由于设备需要能回复出产设置功能,以前都是将最原始的文件都备份一份, 但是目前存在一个问题:系统升级后只是修改了一小部分文件,很多内容没有修改,这样就导致备份的大多数内容其实在浪费空间;那能不能和fork 那样做到cow呢?也就是升级的时候你要修改此文件,我才去备份!这样节约存储空间。so可以参考docker的aufs文件系统来设计自己的系统数据盘
mount -n -t aufs -o br:/fp/modified/root=rw :/fp/update/root=ro+wh :/fp/orig/root=rr,noatime unionfs /union_root
当需要修改一个文件,而该文件位于低层branch时,顶层branch会直接复制低层branch的文件至顶层再进行修改,而低层的文件不变,这种方式即是CoW技术(写复制),AUFS默认支持Cow技术。
当删除一个低层branch文件时,只是在顶层branch对该文件进行重命名并隐藏,实际并未删除文件,只是不可见,这种方式即AUFS的whiteout(写隐藏)。
写时复制(copy-on-write,常被简写为 CoW),也叫隐式共享,是一种提高资源使用效率的资源管理技术。它的思想是:如果一个资源是重复的,在没有对资源做出修改前,并不需要立即复制出一个新的资源实例,这个资源被不同的所有者共享使用。当任何一个所有者要对该资源做出修改时,复制出一个新的资源实例给该所有者进行修改,修改后的资源成为其所有者的私有资源。通过这种资源共享的方式,可以显著地减少复制相同资源带来的消耗,但是这样做也会在进行资源的修改时增加一部分开销
aufs文件系统一旦挂载,只能对挂载联合文件系统的目录进行操作,不能对其他用于合并的目录进行操作。节省空间:AUFS 的 CoW 特性能够允许在多个容器之间共享分层,从而减少物理空间占用。
- 查找文件:AUFS 的找性能在层数非常多时会出现下降,层数越多,查找性能越低。
- 性能:AUFS 的 CoW 特性在写入大型文件时第一次会出现延迟。
$ tree .
├── dir1
│ ├── a
│ └── b
├── dir2
│ ├── b
│ └── c
└── mnt
mount -t aufs -o dirs=./dir1:./dir2 none ./mnt $echo hello > ./mnt/b $ cat ./dir1/b hello $ cat ./dir2/b
我们向dir1和dir2都同时拥有的文件b中写入了一个test,上层目录dir1中的b的内容被修改为了test,而下层目录dir2中的b 依然是空的。所以修改unionFS中的文件,只会修改最上层的文件,这就是aufs的一些简单的功能
aufs联合文件系统在用在制作系统盘时的主要作用有2个,系统升级和系统恢复。
系统升级主要是更新系统。系统恢复主要是当系统不正常或误删系统文件的时候,可以将系统恢复正常和恢复rootfs误删的系统文件。
系统升级:
当我们需要进行升级的时候,通过将升级的系统文件解压到update层和modified层来实现升级,解压到modified层是为了立即生效,解压到update层是为了备份升级内容。
系统恢复:
恢复到打了升级包的状态:
场景:系统出问题,需要恢复系统,但是想保留之前打的所有升级包内容,包括修复的漏洞,解决的bug等。
方案:通过删除aufs文件系统中modified层中root和nsfocus目录中的所有内容后,重启,则恢复到了升级后的版本
恢复出厂设置:
场景:系统出问题,需要恢复系统,直接恢复到出厂设置。
方案:通过删除aufs文件系统中modified层和update层中root和nsfocus目录中的所有内容后,重启,则恢复到了出厂设置。
mount -n -t aufs -o \ br:/fp/modified/root=rw\ :/fp/update/root=ro+wh\ :/fp/orig/root=rr,noatime unionfs /union_root /bin/mount -n -t aufs -o remount,udba=notify,noatime,noxino unionfs /union_root mount -n -t aufs -o \ br:/fp/modified/fpwork=rw\ :/fp/update/fpwork=ro+wh\ :/fpwork=rr,noatime unionfs /union_root/fproot/fpwork /bin/mount -n -t aufs -o remount,udba=notify,noatime,noxino unionfs /union_root/fproot/fpwork