Linux 文件系统和目录结构

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 分区是 linux 特有的,在硬盘上单独划分出来一块空间用来存放内存和硬盘之间的交换数据,以提高机器的效率。相当于 windows 的虚拟内存,但是效率要比虚拟内存好得多。 Swap 分区可以不设立,但是建议划分。

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

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

 

2. linux 目录结构

目录

描述

/

根目录。

/bin

作为基础系统所需要的最基础的命令就是放在这里。比如 ls、cp、mkdir 等命令;功能和 /usr/bin 类似,这个目录中的文件都是可执行的,普通用户都可以使用的命令。

/boot

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

/dev

一些必要的设备、声卡、磁盘等。

/etc

系统的配置文件存放地。一些服务器的配置文件也在这里,比如用户帐号及密码配置文件。

/home

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

/lib

库文件存放地。bin 和 sbin 需要的库文件。类似 windows 的 DLL。

/media

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

/mnt

临时挂载文件系统。这个目录一般是用于存放挂载储存设备的挂载目录的,比如有 cdrom  等目录。可以参看 /etc/fstab 的定义。

/opt

可选的应用程序包。

/proc

操作系统运行时,进程(正在运行中的程序)信息及内核信息(比如 cpu、硬盘分区、内存信息等)存放在这里。/proc 目录伪装的文件系统 proc 的挂载目录,proc 并不是真正的文件系统,它的定义可以参见 /etc/fstab 。

/root

root 用户的工作目录。

/sbin

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

/tmp

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

/usr

包含了系统用户工具和程序。

  • /usr/bin:非必须的普通用户可执行命令
  • /usr/include:标准头文件
  • /usr/lib:/usr/bin/ 和 /usr/sbin/的库文件
  • /usr/sbin:非必须的可执行文件
  • /usr/src:内核源码
  • /usr/local:用户编译安装的软件的默认路径

/srv

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

  

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

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

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

Linux 文件系统和目录结构

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

Linux 文件系统和目录结构

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

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

 

Linux 文件系统和目录结构

上一篇:The Linux Command Line——12. Shell环境


下一篇:【深度学习的linux显卡服务器维护记录】 服务器cuda不能用,nvidia-smi报错“Failed to initialize NVML: Driver/library version mismatch”