在tar命令的手册页中,列出了跟踪硬链接的选项。
-h, --dereference
follow symlinks; archive and dump the files they point to
--hard-dereference
follow hard links; archive and dump the files they refer to
Run Code Online (Sandbox Code Playgroud)
如何tar知道文件是硬链接?它是如何遵循的?
如果我不选择这个选项怎么办?它是如何不硬解引用?
哪些权限会影响硬链接的创建?文件所有权本身重要吗?
假设用户alice想要创建一个指向target.txt目录中文件的硬链接target-dir。
alice需要哪些权限?target.txttarget-dirtarget.txt是由用户拥有bill和target-dir被用户所拥有chad,它改变什么?我试图模拟这种情况,在ext4文件系统中创建以下文件夹/文件结构:
#> ls -lh . *
.:
drwxr-xr-x 2 bill bill 60 Oct 1 11:29 source-dir
drwxrwxrwx 2 chad chad 60 Oct 1 11:40 target-dir
source-dir:
-r--r--r-- 1 bill bill 0 Oct 1 11:29 target.txt
target-dir:
-rw-rw-r-- 1 alice alice 0 Oct 1 11:40 dummy
Run Code Online (Sandbox Code Playgroud)
虽然alice可以创建到 的软链接target.txt,但她不能创建硬链接:
#> ln source-dir/target.txt target-dir/
ln: …Run Code Online (Sandbox Code Playgroud) 我使用 rsnapshot 进行备份,它会生成一系列包含同名文件的文件夹。一些文件是硬链接的,而其他文件是分开的。例如,hourly.1/file1andhourly.2/file1可能硬链接到同一个文件,而hourly.1/file2和hourly.2/file2是完全独立的文件。
我想找到hourly.2 忽略任何文件的文件夹使用的空间量,这些文件是hourly.1. 所以在上面的例子中,我想获得 file2 的大小,但忽略 file1。
我在 linux 上使用 bash,我想尽可能简单地从命令行执行此操作,因此请不要使用大型图形或其他操作系统解决方案。
我有一个文件在~/file.txt.
我通过以下方式创建了硬链接:
ln ~/file.txt ~/test/hardfile.txt
Run Code Online (Sandbox Code Playgroud)
和一个符号链接文件:
ln -s ~/file.txt ~/test/symfile.txt
Run Code Online (Sandbox Code Playgroud)
现在,
我们可以通过 找到符号链接文件->,但是硬链接呢?

当您升级或重新安装一个包dpkg(以及最终使用它的任何东西,如 apt-get 等)时,它会通过在替换之前创建文件的硬链接来备份现有文件。这样,如果解包失败,它可以轻松地放回现有文件。这很棒,因为它可以保护操作系统免受 Bad Things™ 的影响。
除了...它仅在您的文件系统支持硬链接时才有效。并非所有文件系统都如此——例如 FAT 文件系统。
我正在为特定的嵌入式 ARM 平台开发 Debian 发行版,并且引导环境要求某些文件(包括内核)位于 FAT 文件系统上,以便引导代码能够定位和加载它们。
当您升级内核包(或在该 FAT 分区中有文件的任何其他包)时,安装失败:
dpkg: error processing archive linux-image3.18.11+_3.18.11.2.armadillian_armhf.deb (--install):
unable to make backup link of `./boot/vmlinuz-3.18.11+' before installing new version: Operation not permitted
Run Code Online (Sandbox Code Playgroud)
并且整个升级失败。
我在网上搜索过,我能找到的唯一参考是在进行特定升级时遇到特定问题的特定人员,其答案通常是“删除 /boot/vmlinuz-3.18.11+ 并重试”,是的,那个解决了那个特定的问题。
但这不是我的答案。我是 OS 分销商,而不是 OS 用户,因此我需要一种解决此问题的方法,该方法不涉及最终用户在升级之前手动删除其内核文件。我需要一种方法来告诉 dpkg 对 /boot 上的文件(或所有我关心的所有文件,尽管这会减慢升级操作的速度)“复制,而不是硬链接”,或者更好的是“如果硬链接失败,不要抱怨,只需复制它”。
我已经尝试过诸如--force-unsafe-io甚至--force-all标志 之类的事情dpkg,但没有任何效果。
这个答案表明可以将所有文件(包括隐藏文件)从目录复制src到目录中,dest如下所示:
mkdir dest
cp -r src/. dest
Run Code Online (Sandbox Code Playgroud)
答案或其评论中没有解释为什么这实际上有效,似乎也没有人找到有关此的文档。
我尝试了一些东西。一、正常情况:
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src dest
$ ls -A dest
dest_file src
Run Code Online (Sandbox Code Playgroud)
然后,/.最后:
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src/. dest
$ ls -A dest
dest_file .dotfile src_dir src_file
Run Code Online (Sandbox Code Playgroud)
因此,这与 的行为类似*,但也会复制隐藏文件。
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src/* dest …Run Code Online (Sandbox Code Playgroud) 我非常了解硬链接的概念,并且已经多次阅读基本工具的手册页,例如cp--- 甚至最近的 POSIX 规范。我仍然惊讶地观察到以下行为:
$ echo john > john
$ cp -l john paul
$ echo george > george
Run Code Online (Sandbox Code Playgroud)
此时john和paul将具有相同的 inode(和内容),并且george在这两个方面都会有所不同。现在我们这样做:
$ cp george paul
Run Code Online (Sandbox Code Playgroud)
在这一点上,我期望george和paul拥有不同的 inode 编号但内容相同——这个期望得到了满足——但我也期望paul现在有一个不同的 inode 编号john,并且john仍然有内容john。这是我感到惊讶的地方。事实证明,将文件复制到目标路径paul也会导致在共享paul的 inode 的所有其他目标路径上安装相同的文件(相同的 inode)。我想cp创建一个新文件并将其移动到以前由旧文件占据的位置paul。相反,它似乎是打开现有文件paul,截断它,然后写入george的内容到现有文件中。因此,具有相同 inode 的任何“其他”文件都会同时更新“他们的”内容。
好的,这是一种系统行为,现在我知道期待它,我可以弄清楚如何解决它,或者在适当的时候利用它。让我感到困惑的是,我应该在哪里看到这种行为的记录?如果它没有记录我会感到惊讶的地方在文件我已经看过。但显然我错过了它,现在找不到讨论这种行为的来源。
我想知道是否有办法注册这个,但由于大多数现代搜索引擎不能很好地处理长度超过 5 个单词的短语,我需要一些帮助。
我想知道这一点,因为我正在制作一个 bash 脚本,它必须将文件注册为某些类型并做出相应的决定。这在技术上对我的项目并不重要,但我很好奇。
另外,如果它们被认为是常规文件,那么有没有办法检查这些文件是否硬链接而无需解析ls -i?有没有办法在不使用find -i命令的情况下检查某个任意文件 X 是否硬链接到某个其他任意文件 Y ?
如果我知道文件的索引节点(inode),但不知道它的路径(或其任何路径),是否可以直接创建到该 inode 的硬链接?
我可以找到文件sudo find / -inum 123546,然后创建一个硬链接,但这对我的应用程序来说太慢了。
注意我使用的是 ext4 文件系统。
hard-link ×10
cp ×2
files ×2
filesystems ×2
inode ×2
bash ×1
disk-usage ×1
dot-files ×1
dpkg ×1
ext4 ×1
fat ×1
linux ×1
permissions ×1
recursive ×1
shell-script ×1
size ×1
symlink ×1
tar ×1