Android fstab学习

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功能,它会降低系统运行速度

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值