Ell*_*iew 8 mount btrfs snapper
在 GNU/Linux 中,如何区分目录和 btrfs 子卷的最佳方法是什么?
我知道他们应该看起来一样,这很酷。但是出于维护目的,当我查看目录时,我想知道它是否只是一个目录,或者它是否是一个子卷。 (就此而言,最好知道它是否已安装,如果是,如何安装以及从何处安装。)
目的:我想修改我的子卷的结构,例如建议here。我需要一种方法来查看我在做什么,以便检查我在做什么。谢谢。:-)
我看过的:
输出ls -d或tree -d显示文件夹,但不区分目录和btrfs subvolumes。使用ls -l它们实际上看起来相同。
即使ls --classify并且ls --file-type似乎也没有澄清这种区别。
可能的解决方案:
我发现我可以检查一个文件夹的 inode 编号,如果它是256,那就说明它是一个子卷。(参考1、2、3)
那么使用 inode=256 是区分目录和子卷的最佳启发式方法吗? (我假设在某些底层文件系统中,inode 可能是 =256 的另一个原因。因此,要进行明确检查,您还必须确保有问题的目录是 btrfs 文件系统的一部分。 )
另一种方法可能是通过命令btrfs subversion list .然后解析输出。您必须添加到 thismount | grep /\或类似的东西来处理 btrfs 磁盘、磁盘、分区或分区的根挂载,视情况而定。
未来: 我认为如果有一些新选项ls可以提供有关子卷和挂载点的信息,可能采用类似于软链接显示方式的格式,即
$ ls --show-mounts
/ <-- mounted from /dev/sdc
.snapshots <-- subvolume of /
shapshot <-- subvolume of .snapshots mounted to it's folder /2
Run Code Online (Sandbox Code Playgroud)
背景:
目录和子卷是要管理的截然不同的东西。
您不能使用rmdir或 rm -rf删除子卷,而必须使用btrfs subvolume delete.
除非您在一个特定的子卷中,否则您不能硬链接目录或文件。
子卷显示为自动安装,尽管它们也可以手动安装到不同的安装点。
如果使用snapper或拍摄快照,快照实际上是子卷,至少是一种特殊类型的子卷。
例如,您的根树可能部分如下所示:
/
/.snapshots
/.snapshots/1
/.snapshots/1/snapshot
/.snapshots/2
/.snapshots/2/snapshot
...
Run Code Online (Sandbox Code Playgroud)
只有/1和/2是正常的目录位置,同时/,/.snapshots和/snapshot似乎是BTRFS子卷。
btrfs subvolume show /directory/in/question
Run Code Online (Sandbox Code Playgroud)
您很可能需要sudo. 如果它是子卷,则该命令将成功;否则它会失败。您可以将输出重定向到/dev/null并仅依赖于退出状态。
这将测试目录树中的每个可用目录:
sudo find / -type d -exec sh -c '
for d do
btrfs subvolume show "$d" >/dev/null 2>&1 && printf "%s\n" "$d"
done' find-sh {} +
Run Code Online (Sandbox Code Playgroud)
您可能想要排除无法怀疑的路径。以下代码排除/proc,/sys和/dev:
sudo find / -type d \( \
\( -path /proc -prune \) -o \
\( -path /sys -prune \) -o \
\( -path /dev -prune \) -o \
\( -exec sh -c '
for d do
btrfs subvolume show "$d" >/dev/null 2>&1 && printf "%s\n" "$d"
done
' find-sh {} + \) \)
Run Code Online (Sandbox Code Playgroud)
st_dev返回的字段(stat(2)称为包含文件的设备的 ID)在 BTRFS 子卷以及文件系统之间是不同的。使用命令行,即
if [ btrfs != "$(findmnt -noFSTYPE --target=.)" ]
then
echo "not btrfs"
elif findmnt . >/dev/null
then
echo "btrfs mountpoint"
elif [ "$(stat -c%d .)" -ne "$(stat -c%d ..)" ]
then
echo "btrfs subvolume"
else
echo "btrfs directory"
fi
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
987 次 |
| 最近记录: |