在使用overlay文件的过程中,发现有时拷贝一个超出overlay文件系统容量范围时却没有报错,可写的容量比overlay文件系统容量大很多,猜想与工作目录文件系统有关,现在准备探索一下。
准备
虚拟机环境
Linux localhost.localdomain 3.10.0-514.2.2.el7.x86_64 #1 SMP Tue Dec 6 23:06:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
准备一张32G卡,分区和文件系统如下:
第1分区容量32MB,文件系统ext4
第2分区容量1MB,文件系统ext4
第3分区容量32MB,文件系统ubifs(count of LEBs, minimum is 17=2.125MB)
第5分区容量256MB,文件系统btrfs(Minimum size for each btrfs device is 41943040=40MB.)
第6分区容量1MB,文件系统jffs2(TF卡不是MTD设备,所有不支持mkfs.jffs2格式化)
磁盘 /dev/sdb:31.9 GB, 31914983424 字节,62333952 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x269a2bd6
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 67583 32768 83 Linux
/dev/sdb2 67584 69631 1024 83 Linux
/dev/sdb3 69632 135167 32768 83 Linux
/dev/sdb4 135168 62333951 31099392 5 Extended
/dev/sdb5 137216 661503 262144 83 Linux
/dev/sdb6 663552 665599 1024 83 Linux
sudo mkfs.ext4 /dev/sdb1
sudo mkfs.ext4 /dev/sdb2
sudo mkfs.ubifs -m 512 -e 128KiB -c 256 /dev/sdb3
sudo mkfs.btrfs -f /dev/sdb5
创建目录
mkdir merge rom rwdir
挂载
挂载只读ext4只读文件系统目录
sudo mount -t ext4 -o ro /dev/sdb1 rom/
挂载工作目录ext4文件系统
sudo mount -t ext4 /dev/sdb2 rwdir/
sudo mkdir rwdir/base rwdir/work
挂载overlay
sudo mount -t overlay overlay -o lowerdir=rom,upperdir=rwdir/base,workdir=rwdir/work merge
/dev/sdb1 on /home/yubo.wang/overlay/rom type ext4 (ro,relatime,seclabel,data=ordered)
/dev/sdb2 on /home/yubo.wang/overlay/rwdir type ext4 (rw,relatime,seclabel)
overlay on /home/yubo.wang/overlay/merge type overlay (rw,relatime,seclabel,lowerdir=rom,upperdir=rwdir/base,workdir=rwdir/work)
/dev/sdb1 27M 779K 24M 4% /home/yubo.wang/overlay/rom
/dev/sdb2 1003K 25K 907K 3% /home/yubo.wang/overlay/rwdir
overlay 1003K 25K 907K 3% /home/yubo.wang/overlay/merge
写1MB的全0文件到merge目录下,提示空间不足,实际可写文件大小为956K,把预留空间也用掉了,可见ext4不带压缩。
[yubo.wang@localhost overlay]$ sudo dd if=/dev/zero of=merge/1mb bs=1M count=1
dd: 写入"merge/1mb" 出错: 设备上没有空间
记录了1+0 的读入
记录了0+0 的写出
978944字节(979 kB)已复制,0.00321381 秒,305 MB/秒
[yubo.wang@localhost overlay]$ ls merge/1mb -lh
-rw-r--r--. 1 root root 956K 1月 16 16:12 merge/1mb
挂载工作目录ubi文件系统
卸载merge和rwdir目录挂载,挂载
[yubo.wang@localhost overlay]$ sudo mount -t ubifs /dev/sdb3 rwdir/
mount: 未知的文件系统类型“ubifs”
虚拟机验证失败, 在板子上面验证
ubi1:rootfs_data on /ubifs type ubifs (rw,relatime)
overlay on / type overlay (rw,relatime,lowerdir=/,upperdir=/ubifs/base,workdir=/ubifs/work)
overlay 1.0M 232.0K 712.0K 25% /
写10MB的全0文件到根目录下正常,超过21MB才提示空间不足,删除全0文件后拷贝一个1MB的zip压缩文件就提示空间不足,说明ubifs默认带压缩功能,且默认不压缩多媒体文件,比如MP4文件。
挂载工作目录btrfs文件系统
默认挂载方式
sudo mount /dev/sdb5 rwdir/
/dev/sdb5 on /home/yubo.wang/overlay/rwdir type btrfs (rw,relatime,seclabel,space_cache,subvolid=5,subvol=/)
sudo mkdir rwdir/base rwdir/work
sudo mount -t overlay overlay -o lowerdir=rom,upperdir=rwdir/base,workdir=rwdir/work merge
/dev/sdb5 256M 17M 175M 9% /home/yubo.wang/overlay/rwdir
/dev/sdb1 27M 779K 24M 4% /home/yubo.wang/overlay/rom
overlay 256M 17M 175M 9% /home/yubo.wang/overlay/merge
写300MB的全0文件到根目录提示空间不足,实际写入文件为剩余的175MB,看来btrfs默认不带压缩功能,但可支持。
[yubo.wang@localhost overlay]$ sudo dd if=/dev/zero of=merge/300mb bs=1M count=300
dd: 写入"merge/300mb" 出错: 设备上没有空间
记录了176+0 的读入
记录了175+0 的写出
183500800字节(184 MB)已复制,17.0566 秒,10.8 MB/秒
[yubo.wang@localhost overlay]$ ls merge/ -lh
总用量 176M
-rw-r--r--. 1 root root 175M 1月 16 17:49 300mb
修改挂载支持压缩,目前btrfs支持lzo zlib两种算法,-o compress(-force)=lzo(zlib),-force强制压缩所有文件,lzo对性能提升最为明显
sudo mount -o compress=lzo /dev/sdb5 rwdir/
/dev/sdb5 on /home/yubo.wang/overlay/rwdir type btrfs (rw,relatime,seclabel,compress=lzo,space_cache,subvolid=5,subvol=/)
/dev/sdb1 27M 779K 24M 4% /home/yubo.wang/overlay/rom
/dev/sdb5 256M 17M 175M 9% /home/yubo.wang/overlay/rwdir
overlay 256M 17M 175M 9% /home/yubo.wang/overlay/merge
挂载支持lzo压缩后可以写300MB文件,实际占用41MB。
[yubo.wang@localhost overlay]$ sudo dd if=/dev/zero of=merge/300mb bs=1M count=300
记录了300+0 的读入
记录了300+0 的写出
314572800字节(315 MB)已复制,3.40944 秒,92.3 MB/秒
[yubo.wang@localhost overlay]$ ls -lh merge/
总用量 301M
-rw-r--r--. 1 root root 300M 1月 16 17:59 300mb
/dev/sdb1 27M 779K 24M 4% /home/yubo.wang/overlay/rom
/dev/sdb5 256M 27M 134M 17% /home/yubo.wang/overlay/rwdir
overlay 256M 27M 134M 17% /home/yubo.wang/overlay/merge
挂载工作目录jffs2文件系统
虚拟机里面挂载失败
[yubo.wang@localhost overlay]$ sudo mount -t jffs2 /dev/sdb6 rwdir/
mount: 未知的文件系统类型“jffs2”
在开发板里面测试
/dev/mtdblock4 on /rom/jffs type jffs2 (rw,relatime)
overlay on / type overlay (rw,relatime,lowerdir=/,upperdir=/jffs/base,workdir=/jffs/work)
overlay 1.0M 988.0K 36.0K 96% /
写10MB的全0文件到根目录下正常,超过26MB才提示空间不足,删除全0文件后拷贝一个1MB的zip压缩文件就提示空间不足,说明jffs2默认带压缩功能。
总结
目前得知ext4不带压缩功能,ubifs和jffs2默认带压缩功能,btrfs默认不带压缩功能但可配置支持压缩。