这些是什么类型的目录?

这些是什么类型的目录?

我正在查看为备份创建的目录。其中一个子文件夹是 Git 存储库的根目录,包含 .git 文件夹。该文件夹还包含指向系统中其他文件夹的链接。这个想法git add/commit/push本质上是使用完整的版本控制来备份整个环境中的选定更改。

但我不知道这是什么样的文件夹结构。这个 Ubuntu v20.04 内核阻止了到目录的硬链接。文件夹只是名称,而不是“名称 -> 实际/文件夹/名称”。当使用常见的 ls 和 lsattr 命令查看时,这些文件夹看起来和其他文件夹一样。我不确定这些文件夹是挂载的、FUSE 还是看起来像任何 inode 附加目录的符号链接。

有人可以提供一些命令来识别这些文件夹吗?我看到过使用“查找”的建议,但如果不知道我在寻找什么,我会随机尝试不同的查找选项。我希望有更直接的方法。

我的目的是了解和使用那里的东西,或者重新配置为更易于识别的东西。在我掌握它之前,我当然不想只使用rm子文件夹指针,因为我不知道会发生什么。

谢谢。

EDIT1,测试结果:

  1. ln显示相同的 inode,文件名没有区分到目录的明显硬链接。

    # ls -aliF /var/local/repo/configs | grep etc  
    43 drwxr-xr-x 139 root root 12288 Jun 8 06:58 etc/  
    # ls -aliF / | grep etc  
    43 drwxr-xr-x 139 root root 12288 Jun 8 06:58 etc/
    
  2. 未识别“查找”

    find /var/local/repo/configs -xtype l
    
  3. 在两个文件夹上尝试“namei”:

    # namei /var/local/repo/configs/etc  
     f: /var/local/repo/configs/etc  
        d /  
        d var  
        d local  
        d repo  
        d configs  
        d etc  
    # namei /etc  
     f: /etc  
        d /  
        d etc
    
  4. readlink -f只是回显文件夹,

    /var/local/repo/configs  
    /var/local/repo/configs/etc  
    /var/local/repo/configs/etc/rspamd
    
  5. file命令说 /var/local/repo/configs/etc 是一个目录

  6. stat命令显示 repo 路径和 /etc 的完全相同的数据,当然,除了每个文件字段显示查询的位置......它们并不都显示 /etc。

对其他文件的检查也表明它们是真实的文件夹而不是链接。

答案1

我找到了这是什么。在启动时,将执行以下脚本来执行“绑定挂载”。

#!/bin/env bash

BASE=/var/local/repositories/network/$HOSTNAME

do_mount() {
  # https://unix.stackexchange.com/questions/198590/what-is-a-bind-mount/198591#198591
  mkdir -p "$BASE$1"
  mount --bind $1 "$BASE$1"
}

do_mount /var/local/real/folder
do_mount /etc
...

在那里面惊人的 什么是 bind-mount 帖子,有这个:

最近的内核确实会跟踪绑定挂载并通过 <code/proc/PID/mountinfo 公开信息,这允许 findmnt 指示绑定挂载。

这是一个链接此问答哪里可以找到这种智慧:

如果您查看 /proc/self/mountinfo,您将看到此过程的挂载世界的内核视图...

好的,在我的系统上:

# grep etc /proc/self/mountinfo
2568 32 252:1 /etc /var/local/repositories/network/zzz/etc rw,relatime shared:1 - ext4 /dev/vda1 rw

是“这些是什么类型的目录?”的答案。它们是绑定挂载。mountinfo 告诉我们源和目标的关系。

我需要改进我们的系统文档,以便此类定制的细节不会丢失。

相关内容