跳转至内容

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/Blu-ray)很有用。
  • 如果根文件系统是 btrfsXFS,fsck 顺序应设置为 0 而不是 1。请参阅 fsck.btrfs(8)fsck.xfs(8)

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

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

文件系统标识

本文章或章节需要扩充。

原因: 设备路径不仅限于内核名称符。/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

加密文件系统

如果您有带有密钥文件的辅助加密文件系统,您也可以将 nofail 参数添加到 /etc/crypttab/etc/fstab 中的相应条目。systemd 不会等待 cryptsetup 服务完成解锁和挂载文件系统,而是可能在到达 default.target 之后完成挂载。这将避免因解锁不需要在启动后立即使用的辅助分区而导致的任何启动延迟。有关 cryptsetup 配置,请参阅 dm-crypt/System configuration#非阻塞挂载

由于挂载服务默认只等待 90 秒让分区可用,因此密钥文件可用性的任何延迟都可能导致挂载失败。为避免这种情况,请将 x-systemd.mount-timeout=0 选项添加到 fstab,以确保挂载服务无限期地等待分区解锁。

/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 外部设备选项 讨论)

需要挂载但 absent 时被忽略的外部设备可能需要 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)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 时,可以通过按照 可发现分区规范 进行分区,并让 systemd-gpt-auto-generator(8) 挂载分区,从而从 /etc/fstab 中省略某些分区。请参阅 systemd#GPT 分区自动挂载

要为这些卷指定自定义挂载选项,请使用 by-designator 标识符 作为设备名称。

/etc/fstab
/dev/disk/by-designator/root  /     ext4  defaults,noatime  0 1
/dev/disk/by-designator/swap  none  swap  defaults,discard  0 0

绑定挂载

您可以使用 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.cn/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/ 的权限,并根据您的需要进行修改。

验证更改

使用 findmnt --verify --verbose 检查 fstab 中的语法错误和无效选项。

参见