我正在查看为备份创建的目录。其中一个子文件夹是 Git 存储库的根目录,包含 .git 文件夹。该文件夹还包含指向系统中其他文件夹的链接。这个想法git add/commit/push
本质上是使用完整的版本控制来备份整个环境中的选定更改。
但我不知道这是什么样的文件夹结构。这个 Ubuntu v20.04 内核阻止了到目录的硬链接。文件夹只是名称,而不是“名称 -> 实际/文件夹/名称”。当使用常见的 ls 和 lsattr 命令查看时,这些文件夹看起来和其他文件夹一样。我不确定这些文件夹是挂载的、FUSE 还是看起来像任何 inode 附加目录的符号链接。
有人可以提供一些命令来识别这些文件夹吗?我看到过使用“查找”的建议,但如果不知道我在寻找什么,我会随机尝试不同的查找选项。我希望有更直接的方法。
我的目的是了解和使用那里的东西,或者重新配置为更易于识别的东西。在我掌握它之前,我当然不想只使用rm
子文件夹指针,因为我不知道会发生什么。
谢谢。
EDIT1,测试结果:
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/
未识别“查找”
find /var/local/repo/configs -xtype l
在两个文件夹上尝试“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
readlink -f
只是回显文件夹,/var/local/repo/configs /var/local/repo/configs/etc /var/local/repo/configs/etc/rspamd
file
命令说 /var/local/repo/configs/etc 是一个目录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 告诉我们源和目标的关系。
我需要改进我们的系统文档,以便此类定制的细节不会丢失。