Linux-overlay工作目录文件系统压缩支持探索

在使用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默认不带压缩功能但可配置支持压缩。

 

猜你喜欢

转载自blog.csdn.net/TSZ0000/article/details/86508178