使用python编写一个fuse文件系统

1. fuse 用户空间文件系统

我们买电脑,都会关心硬盘有多大,你要明白,操作系统是通过文件系统来管理硬盘的,你在自己的电脑上随便找一个硬盘,右键点击属性,可以看到类似的内容
文件系统

红色框里的NTFS就是文件系统的一种。

FUSE,implementing filesystems in user space,允许你在用户空间来订制自己的文件系统,你可能对文件系统没啥概念,我这样说吧,假设,你现在希望一个文件夹里的文件,不允许重新命名文件,你该如何实现这个功能呢?

正常的文件系统,都是可以对文件重命名的,除非你自己来实现一个文件系统,管理对文件的操作。如果在计算机内核层面定制,这就太困难了,咱们普通人哪搞得定系统内核。这个时候,你就可以用fuse, 来订制一个文件系统。

fuse,如同一个管道,我们在用户空间做的事情,会被它传输到系统内核,这里强调一下,fuse这个东西只有在类unix系统上才有。

接下来,我将结合具体示例,演示如何订制一个文件系统,不允许对文件进行重命名。

2. 在docker 中实验

毕竟这个东西涉及到了文件系统和系统内核,所以我在做实验的时候,比较小心,用docker 启动了一个container, 如果你胆子够大,直接在linux服务器上进行,也没有问题。

我启动了一个centos系统

docker run -it --name  fuse --cap-add SYS_ADMIN --device /dev/fuse cnetos:7 

容器里缺少libfuse , 因此需要安装,如果你试验的环境不缺少,就不需要安装了,可以使用下面的命令查看是否已经安装libfuse

find / -name libfuse.so*

https://github.com/libfuse/libfuse/releases/tag/fuse-2.9.7 下载安装包

tar -zxvf fuse-2.9.7.tar.gz
cd fuse-2.9.7/ && ./configure && make && make install
echo -e '\n/usr/local/lib' >> /etc/ld.so.conf
ldconfig
cp /usr/local/lib/libfuse.so.2.9.7 /usr/lib64/

这样就安装好了

3. fusepy

fusepy 是一个python库,为fuse提供接口,我们可以用它来实现一个自定义的文件系统

pip install fusepy

下载 https://github.com/skorokithakis/python-fuse-sample/blob/master/passthrough.py , 我们以这份代码为基础,站在前人的肩上,修改文件里的rename方法

    def rename(self, old, new):
        return 0

接下来创建 /home/src /home/myfs 这两个目录,执行命令

python3 test.py /home/src /home/myfs

/home/src 是挂载点, /home/myfs 是我们自己定制的文件系统,你在myfs里创建的文件,都真实的存在于src中, 在src中做的任何操作,都镜像的反应在myfs中。现在,请在myfs中执行下面的两个操作

touch 1.txt
mv 1.txt 2.txt

第一个命令用于创建一个文件,mv命令对文件进行重名名,正常情况下,1.txt的文件名称会被修改为2.txt, 但现在,在我定制的文件系统里,不允许重命名,因此,文件名称不会发生变化。

当程序停止时,你进入myfs,将看不到任何文件,因为文件被存储在src目录中,程序再次启动后,myfs将恢复如初。

本文所演示的,只是一个简单功能,你可以根据自身的需要,定制功能更加强大的文件系统。

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案