#overlay #git #fuse #file-metadata #text-file #bindroot

bin+lib progitoor

progitoor 是一个覆盖文件系统,它将所有者和其他文件元数据存储在文本数据库中,并将该视图呈现给以root身份运行的过程,而实际的文件由用户拥有,可以在git中版本化。

2个版本

0.1.1 2024年6月22日
0.1.0 2021年10月4日

354文件系统

GPL-3.0 许可证

110KB
1.5K SLoC

progitoor

logo.png

简介

progitoor 是一个覆盖文件系统,它将所有者和其他文件元数据存储在文本数据库中,并将该视图呈现给以root身份运行的过程,而实际的文件由用户拥有,可以在git中版本化。

一个典型的用例是构建root文件系统。在这种情况下

  • 后端存储可以是用户拥有的git分支中的文件,位于 ~/project/ 中的某个位置
  • progitoor 将挂载后端存储,并在挂载点(例如,~/mnt/)下呈现覆盖
  • sudo chroot ~/mnt 中创建或修改的文件将具有持久化的所有者和mtime,存储在 ~/project/.progitoor 中(理想情况下也是git版本化的)

工作原理

文件I/O通过使用FUSE文件系统驱动程序通过 progitoor 传递。当需要重新映射文件元数据时,使用 BTreeMap 进行查找。该映射每30秒持久化(刷新)到文本文件(底层中的 .progitoor),并在 progitoor 退出(通常在卸载文件系统时)时也进行。

对映射的每次更改也会写入一个日志文件以备安全。刷新操作删除日志。如果启动时存在日志文件(表示崩溃),则将其回放(合并到数据库中并删除)。通过写入一个特殊的(墓碑)条目并具有全零文件模式来记录文件删除。

构建和安装

要安装 progitoor 的最新版本,请确保您已安装 Rust 工具链,然后运行

cargo install progitoor

或者,从源代码构建(在 target/release/progitoor 中的二进制文件)

cargo build --release

用法

如果没有使用可选的--foreground标志,progitoor将挂载文件系统,然后进入后台并退出,日志记录到syslog。在前台模式下,日志会发送到stdout。

用法与正常的mount -o 选项 <设备> <挂载点>兼容,具体来说

USAGE:
    progitoor [FLAGS] [OPTIONS] <SOURCE> <TARGET>

FLAGS:
    -f, --foreground    Don't fork - remain in foreground
    -h, --help          Prints help information
    -V, --version       Prints version information

OPTIONS:
    -l, --loglevel <LOGLEVEL>    Specifies the log level [default: Info]
    -o <MOUNT_OPT>...            Specifies the mount options

ARGS:
    <SOURCE>
    <TARGET>

--loglevel的有效日志级别为DebugInfoWarnError

示例

运行progitoor(前台模式)

$ mkdir project
$ mkdir mnt
$ progitoor ./project/ ./mnt/ --foreground
Source dir: "/home/simeon/project"
Mount point: "/home/simeon/mnt"
Using fuse mount options: ["-o", "nonempty", "-o", "allow_root", "-o", "auto_unmount", "-o", "suid", "-o", "exec"]
Periodic flusher thread starting
Ready to mount...
Mounting /home/simeon/mnt
Periodic flusher thread running

在另一个终端中创建一些文件,查看它们(作为用户)

$ cd mnt
mnt$ mkdir etc
mnt$ echo "fake data" > etc/passwd
mnt$ ls -ld etc/
drwxrwxr-x 2 simeon simeon 4096 Oct  3 09:27 etc/
mnt$ ls -l etc/
total 4
-rw-rw-r-- 1 simeon simeon 10 Oct  3 09:28 passwd

作为root,调整所有权

mnt$ sudo chown -R root: etc/

用户的视图没有改变

mnt$ ls -ld etc/
drwxrwxr-x 2 simeon simeon 4096 Oct  3 09:27 etc/
mnt$ ls -l etc/
total 4
-rw-rw-r-- 1 simeon simeon 10 Oct  3 09:28 passwd

root可以看到重新映射的所有权

mnt$ sudo ls -ld etc/
drwxrwxr-x 2 root root 4096 Oct  3 09:27 etc/
mnt$ sudo ls -l etc/
total 4
-rw-rw-r-- 1 root root 10 Oct  3 09:28 passwd

许可证

progitoor根据通用公共许可证3.0授权。请参阅LICENSE以获取详细信息。

依赖项

~6–15MB
~195K SLoC