1,一个简单的 /etc/fstab,使用内核名称标识磁盘:
/etc/fstab
# <file system> <dir> <type> <options> <dump> <pass>
tmpfs /tmp tmpfs nodev,nosuid 0 0
/dev/sda1 / ext4 defaults,noatime 0 1
/dev/sda2 none swap defaults 0 0
/dev/sda3 /home ext4 defaults,noatime 0 2
字段定义
/etc/fstab 文件包含了如下字段,通过空格或 Tab 分隔:
<file system> <dir> <type> <options> <dump> <pass>
<file systems> - 要挂载的分区或存储设备.
<dir> - <file systems>的挂载位置。
<type> - 要挂载设备或是分区的文件系统类型,支持许多种不同的文件系统:ext2, ext3, ext4, reiserfs, xfs, jfs, smbfs, iso9660, vfat, ntfs, swap 及 auto。 设置成auto类型,mount 命令会猜测使用的文件系统类型,对 CDROM 和 DVD 等移动设备是非常有用的。
<options> - 挂载时使用的参数,注意有些 参数是特定文件系统才有的。一些比较常用的参数有 (mount(8)):
auto - 在启动时或键入了 mount -a 命令时自动挂载。
noauto - 只在你的命令下被挂载。
exec - 允许执行此分区的二进制文件。
noexec - 不允许执行此文件系统上的二进制文件。
ro - 以只读模式挂载文件系统。
rw - 以读写模式挂载文件系统。
user - 允许任意用户挂载此文件系统,若无显示定义,隐含启用 noexec, nosuid, nodev 参数。
users - 允许所有 users 组中的用户挂载文件系统.
nouser - 只能被 root 挂载。
owner - 允许设备所有者挂载.
sync - I/O 同步进行。
async - I/O 异步进行。
dev - 解析文件系统上的块特殊设备。
nodev - 不解析文件系统上的块特殊设备。
suid - 允许 suid 操作和设定 sgid 位。这一参数通常用于一些特殊任务,使一般用户运行程序时临时提升权限。
nosuid - 禁止 suid 操作和设定 sgid 位。
noatime - 不更新文件系统上 inode 访问记录,可以提升性能(参见 atime 参数)。
nodiratime - 不更新文件系统上的目录 inode 访问记录,可以提升性能(参见 atime 参数)。
relatime - 实时更新 inode access 记录。只有在记录中的访问时间早于当前访问才会被更新。(与 noatime 相似,但不会打断如 mutt 或其它程序探测文件在上次访问后是否被修改的进程。),可以提升性能(参见 atime 参数)。
flush - vfat 的选项,更频繁的刷新数据,复制对话框或进度条在全部数据都写入后才消失。
defaults - 使用文件系统的默认挂载参数,例如 ext4 的默认参数为:rw, suid, dev, exec, auto, nouser, async.
<dump> dump 工具通过它决定何时作备份. dump 会检查其内容,并用数字来决定是否对这个文件系统进行备份。 允许的数字是 0 和 1 。0 表示忽略, 1 则进行备份。大部分的用户是没有安装 dump 的 ,对他们而言 <dump> 应设为 0。
<pass> fsck 读取 <pass> 的数值来决定需要检查的文件系统的检查顺序。允许的数字是0, 1, 和2。 根目录应当获得最高的优先权 1, 其它所有需要被检查的设备设置为 2. 0 表示设备不会被 fsck 所检查。
2,文件系统标识
在 /etc/fstab配置文件中你可以以三种不同的方法表示文件系统:内核名称、UUID 或者 label。使用 UUID 或是 label 的好处在于它们与磁盘顺序无关。如果你在 BIOS 中改变了你的存储设备顺序,或是重新拔插了存储设备,或是因为一些 BIOS 可能会随机地改变存储设备的顺序,那么用 UUID 或是 label 来表示将更有效。参见 持久化块设备名称 。
要显示分区的基本信息请运行:
$ lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 ext4 Arch_Linux 978e3e81-8048-4ae1-8a06-aa727458e8ff /
├─sda2 ntfs Windows 6C1093E61093B594
└─sda3 ext4 Storage f838b24e-3a66-4d02-86f4-a2e73e454336 /media/Storage
sdb
├─sdb1 ntfs Games 9E68F00568EFD9D3
└─sdb2 ext4 Backup 14d50a6c-e083-42f2-b9c4-bc8bae38d274 /media/Backup
sdc
└─sdc1 vfat Camera 47FA-4071 /media/Camera
3,UUID
所有分区和设备都有唯一的 UUID。它们由文件系统生成工具 (mkfs.*) 在创建文件系统时生成。
lsblk -f 命令将显示所有设备的 UUID 值。/etc/fstab 中使用 UUID= 前缀:
/etc/fstab
# <file system> <dir> <type> <options> <dump> <pass>
tmpfs /tmp tmpfs nodev,nosuid 0 0
UUID=24f28fc6-717e-4bcd-a5f7-32b959024e26 / ext4 defaults,noatime 0 1
UUID=03ec5dd3-45c0-4f95-a363-61ff321a09ff /home ext4 defaults,noatime 0 2
UUID=4209c845-f495-4c43-8a03-5363dd433153 none swap defaults 0 0
4,Android fstab
#<src><mnt_point> <type> <mnt_flags and options><fs_mgr_flags>
Android 10 引入了以下可在 fstab 文件中使用的 fs_mgr 标记:
first_stage_mount 表明将由第一阶段 init 装载分区。
logical 表明这是一个动态分区。
avb=vbmeta-partition-name 可指定 vbmeta 分区。第一阶段 init 可初始化该分区,然后再装载其他分区。如果该条目的 vbmeta 分区已由上一行中的其他 fstab 条目指定,可以省略此标记的参数。
以下示例展示了将 system、vendor 和 product 分区设置为逻辑(动态)分区的 fstab 条目。
#<dev> <mnt_point> <type> <mnt_flags options> <fs_mgr_flags>
system /system ext4 ro,barrier=1 wait,slotselect,avb=vbmeta_system,logical,first_stage_mount
vendor /vendor ext4 ro,barrier=1 wait,slotselect,avb=vbmeta,logical,first_stage_mount
product /product ext4 ro,barrier=1 wait,slotselect,avb,logical,first_stage_mount
barrier:
Linux日志和barrier功能
要理解barrier,你首先需要理解文件系统日志功能。
常用的文件系统使用日志功能来保证文件系统的完整性。该功能背后的思路很简单:
在写入新的 数据块到磁盘之前,会先将元数据写入日志。
预先将元数据写入日志
可以保证在写入真实数据前后一旦发生错误,日志功能能很容易地回滚到更改之前的状态。
这个 方法确保了不会发生文件系统崩溃的情况。
单独使用日志功能不能保证没有任何差错。
现在的磁盘大都有大容量的缓存,数据不会立即写入到磁盘中,而是先写入到磁盘缓存中。
到这一步,磁盘控制器 就能更加高效地将其复制到磁盘中。
这对性能来说是有好处的,
但是对日志功能来说则相反。为了保证日志百分之百可靠,它必须绝对保证元数据在真实数据写入之
前被预先写入。这就是我们要介绍文件系统barrier的原因。
我们很容易理解使用barrier的根本原因:
barrier本身禁止在barrier之后写入数据,真实的数据块将在barrier被写入之前完 全写入磁盘。
使用barrier可以确保文件系统的完整性,
因为barrier功能 在EXT4文件系统中是默认启用的
(除非你的操作系统更改了这个默认设置)。
使用barrier保护的风险之一是,在系统中断时,数据会
留在缓存中,而永不会写入文件系统。一个简单的电池备份控制器可以避免这个问题。
当服务器使用的这个控制器出故障了,磁盘控制器 仍然能保证变更操作,这充分排除了
barrier使用的需要。 使用barrier的另一个不利之处在于,你需要付出降低性能的代价。
如果你需要顶级的性能,那么你可以用挂载选项-o barrier=0来关闭barrier功能,
比如: mount /dev/sda2 -o barrier=0 /data。 文件系统barrier功能非常有用,
但是不能和设备映射器配合工作。如果你需要使用这类设备,但是又想要保证文件系统完整性,
那么你可以用电池备 份磁盘控制器。如果你的硬件不支持这个, 那么你只能避免使用设备映射器,
这样才能用barrier功能来保障文件系统完整性。还有,如果你希望得到更好的 系统性能,
最好也不要开启barrier功能,它会降低系统运行速度