Linux 磁盘配置文件 /etc/fstab 详解

512 阅读1分钟

/etc/fstab 文件的作用

磁盘被手动挂载之后都必须把挂载信息写入 /etc/fstab 这个文件中,否则下次开机启动时仍然需要重新挂载

系统开机时会主动读取 /etc/fstab 这个文件中的内容,根据文件里面的配置挂载磁盘。这样我们只需要将磁盘的挂载信息写入这个文件中我们就不需要每次开机启动之后手动进行挂载了。

挂载的限制

在说明这个文件的作用之前我想先强调一下挂载的限制。

  1. 根目录是必须挂载的,而且一定要先于其他 mount point 被挂载。因为 mount 是所有目录的根目录,其他都是由根目录 / 衍生出来的
  2. 挂载点必须是已经存在的目录
  3. 挂载点的指定可以任意,但必须遵守必要的系统目录架构原则
  4. 所有挂载点在同一时间只能被挂载一次
  5. 所有分区在同一时间只能挂在一次
  6. 若进行卸载,必须将工作目录退出挂载点(及其子目录)之外。

/etc/fstab 文件中参数

# 查看当前系统已经存在的挂载信息
$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda1 during installation
/dev/disk/by-uuid/dbe45dcb-0a04-428d-816d-ae4c004599d8 / ext4 defaults 0 1
# /boot/efi was on /dev/nvme1n1p1 during curtin installation
/dev/disk/by-uuid/8EC3-92ED /boot/efi vfat defaults 0 1
/swap.img       none    swap    sw      0       0
UUID=cf0c96db-89d0-41d9-bdc9-0dd5cb67bcde /mnt/pmem0 ext4 defaults 0 1
/dev/sda1 /mnt/sda1/zz_data ext4 defaults 0 2
/mnt/sda1/zz_data /home/zz/data_new/Nomad/src none bind 0 0
UUID=526d14d2-dbcc-4100-8cb5-85579eefae94 /home/lj ext4 defaults 0 2

在文件中我已经把每一列都做出来表示方便识别,我们可以看到一共有六列。

第 1 列 [Device] 磁盘设备文件或者该设备的 Label 或者 UUID

Label 就是分区的标签,在最初安装系统时填写的挂载点就是标签的名字。

UUID-Universally Unique IDentifiers 全局唯一标识符

可以通过查看一个分区的 superblock 中的信息找到 UUID 和 Label name。

# 切换 root
$ sudo -i

# 查询 /dev/nvme0n1 的 UUID
$ blkid /dev/nvme0n1
/dev/nvme0n1: UUID="36df5186-24a0-4dad-9b4e-664a4230b7f1" TYPE="ext4"

使用设备名称(/dev/sda)来挂载分区时是被固定死的,一旦磁盘的插槽顺序发生了变化,就会出现名称不对应的问题。因为这个名称是会改变的。

不过使用 label 挂载就不用担心插槽顺序方面的问题。不过要随时注意你的 Label name。至于 UUID,每个分区被格式化以后都会有一个 UUID 作为唯一的标识号。使用 uuid 挂载的话就不用担心会发生错乱的问题了。

第 2 列 [Mount Point] 设备挂载点,就是你要挂载到哪个目录下

第 3 列 [File System] 磁盘文件系统的格式,包括 ext2、ext3、ext4、nfs...

第 4 列 [Parameters] 文件系统的参数

参数说明
Async/sync设置是否为同步方式运行,默认为 async
auto/noauto当下载 mount -a 的命令时,此文件系统是否被主动挂载。默认为 auto
rw/ro是否以以只读或者读写模式挂载
exec/noexec限制此文件系统内是否能够进行”执行”的操作
user/nouser是否允许用户使用 mount 命令挂载
suid/nosuid是否允许 SUID 的存在
Usrquota启动文件系统支持磁盘配额模式
Grpquota启动文件系统对群组磁盘配额模式的支持
Defaults同时具有 rw,suid,dev,exec,auto,nouser,async 等默认参数的设置

第 5 列 [能否被 dump 备份命令作用] dump 是一个用来作为备份的命令,通常值为 0 或 1

参数说明
0代表不要做 dump 备份
1代表要每天进行 dump 的操作
2代表不定日期的进行 dump 操作

第 6 列 [是否检验扇区] 开机的过程中,系统默认会以 fsck 检验我们系统是否为完整(clean)

参数说明
0不要检验
1最早检验(一般根目录会选择)
21级别检验完成之后进行检验

Linux 磁盘分区 UUID 获取及其作用

获取 UUID 的方法

# 方法一
$ sudo ls -l /dev/disk/by-uuid/

# 方法二
$ sudo blkid /dev/sda1
/dev/sda1: UUID="f0d9b5f8-24ef-4aba-b3ce-f4bf0a0c231a" TYPE="ext4" PARTUUID="e3d6d3a9-01"

原因 1:它是真正的唯一标志符

UUID 为系统中的存储设备提供唯一的标识字符串,不管这个设备是什么类型的。如果你在系统中添加了新的存储设备如硬盘,很可能会造成一些麻烦,比如说启动的时候因为找不到设备而失败,而使用UUID则不会有这样的问题。

原因 2:设备名并非总是不变的

自动分配的设备名称并非总是一致的,它们依赖于启动时内核加载模块的顺序。如果你在插入了 USB 盘时启动了系统,而下次启动时又把它拔掉了,就有可能导致设备名分配不一致。

使用 UUID 对于挂载移动设备也非常有好处──例如我有一个 24 合一的读卡器,它支持各种各样的卡,而使用 UUID 总可以使同一块卡挂载在同一个地方。

原因 3:ubuntu 中的许多关键功能现在开始依赖于 UUID

例如 grub ──系统引导程序,现在可以识别 UUID,打开你的 /boot/grub/menu.lst,你可以看到类似如下的语句:

$ cat /boot/grub/menu.lst
title Ubuntu hardy (development branch), kernel 2.6.24-16-generic
root (hd2,0)
kernel /boot/vmlinuz-2.6.24-16-generic root=UUID=c73a37c8-ef7f-40e4-b9de-8b2f81038441 ro quiet splash
initrd /boot/initrd.img-2.6.24-16-generic
quiet