如何区分目录和子卷?

Ell*_*iew 8 mount btrfs snapper

在 GNU/Linux 中,如何区分目录和 btrfs 子卷的最佳方法是什么

我知道他们应该看起来一样,这很酷。但是出于维护目的,当我查看目录时,我想知道它是否只是一个目录,或者它是否是一个子卷。 (就此而言,最好知道它是否已安装,如果是,如何安装以及从何处安装。)

目的:我想修改我的子卷的结构,例如建议here。我需要一种方法来查看我在做什么,以便检查我在做什么。谢谢。:-)


我看过的:

输出ls -dtree -d显示文件夹,但不区分目录btrfs subvolumes。使用ls -l它们实际上看起来相同。

即使ls --classify并且ls --file-type似乎也没有澄清这种区别。


可能的解决方案:

我发现我可以检查一个文件夹的 inode 编号,如果它是256,那就说明它是一个子卷。(参考123


那么使用 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)

背景:

  • 目录和子卷是要管理的截然不同的东西。

  • 您不能使用rmdirrm -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子卷。

Kam*_*ski 5

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)

相关:如何确定目录/文件位于哪个子卷?


izm*_*cfg 4

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)

  • 抱歉,但不起作用。显示什么“设备”,如果设备是 btrfs,或者 btrfs 子卷,则不显示。 (2认同)
  • 将 `st_dev` 与父目录的比较。它们对于子卷是不同的。查看我的编辑。 (2认同)