目录
1 引言
2 常见镜像格式
3 格式化工具
3.1 mkfs.ext4安装
3.2 常用参数
4 应用
4.1 resize2fs
参考
1 引言
根据上一章的操作,rootfs构建完成后,烧写到系统中去之前,需要打包为img镜像,所以本章内容将着重介绍如何将 rootfs打包为img镜像,具体为ext4格式的镜像。
2 常见镜像格式
Windows系统格式化硬盘时,会指定格式FAT或者NTFS,而Linux的文件系统格式为ext3、ext4、xfs、btrfs和f2fs等。本文常用的文件系统格式为ext4
3 格式化工具
mkfs ——该命令用来在特定的分区创建linux文件系统,常见的文件系统有ext2,ext3,ext4等,执行mkfs命令其实是在调用:
mkfs.ext2 | mkfs.ext3 |mkfs.ext4 |
3.1 mkfs.ext4安装
安装命令
sudo apt-get install mtd-utils e2fsprogs e3fsprogs e4fsprogs
3.2 常用参数
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 不启用日志
在我们的应用中上述参数几乎都用不到。
4 应用
1)生成一个空的2MiB文件 dd if=/dev/zero of=rootfs.ext4 bs=1M count=2048 (指定每一块大小为1M,一共又2048块,那么就是1M * 1024 = 1 GiB)
2)对生成的文件进行格式化 mkfs.ext4 rootfs.ext4
3)挂载此空镜像 mount -o loop rootfs.ext4 /mnt
4)向挂载好的文件系统mnt中写入rootfs中的内容 cp rootfs /mnt
5)卸载根文件系统(意味着镜像已经制作完成) umount /mnt
4.1 resize2fs
扩大文件系统
resize2fs [参数] [文件]
resize2fs命令是用来增大或者收缩未加载的“ext2/ext3/ext4”文件系统的大小,它可以放大或者缩小没有挂载的文件系统的大小。如果文件系统已经挂载,它可以扩大文件系统的大小,前提是内核支持在线调整大小。
如:
resize2fs /dev/sdb1 调整sdb1分区大小。
当我们的rootfs镜像烧写完成之后,可以通过fdisk -l 来查看镜像包的挂载位置,并使用resize2fs扩容。
参考
https://yangfeiffei.github.io/linux-basics/2019/08/25/linux-mkfs-and-mount.html
http://linux.51yip.com/search/mkfs.ext4