fstab

来自 Arch Linux 中文维基

fstab(5)文件可用于定义磁盘分区,各种其他块设备或远程文件系统应如何装入文件系统。

每个文件系统在一个单独的行中描述。这些定义将在引导时动态地转换为系统挂载单元,并在系统管理器的配置重新加载时转换。在启动需要挂载的服务之前,默认设置会自动 fsck 和挂载文件系统。例如,Systemd 会自动确保远程文件系统挂载(如 NFSSamba )仅在网络设置完成后启动。因此,在 /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   noatime   0      1
UUID=f9fe0b69-a280-415d-a03a-a32752370dee none  swap   defaults  0      0
UUID=b411dc99-f0a0-4c87-9e05-184977be8539 /home ext4   noatime   0      2
提示:
  • auto 类型会让 mount 命令猜测设备使用的文件系统。这对于 光学介质 (CD/DVD/Blu-ray) 是很有用的。
  • 如果 root 文件系统是 BtrfsXFS,fsck 顺序应该设置为 0 而不是 1。请见 fsck.btrfs(8)fsck.xfs(8)

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

文件系统标识[编辑 | 编辑源代码]

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

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

/etc/fstab 配置文件中你可以用不同的方法表示文件系统:内核名称、标签 或者 UUID,对于 GPT 磁盘还可以使用 GPT 标签 和 分区 UUID。内核名称不应该被使用,而 UUID 或 分区 UUID 应该优于标签。更多解释请见持久化块设备名称。建议在继续阅读本文前先阅读那篇文章。

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

要使用内核名称,在第一列中使用 /dev/sdxy

内核名称[编辑 | 编辑源代码]

运行 lsblk -f 以列出分区,并在 NAME 列中的值的前面加上 /dev/

/etc/fstab
# <device>        <dir>        <type>        <options>        <dump> <fsck>
/dev/sda1         /boot        vfat          defaults         0      2
/dev/sda2         /            ext4          defaults         0      1
/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=ESP         /boot        vfat          defaults         0      2
LABEL=System      /            ext4          defaults         0      1
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=CBB6-24F2                            /boot vfat   defaults  0      2
UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /     ext4   defaults  0      1
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=EFI\040system\040partition /boot vfat   defaults  0      2
PARTLABEL=GNU/Linux                  /     ext4   defaults  0      1
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=d0d0d110-0a71-4ed6-936a-304969ea36af /boot vfat   defaults  0      2
PARTUUID=98a81274-10f7-40db-872a-03df048df366 /     ext4   defaults  0      1
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 挂载选项。

自动挂载[编辑 | 编辑源代码]

  • 如果 /home 分区较大,可以让不依赖 /home 分区的服务先启动。把下面的参数添加到 /etc/fstab 文件中 /home 项目的参数部分即可:
noauto,x-systemd.automount

这样 /home 分区只有需要访问时才会被挂载。内核会缓存所有的文件操作,直到 /home 分区准备完成。

注意: 这样做会使 /home 的文件系统类型被识别为 autofs,造成 mlocate 查询时忽略该目录。实际加速效果因配置而异,所以请自己权衡是否需要。
  • 挂载远程文件系统也是同理。如果你仅想在需要的时候才挂载,也可以添加 noauto,x-systemd.automount 参数。另外,可以设置 x-systemd.device-timeout=# 参数,设置超时时间,以防止网络资源不能访问的时候浪费时间。
  • 如果你的加密文件系统需要密钥,则需要添加 noauto 参数到 /etc/crypttab 文件中的对应位置。systemd 开机的时候就不会打开这个加密设备,会一直等待到设备被访问时再使用密钥文件挂载。比如在使用加密RAID设备的时候可以节省一定的时间,因为 systemd 不必等到设备可用后才能访问。例如:
/etc/crypttab
data /dev/md0 /root/key noauto

本机分区[编辑 | 编辑源代码]

假如有一个大分区,当它通过 fsck 被检查时,允许不依赖它可能会更快启动。这可以通过向 /etc/fstab 的分区条目中添加下列选项来完成:

noauto,x-systemd.automount

这会使分区第一次被访问时才运行 fsck 和 mount,并且在它准备好前内核会缓冲所有对它的文件访问。 例如,有人有非常大的 /home 分区时,这个方法可能会起作用。

注意: 这会使文件系统类型 autofs 默认被 mlocate 忽略。

远程文件系统[编辑 | 编辑源代码]

对于远程文件系统的挂载也是一样的。如果你想让它们只在访问时被挂载,你需要使用 noauto,x-systemd.automount 参数。另外,你还可以使用 x-systemd.mount-timeout= 选项来指定 systemd 应该在命令完成前等待多久。还有,_netdev 选项确保 systemd 明白挂载需要网络并且在网络就绪后再执行挂载。

加密文件系统[编辑 | 编辑源代码]

如果你有带有密钥文件的加密文件系统,你可以在 /etc/crypttab 向对应条目添加 noauto 参数。systemd 将不会在启动时打开加密设备,而是会等到它实际被访问时再在挂载前自动通过指定的密钥文件打开它。假如你使用一个加密的 RAID 设备,这可能会为你在启动时省下几秒钟,因为 systemd 不会等待变为可用。举个例子:

/etc/crypttab
data /dev/md0 /root/key noauto

自动卸载[编辑 | 编辑源代码]

你也许可以通过 x-systemd.idle-timeout 参数来为挂载设置一个空闲超时。举个例子:

noauto,x-systemd.automount,x-systemd.idle-timeout=1min

这会使 systemd 在设备空闲 1 分钟后卸载它。

外部设备[编辑 | 编辑源代码]

外部设备在插入时挂载,在未插入时忽略。这需要 nofail 选项,可以在启动时若设备不存在直接忽略它而不报错。举个例子:

/etc/fstab
/dev/sdg1        /media/backup    jfs    nofail,x-systemd.device-timeout=1ms    0  2

路径名有空格[编辑 | 编辑源代码]

因为空格在 fstab 中用于划分列,如果任意一列(PARTLABEL, LABEL 或 挂载点)中含有空格,这些空格必须被替换为转义符 \ 后面跟着三位数八进制代码 040:

/etc/fstab
UUID=47FA-4071     /home/username/Camera\040Pictures   vfat  noatime       0  0
/dev/sda7          /media/100\040GB\040(Storage)       ext4  noatime,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 小时。

重新挂载 root 分区[编辑 | 编辑源代码]

如果处于某些原因 root 分区被不正确地挂载为只读,通过以下命令将 root 分区以读写访问重新挂载:

# mount -o remount,rw /

GPT 分区自动挂载[编辑 | 编辑源代码]

在使用 UEFI/GPT 时,根据可发现分区规范进行分区,可以在 /etc/fstab 中省略某些分区,并具有 systemd-gpt-auto-generator(8) 挂载分区。请见 Systemd#GPT 分区自动挂载.

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

参见[编辑 | 编辑源代码]