fstab
fstab(5)文件可用于定义磁盘分区,各种其他块设备或远程文件系统应如何装入文件系统。
每个文件系统在一个单独的行中描述。这些定义将在引导时动态地转换为系统挂载单元,并在系统管理器的配置重新加载时转换。在启动需要挂载的服务之前,默认设置会自动 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 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
<device>
描述要挂载的特定块设备或远程文件系统; 请见 #文件系统标识。<dir>
描述挂载目录。<type>
文件系统类型。<options>
相关的挂载选项; 请见 mount(8) § FILESYSTEM-INDEPENDENT_MOUNT_OPTIONS 和 ext4(5) § MOUNT_OPTIONS。<dump>
会被 dump(8) 工具检查。该字段通常设置为0
, 以禁用检查。<fsck>
设置引导时文件系统检查的顺序; 请见 fsck(8)。对于 root 设备该字段应该设置为1
。对于其它分区该字段应该设置为2
,或设置为0
以禁用检查。
auto
类型会让 mount 命令猜测设备使用的文件系统。这对于 光学介质 (CD/DVD/Blu-ray) 是很有用的。- 如果 root 文件系统是 Btrfs 或 XFS,fsck 顺序应该设置为
0
而不是1
。请见 fsck.btrfs(8) 和 fsck.xfs(8)。
除非指定 noauto
选项,否则在启动以及使用带有 -a
标识的 mount(8) 命令时,所有在 /etc/fstab
里指定的设备会自动被挂载。除非使用 nofail
选项,否则在列表中出现但实际不存在的设备会导致错误。
文件系统标识[编辑 | 编辑源代码]
在 /etc/fstab
配置文件中你可以用不同的方法表示文件系统:内核名称、标签 或者 UUID,对于 GPT 磁盘还可以使用 GPT 标签 和 分区 UUID。内核名称不应该被使用,而 UUID 或 分区 UUID 应该优于标签。更多解释请见持久化块设备名称。建议在继续阅读本文前先阅读那篇文章。
在本节中,我们将通过示例描述如何使用所有可用的挂载方法来挂载文件系统。以下示例中使用的命令 lsblk -f
和 blkid
的输出可在文章持久化块设备名称中找到。
要使用内核名称,在第一列中使用 /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
分区准备完成。
- 挂载远程文件系统也是同理。如果你仅想在需要的时候才挂载,也可以添加
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
选项仅对目录禁用文件访问时间的写入,而其他文件仍会写入访问时间。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。