这一直困扰着我。为什么根目录包含对父目录的引用?
bob@bob:/$ ls -a . 构建 home lib32 mnt .rpmdb sys vmlinuz .. cdrom initrd.img lib64 opt sbin tmp vmlinuz.old bin dev initrd.img.old lost+found proc selinux usr 引导等 lib 媒体根 srv var
我了解如何在文件系统中管理目录 - 每个目录都有 n+2 个指向自身的指针(n = 目录内的子目录数)。一个用于每个直接子目录,一个用于其父目录,一个用于其自身。
但是什么是/父母?
多亏了这里和这个页面上的一些很好的问答,我现在明白了链接。我看到硬链接以不同的名称引用相同的 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返回的原始文件的大小?但是我怎么知道文件名占用了多少空间呢?这里说硬链接没有大小。他们的文件名是否与原始文件名一起保存?硬链接的文件名存储在哪里?
我了解符号链接和硬链接之间的技术差异,这是一个关于它们在实践中使用的问题,特别是我很想知道为什么两者都在看似相似的条件下使用:/bin目录。
这是它在我的系统上的列表的片段:
~$ ls -lai /bin
total 10508
32770 drwxr-xr-x 2 root root 4096 Jun 14 11:47 .
2 drwxr-xr-x 28 root root 4096 Sep 6 13:15 ..
119 -rwxr-xr-x 1 root root 959120 Mar 28 22:02 bash
2820 -rwxr-xr-x 3 root root 31112 Dec 15 2011 bunzip2
127 -rwxr-xr-x 1 root root 1832016 Nov 16 2012 busybox
2820 -rwxr-xr-x 3 root root 31112 Dec 15 2011 bzcat
6191 lrwxrwxrwx 1 root root 6 Dec 15 2011 bzcmp …Run Code Online (Sandbox Code Playgroud) 我想知道将有关文件的信息存储在inode 中而不是直接存储在目录中是否值得额外的开销。可能我高估了开销或忽略了一些重要的事情,但这就是我问的原因。
我看到硬链接需要像“inode”这样的东西,但如果开销真的和我想象的一样大,我想知道是否有任何理由证明它是合理的:
bunzip2并且bcat可以忽略不计我并不是说 inodes/hardlinks 不好或没用,但它能否证明额外间接的成本是合理的(缓存肯定有很大帮助,但它不是灵丹妙药)?
hard-link ×3
files ×2
filesystems ×2
symlink ×2
directory ×1
disk-usage ×1
inode ×1
linux ×1
utilities ×1