Android 常用文件系统命令
当系统正在对某个文件系统的区域进行写入操作时(读的话没关系),突然断电,会造成文件系统对应区域的损坏(如写入脏数据), 而e2fsck算法就是用来恢复受损的文件系统,目的是:系统能够重启后,一切正常。当然,有损坏,想原样修复,当然不能100%保证,所以,就遇到了某些系统文件丢失,或者文件属性发生变化的事情。 文件损坏会报错structure needs cleaning(结构需要清理)。
Android车机系统的重启,默认是从通过QNX直接给Android掉电,没有走Android的正常重启流程;所以会造成Android系统一些分区的损坏,这需要了解一些文件系统的常用命令,来进行文件分区的查看,修复操作。整理一些常用的文件系统命令。
1.常用命令解析
1.1 mkfs.ext4
bash
mkfs.ext4 参数
-b block-size 块大小(1k,2k,4k)
-c 坏块测试
-l filename从文件读坏块列表
-C cluster-size 簇大小 (大块分配持性)
-D 使用direct I/O
-E 扩展属性
mmp_update_interval=MMP更新时间间隔,必需小于300s
stride=条块大小(RAID组中每个条带单元chunk大小)
stripe_width=条带大小 (单位为block),(在数据定时,块分配器尽可能的防止产生read-modify-write)
resize=保留在线调整时的空间大小
lazy_itable_init=0/1 inode表不完全初始化 (挂载时由内核在后台初始化) // 40TG mount后50M写初始化55分钟 (格式化时:20s,强制初始化时:7min) (mkfs.ext4 -E lazy_itable_init=0,lazy_journal_init=0 )
lazy_journal_init=0/1日志inode表不完全清0
test_fs设置文件系统体验标志
-F(force 强制)
-f fragment-size 指定片段大小
-g blocks-per-group 指定每一个块组内块的数量
-G number-of-groups 指定块组数量(在元数据负载重时可以提高元数据性能)
-i bytes-per-inode 指定 bytes/inode 比率
-I inode-size 指定inode大小
-j 创建一个ext3日志。默认创建合适大小的日志区
-J 创建指定属性的日志。逗号分隔。 (size=1024块 内部日志大小,device= 外部日志设备 )
size= journal-size 内部日志大小,单位为M,最小为1024个文件系统块,(最大为10240000个文件系统块或文件系统的一半)
device = external-journal 外部日志块设备(设备名,标签,UUID)
外部日志必需先创建:mke2fs -b 4096 -O journal_dev external-journal (/dev/ramhda)
mkfs.ext4 -J device= external-journal (/dev/ramhda) -F /dev/mapper/vggxxxxxxx
-L 设置volume 标签,最长为16个byte
-m 指定保留空间百分比,为root用户
-M 设置最后挂载目录
-n 不真正创建文件系统,只是显示创建的信息
-S 只写超级块和块组描述符。(当超级块和备份超级块错误后,可以用来恢复数据。因为它不会touching inode表和bitmap)
-O feature 指定创建文件系统时的持性(/etc/mke2fs.conf)
bigalloc 使能大块分配(cluster-size)
dir_index 使用哈希B树加速目录查找
extents 使用extents替代间接块
filetype在目录项中存储文件类型信息
flex_bg 允许为每一个块组元数据(分配bitmap和inode表)存放在任何位置
has_journal 创建ext3日志(-j)
journal_dev 在给定的设备上创建外部ext3日志
large_file 支持>2G的文件(现代内核会自动打开)
quota 创建quota inodes(inode#3为用户配额,inode#4为组配额) ,并在超级块中设置。
(挂载后自己启用quota)
resize_inode 保留空间以便未来块组描述表增长。用于resize2fs
sparse_super 创建少量的超缓块拷贝
uninit_bg 创建文件系统时不初始化所有的块组,加速创建时间,和e2fsck时间、
-O^has_journal 不启用日志
1.2 resize2fs命令
bash
resize2fs可用于调整ext2、ext3或ext4文件系统的大小。它可以用来扩容或缩小位于设备上的已卸载的文件系统。
参数:
-f :强制执行 resize 操作
[device]:分区名;
[size] :可以加也可以不加。如果加上 size 的話,加上一个单位例如 M,G。
1.3 e2fsck命令
指令:e2fsck
bash
使用权限 : 超级使用者
使用方式 : e2fsck [-pacnydfvFV] [-b superblock] [-B blocksize] [-l|-L bad_blocks_file] [-C fd] device
参数 :
device : 预备检查的硬碟 partition,例如:/dev/sda1
-a : 对 partition 做检查,若有问题便自动修复,等同 -p 的功能
-b : 设定存放 superblock 的位置
-B : 设定单位 block 的大小
-c : 检查该partition 是否有坏轨
-C file : 将检查的结果存到 file 中以便查看
-d : 列印 e2fsck 的 debug 结果
-f : 强制检查
-F : 在开始检查前,将device 的 buffer cache 清空,避免有错误发生
-l bad_blocks_file : 将有坏轨的block资料加到 bad_blocks_file 里面
-L bad_blocks_file : 设定坏轨的block资料存到 bad_blocks_file 里面,若无该档则自动产生
-n : 将档案系统以[唯读]方式开启
-p : 对 partition 做检查,若有问题便自动修复
-v : 详细显示模式
-V : 显示出目前 e2fsck 的版本
-y : 预先设定所有检查时的问题均回答[是]
大部份使用 e2fsck 来检查硬碟 partition 的情况时,通常都是情形特殊,因此最好先将该 partition umount,然后再执行 e2fsck 来做检查,若是要非要检查 / 时,则请进入 singal user mode 再执行。
1.4 fsck 命令
bash
参数 :
filesys : device 名称(eg./dev/sda1),mount 点 (eg. / 或 /usr)
-t : 给定档案系统的型式,若在 /etc/fstab 中已有定义或 kernel 本身已支援的则不需加上此参数
-s : 依序一个一个地执行 fsck 的指令来检查
-A : 对/etc/fstab 中所有列出来的 partition 做检查
-C : 显示完整的检查进度
-d : 列印 e2fsck 的 debug 结果
-p : 同时有 -A 条件时,同时有多个 fsck 的检查一起执行
-R : 同时有 -A 条件时,省略 / 不检查
-V : 详细显示模式
-y : 预先设定所有检查时的问题均回答[是]
-a : 如果检查有错则自动修复
-r : 如果检查有错则由使用者回答是否修复 参数 :
filesys : device 名称(eg./dev/sda1),mount 点 (eg. / 或 /usr)
-t : 给定档案系统的型式,若在 /etc/fstab 中已有定义或 kernel 本身已支援的则不需加上此参数
-s : 依序一个一个地执行 fsck 的指令来检查
-A : 对/etc/fstab 中所有列出来的 partition 做检查
-C : 显示完整的检查进度
-d : 列印 e2fsck 的 debug 结果
-p : 同时有 -A 条件时,同时有多个 fsck 的检查一起执行
-R : 同时有 -A 条件时,省略 / 不检查
-V : 详细显示模式
-y : 预先设定所有检查时的问题均回答[是]
-a : 如果检查有错则自动修复
-r : 如果检查有错则由使用者回答是否修复
注意 :
此指令可与 /etc/fstab 相互参考操作来加以了解。
1.5 e2fsck与fsck的区别
e2fsck只是针对ext2、ext3、ext4等ext系列文件系统的工具,fsck支持检查各种不同的文件系统,包含ext系列文件系统。
2.使用示例
2.1 e2fsck使用示例
检查 /dev/hda5 是否正常,如果有异常便自动修复,并且设定若有问答,均回答[是] :
bash
e2fsck -a -y /dev/hda5
2.2 fsck使用示例
- 检查 msdos 档案系统的 /dev/hda5 是否正常,如果有异常便自动修复 :
bash
fsck -t msdos -a /dev/hda5
- 修复Android的ext4分区
整个操作会删除挂载点所有文件,需要注意备份
1 首先df -t 查看出错的挂载点对应的文件系统和文件系统类型
2 然后umount这个文件系统 比如:umount /dev/sda1
3 然后根据文件系统类型不同操作不同,比如ext4:
bash
fsck.ext4 /dev/sda1
4 最后重启reboot