fstab
fstab(5)文件可用于定义如何挂载硬盘分区以及各种块设备和远程文件系统。
每个文件系统都分别在单独一行中定义,这些定义将在系统引导或重新加载系统管理器配置时被动态转换为 systemd 挂载单元。The default setup will automatically fsck and mount file systems before starting services that need them to be mounted. 例如,systemd 会自动确保类似 NFS 和 Samba 的远程文件系统仅在网络可用后才会进行挂载。因此,/etc/fstab 中指定的本地和远程文件系统挂载应能开箱即用。具体信息请参考 systemd.mount(5)。
如果仅提供了单个目录或是设备作为参数,那么 mount 会调用 fstab 来填充其它参数。在这种情况下,将调用 fstab 中列出的挂载参数。
一个简单的 /etc/fstab,使用了文件系统 UUID:
/etc/fstab
# <device> <dir> <type> <options> <dump> <fsck>
UUID=0a3407de-014b-458b-b5c1-848e92a327a3 / ext4 defaults 0 1
UUID=CBB6-24F2 /boot vfat defaults,nodev,nosuid,noexec,fmask=0177,dmask=0077 0 2
UUID=f9fe0b69-a280-415d-a03a-a32752370dee none swap defaults 0 0
UUID=b411dc99-f0a0-4c87-9e05-184977be8539 /home ext4 defaults 0 2
-
<device>描述了要挂载的特定块设备或远程文件系统,详见 #文件系统标识。 -
<dir>指定了要将文件系统挂载到的目录,即挂载点。必须提前创建该目录。 -
<type>是文件系统类型。 -
<options>是文件系统挂载选项,详见 mount(8) § FILESYSTEM-INDEPENDENT MOUNT OPTIONS 和 ext4(5) § Mount options for ext4。 -
<dump>会被 dump(8) 工具检查。该字段通常设置为0,以禁用检查。 -
<fsck>设置了引导时检查文件系统的顺序,具体信息请参考 fsck(8)。对于根设备,该字段需设置为1。对于其它分区该字段应该设置为2,或设置为0以禁用检查。
-
auto类型会让 mount 命令猜测设备使用的文件系统。这对于光学介质(CD/DVD/Blu-ray)非常有用。 - 如果根文件系统是 btrfs 或 XFS,那么 fsck 顺序应该设置为
0而不是1。具体信息请参考 fsck.btrfs(8) 和 fsck.xfs(8)。
除非指定 noauto 选项,否则在启动以及使用带有 -a 标识的 mount(8) 命令时,所有在 /etc/fstab 里指定的设备都会自动被挂载。除非使用 nofail 选项,否则在列表中出现但实际不存在的设备会导致错误。
更多信息请参考 fstab(5) § DESCRIPTION。
在 /etc/fstab 配置文件中,有多种方法可用于标识文件系统:内核名称、文件系统标签或者 UUID,对于 GPT 硬盘还可以使用 GPT 分区标签和 UUID。不应使用内核名称,而 UUID 或分区 UUID(PARTUUID)应该优于标签。更多信息请参考块设备持久化命名。建议在继续阅读本文前先阅读那篇文章。
在本节中,我们将通过示例描述如何使用所有可用的挂载方法来挂载文件系统。以下示例中使用的命令 lsblk -f 和 blkid 的输出可在块设备持久化命名一文中找到。
运行 lsblk -f 以列出分区,并在 NAME 列中的值的前面加上 /dev/。
/etc/fstab
# <device <dir> <type> <options> <dump> <fsck>
/dev/sda2 / ext4 defaults 0 1
/dev/sda1 /boot vfat defaults,nodev,nosuid,noexec,fmask=0177,dmask=0077 0 2
/dev/sda3 /home ext4 defaults 0 2
/dev/sda4 none swap defaults 0 0
运行 lsblk -f 以列出分区,并在 LABEL 列中的值的前面加上 LABEL=;或者运行 blkid 并使用不带引号的 LABEL 的值:
/etc/fstab
# <device> <dir> <type> <options> <dump> <fsck>
LABEL=System / ext4 defaults 0 1
LABEL=ESP /boot vfat defaults,nodev,nosuid,noexec,fmask=0177,dmask=0077 0 2
LABEL=Data /home ext4 defaults 0 2
LABEL=Swap none swap defaults 0 0
运行 lsblk -f 以列出分区,并在 UUID 列中的值的前面加上 UUID=;或者运行 blkid 并使用不带引号的 UUID 的值:
/etc/fstab
# <device> <dir> <type> <options> <dump> <fsck>
UUID=0a3407de-014b-458b-b5c1-848e92a327a3 / ext4 defaults 0 1
UUID=CBB6-24F2 /boot vfat defaults,nodev,nosuid,noexec,fmask=0177,dmask=0077 0 2
UUID=b411dc99-f0a0-4c87-9e05-184977be8539 /home ext4 defaults 0 2
UUID=f9fe0b69-a280-415d-a03a-a32752370dee none swap defaults 0 0
运行 blkid 来列出分区,并使用不带引号的 PARTLABEL 的值:
/etc/fstab
# <device> <dir> <type> <options> <dump> <fsck>
PARTLABEL=GNU/Linux / ext4 defaults 0 1
PARTLABEL=EFI\040system\040partition /boot vfat defaults,nodev,nosuid,noexec,fmask=0177,dmask=0077 0 2
PARTLABEL=Home /home ext4 defaults 0 2
PARTLABEL=Swap none swap defaults 0 0
运行 blkid 来列出分区,并使用不带引号的 PARTUUID 的值:
/etc/fstab
# <device> <dir> <type> <options> <dump> <fsck>
PARTUUID=98a81274-10f7-40db-872a-03df048df366 / ext4 defaults 0 1
PARTUUID=d0d0d110-0a71-4ed6-936a-304969ea36af /boot vfat defaults,nodev,nosuid,noexec,fmask=0177,dmask=0077 0 2
PARTUUID=7280201c-fc5d-40f2-a9b2-466611d3d49e /home ext4 defaults 0 2
PARTUUID=039b6c1c-7553-4455-9537-1befbc9fbc5b none swap defaults 0 0
请参考 systemd.mount(5) 获取所有 systemd 挂载选项。
在使用大分区时,可以在 fsck 进行检查时启动不依赖该分区的服务以提高效率。这可以通过向 /etc/fstab 的分区条目中添加以下选项来完成:
x-systemd.automount
这会使分区被首次访问时才运行 fsck 和 mount,并且内核会在它可用前缓冲所有对它的文件访问。
该方法适用于如 /home 分区非常大的情况。
autofs,并默认被 locate 忽略。对于远程文件系统的挂载也是一样的。如果你想让它们只在访问时被挂载,就需要使用 x-systemd.automount 参数。另外,你还可以使用 x-systemd.mount-timeout= 选项来指定 systemd 应该在命令完成前等待多久。另外,_netdev 选项可确保 systemd 明白该挂载需要网络,并且在网络就绪后再执行挂载:
x-systemd.automount,x-systemd.mount-timeout=30,_netdev
如果你有一个使用密钥文件的加密附属文件系统,可以将 nofail 参数添加到 /etc/crypttab 和 /etc/fstab 中的对应项中。systemd 将不会在启动时等待 cryptsetup 完成解密并挂载,而是等到甚至是抵达 default.target 后再完成挂载。通过忽略无需启动后立即可用的加密附属文件系统,该操作可避免由此带来的启动延迟。cryptsetup 的具体配置请参考 dm-crypt/系统配置#非阻塞挂载。
由于挂载服务默认仅会为文件系统可用等待 90 秒,因此任何对密钥文件可用性的延迟都可能导致挂载失败。为避免该情况出现,可以在 fstab 中添加 x-systemd.mount-timeout=0 选项,以使挂载服务一直等待到分区解锁完成。
/etc/fstab
UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /data ext4 defaults,nofail,x-systemd.device-timeout=0 0 2
可以通过 x-systemd.idle-timeout 参数来为挂载设置一个空闲超时时间。举个例子:
x-systemd.automount,x-systemd.idle-timeout=1min
这会使 systemd 在设备空闲 1 分钟后卸载它。
对于仅在可用时挂载,未找到时忽略的外部设备,需要使用 nofail 选项。该选项可在启动时防止出现报错。例如:
/etc/fstab
LABEL=MyExternalDrive /media/backup jfs nofail,x-systemd.device-timeout=5 0 2
建议将 nofail 选项搭配 x-systemd.device-timeout 选项使用,原因是默认设备超时时间是 90 秒,因此除非按如上进行配置,否则仅包含 nofail 选项且未连接的外部设备将使启动时间延长 90 秒。务必确保超时时间没有设为 0 秒,这会将超时时间设为无限。
因为空格在 fstab 中用于划分列,如果任意一列(PARTLABEL,LABEL 或挂载点)中含有空格,这些空格必须被替换为转义符 \ 后面跟着三位数八进制代码 040:
/etc/fstab
UUID=47FA-4071 /home/username/Camera\040Pictures vfat defaults 0 0 LABEL=Storage\040drive /media/100\040GB\040(Storage) ext4 defaults,user 0 2
下列 atime 选项可能影响驱动器性能。
-
strictatime选项会在文件每次被访问时更新它们的访问时间。这更多用于 Linux 服务器,而对于桌面用户并没有多少价值。strictatime选项的缺点是即使从页面缓存中读取文件(从内存而不是从驱动器读取)也会导致一次写入。 -
noatime选项将在读取文件时不将文件访问时间写入驱动器。开启这个选项对多数应用不会产生影响,除了那些需要知道文件自上次修改后是否被访问的应用。在启用此选项的情况下,只要写入文件,文件的写入时间信息就会更新。 -
nodiratime选项仅对目录禁用文件访问时间的写入,而其他文件仍会写入访问时间。 -
relatime仅当先前访问时间早于当前修改时间时才会更新访问时间。此外,从 Linux 2.6.30 开始,如果与之前的访问时间间隔超过 24 小时,则始终会更新访问时间。在使用defaults选项,atime选项(即使用内核默认值relatime;具体信息请参考 mount(8) 和 Once upon atime)或没指定任何选项时,将启用该选项。
在使用 Mutt 或其它需要知道一个文件自上次修改后是否被读取的应用时,不应该使用 noatime 选项;可以使用 relatime,同时还能获得性能提升。
自从内核 4.0 版本起还有另一个相关的选项:
-
lazytime通过仅在内存中维护对 inode 时间戳的更改(包括访问、修改和创建时间)来减少对磁盘的写入。硬盘上的时间戳仅在以下情况下更新:(1) 文件 inode 需要针对与文件时间戳无关的某些更改进行更新,(2) 发生与硬盘的同步,(3) 从内存中逐出未删除的 inode 或 (4) 自上次将内存中的副本写入硬盘已超过 24 小时。
- 警告:如果系统崩溃,硬盘上的访问和修改时间可能会距当前时间过时最多 24 小时。
注意, lazytime 并不用于替代上述 *atime 选项,而是与它们搭配使用。默认会与 relatime 搭配,但在搭配 strictatime 时的硬盘写入损耗也较纯 relatime 选项相同设置更低。
如果出于某些原因根分区被错误挂载为只读,通过以下命令可以将根分区以读写访问重新挂载:
# mount -o remount,rw /
在根据可发现分区规范进行了分区的情况下,使用 UEFI/GPT 时可以在 /etc/fstab 中省略部分分区,并让 systemd-gpt-auto-generator(8) 自动进行挂载。具体信息请参考 systemd#GPT分区自动挂载。
可以将 /dev/gpt-auto-root 作为设备名称来为根分区指定挂载选项:
/etc/fstab
/dev/gpt-auto-root / ext4 defaults,noatime 0 1
你可以使用 bind 选项链接目录:
/etc/fstab
# <device> <dir> <type> <options> <dump> <fsck> UUID=94649E22649E06E0 /media/user/OS/ ntfs defaults,rw,errors=remount-ro 0 0 /media/user/OS/Users/user/Music/ /home/user/Music/ none defaults,bind 0 0 /media/user/OS/Users/user/Pictures/ /home/user/Pictures/ none defaults,bind 0 0 /media/user/OS/Users/user/Videos/ /home/user/Videos/ none defaults,bind 0 0 /media/user/OS/Users/user/Downloads/ /home/user/Downloads/ none defaults,bind 0 0 /media/user/OS/Users/user/Documents/ /home/user/Documents/ none defaults,bind 0 0 /media/user/OS/Users/user/projects/ /home/user/projects/windows/ none defaults,bind 0 0
详情请见 mount(8) § Bind mount operation。
可以使用 genfstab 来创建 fstab 文件,具体信息请参考 genfstab.
以下为一系列可用于修改挂载点的工具,它们的 fstab 编辑功能可能不完整,但常用的功能都有,可以简化你的工作流:
- GNOME Disks — 用于处理存储设备的 GNOME 工具,是 gnome包组 的一部分。
- KDE Partition Manager — 可用于管理电脑上的硬盘、分区和文件系统的工具,是 kde-system包组 的一部分。
如果你希望所有用户都能挂载某个硬盘,可以考虑在 fstab 的对应项中添加以下挂载选项:
-
users- 允许任意用户挂载和卸载(即使由其他用户挂载)对应的文件系统。该选项隐式包含了 noexec,nosuid 和 nodev 选项(除非被类似 users,exec,dev 和 suid 的选项覆盖)。 -
user- 允许一个普通用户挂载对应的文件系统,且仅允许同一个用户进行卸载。该选项隐式包含了 noexec,nosuid 和 nodev 选项(除非被类似 users,exec,dev 和 suid 的选项覆盖)。
对于没有文件权限功能的文件系统(例如 FAT 和 exFAT),可以显式指定整个硬盘和其中的文件的用户和用户组。可以通过 /etc/passwd 查找特定用户的 ID,其中第三列是用户 ID(UID),第四列是组 ID(GID)。
-
uid- 设置硬盘的所有者 ID -
gid- 设置硬盘的组 ID
对于 ext4,btrfs 和其他有权限功能的文件系统,其他用户可能没有查看硬盘的权限。请检查硬盘下的文件权限,并根据需要进行修改。
可以通过 findmnt --verify --verbose 检查 fstab 中的语法错误和无效选项。