系统管理员很重要的任务之一就是管理好自己的磁盘文件系统,每个分区槽不可太大也不能太小, 太大会造成磁盘容量的浪费,太小则会产生文件无法储存的困扰。此外,我们所讨论的文件的权限与属性分别记录在文件系统的哪个区块内?现在,为了虚拟化与大容量磁盘,现在的 CentOS 7 默认使用大容量效能较佳的 xfs 当预设文件系统,这也是需要我们了解的东西。
1. Linux 文件系统
1.1. Linux支持的文件系统及VFS
首先来看看 Linux 支持的文件系统有:
- 传统文件系统:ext2、minix、FAT(用vfat模块)、iso9660(光盘)等;
- 日志式文件系统:ext3、ext4、ReiserFS、Windows's NTFS、IBM's JFS、SGI's XFS、ZFS
- 网络文件系统:NFS、SMBFS
想要知道你的 Linux 支持的文件系统有哪些,可以察查看底下这个目录:

系统目前已加载到内存中支持的文件系统则有:

整个 Linux 的系统都是透过一个名为 Virtual Filesystem Switch 的核心功能去读取 filesystem 的。 也就是说,整个 Linux 认识的 filesystem 其实都是 VFS 在进行管理,我们使用者并不需要知道每个 partition 上头的 filesystem 是什么,VFS 会主动的帮我们做好读取的动作。

1.2. Linux文件系统特性
由于文件系统建立在磁盘上面,因此在讨论文件系统之前我们先来说一下磁盘分区。
1.2.1. 磁盘分区与文件系统挂载
1. 磁盘物理组成

磁盘可能有多个碟片,所有碟片的同一个磁道我们称为磁柱 (Cylinder), 早期磁柱是文件系统的最小单位,也就是分区的最小单位。近来有 GPT 这个可达到 64bit 纪录功能的分区表, 现在我们使用扇区 (sector) 号码来作为分区单位。
2. MBR分区表与GPT分区表
- MBR分区表
- 主引导记录(Master Boot Record, MBR):记录整块硬盘分区的状态,446字节;
- 分区表(partition table):记录整块硬盘分区的状态,64字节。(4组记录区,始末柱面)


扩展分区的目的是使用额外的扇区来记录分区信息,扩展分区本身并不能被拿来格式化。扩展分区可以持续划分出逻辑分区
- GPT分区表
因为过去一个扇区大小就是 512bytes 而已,不过目前已经有 4K 的扇区设计出现!为了兼容于所有的磁盘,因此在扇区的定义上面, 大多会使用所谓的逻辑区块地址(Logical Block Address, LBA)来处理。
GPT 将磁盘所有区块以此 LBA(预设为 512bytes ) 来规划,而第一个 LBA 称为 LBA0 (从 0 开始编号)。 与 MBR 仅使用第一个 512bytes 区块来纪录不同, GPT 使用了 34 个 LBA 区块来纪录分区信息!同时与过去 MBR 仅有一的区块,被干掉就死光光的情况不同, GPT 除了前面 34 个 LBA 之外,整个磁盘的最后 33 个 LBA 也拿来作为另一个备份。(1+32+1→128)

3. 文件系统与磁盘的挂载
『挂载』就是利用一个目录当成进入点,将磁盘分区的数据放置在该目录下; 也就是说,进入该目录就可以读取该分区的意思。这个动作我们称为『挂载』,那个进入点的目录我们称为『挂载点』。

1.2.2. 文件系统特性
1. 磁盘分区格式化
磁盘分区完毕后还需要进行格式化(format),之后操作系统才能够使用这个文件系统。为什么需要进行格式化呢?这是因为每种操作系统所设定的文件属性/权限并不相同,为了存放这些文件所需的数据,就需要将分区进行格式化以成为操作系统能够利用的文件系统格式(filesystem)。
因此,每种操作系统能够使用的文件系统并不相同。 举例来说,windows 98 以前的微软操作系统主要利用的文件系统是 FAT (或 FAT16),windows 2000 以后的版本有所谓的 NTFS 文件系统,至于Linux 的正统文件系统则为 Ext2 (Linux second extended file system, ext2fs)这一个。此外,在默认的情况下,windows 操作系统是不会认识 Linux 的 Ext2 的。
传统的磁盘与文件系统之应用中,一个分区就是只能够被格式化成为一个文件系统,所以我们可以说一个 filesystem 就是一个 partition。但是由于新技术例如LVM与软件磁盘阵列(software raid)可以将一个分区格式化为多个文件系统(例如LVM),也能够将多个分区合成一个文件系统(LVM, RAID)!所以说,目前我们在格式化时已经不再说成针对 partition 来格式化了,通常我们称呼一个可被挂载的数据为一个文件系统而不是一个分区。
文件系统的运作与操作系统的文件数据有关。如Linux 操作系统的文件包括内容、权限和属性。文件系统通常会将这两部份的数据分别存放在不同的区块,权限与属性放置到 inode 中,至于实际数据则放置到 data block 区块中。 另外,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量等。
2. 索引式文件系统(index allocation)
- FAT格式
FAT格式的文件系统没有inode,长时间使用后文件写入的 block 太过于离散了,此时文件读取的效能将会变的很差。这个时候可以透过碎片整理将同一个文件所属的 blocks 汇整在一起,以方便数据读取。
FAT数据存储
- ext2格式
- inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的区块号码;
- bolck:实际记录文件的内容,若文件太大时,会占用多个block;
- superblock:记录此文件系统的整体信息,包括inode与block的总量、使用量、剩余量,以及文件系统的格式与相关信息等。

Ext2 文件系统在格式化的时候基本上是区分为多个区块群组 (block group) 的,每个区块群组都有独立的 inode/block/superblock 系统。

- data block:用于放置数据文件,ext2支持1K、2K及4K三种-----决定了最大磁盘容量
- inode table:记录文件属性以及实际数据放在哪个block-----决定了最大单一文件容量
- inode对照表:记录使用与未使用的inode号码
- block对照表:记录使用与未使用的block号码
- 文件系统描述:描述每个block群组的开始和结束的block,以及每个区段在block中的位置
- superblock:记录整个文件系统相关信息的地方
Superblock 记录了文件系统的所有基本信息,因此,它很重要!一般来说, superblock 的大小为 1K。一个文件系统应该仅有一个 superblock,实际中除了第一个 block group 以外也可能会有 superblock ,主要是做为第一个 block group 内 superblock 的备份。
inode table

2. 文件系统的操作
2.1. 查看磁盘与目录容量
-
df:列出文件系统的整体磁盘使用量
df命令
-
du:查看文件系统的磁盘使用量(常用在查看目录所占磁盘空间)
du命令
2.2. 硬链接与符号链接
在 Linux 底下的链接文件有两种,一种是类似 Windows 的快捷方式功能的文件,可以让你快速的链接到目标文件(或目录),这种称为符号链接(symbolic link); 另一种则是通过文件系统的 inode 连结来产生新档名,而不是产生新文件!这种称为硬链接 (hard link)。
- hard link
hard link基于的事实是对于一个文件来说,其文件名只与目录有关,而文件内容则与 inode 有关,因此,hard link 只是在某个目录下新增一条文件名链接到某 inode 号码的关连记录而已。hard link不能夸文件系统,也不能链接目录。
- symbolic link
symbolic link 就是在建立一个独立的文件,而这个文件会让数据的读取指向他 link 的那个文件的文件名。symbolic Link 与 Windows 的快捷方式可以划上等号,由于 symbolic link 所建立的文件为一个独立的新的文件,所以会占用掉 inode 与 block。

3. 磁盘管理的操作
3.1. 磁盘分区
由于目前磁盘分区主要有 MBR 以及 GPT 两种格式,这两种格式所使用的分区工具不太一样。一般分别使用 fdisk 和 gdisk 来处理MBR和GPT分区,同时支持以上两种分区格式的有parted。
三种查看磁盘分区的命令
-
lsblk 列出系统上的所有磁盘列表
lsblk命令
-
blkid 列出设备的UUID(全局唯一标识符)等参数
blkid命令
-
parted 列出磁盘的分区表类型与分区信息
parted命令
3.2. 磁盘格式化
其实,我们所说的格式化,更应该被称为创建文件系统(make filesystem)
-
XFS 文件系统 mkfs.xfs
XFS 文件系统 mkfs.xfs
-
ext4 文件系统 mkfs.xfs
ext 文件系统 mkfs.ext4
3.3. 文件系统检验
下面两个xfs_repair 或 fsck.ext4,这都是用来检查与修正文件系统错误的指令。通常只有身为 root 且你的文件系统有问题的时候才使用这个指令,否则在正常状况下使用此一指令,可能会造成对系统的危害!通常使用这个指令的场合都是在系统出现极大的问题,导致你在 Linux 开机的时候得进入单人单机模式下进行维护的行为时,才必须使用此一指令!
-
xfs_repair 处理XFS文件系统
xfs_repair命令
-
fsck.ext4 处理 ext4 文件系统
fsck.ext4命令
3.4. 文件系统挂载与卸载
-
mount 挂载
mount命令
-
umount 卸载
umount命令
二么士
网友评论