0x0001 刚跟着楼上分享的 IBM的文档 做了个小实验,仔细观察了一下。
每个目录都保存了两个硬链接,一个是它自己 .
,另一个是上层目录 ..
# 注:ls 的输出中,第一列是这个文件名对应的 inode 号
# 第三列是同样指向该 inode 号的文件名的计数
ubuntu@server:~/fs-test$ ls -ail
total 2
1713 drwxr-xr-x 2 ubuntu ubuntu 1024 Sep 22 03:49 .
2 drwxr-xr-x 5 ubuntu ubuntu 1024 Sep 22 03:49 ..
# 创建一个子目录,这时候多了一个
ubuntu@server:~/fs-test$ mkdir subdir1
ubuntu@server:~/fs-test$ ls -ail
total 3
1713 drwxr-xr-x 3 ubuntu ubuntu 1024 Sep 22 03:53 .
2 drwxr-xr-x 5 ubuntu ubuntu 1024 Sep 22 03:49 ..
1714 drwxrwxr-x 2 ubuntu ubuntu 1024 Sep 22 03:53 subdir1
# 再创建一个,这时候 . 的硬链接数量又多了一个
ubuntu@server:~/fs-test$ mkdir subdir2
ubuntu@server:~/fs-test$ ls -ail
total 4
1713 drwxr-xr-x 4 ubuntu ubuntu 1024 Sep 22 03:55 .
2 drwxr-xr-x 5 ubuntu ubuntu 1024 Sep 22 03:49 ..
1714 drwxrwxr-x 2 ubuntu ubuntu 1024 Sep 22 03:53 subdir1
1715 drwxrwxr-x 2 ubuntu ubuntu 1024 Sep 22 03:55 subdir2
# 进刚创建的子目录,其中的 .. 的 inode 指向了上层目录
ubuntu@server:~/fs-test$ cd subdir1
ubuntu@server:~/fs-test/subdir1$ ls -ail
total 2
1714 drwxrwxr-x 2 ubuntu ubuntu 1024 Sep 22 03:53 .
1713 drwxr-xr-x 4 ubuntu ubuntu 1024 Sep 22 03:55 ..
# 用 tree 打印出目录结构和对应的 inode,可以与前面 ls 的输出做参考
ubuntu@server:~$ tree . -F --inodes
.
├── [ 1713] fs-test/
│ ├── [ 1714] subdir1/
│ └── [ 1715] subdir2/
└── [ 14] note.txt
3 directories, 1 file
# 尝试做个软链接
ubuntu@server:~$ ln -s fs-test symlink-test
ubuntu@server:~$ ls -l symlink-test
lrwxrwxrwx 1 ubuntu ubuntu 7 Sep 22 04:17 symlink-test -> fs-test
ubuntu@server:~$ tree . -F --inodes
.
├── [ 1713] fs-test/
│ ├── [ 1714] subdir1/
│ └── [ 1715] subdir2/
├── [ 14] note.txt
└── [ 1713] symlink-test -> fs-test/
4 directories, 1 file
# 加上 -l 参数,软链接也往下展开
ubuntu@server:~$ tree . -F -l --inodes
.
├── [ 1713] fs-test/
│ ├── [ 1714] subdir1/
│ └── [ 1715] subdir2/
├── [ 14] note.txt
└── [ 1713] symlink-test -> fs-test/ [recursive, not followed]
4 directories, 1 file
其中,引用一段 tree 的手册(man tree
)的说明:
By default, when a symbolic link is encountered, the path that the symbolic link refers to is printed after the name of the link in the format:
name -> real-path
If the -l
option is given and the symbolic link refers to an actual directory, then tree will follow the path of the symbolic link as if it were a real directory.
关于 tree 的 -l
参数
-l
Follows symbolic links if they point to directories, as if they were directories. Symbolic links that will result in recursion are avoided when detected.
结合 payne 的回答,得到这样的推断:
这种双向链表由 inode 号来建立联系,单纯地支持目录链接的话,在遍历的时候肯定会有无限递归的情况,软链接有独立的 inode 号,这样的情况可以在更高一级抽象的内核层面处理好。
而硬链接因为是直接在 inode 号建立联系,内核没有办法得到额外的信息去处理这种情况,所以默认禁止了这样的操作,强行操作就造成混乱了。
(看来得找时间仔细研究一下这一层面的问题哈哈哈