目录

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