/etc/fstab 文件学习systemd与该文件关系
文章目录
- 一、文件字段
- 1.1、设备标识
- 1.2、挂载点
- 1.3、文件系统类型
- 1.4、挂载选项
- 1.5、dump
- 1.5、fsck顺序
- 二、/etc/fstab 与systemd 的关系
- 2.1、/etc/fstab 与systemd 的关系
- 2.2、systemd 之前/etc/fstab生效过程
- 2.3、systemd 时代/etc/fstab生效过程
- 三、相关知识
- 3.1、如何更具UUID 确定文件设备名?</u>
- 3.2、如何生成UUID?
- 3.3、文件系统格式化
- 3.4、swap 分区和swap文件的创建
- 参考文档
/etc/fstab
文件是 Linux 系统中用于定义和管理文件系统的挂载信息的配置文件,决定了系统启动时如何挂载文件系统。这个文件包含了系统中所有需要在启动时
自动挂载的文件系统的条目。如下:
# <文件系统> <挂载点> <文件系统类型> <选项> <dump> <fsck顺序>
UUID=123456789 / ext4 defaults 1 1
/dev/sda2 /boot ext4 defaults 1 2
/dev/sda3 none swap sw 0 0
/dev/sdb1 /var/log ext4 nosuid 0 0
/dev/sdb2 /var/lib ext4 defaults 0 0
LABEL=docker /var/lib/docker ext4 defaults,noatime,nodiratime,prjquota 0 0
一、文件字段
字段 | 含义 |
---|---|
设备标识(file systems ) | 可以是设备名(如 /dev/sda1)、UUID、LABEL 或者其他标识符。 |
挂载点(dir ) | 文件系统将被挂载到的目录路径。 |
文件系统类型(type ) | 如 ext4, xfs, nfs 等。 |
挂载选项(options ) | 如 defaults, ro (只读), rw (读写) 等。 |
备份选项(dump ) | 用于 dump 命令的参数,0 表示不备份。 |
文件系统检查顺序(pass ) | 用于 fsck 命令的参数,0 表示不检查。 |
1.1、设备标识
- 可以使用设备文件名、UUID或者标签,也可以是NFS等远程文件系统。
- 远程文件系统配置方式是
<host>:<dir>
,与直接使用mount命令挂载远程文件系统是一致的。 - 使用物理设备名或分区名,如 /dev/sdb1,表示第一个硬盘的第一个分区.
- UUID和LABEL配置方式是
LABEL=<label>
或者UUID=<uuid>
三种方式优缺点
UUID
是一个 128 位的数字,用于唯一标识文件系统。每个文件系统在格式化时都会生成一个唯一的 UUID。
优点:
- 唯一性:UUID 是全局唯一的,不会因为设备顺序或名称的变化而改变。
- 稳定性:即使磁盘顺序或设备文件名发生变化,UUID 也不会改变,因此更稳定。
缺点:
- 可读性差:UUID 是一串较长的字符串,不容易记忆和识别。
- 适用场景:适用于需要高稳定性和唯一性的环境,尤其是在多磁盘或多分区的系统中
设备文件名
是指设备在系统中的路径,例如 /dev/sda1 或 /dev/vda1。
优点:
- 易读性:设备文件名较短且易于理解,方便管理员识别。
缺点:
- 不稳定性:设备文件名可能会因为磁盘顺序变化、磁盘更换或系统重启等原因而改变。
- 依赖硬件:如果硬件配置发生变化(如添加或移除磁盘),设备文件名可能会发生变化。
- 适用场景:适用于单磁盘或简单的系统配置,或者在不需要高度稳定性的环境中。
LABEL
是用户为文件系统指定的一个标签,可以在格式化文件系统时设置。
优点:
- 可读性好:LABEL 可以是任意的字符串,便于管理员理解和记忆。
- 灵活性:可以为多个文件系统设置相同的 LABEL,但通常建议每个文件系统的 LABEL 是唯一的。
缺点:
- 非唯一性:LABEL 不是全局唯一的,如果多个文件系统设置了相同的 LABEL,可能会导致混淆。
- 依赖用户设置:需要在格式化文件系统时正确设置 LABEL,否则无法使用。
- 适用场景:适用于需要良好可读性和灵活性的环境,特别是在多磁盘或多分区的系统中,可以通过有意义的 LABEL 来标识文件系统。
1.2、挂载点
文件系统挂载的位置,即它在目录树中的路径。挂载点可以是任何一个空目录;如果是swap ,挂载点 通常是 none,因为 swap 不需要实际的挂载点,文件系统类型 是 swap,并且 选项 通常包括 sw(表示启用 swap)。
如下:
# Swap 分区:
/dev/sdb2 none swap sw 0 0
# Swap 文件:
/swapfile none swap sw 0 0
1.3、文件系统类型
文件系统类型字段指定了挂载点所使用的文件系统类型,此字段告诉操作系统在挂载时应该使用哪种文件系统驱动来读取和写入数据。常见文件系统类型如下:
文件系统类型 | 说明 |
---|---|
ext4 | 第四代扩展文件系统,广泛用于 Linux 系统 |
xfs | 高性能的日志文件系统,适用于大容量存储 |
btrfs | 具有高级功能(如快照、池化)的现代文件系统 |
nfs | 网络文件系统,用于通过网络共享文件 |
vfat | 支持 FAT32 文件系统的驱动 |
ntfs | 支持 NTFS 文件系统的驱动 |
tmpfs | 临时文件系统,存储在内存中 |
swap | 交换分区 |
1.4、挂载选项
挂载选项字段用于指定文件系统在挂载时的行为。这些选项可以控制文件系统的读写权限、日志记录、性能优化等方面。常见挂载选项及其含义如下:
挂载选项 | 含义 | 示例 |
---|---|---|
defaults | 使用文件系统的默认挂载参数,例如 ext4 的默认参数为:rw, suid, dev, exec, auto, nouser, async | /dev/sda1 /mnt/data ext4 defaults 0 2 |
auto | 在启动时或键入了 mount -a 命令时自动挂载。(默认) | /dev/sda1 /mnt/data ext4 auto 0 2 |
noauto | 只在你的命令下被挂载。 | /dev/sda1 /mnt/data ext4 noauto 0 2 |
exec | 允许执行此分区的二进制文件。 | /dev/sda1 /mnt/data ext4 exec 0 2 |
noexec | 不允许执行此文件系统上的二进制文件。 | /dev/sda1 /mnt/data ext4 noexec 0 2 |
ro | 以只读模式挂载文件系统。 | /dev/sda1 /mnt/data ext4 ro 0 2 |
rw | 以读写模式挂载文件系统。 | /dev/sda1 /mnt/data ext4 rw 0 2 |
user | 允许任意用户挂载此文件系统,若无显示定义,隐含启用 noexec, nosuid, nodev 参数。 | /dev/sda1 /mnt/data ext4 user 0 2 |
users | 允许所有 users 组中的用户挂载文件系统. | /dev/sda1 /mnt/data ext4 users 0 2 |
nouser | 只能被 root 挂载。(默认) | /dev/sda1 /mnt/data ext4 nouser 0 2 |
owner | 允许设备所有者挂载. | /dev/sda1 /mnt/data ext4 owner 0 2 |
sync | I/O 同步进行。每次写操作都会立即写入磁盘,保证数据完整性但会降低性能。 | /dev/sda1 /mnt/data ext4 sync 0 2 |
async | I/O 异步进行。写操作可能会延迟写入磁盘,提高性能但可能有数据丢失的风险(默认) | /dev/sda1 /mnt/data ext4 async 0 2 |
dev | 解析文件系统上的块特殊设备。允许将文件系统中的设备文件解释为设备节点(默认) | /dev/sda1 /mnt/data ext4 dev 0 2 |
nodev | 不解析文件系统上的块特殊设备。 | /dev/sda1 /mnt/data ext4 nodev 0 2 |
suid | 允许 suid 操作和设定 sgid 位。允许设置用户 ID 和组 ID 位(默认),这一参数通常用于一些特殊任务,使一般用户运行程序时临时提升权限。 | /dev/sda1 /mnt/data ext4 suid 0 2 |
nosuid | 禁止 suid 操作和设定 sgid 位。禁止设置用户 ID 和组 ID 位 | /dev/sda1 /mnt/data ext4 nosuid 0 2 |
noatime | 不更新文件系统上 inode 访问记录,可以提升性能。 | /dev/sda1 /mnt/data ext4 noatime 0 2 |
nodiratime | 不更新文件系统上的目录 inode 访问记录,可以提升性能(参见 atime 参数)。 | /dev/sda1 /mnt/data ext4 nodiratime 0 2 |
relatime | 实时更新 inode access 记录。只有在记录中的访问时间早于当前访问才会被更新。(与 noatime 相似,但不会打断如 mutt 或其它程序探测文件在上次访问后是否被修改的进程。),可以提升性能。更新文件的访问时间戳,但只有当文件的修改时间戳或状态时间戳发生变化时才更新访问时间戳。 | /dev/sda1 /mnt/data ext4 relatime 0 2 |
flush | 主要用于 NFS(Network File System)文件系统。这个选项的作用是确保数据在写入时被立即刷新到服务器上,从而提高数据的一致性和可靠性。 | 192.168.1.100:/exports/data /mnt/nfs nfs defaults,flush 0 0 |
nofail | 即使设备在启动时不可用,系统仍会继续正常启动,不会中断或进入应急模式。此时,系统只会记录设备挂载失败的错误信息,但不会影响整体启动过程 | /dev/sda1 /mnt/data ext4 nofail 0 2 |
x-systemd.automount | 指定在访问挂载点时自动挂载。文件系统在首次访问时(例如用户尝试访问 /mnt/usb 目录时)才会自动挂载。此选项避免了系统启动时挂载失败的问题,因为它只在需要时挂载 | /dev/sda1 /mnt/data ext4 x-systemd.automount 0 2 |
comment | 忽略此条目,用于注释 | /dev/sda1 /mnt/data ext4 comment 0 2 |
loop | 指定该设备是一个循环设备 | /path/to/file.img /mnt/loop ext4 loop 0 2 |
offset | 指定循环设备的偏移量 | /path/to/file.img /mnt/loop ext4 loop,offset=1024 0 2 |
size | 指定循环设备的大小 | /path/to/file.img /mnt/loop ext4 loop,size=1024 0 2 |
discard | 启用 TRIM 支持,用于 SSD | /dev/sda1 /mnt/data ext4 discard 0 2 |
x-systemd.device-timeout | 指定等待设备出现的超时时间 | /dev/sda1 /mnt/data ext4 x-systemd.device-timeout=10 0 2 |
x-systemd.requires | 指定挂载前需要启动的服务 | /dev/sda1 /mnt/data ext4 x-systemd.requires=network-online.target 0 2 |
x-systemd.idle-timeout | 指定在没有活动时自动卸载的时间 | /dev/sda1 /mnt/data ext4 x-systemd.idle-timeout=1min 0 2 |
bind | 绑定挂载,将一个目录挂载到另一个目录 | /path/to/source /path/to/target none bind 0 0 |
remount | 重新挂载已经挂载的文件系统 | /dev/sda1 /mnt/data ext4 remount 0 2 |
mand | 强制执行强制锁 | /dev/sda1 /mnt/data ext4 mand 0 2 |
nomand | 禁用强制锁。 | /dev/sda1 /mnt/data ext4 nomand 0 2 |
iversion | 启用 inode 版本号。 | /dev/sda1 /mnt/data ext4 iversion 0 2 |
nobarrier | 禁用屏障支持,提高性能但可能降低数据完整性。 | /dev/sda1 /mnt/data ext4 nobarrier 0 2 |
barrier | 启用屏障支持,提高数据完整性但可能降低性能。 | /dev/sda1 /mnt/data ext4 barrier 0 2 |
data | 控制数据写入方式,如 writeback, ordered, journal。 | /dev/sda1 /mnt/data ext4 data=writeback 0 2 |
errors | 控制文件系统错误处理方式,如 continue, remount-ro, panic。 | /dev/sda1 /mnt/data ext4 errors=remount-ro 0 2 |
acl | 启用访问控制列表。 | /dev/sda1 /mnt/data ext4 acl 0 2 |
noacl | 禁用访问控制列表。 | /dev/sda1 /mnt/data ext4 noacl 0 2 |
usrquota | 启用用户配额。 | /dev/sda1 /mnt/data ext4 usrquota 0 2 |
grpquota | 启用组配额。 | /dev/sda1 /mnt/data ext4 grpquota 0 2 |
prjquota | 启用项目配额。 | /dev/sda1 /mnt/data ext4 prjquota 0 2 |
inode64 | 启用 64 位 inode 支持。 | /dev/sda1 /mnt/data ext4 inode64 0 2 |
bigalloc | 启用大块分配。 | /dev/sda1 /mnt/data ext4 bigalloc 0 2 |
stripe | 指定 RAID 条带宽度。 | /dev/sda1 /mnt/data ext4 stripe=256 0 2 |
delalloc | 延迟分配。 | /dev/sda1 /mnt/data ext4 delalloc 0 2 |
nodelalloc | 禁用延迟分配。 | /dev/sda1 /mnt/data ext4 nodelalloc 0 2 |
logbufs | 指定日志缓冲区数量。 | /dev/sda1 /mnt/data ext4 logbufs=16 0 2 |
logbsize | 指定日志块大小。 | /dev/sda1 /mnt/data ext4 logbsize=256k 0 2 |
1.5、dump
dump 字段是用于指定文件系统备份策略的一个字段。这个字段的值是一个数字,通常用于与 dump 命令配合使用,以决定哪些文件系统需要备份以及备份的频率。
- 这个字段的值是一个整数,范围从 0 到 9。
- 0: 表示该文件系统不需要被 dump 命令备份。
- 1-9: 表示该文件系统的备份优先级。数字越小,优先级越高。例如,1 表示高优先级,9 表示低优先级。
UUID=1234-5678 / ext4 defaults 0 1
UUID=8765-4321 /home ext4 defaults 1 2
UUID=abcd-efgh /data xfs noatime,nodiratime 0 0
1.5、fsck顺序
fsck 顺序字段(也称为 pass 字段)用于指定文件系统检查工具 fsck 在系统启动时检查文件系统的顺序。
- 这个字段的值是一个整数,通常取值为 0、1 或 2。
- 0: 表示该文件系统不需要在启动时进行 fsck 检查。
- 1: 表示该文件系统是根文件系统(通常是 /),并且需要在启动时首先进行检查。
- 2: 表示该文件系统不是根文件系统,但在启动时需要进行检查。这些文件系统会在根文件系统检查之后按顺序进行检查。
二、/etc/fstab 与systemd 的关系
2.1、/etc/fstab 与systemd 的关系
- 兼容性:systemd 完全支持 /etc/fstab 文件,并且会在系统启动时读取并处理其中的条目。这意味着你可以在 /etc/fstab 中定义的文件系统仍然会被 systemd 自动挂载。
- 动态挂载:systemd 提供了更灵活的挂载机制,例如 systemd-automount 单元,可以在需要时动态挂载文件系统。这些单元可以由用户或系统事件触发,而不是仅在系统启动时挂载。
- 单位文件:systemd 使用 .mount 和 .automount 单位文件来定义文件系统的挂载行为。这些单位文件可以手动创建,也可以通过 systemd-fstab-generator 从 /etc/fstab 自动生成。
- 优先级:如果你在 /etc/fstab 和 systemd 单位文件中都定义了相同的挂载点,systemd 会优先使用单位文件中的配置。这允许你覆盖 /etc/fstab 中的设置,以实现更复杂的挂载行为。
2.2、systemd 之前/etc/fstab生效过程
在传统的 init 系统中,/etc/fstab 的处理主要由以下几个步骤完成:
- 读取和解析 /etc/fstab:
系统启动时,init 进程会读取并解析 /etc/fstab 文件,获取所有需要挂载的文件系统条目。 - 执行 mount -a 命令:
init 进程会调用 mount -a 命令来挂载 /etc/fstab 中定义的所有文件系统。-a 选项表示挂载所有在 /etc/fstab 中定义的文件系统。 - 处理挂载选项:
mount 命令会根据 /etc/fstab 中定义的选项来挂载每个文件系统。例如,如果某个文件系统被标记为 noauto,则它不会在启动时自动挂载。 - 根文件系统挂载:
根文件系统(通常是 /)会在早期启动阶段由内核或 initrd(初始 RAM 磁盘)进行挂载。/etc/fstab 中定义的其他文件系统会在根文件系统挂载后进行挂载。 - 错误处理:
如果某个文件系统无法挂载,mount 命令会记录错误信息,并继续尝试挂载其他文件系统。具体的错误处理行为可能会因系统配置而异。
2.3、systemd 时代/etc/fstab生效过程
systemd 通过其内置的生成器和单元文件机制来处理 /etc/fstab 中的条目,确保这些文件系统在系统启动时被正确挂载。以下是 systemd 时代 /etc/fstab 生效的具体过程:
-
systemd-fstab-generator:
systemd 使用 systemd-fstab-generator 工具来读取 /etc/fstab 文件,并根据其中的条目生成相应的 .mount 和 .automount 单元文件。这些单元文件会被放置在 /run/systemd/generator 目录下。.mount
单元文件:
定义了文件系统的挂载点、类型和选项。
例如,对于 /etc/fstab 中的一个条目:
UUID=1234-5678 /mnt/data ext4 defaults 0 2
会生成一个类似如下的单元文件/run/systemd/generator/mnt-data.mount
:[Unit] Description=Mount for /mnt/data [Mount] What=/dev/disk/by-uuid/1234-5678 Where=/mnt/data Type=ext4 Options=defaults [Install] WantedBy=multi-user.target
.automount
单元文件:
如果 /etc/fstab 中的条目包含 x-systemd.automount 选项,systemd 会生成一个 .automount 单元文件,用于延迟挂载(即在访问挂载点时才挂载)。
例如,对于以下条目:
UUID=1234-5678 /mnt/data ext4 x-systemd.automount 0 2
会生成一个类似如下的单元文件/run/systemd/generator/mnt-data.automount
:[Unit] Description=Automount for /mnt/data [Automount] Where=/mnt/data [Install] WantedBy=multi-user.target
-
单元文件的加载
生成的.mount
和.automount
单元文件会被 systemd 加载并激活。systemd 会在启动过程中根据这些单元文件来挂载或自动挂载文件系统。 -
挂载过程
- 自动挂载 (x-systemd.automount):
如果启用了自动挂载,systemd 会在访问挂载点时才挂载文件系统。例如,当第一次访问 /mnt/data 时,systemd 会触发挂载操作。
自动挂载可以减少启动时间,因为文件系统不会在启动时立即挂载,而是在需要时才挂载。 - 立即挂载:
如果没有启用自动挂载,systemd 会在启动过程中立即挂载文件系统。
这些挂载点通常由local-fs.target
或multi-user.target
等目标单元管理。
- 自动挂载 (x-systemd.automount):
-
错误处理
如果某个文件系统无法挂载,systemd 会记录错误信息,并继续尝试挂载其他文件系统。
你可以通过 journalctl 查看详细的日志信息,以诊断挂载失败的原因
三、相关知识
3.1、如何更具UUID 确定文件设备名?
$ cat /etc/fstab
UUID=f0d8224f-6cba-426a-a091-b70024003f95 /boot ext4 defaults 1 2
$ lsblk -f | grep f0d8224f-6cba-426a-a091-b70024003f95
└─vda1 ext4 f0d8224f-6cba-426a-a091-b70024003f95 /boot
可知 此设备文件名为/dev/vda1
3.2、如何生成UUID?
设备文件的 UUID(Universally Unique Identifier)是在文件系统格式化时生成的。每个文件系统在格式化时都会生成一个唯一的 UUID,以确保其在全球范围内的唯一性。
- 生成 UUID 的过程–格式化文件系统:
当你使用 mkfs 命令或其他文件系统工具格式化一个分区或磁盘时,UUID 会自动生成。例如,使用mkfs.ext4
命令格式化一个分区时,UUID 会自动分配给该文件系统。 - UUID 生成算法:
UUID 通常是通过特定的算法生成的,这些算法旨在确保生成的 UUID 在全球范围内是唯一的。常见的 UUID 生成算法包括基于时间戳、随机数和硬件 MAC 地址
等。 - 存储 UUID:
生成的 UUID 会被存储在文件系统的超级块中,这是一个包含文件系统元数据的区域。你可以使用 blkid 或 lsblk 等命令来查看文件系统的 UUID。
3.3、文件系统格式化
文件系统格式化是一个将磁盘或分区初始化为特定文件系统类型的过程。格式化会创建文件系统的结构,包括超级块、inode 表、数据块等,并分配 UUID 和其他元数据。
格式化过程:
- 创建超级块:超级块包含文件系统的元数据,如文件系统的大小、状态信息、UUID 等。
- 创建 inode 表:inode 是文件系统中用于存储文件元数据的数据结构,如文件权限、所有者、时间戳等。
- 创建数据块:数据块用于存储实际的文件数据。
- 分配 UUID:生成并分配一个唯一的 UUID 给文件系统。
- 写入其他元数据:如位图、日志等,用于文件系统的管理和维护。
常见文件系统类型:
- ext4:Linux 系统常用的文件系统。
- NTFS:Windows 系统常用的文件系统。
- FAT32:跨平台兼容性较好的文件系统,但有单文件大小限制。
- XFS:适用于大文件和高性能需求的文件系统。
- Btrfs:具有高级功能(如快照、校验和)的现代文件系统。
格式化的时机
- 首次使用:通常在新磁盘或分区首次使用时进行格式化。
- 重新格式化:当需要更改文件系统类型或修复严重损坏的文件系统时,可能会重新格式化。
- 恢复出厂设置:某些情况下,恢复设备到出厂设置时会进行格式化。
机器每次启动都会格式化文件系统吗?
不会。机器每次启动时不会自动进行文件系统格式化。格式化是一个破坏性的操作,会删除磁盘上的所有数据。
检查和修复:在某些情况下,操作系统可能会在启动时检查文件系统的完整性,并在发现错误时尝试修复。例如:
fsck
(File System Consistency Check):在 Linux 系统中,fsck 工具会在启动时检查和修复文件系统错误。chkdsk
(Check Disk):在 Windows 系统中,chkdsk 工具可以检查和修复文件系统错误。
3.4、swap 分区和swap文件的创建
创建 Swap 分区
假设你已经有一个未使用的分区 /dev/sdb2,你可以将其设置为 swap 分区:
sudo mkswap /dev/sdb2
sudo swapon /dev/sdb2
然后在 /etc/fstab 中添加以下条目:
/dev/sdb2 none swap sw 0 0
创建 Swap 文件
假设你想创建一个 2GB 的 swap 文件 /swapfile,你可以按以下步骤操作:
- 创建空文件:
sudo fallocate -l 2G /swapfile
- 设置适当的权限:
sudo chmod 600 /swapfile
- 将文件设置为
swap:sudo mkswap /swapfile
- 启用 swap 文件:
sudo swapon /swapfile
- 在 /etc/fstab 中添加条目:
/swapfile none swap sw 0 0
- 验证 Swap 配置:
sudo swapon --show
参考文档
1、https://juejin.cn/post/7259354549165178941
2、https://blog.csdn.net/peng2hui1314/article/details/142675349
3、https://www.ctyun.cn/zhishi/p-216081
4、https://blog.csdn.net/szembed/article/details/126933883