多亏了这里和这个页面上的一些很好的问答,我现在明白了链接。我看到硬链接以不同的名称引用相同的 inode,副本是不同的“节点,具有不同的名称。加上软链接将原始文件名和路径作为它们的 inode,所以如果文件被移动,链接就会中断。
所以,我用一些文件(下面的“saluton_mondo.cpp”)测试了我学到的东西,制作了一个硬链接和一个软链接以及一个副本。
jmcf125@VMUbuntu:~$ ls -lh soft hard copy s*.cpp
-rw-rw-r-- 1 jmcf125 jmcf125 205 A?g 27 16:10 copy
-rw-rw-r-- 2 jmcf125 jmcf125 205 A?g 25 13:34 hard
-rw-rw-r-- 2 jmcf125 jmcf125 205 A?g 25 13:34 saluton_mondo.cpp
lrwxrwxrwx 1 jmcf125 jmcf125 17 A?g 27 16:09 soft -> saluton_mondo.cpp
Run Code Online (Sandbox Code Playgroud)
然而,我发现硬链接与原始链接的大小相同,并且在逻辑上与副本的大小相同,这让我感到尴尬。如果硬链接和原始共享同一个inode,即有数据,只是文件名不同,那么硬链接不应该只占用其名称的空间,而不是205个字节吗?或者是ls -lh返回的原始文件的大小?但是我怎么知道文件名占用了多少空间呢?这里说硬链接没有大小。他们的文件名是否与原始文件名一起保存?硬链接的文件名存储在哪里?
我将我的 dotfiles 置于版本控制之下,部署它们的脚本会创建硬链接。我也习惯etckeeper把我的/etc版本控制。最近我收到了这样的警告:
warning: hard-linked files could cause problems with bzr
Run Code Online (Sandbox Code Playgroud)
简单的复制 ( cp filename.ext filename.ext) 将不起作用:
cp: `filename.ext' and `filename.ext' are the same file
Run Code Online (Sandbox Code Playgroud)
重命名/移动文件 - 除了跨卷 - 也不会破坏硬链接。
所以我的问题是:有没有办法打破文件的硬链接,而实际上不必知道该文件的其他硬链接在哪里?
我有/home/myuser/Desktop/rc/.netrc文件,我想硬链接到/root,即root用户的主目录。当我做:
ln /home/user/Destkop/rc/.netrc /root
它给出了以下错误:
ln: 创建硬链接
/root/.netrc' =>.netrc': 无效的跨设备链接
但是当我将文件硬链接到myuser的家,即/home/myuser时,它会起作用。
那么,问题是什么,为什么这里只有一个文件系统时会显示无效的跨设备?
附注。我正在使用RHEL6
我正在使用 rsync 和硬链接实施备份方案。我知道我可以使用带有 rsync 的 link-dest 来做硬链接,但是我看到提到在 rsync 中实现“link-dest”之前使用“cp -l”。我知道的另一种硬链接方法是“ln”。
所以我的问题是,出于好奇:与使用“ln”相比,使用“cp -l”制作硬链接有区别吗?
当我统计一个目录时,我得到一个列表,告诉我有 5 个指向该目录的链接。
stat dir
Run Code Online (Sandbox Code Playgroud)
我的问题是如何获取所有这 5 个链接的信息(名称和位置)?
采用rsync --link-dest了节省空间的快照,我怎么能弄清楚我多少空间实际保存?或更一般的:
仅考虑在目录结构之外的其他地方没有硬链接的文件,如何确定目录使用了多少空间?换一种方式提问:删除该目录后实际会释放多少空间?(
du -hs会撒谎。可能包括硬链接本身所需的空间)
当我想以root模式在我的/home目录中创建硬链接时,Linux 显示以下错误消息:
ln: failed to create hard link ‘my_sdb’ => ‘/dev/sda1’: Invalid cross-device link
Run Code Online (Sandbox Code Playgroud)
上面的错误信息如下所示:
# cd /home/user/
# ln /dev/sda1 my_sdb
Run Code Online (Sandbox Code Playgroud)
但是我只能在/dev目录中创建硬链接,而在其他目录中是不可能的。
现在,我想知道如何从目录(或其他目录)中的现有设备文件(如sdb1)创建硬链接/home?
从ln的联机帮助页:
-d, -F, --directory
allow the superuser to attempt to hard link directories (note: will
probably fail due to system restrictions, even for the superuser)
Run Code Online (Sandbox Code Playgroud)
是否有任何文件系统驱动程序实际上允许这样做,或者是唯一的选择mount --bind <src> <dest>?或者这种行为是否在到达特定于文件系统的驱动程序之前就被内核阻止了?
注意:我实际上并不打算在任何机器上执行此操作,只是出于好奇。
有没有办法告诉cp给--link(即创建硬链接),但回落的情况下,我试图设备间的硬链接?设备间链接是不可能的,并且会导致cp失败。
我问的原因是因为我想在 a 中使用它,GNUmakefile并且更喜欢可读的命令行而不是一些复杂而冗长的命令行(或函数,就此而言)。
问题是针对 GNU coreutils(7.4 和 8.13)。
注意:现在的解决方法类似于(GNU make recipe 语法):
cp -fl $^ $@ || cp -f $^ $@
Run Code Online (Sandbox Code Playgroud)
这当然会在设备间链接的情况下给出虚假的错误消息,尽管在第二次cp调用时成功。此外,然后它会被扩展(毕竟源表单看起来可读)它不会再可读了。
我正在尝试定期拍摄大型文件夹的快照。
我在这里读过:http : //www.mikerubel.org/computers/rsync_snapshots/#Incremental通过简单地复制硬链接
来cp -al获取文件夹的快照。
这一切都很好,但问题是在这个快照中,如果我更改一个文件,它会在所有快照中更改。我想要的是让系统在更改时创建一个新文件并链接到该文件。这样每个快照在编辑第一个文件时不会变得无效。
我怎样才能做到这一点?
ps 我试过rsync -a --delete --link-dest=../backup.1 source_directory/ backup.0/,但它有同样的问题。