fstab
fstab(5) 文件可以用于定义磁盘分区、各种其他块设备或远程文件系统应如何挂载到文件系统中。
每个文件系统都在单独的一行中描述。这些定义将在启动时以及重新加载系统管理器配置时动态转换为 systemd 挂载单元。默认设置将在启动需要挂载文件系统的服务之前自动 fsck 并挂载文件系统。例如,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) § 文件系统无关挂载选项 和 ext4(5) § ext4 的挂载选项。<dump>
由 dump(8) 实用程序检查。此字段通常设置为0
,这将禁用检查。<fsck>
设置启动时文件系统检查的顺序;参见 fsck(8)。对于根设备,它应该是1
。对于其他分区,它应该是2
,或0
以禁用检查。
auto
类型允许 mount 命令猜测使用的文件系统类型。这对于 光盘介质 (CD/DVD/蓝光) 非常有用。- 如果根文件系统是 btrfs 或 XFS,则 fsck 顺序应设置为
0
而不是1
。参见 fsck.btrfs(8) 和 fsck.xfs(8)。
除非指定了 noauto
选项,否则 /etc/fstab
中所有指定的设备都将在启动时以及当 -a
标志与 mount(8) 一起使用时自动挂载。除非使用 nofail
选项,否则列出但不存在的设备将导致错误。
有关详细信息,请参阅 fstab(5) § DESCRIPTION。
识别文件系统
有不同的方法来识别将在 /etc/fstab
中挂载的文件系统:内核名称描述符、文件系统标签和 UUID,以及 GPT 分区标签和 GPT 磁盘的 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
文件系统 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
加密文件系统
如果您有带密钥文件的加密文件系统,您还可以将 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
中用于分隔字段,因此如果任何字段(PARTLABEL、LABEL 或挂载点)包含空格,则这些空格必须替换为转义字符 \
后跟 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
选项仅禁用目录的文件访问时间写入,而其他文件仍然会写入访问时间。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 的一部分。
- KDE Partition Manager — 帮助您管理计算机上的磁盘、分区和文件系统的实用程序。属于 kde-system 的一部分。
修改用户权限和所有权
如果您想允许任何用户挂载驱动器,请考虑将以下挂载选项添加到您的 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
- 设置驱动器的所有者 IDgid
- 设置驱动器的组 ID
对于 ext4、btrfs 和其他具有权限能力的文件系统,其他用户可能不允许查看驱动器。请务必仔细检查 /path/to/drive/
的权限,并根据您的需要进行修改。