我们买电脑,都会关心硬盘有多大,你要明白,操作系统是通过文件系统来管理硬盘的,你在自己的电脑上随便找一个硬盘,右键点击属性,可以看到类似的内容
红色框里的NTFS就是文件系统的一种。
FUSE,implementing filesystems in user space,允许你在用户空间来订制自己的文件系统,你可能对文件系统没啥概念,我这样说吧,假设,你现在希望一个文件夹里的文件,不允许重新命名文件,你该如何实现这个功能呢?
正常的文件系统,都是可以对文件重命名的,除非你自己来实现一个文件系统,管理对文件的操作。如果在计算机内核层面定制,这就太困难了,咱们普通人哪搞得定系统内核。这个时候,你就可以用fuse, 来订制一个文件系统。
fuse,如同一个管道,我们在用户空间做的事情,会被它传输到系统内核,这里强调一下,fuse这个东西只有在类unix系统上才有。
接下来,我将结合具体示例,演示如何订制一个文件系统,不允许对文件进行重命名。
毕竟这个东西涉及到了文件系统和系统内核,所以我在做实验的时候,比较小心,用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/
这样就安装好了
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