LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 773|回复: 4

ShadowFS计划

[复制链接]
发表于 2005-3-29 11:39:23 | 显示全部楼层 |阅读模式
本版是讨论内核的,那我来说一个我已经设想了很久的计划:ShadowFS,希望通过编写内核驱动,能够付诸实现!

什么是ShadowFS?它是一个“影子”文件系统。当我们做LiveCD的时候,LiveCD是不可写的。因此应用上就比较麻烦,比如每次都要输入相同的许多命令等等。最显然的一点,就是每次都要运行一遍 adsl-setup,然后才能adsl-start。

ShadowFS希望通过设定一个磁盘分区作为另一个只读分区的影子,来解决这个问题。对于用户来说,他面对的是一个可读写的文件系统。任何写入操作都会写入影子分区中;但如果影子分区上没有所需要的数据,ShadowFS会从原始只读分区中读取。

为了避免将一个影子分区对应于一个错误的只读分区(例如,你用同一个影子分区对应了两个只读分区,这样会造成严重错误!),需要进行校验。通过iso9660、squashfs等只读文件系统内部的一些功能,应当可以生成校验码,在格式化影子分区的时候写入进去。对于ext2等可读写的文件系统,创建影子分区也可以,但如果创建了影子分区之后,另外又将ext2分区mount成可读写的,则有可能会出现冲突,且很难防止。

例如:mkshadowfs --from /dev/cdrom -t iso9660 -o $Options /dev/hda7这条命令就为/dev/cdrom创建了一个影子分区/dev/hda7。其中,会设定mount /dev/cdrom时所用的文件类型和选项。这些也需要一并记录在影子分区中。

当需要加载影子分区的时候,可以采用这样的命令:
mount -t shadowfs /dev/hda7
由于/dev/hda7已经包含了足够的信息表明哪个设备是对应的原始设备,该设备应该用什么选项来mount等等,所以munt这个分区就相对变得简单。

为了方便有时候要用不同的选项mount同一个设备,或者适应硬件上的改变(例如,把硬盘拆到其它机器上去了),这些元信息是可以修改的。但fs类型和内部的签名不能修改。所有元信息都可以查询。

setshadowfs --from /dev/loop0 /dev/hda7

这条命令即可把/dev/hda7修改为对应/dev/loop0。

showshadowfs /dev/hda7
这条命令显示shadowfs分区hda7的信息。可能的输出如下:
/dev/hda7 is a shadow of /dev/loop0
Original filesystem is iso9660
Options of original filesystem is ...
Signature: 0x88043343aabbc
Current Size:10,020MB
Used Size: 200MB

有了Shadowfs,LiveCD的功能可以变得异常强大:首次在某台机器上使用时,可以提示你建立shadowfs;在以后的使用中,可以自动搜索适合的Shadowfs加以使用,这将是超炫的体验!
更加更加炫的是,可以用loop0来做Shadowfs。这样,只要这台机器上有足够的空间,LiveCD就可以在现有分区上(甚至是Windows分区)创建一个文件,以后需要写入的内容就放在这个文件里---是不是酷毙了?这样的LiveCD已经不仅仅是“活的”了,它还可以安装软件、调整设置,可以做任何硬盘版OS能做的事情。

但是,Shadowfs项目现在还不存在。没有大家的支持,以上的设想就不可能实现。从技术的角度看,实现上除了需要对内核文件系统有经验之外,似乎困难不大。有高手愿意参与这样一个项目吗?
发表于 2005-3-29 13:05:42 | 显示全部楼层
这个实现起来并不难,只要将对原分区的所有写操作重定向到影子分区就行了.同时在原分区的读操作中加入钩子.检测影子分区中是不是存在同样的内容.以便进行操作.
同时在文件系统中建立相应的数据结构,用于管理影子分区中的数据.

我对这个问题很感兴趣.有人愿做的话.我想加入.
我分析过ext2,对从文件操作的系统调用到.最终的磁盘操作作出一些研究.
回复 支持 反对

使用道具 举报

发表于 2005-3-29 17:23:39 | 显示全部楼层
SLAX就使用了类似shadowfs的技术,其名为ovlfs,同样实现了可写的光盘根文件系统。目前ovlfs的补丁集只对内核2.4有效。

其实,我觉得没有这个必要去设计一个shadowfs或者ovlfs,同样的可写并且定制可复用的功能,使用简单的"mount --bind"命令以及shell算法即可实现。 ;)

ps:在Linux下的开发设计,首先应该确定大前提是放在用户层还是内核层,前者是优先的考虑。纯属个人意见。
回复 支持 反对

使用道具 举报

发表于 2005-3-29 18:06:08 | 显示全部楼层
谢谢提醒!!
也是.最重要的是简单.好用!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-30 01:01:49 | 显示全部楼层
很感兴趣。我看了ovlfs,应该是可以达到基本要求。但如果有一个1GB的文件在DVD上(比如是个iso文件),而它有错误启动不了,我想要二进制编辑其中的内容让它能启动,这个文件系统会把整个文件拷贝到storage_filesystem(我称为影子分区的地方)上,虽然你可能仅需要改动几个字节。当然,如果这点能得到改进,并能支持更新的内核,则我的项目就不需要了。

至于用户态的方法,如果真有这种魔法我很佩服。但我能够从一个不支持X的LiveCD上用正常的方法(下载源码,解压,配置,编译,安装)安装X并使它正常运行吗?应该如何做?也许能实现,但所费的心力估计不下于写一个内核驱动吧?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表