跳转到内容

fstab

来自 Arch Linux 中文维基

fstab(5)文件可用于定义如何挂载硬盘分区以及各种块设备和远程文件系统。

每个文件系统都分别在单独一行中定义,这些定义将在系统引导或重新加载系统管理器配置时被动态转换为 systemd 挂载单元。默认设置将在需要挂载文件系统的服务启动之前自动进行 fsck 并挂载文件系统。例如,systemd 会自动确保类似 NFSSamba 的远程文件系统仅在网络可用后才会进行挂载。因此,/etc/fstab 中指定的本地和远程文件系统挂载应能开箱即用。具体信息请参考 systemd.mount(5)

如果仅提供了单个目录或是设备作为参数,那么 mount 会调用 fstab 来填充其它参数。在这种情况下,将调用 fstab 中列出的挂载参数。

这篇文章的某些内容需要扩充。

原因:需解释 systemd-remount-fs.service(8) 的作用,并建议通过 rootflags 调用无法通过重挂载应用的选项。 (在 Talk: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
提示:
  • auto 类型会让 mount 命令猜测设备使用的文件系统。这对于光学介质(CD/DVD/Blu-ray)非常有用。
  • 如果根文件系统是 btrfsXFS,那么 fsck 顺序应该设置为 0 而不是 1。具体信息请参考 fsck.btrfs(8)fsck.xfs(8)

除非指定 noauto 选项,否则在启动以及使用带有 -a 标识的 mount(8) 命令时,所有在 /etc/fstab 里指定的设备都会自动被挂载。除非使用 nofail 选项,否则在列表中出现但实际不存在的设备会导致错误。

更多信息请参考 fstab(5) § DESCRIPTION

文件系统标识

[编辑 | 编辑源代码]

这篇文章的某些内容需要扩充。

原因:除了内核名称外,还有其他类型的设备路径。/dev/disk/by-*/*/dev/mapper/*/dev/md/* 有着不同程度的持久性,而且使用它们应该是没有问题的。 (在 Talk:Fstab 中讨论)

/etc/fstab 配置文件中,有多种方法可用于标识文件系统:内核名称、文件系统标签或者 UUID,对于 GPT 硬盘还可以使用 GPT 分区标签和 UUID。不应使用内核名称,而 UUID 或分区 UUID(PARTUUID)应该优于标签。更多信息请参考块设备持久化命名。建议在继续阅读本文前先阅读那篇文章。

在本节中,我们将通过示例描述如何使用所有可用的挂载方法来挂载文件系统。以下示例中使用的命令 lsblk -fblkid 的输出可在块设备持久化命名一文中找到。

内核名称

[编辑 | 编辑源代码]

运行 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
警告:块设备的内核名称不是持久化的,可能在每次启动系统时都不同,因此不能被用在配置文件中(包括 /etc/fstab)。

文件系统标签

[编辑 | 编辑源代码]

运行 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
注意:如果你的标签中包含空格,请参考 #路径名有空格

文件系统 UUID

[编辑 | 编辑源代码]

运行 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

GPT 分区标签

[编辑 | 编辑源代码]

运行 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
注意:如果你的分区标签中包含空格,请参考 #路径名有空格

GPT 分区 UUID

[编辑 | 编辑源代码]

运行 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 自动挂载

[编辑 | 编辑源代码]

请参考 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 选项无法按以下描述工作。(在 Talk:Fstab#3.2 External Device options 中讨论)


对于仅在可用时挂载,未找到时忽略的外部设备,需要使用 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 中用于划分列,如果任意一列(PARTLABELLABEL 或挂载点)中含有空格,这些空格必须被替换为转义符 \ 后面跟着三位数八进制代码 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 参数

[编辑 | 编辑源代码]

下列 atime 选项可能影响驱动器性能。

  • strictatime 选项会在文件每次被访问时更新它们的访问时间。这更多用于 Linux 服务器,而对于桌面用户并没有多少价值。strictatime 选项的缺点是即使从页面缓存中读取文件(从内存而不是从驱动器读取)也会导致一次写入。
  • noatime 选项将在读取文件时不将文件访问时间写入驱动器。开启这个选项对多数应用不会产生影响,除了那些需要知道文件自上次修改后是否被访问的应用。在启用此选项的情况下,只要写入文件,文件的写入时间信息就会更新。
  • nodiratime 选项仅对目录禁用文件访问时间的写入,而其他文件仍会写入访问时间。
    注意: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 /

GPT 分区自动挂载

[编辑 | 编辑源代码]

在根据可发现分区规范进行了分区的情况下,使用 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 挂载

[编辑 | 编辑源代码]

你可以使用 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 文件,具体信息请参考 genfstab.

GUI 工具

[编辑 | 编辑源代码]

以下为一系列可用于修改挂载点的工具,它们的 fstab 编辑功能可能不完整,但常用的功能都有,可以简化你的工作流:

  • GNOME Disks — 用于处理存储设备的 GNOME 工具,是 gnome包组 的一部分。
https://apps.gnome.org/DiskUtility/ || gnome-disk-utility
  • KDE Partition Manager — 可用于管理电脑上的硬盘、分区和文件系统的工具,是 kde-system包组 的一部分。
https://apps.kde.org/partitionmanager/ || partitionmanager

修改用户权限和所有权

[编辑 | 编辑源代码]

如果你希望所有用户都能挂载某个硬盘,可以考虑在 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 中的语法错误和无效选项。

参见

[编辑 | 编辑源代码]