软连接和硬连接
文件和目录的基本存储
每个分区都可以理解为分成两部分,一小部分里边是存放文件的i节点信息,大部分放的是Block文件块。
在文件的i节点当中保存的信息有:i节点号,时间,权限,保存位置。而Block块中保存的是文件中的数据。
每个文件夹中都会有i
节点和对应的Block
文件。
但是有一个问题,一个文件的文件名是存放哪里?
我们就以在文件夹root
中有一个文件abc
为例。文件路径为/root/abc
。
在root
目录中,所有的文件都有i
节点名和对应的Block
块,而root
目录也有自己的i
节点信息。有i
节点信息,就有与之对应的Block
块,root
目录的Block
块中存放的数据是root
目录下所有的子文件和子目录的文件名,和它对应的i
节点号。
也就是说,root
目录下文件的文件名,没有写在该文件的i
节点里。而是写在上级目录的Block
块中。
如果我要查找abc
文件的文件名,要先找到root
文件夹的i
节点,然后在root
目录的Block
块中找到abc
的文件名和对应的i
节点号才能找到。通过abc
文件的i
节点号最终读取到abc
文件中的数据。
那root
目录的文件名或者说是i
节点存储在哪里?
那root
目录是在根目录下的,根目录会有自己的i
节点信息,也会有自己的Block
,综上所述,那root
目录的文件名和i
节点号的信息是放在根目录的Block
块中的。
那根的i
节点号怎么获取?
根的i
节点号是固定的,根的i
节点号为2。(因为编号1在系统内核加载的时候被占用了)
[root@localhost ~]# ls -ild /``2 dr-xr-xr-x. 25 root root 4096 12月 27 22:27 /``第一位显示的就是i节点号。
综上所诉,要查看abc
文件的内容,就先用通过根的i
节点号,读取根的Block
块中数据,找到root
目录的i
节点信息,读取root
目录的Block
块中数据,找到abc
文件的i节点信息,读取abc
文件的Block
块中数据。
以上就是文件和目录的基本存储
ln
ln
英文原意:make links between file
所在路径:/bin/ln
执行权限:所有用户。功能描述:在文件之间建立链接。
硬连接
源文件和硬链接文件拥有相同的Inode
和Block
。修改任意一个文件,另一个都改变。删除任意一个文件,另一个都能使用。硬链接标记不清,很难确认硬链接文件位置(很难确定这是一个硬连接文件,自己创建的还可能记住,要是别人创建的,我根本无法判定一个文件是硬连接文件),不建议使用。硬链接不能链接目录。硬链接不能跨分区(因为两个文件需要同一个分区的同一个i
节点号。所以跨分区找不到)。
## 创建一个文件test.log
[root@localhost src]# echo 666 > test.log
## 创建一个硬连接
[root@localhost src]# ln test.log test1.log
[root@localhost src]# ls -li
总用量 8
36251071 -rw-r--r-- 2 root root 4 10月 11 21:07 test1.log
36251071 -rw-r--r-- 2 root root 4 10月 11 21:07 test.log
## 查看文件内容
[root@localhost src]# cat test*
666
666
## 修改连接中的源文件test.log
[root@localhost src]# echo 666 >> test.log
[root@localhost src]# cat test1.log
666
666
## 验证文件inodeID,和文件大小,完全一样
[root@localhost src]# ls -li
总用量 8
36251071 -rw-r--r-- 2 root root 8 10月 11 21:08 test1.log
36251071 -rw-r--r-- 2 root root 8 10月 11 21:08 test.log
## 删除掉硬连接源文件,验证连接文件是否正常
[root@localhost src]# rm -f test.log
[root@localhost src]# ls -l
总用量 4
-rw-r--r-- 1 root root 8 10月 11 21:08 test1.log
[root@localhost src]# cat test1.log
666
666
## 连接文件正常访问inode也不变
软连接
软链接和源文件拥有不同的Inode
和Block
。两个文件修改任意一个,另一个都改变。删除软链接,源文件不受影响;删除源文件,软链接不能使用,因为软链接没有实际数据,只保存源文件的Inode
,不论源文件多大,软链接文件大小不变。软链接的权限是最大权限lrwxrwxrwx
.,但是由于没有实际数据,最终访问时需要参考源文件权限。软链接可以链接目录,软链接可以跨分区。软链接特征明显,建议使用软连接。
## 创建软连接的源文件测试使用
[root@localhost src]# echo 777 > test.log
[root@localhost src]# ls -li
总用量 8
36251071 -rw-r--r-- 1 root root 8 10月 11 21:08 test1.log
36259072 -rw-r--r-- 1 root root 4 10月 11 21:19 test.log
### 这里有个细节,新建的test.log 与上个实验的硬连接的inodeID 不同,证明是两个文件
## 创建软连接test_soft.log
[root@localhost src]# ln -s test.log test_soft.log
[root@localhost src]# ls -li
总用量 8
36251071 -rw-r--r-- 1 root root 8 10月 11 21:08 test1.log
36259072 -rw-r--r-- 1 root root 4 10月 11 21:19 test.log
36259073 lrwxrwxrwx 1 root root 8 10月 11 21:19 test_soft.log -> test.log
### 这里也有细节,生成的软连接的inodeID与源文件id不同
## 验证软连接生成文件内容
[root@localhost src]# cat test_soft.log
777
## 修改软连接源文件
[root@localhost src]# echo 777 >> test.log
[root@localhost src]# cat test.log
777
777
## 软连接也跟着改变
[root@localhost src]# cat test_soft.log
777
777
## 删除软连接源文件,软连接无法使用
[root@localhost src]# rm -f test.log
[root@localhost src]# ls -li
总用量 4
36251071 -rw-r--r-- 1 root root 8 10月 11 21:08 test1.log
36259073 lrwxrwxrwx 1 root root 8 10月 11 21:19 test_soft.log -> test.log
[root@localhost src]# cat test_soft.log
cat: test_soft.log: 没有那个文件或目录
[root@localhost src]# ls -li
总用量 4
36251071 -rw-r--r-- 1 root root 8 10月 11 21:08 test1.log
36259073 lrwxrwxrwx 1 root root 8 10月 11 21:19 test_soft.log -> test.log
[root@localhost src]#