1. Linux 文件系统

2. linux 目录结构

3. 磁盘分区、文件系统和目录的关系

 

 

1. Linux 文件系统

Linux 支持多种的文件系统种类,除了 linux 通常使用的 ext 系列,也可以支持 windows 下的 vfat 和 ntfs 格式,当然包括类似 nfs 、 xfs 等各种网络存储格式。这里我们首先介绍一下 CentOS 系统通常会用到的 ext , ext2 , ext3 , ext4 , swap 格式。

1)ext

ext 是第一个专门为 Linux 的文件系统类型,叫做扩展文件系统。它在 1992 年 4 月 完成的。它为 Linux 的发展取得了重要作用。但是在性能和兼容性上存在许多缺陷。现在已经很少使用了。

2)ext2

ext2 是为解决 ext 文件系统的缺陷而设计的可扩展的高性能的文件系统。 ext2 是 Linux 文件系统类型中使用最多的格式。并且在速度和 CPU 利用率上较突出,是 GNU / Linux 系统中标准的文件系统,其特点为存取文件的性能极好。

ext2 可以支持 256 字节的长文件名,其单一文件大小与文件系统本身的容量上限与文件系统本身的簇大小有关,在一般常见的 Intel x86 兼容处理器的系统中,簇最大为 4KB , 则单一文件大小上限为 2048GB ,而文件系统的容量上限为 6384GB 。

ext2 的缺点:ext2 的设计者主要考虑的是文件系统性能方面的问题。ext2 在写入文件内容时并没有马上同步写入文件的 meta-data(和文件有关的信息,例如:权限、所有者以及创建和访问时间)。换句话说, Linux 先写入文件的内容,然后等到有空的时候才写入文件的 meta-data 。这样若出现写入文件内容之后,在写入文件的 meta-data 之前系统突然断电,就可能造成在文件系统就会处于不一致的状态。在一个有大量文件操作的系统中出现这种情况会导致很严重的后果。

3)ext3

ext3 是由开放资源社区开发的日志文件系统。 ext3 被设计成是 ext2 的升级版本,尽可能地方便用户从 ext2fs 向 ext3fs 迁移。 ext3 在 ext2 的基础上加入了记录元数据的日志功能, 努力保持向前和向后的兼容性。 Ext3 目前所支持最大 16TB 文件系统和最大 2TB 文件( x86 _ 64 机器, 32 位机器和 ext2 一样, ext2 时代还没有出现 64 位机器)。

ext3 是一种日志式文件系统。日志式文件系统的优越性在于:由于文件系统都有快取层参与运作,如不使用时必须将文件系统卸下,以便将快取层的资料写回磁盘中。因此每当系统要关机时,必须将其所有的文件系统全部卸下后才能进行关机。如果在文件系统尚未卸下前就关机(如停电)时,下次重开机后会造成文件系统的资料不一致,故这时必须做文件系统的重整工作,将不一致与错误的地方修复。然而,重整的工作是相当耗时的,特别是容量大的文件系统,而且也不能百分之百保证所有的资料都不会流失。

ext3 的缺点:其最大的缺点是没有现代文件系统所具有的能提高文件数据处理速度和解压的高性能。

4)ext4

Ext4 是一种针对 ext3 系统的扩展日志式文件系统,是专门为 Linux 开发的原始的扩展文件系统(ext 或 extfs)的第四版。 Linux kernel 自 2.6.28 开始正式支持新的文件系统 Ext4 。 Ext4 是 Ext3 的改进版,修改了 Ext3 中部分重要的数据结构,而不仅仅像 Ext3 对 Ext2 那样,只是增加了一个日志功能而已。 Ext4 可以提供更佳的性能和可靠性,还有更为丰富的功能。相对于 Ext3 ,特点如下:

  1. 与 Ext3 兼容。执行若干条命令,就能从 Ext3 在线迁移到 Ext4 ,而无须重新格式化磁盘或重新安装系统。原有 Ext3 数据结构照样保留, Ext4 作用于新数据,当然,整个文件系统因此也就获得了 Ext4 所支持的更大容量。
  2. 更大的文件系统和更大的文件。 Ext4 分别支持 1EB ( 1 , 048 , 576TB , 1EB = 1024PB , 1PB = 1024TB )的文件系统,以及 16TB 的文件。
  3. 无限数量的子目录。 Ext3 目前只支持 32 , 000 个子目录,而 Ext4 支持无限数量的子目录。
  4. Extents 。 Ext3 采用间接块映射,当操作大文件时,效率极其低下。比如一个 100MB 大小的文件,在 Ext3 中要建立 25 , 600 个数据块(每个数据块大小为 4KB )的映射表。而 Ext4 引入了现代文件系统中流行的 extents 概念,每个 extent 为一组连续的数据块,上述文件则表示为“该文件数据保存在接下来的 25 , 600 个数据块中”,提高了不少效率。
  5. 多块分配。当写入数据到 Ext3 文件系统中时, Ext3 的数据块分配器每次只能分配一个 4KB 的块,写一个 100MB 文件就要调用 25 , 600 次数据块分配器,而 Ext4 的多块分配器“ multiblock allocator ”( mballoc )支持一次调用分配多个数据块。
  6. 延迟分配。 Ext3 的数据块分配策略是尽快分配,而 Ext4 和其它现代文件操作系统的策略是尽可能地延迟分配,直到文件在 cache 中写完才开始分配数据块并写入磁盘,这样就能优化整个文件的数据块分配,与前两种特性搭配起来可以显著提升性能。
  7. 快速 fsck 。 以前执行 fsck 第一步就会很慢,因为它要检查所有的 inode ,现在 Ext4 给每个组的 inode 表中都添加了一份未使用 inode 的列表,今后 fsck Ext4 文件系统就可以跳过它们而只去检查那些在用的 inode 了。
  8. 日志校验。 日志是最常用的部分,也极易导致磁盘硬件故障,而从损坏的日志中恢复数据会导致更多的数据损坏。 Ext4 的日志校验功能可以很方便地判断日志数据是否损坏,而且它将 Ext3 的两阶段日志机制合并成一个阶段,在增加安全性的同时提高了性能。
  9. “无日志”( No Journaling )模式。 日志总归有一些开销, Ext4 允许关闭日志,以便某些有特殊需求的用户可以借此提升性能。
  10. 在线碎片整理。 尽管延迟分配、多块分配和 extents 能有效减少文件系统碎片,但碎片还是不可避免会产生。 Ext4 支持在线碎片整理,并将提供 e4defrag 工具进行个别文件或整个文件系统的碎片整理。
  11. inode 相关特性。 Ext4 支持更大的 inode ,较之 Ext3 默认的 inode 大小 128 字节, Ext4 为了在 inode 中容纳更多的扩展属性(如纳秒时间戳或 inode 版本),默认 inode 大小为 256 字节。 Ext4 还支持快速扩展属性( fast extended attributes )和 inode 保留( inodes reservation )。
  12. 持久预分配( Persistent preallocation )。 P2P 软件为了保证下载文件有足够的空间存放,常常会预先创建一个与所下载文件大小相同的空文件,以免未来的数小时或数天之内磁盘空间不足导致下载失败。 Ext4 在文件系统层面实现了持久预分配并提供相应的 API ( libc 中的 posix _ fallocate ()),比应用软件自己实现更有效率。
  13. 默认启用 barrier 。磁盘上配有内部缓存,以便重新调整批量数据的写操作顺序,优化写入性能,因此文件系统必须在日志数据写入磁盘之后才能写 commit 记录,若 commit 记录写入在先,而日志有可能损坏,那么就会影响数据完整性。 Ext4 默认启用 barrier ,只有当 barrier 之前的数据全部写入磁盘,才能写 barrier 之后的数据。(可通过 " mount - o barrier = 0 " 命令禁用该特性。)

5)XFS

Ext4 作为传统的文件系统确实非常成熟稳定,但是随着存储需求的越来越大, Ext4 渐渐适应不了了。比如说现在虽然 Ext4 目录索引采用了 Hash Index Tree , 但是依然限制高度为 2。

Ext4 的单个目录文件超过 200W 个,性能下降的就比较厉害了。由于历史磁盘结构原因 Ext4 的 inode 个数限制(32 位数)最多只能有大概 40 多亿文件。而且 Ext4 的单个文件大小最大只能支持到 16T ( 4K block size) 的话,这些至少对于目前来说已经是瓶颈了。而 XFS 使用 64 位管理空间,文件系统规模可以达到 EB 级别,可以说未来几年 XFS 彻底取代 Ext4 是早晚的事情。

6)swap

swap 分区(即交换空间,swap space)是 linux 特有的,在硬盘上单独划分出来一块空间用来存放内存和硬盘之间的交换数据,以提高机器的效率。相当于 windows 的虚拟内存,但是效率要比虚拟内存好得多。

swap space 是磁盘上的一块区域,可以是一个分区,也可以是一个文件,所以具体的实现可以是 swap 分区也可以是 swap 文件。当系统物理内存吃紧时,Linux 会将内存中不常访问的数据保存到 swap 上,这样系统就有更多的物理内存为各个进程服务,而当系统需要访问 swap 上存储的内容时,再将 swap 上的数据加载到内存中,这就是常说的换出和换入。

交换空间可以在一定程度上缓解内存不足的情况,但是它需要读写磁盘数据,所以性能不是很高。

现在的机器一般都不太缺内存,如果系统默认还是使用了 swap 是不是会拖累系统的性能?理论上是的,但实际上可能性并不是很大。并且内核提供了一个叫做 swappiness 的参数,用于配置需要将内存中不常用的数据移到 swap 中去的紧迫程度。这个参数的取值范围是 0~100,0 告诉内核尽可能的不要将内存数据移到 swap 中,也即只有在迫不得已的情况下才这么做,而 100 告诉内核只要有可能,尽量的将内存中不常访问的数据移到 swap 中。在 ubuntu 系统中,swappiness 的默认值是 60。

如果我们觉着内存充足,可以在 /etc/sysctl.conf 文件中设置 swappiness。如果系统的内存不足,则需要根据物理内存的大小来设置交换空间的大小,具体的策略网上有很丰富的资料。

Swap 分区可以不设立,但是建议划分。

  • 在内存小于 2G 时, swap 分区建议使用两倍内存大小;
  • 内存大于 2G ,小于 4G , swap 分区建议使用内存大小;
  • 内存大于 4G , swap 分区建议使用内存一半大小。

不同的应用有不同的需求,可以根据使用情况逐步添加或者减小 swap 分区。

 

2. linux 目录结构

目录

描述

/

根目录。

/bin

二进制可执行文件。作为基础系统所需要的最基础的命令就是放在这里。比如 ls、cp、mkdir 等命令,是所有用户都可以使用的命令。

/boot

Linux 的内核及引导系统程序所需要的文件,比如 vmlinuz initrd.img 文件都位于这个目录中。在一般情况下,GRUB 或 LILO 系统引导管理器也位于这个目录;也是启动装载文件的存放位置,如 kernels、initrd、grub。

/dev

设备文件目录,主要存放系统中所有设备(设备、声卡、磁盘等)的相关信息。不论是使用的或未使用的设备,只要有可能使用到,就会在 /dev 中建立一个相对应的设备文件。

Linux 中设备分为两种:

  • 块设备(block):硬盘、软驱、光驱等。
  • 字符设备(character):鼠标、键盘等。

/etc

系统配置文件的存放地。比如用户帐号及密码配置文件等。

/etc/sysconfig/:非常重要的系统配置文件的存放目录,里面放置了大量系统启动及运行相关的配置文件,如 iptables 防火墙配置文件。

/home

普通用户的工作目录,存放用户的个人配置文件如个人环境变量等,所有的账号分配一个工作目录。一般是一个独立的分区。

/lib

需要共享的函数库与 kernel 模块、系统 kernel 启动所使用的函数库、或者当执行一些在 /bin 和 /sbin 中的命令时使用的函数库;

/media

可拆卸的媒介挂载点,如 CD-ROMs、移动硬盘、U 盘,系统默认会挂载到这里来。

/mnt

临时挂载文件系统。这个目录一般是用于存放挂载储存设备的挂载目录的,比如有 cdrom 等目录。

/opt

optional(可选),一般是用来安装程序的。类似于 windows 的 Programfiles 目录。

/proc

操作系统运行时,进程信息及内核信息(比如 cpu、硬盘分区、内存信息等)都存放在这里。特殊目录。

这里的所有文件都不是在硬盘里的,而是在内存里的。也就是这个目录的文件都是内存的真实映射。

/sys

跟 proc 类似,也是记录和内核相关的信息。同样不占硬盘空间

/root

root 用户的工作目录。

/sbin

和 bin 类似,是一些可执行文件。不过一般是系统管理所需要使用的。

/tmp

系统的临时文件,一般系统重启不会被保存。

/usr

Usr=Unix Software Resource。类似于前面的 opt 目录,但是存放在这个地方的软件都是很重要的。相当于 windows 里 C:\WINDOWS 和 C:\Program Files 的综合体。

  • /usr/bin/:一般用户有机会使用到的程序,或者该软件默认就是要让所有用户使用才会放在该目录中。
  • /usr/sbin/:一些系统有可能会用到的系统命令,与/sbin比起来,都是一些较次要的文件。
  • /usr/include/:标准头文件。
  • /usr/lib/:存放一些函数库、执行文件及连接文件。
  • /usr/etc/:自行安装或非系统主要的配置文件目录。
  • /usr/src/:内核源码。
  • /usr/local/:linux系统中安装的共享软件程序最好的方式是安装在 /usr/local 下,按照 linux 标准目录结构,新建立的软件都应该放在 /usr/local 下。
  • /usr/local/bin:存放软件执行文件的目录。
  • /usr/local/sbin:同样存放软件执行文件的目录,但此目录专门针对系统所使用的文件。
  • /usr/local/lib:软件相关的函数库。

/srv

该目录存放一些服务启动之后需要提取的数据。

/var

常态性变动的文件,比如缓存、mysql 文件、mail 等数据。

selinux

SecureLinux 关于安全策略的配置。

media

存放一些可删除的设备文件。

  

3. 磁盘分区、文件系统和目录的关系

以下为两块磁盘,在使用之前划分为不同的分区(分区大小不同),每个分区格式化为不同的文件系统:

(以红色代表 swap 文件系统、以蓝色单表 ext2 文件系统、以绿色代表 ext3 文件系统)

Linux 文件系统和目录结构_Linux

将这八块分区分别挂载到不同的目录下。箭头表示挂载:

Linux 文件系统和目录结构_Linux_02

如上图所示,当硬盘挂载到某个目录上时,该目录及其下的子目录都使用该分区,除非其子目录挂载了别的分区。换句话说,每个目录都使用挂载在自身的分区,如果没有分区挂载在自身,就使用上级目录所使用的分区。

根据 linux 分区和目录结构的联系特点,需要在安装初期规划好分配情况,才能保证数据安全和性能。