FUSE

FUSE

什么是FUSE呢?

FUSE 是一个用户空间文件系统框架。它由一个 kernel 模块(fuse.ko), 用户空间 library (libfuse.*)和 一些 mount 工具组成。FUSE 中最重要的一个功能就是允许被安全的挂载使用。sshfs 就是一个很好的例子,它是一个基于 sftp 协议实现的安全网络文件系统。

虽然FUSE运行在用户空间,有一定的性能开销,但是开发者却可以轻松根据自己的需要开发适合自己的文件系统,一个东西之所以能够存在,那么它的优势肯定是大于它的劣势的。

Have fun

于是打算实现一个自己的文件系统,后端基于 HTTP 协议请求到公司的服务树上,将服务树的结构挂载到 SRE 本地的硬盘中,每个节点都是一个文件夹,每个叶子节点都是一个文件,文件的内容是这个节点下的服务器列表。我们操作远程服务树上的机器就像操作本地的文件一样。当然启动这个文件系统的时候要指定自己的Personal Aceess Token, 因为根据权限划分每个人看到的服务树的节点是不一样的。

./fs-registry -token libk:ocjdU5ExPsPUfBvNaq

cat /proc/mounts

rootfs / rootfs rw 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,seclabel,relatime 0 0
devtmpfs /dev devtmpfs rw,seclabel,relatime,size=1891400k,nr_inodes=472850,mode=755 0 0
devpts /dev/pts devpts rw,seclabel,relatime,gid=5,mode=620,ptmxmode=000 0 0
/dev/mapper/vg_lt-lv_root / ext4 rw,seclabel,relatime,barrier=1,data=ordered 0 0
none /selinux selinuxfs rw,relatime 0 0
devtmpfs /dev devtmpfs rw,seclabel,relatime,size=1891400k,nr_inodes=472850,mode=755 0 0
/proc/bus/usb /proc/bus/usb usbfs rw,relatime 0 0
loda /loda fuse.loda ro,nosuid,nodev,relatime,user_id=0,group_id=0 0 0

如果不指定挂载点fs-registry 会自动在 /loda上挂载一个 type 为 fuse.loda 类型的文件系统,目前是只读。

好了,见证奇迹的时刻到了。执行 tree /loda -L 1

[root@LT /]# tree /loda -L 1
/loda
├── api
├── barrage
├── blog
├── car
├── cloud
├── colligate
├── comment
├── dynamic-business
├── finance
├── fm
├── game
├── ipush
├── it
├── k8s
├── live
├── loadbalance
├── monitor
...

上面这些目录对应的就是下图服务树上的一级节点:

接下来我们 输出一个叶子节点:

[root@LT /]# cat /loda/monitor/nsq 
monitor_nsq_01 10.10.40.1,123.103.0.1,2408:80f0:4100:2001:0:e:0:10
monitor_nsq_02 10.10.32.2
monitor_nsq_03 10.10.22.3

cat 输出的就是 nsq.monitor.loda 这个节点下的服务器列表。其实能够做到这些是因为我们在后面实现了Attr ReadDir ReadAll 等来实现fuse的接口。

用文件系统对接了整个服务树之后,我们就可以很方便的对这些文件进行相应的操作了,比如搜索某个机器都在哪些节点下:

[root@LT /]# find /loda -type f -print0 | xargs -0 -I%  grep -H "10.0.2.204" %   
/loda/monitor/alarm/adapter:monitor_msgt204v2_syq 10.0.2.204,111.202.1.88
/loda/monitor/alert:monitor_msgt204v2_syq 10.0.2.204,111.202.1.88
/loda/monitor/lb:monitor_msgt204v2_syq 10.0.2.204,111.202.1.88
/loda/monitor/ui:monitor_msgt204v2_syq 10.0.2.204,111.202.1.88

这种操作可以说是非常 SRE 了。

More

目前,我们实践了基于 DNSfilesystem 的服务树的实现。相比DNS , 文件系统可以做更多的事情,我们可以将服务器的健康状态通过文件的某个属性展示出来,我们可以通过修改文件内容调整服务树上的服务器列表,等等。

References: