fstab

出自 ArchWiki

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/蓝光) 非常有用。
  • 如果根文件系统是 btrfsXFS,则 fsck 顺序应设置为 0 而不是 1。参见 fsck.btrfs(8)fsck.xfs(8)

除非指定了 noauto 选项,否则 /etc/fstab 中所有指定的设备都将在启动时以及当 -a 标志与 mount(8) 一起使用时自动挂载。除非使用 nofail 选项,否则列出但不存在的设备将导致错误。

有关详细信息,请参阅 fstab(5) § DESCRIPTION

识别文件系统

本文或章节需要扩充。

原因: 除了内核名称描述符之外,还有更多的设备路径。 /dev/disk/by-*/*/dev/mapper/*/dev/md/* 具有不同级别的持久性,使用它们应该没有问题。(在 Talk:Fstab 中讨论)

有不同的方法来识别将在 /etc/fstab 中挂载的文件系统:内核名称描述符、文件系统标签和 UUID,以及 GPT 分区标签和 GPT 磁盘的 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 挂载选项,请参阅 systemd.mount(5)

本地分区

对于大型分区,允许不依赖于它的服务在 fsck 检查时启动可能更有效。这可以通过将以下选项添加到分区的 /etc/fstab 条目来实现

x-systemd.automount

这将仅在首次访问时 fsck 和挂载分区,并且内核将缓冲所有文件访问,直到它准备就绪。如果某人拥有一个非常大的 /home 分区,则此方法可能相关。

注意: 这会将文件系统类型设置为 autofs,默认情况下 locate 会忽略它。

远程文件系统

这同样适用于远程文件系统挂载。如果您希望仅在访问时挂载它们,则需要使用 x-systemd.automount 参数。此外,您可以使用 x-systemd.mount-timeout= 选项来指定 systemd 应等待挂载命令完成的时间。此外,_netdev 选项确保 systemd 了解挂载依赖于网络,并在网络联机后对其进行排序。

x-systemd.automount,x-systemd.mount-timeout=30,_netdev

加密文件系统

本文或章节是与 dm-crypt/System configuration#按需挂载 合并的候选对象。

注意: /etc/crypttab 不在本文的范围之内。(在 Talk:Fstab 中讨论)

如果您有带密钥文件的加密文件系统,您还可以将 noauto 参数添加到 /etc/crypttab 中相应的条目。然后,systemd 将不会在启动时打开加密设备,而是等待直到实际访问它,然后在挂载之前使用指定的密钥文件自动打开它。如果您例如使用加密的 RAID 设备,这可能会节省几秒钟的启动时间,因为 systemd 不必等待设备变为可用。例如

/etc/crypttab
data /dev/md/MyRAIDArray /etc/cryptsetup-keys.d/data.key noauto

自动卸载

您还可以使用 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 中用于分隔字段,因此如果任何字段(PARTLABELLABEL 或挂载点)包含空格,则这些空格必须替换为转义字符 \ 后跟 3 位八进制代码 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)wikipedia:Stat (system call)#Criticism of 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 选项链接目录

/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) § 绑定挂载操作

使用 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)。只需将 users 添加到挂载选项即可启用此功能。
  • user - 允许普通用户挂载文件系统。仅允许同一用户卸载。此选项隐含 noexec、nosuid 和 nodev 选项(除非被后续选项覆盖,例如选项行 user,exec,dev,suid)。只需将 user 添加到挂载选项即可启用此功能。

对于不具有内置文件权限的文件系统(如 FAT 和 exFAT),您可以显式设置整个驱动器及其文件的用户或组。您可以在 /etc/passwd 中查看特定用户的 ID。uid 是条目中的第三个数字,组 id 是第四个。

  • uid - 设置驱动器的所有者 ID
  • gid - 设置驱动器的组 ID

对于 ext4、btrfs 和其他具有权限能力的文件系统,其他用户可能不允许查看驱动器。请务必仔细检查 /path/to/drive/ 的权限,并根据您的需要进行修改。

另请参阅