linux下的文件管理是通过inode和block来保存的,一个文件内的实际内容是保存在block中的,而文件的属性,权限之类以及该文件的block都在在inode当中,一个文件会占用一个inode,而当一个文件过大时,它是会占用多个block的,而这些block都在inode当中记录着。
有了上面这个认识之后,就具体来看看两种连接究竟是什么样子。
硬连接(hard link)
ln [-参数] 源文件 目标文件
-s :符号连接(symbolic link)即所谓的软连接,就是windows下的快捷方式
-f :如果目标文件存在,则直接删除后再创建
默认不加参数情况下,是创建硬连接。
硬连接的实现机理呢,其实就是让多个文件指向同一个inode号码而已。简单来理解,就是你创建的连接只是在该目录下创建了一个连接到某inode号的关联记录而已。
下面直接用实例来说明:
ln /etc/crontab .
ll -i /etc/crontab /root/crontab
这里看到,在/root目录下创建了一个crontab文件的连接。查看这两个文件的inode号竟然是一样的,并且它的第三个字段都为2,这里说一下第三个字段为连接数,即有多个连接指向该文件,这里就更好说明这两个文件其实是指向同一个文件。
竟然知道了硬连接其实是增加一个连接数,那么它的作用就显而易见了,就是防止误删,当你在删除一个文件时,其实是在减少该文件的连接数,这里等介绍完软连接后再具体说这个问题。
局限性:
不能跨文件系统
不能连接到目录
软连接(symbolic link)
软连接是创建一个新的文件,而该文件的内容就是它所指向文件的文件名,当源文件被删除后,该连接文件会打开失败,因为已经找不到源文件的“文件名”了。
同样是刚才的例子
ln -s /etc/crontab crontab2
ll -i /etc/crontab /root/crontab2
看到两个文件的inode是不一样的,这里的crontab文件的连接数为2,因为我们刚才创建了一个硬连接还在呢,所以是2,但是新创建的软连接这个文件的连接数却是1,这里足可见,软连接是重新创建了一个文件,而且细心的话,你可以发现这个新文件的大小为12个bytes,因为/etc/crontab是12个bytes,就是上面提到的,该文件的内容是它所指向的文件名。
<实例测试>
最后来通过一系列的实例来具体感受下两种连接的不同。
由于是测试,我们就在/tmp目录下进行
cp -a /etc/passwd .
du -sb ; df -i . //这里的du是评估文件系统的磁盘使用量(一般用来查看目录的使用情况,df是列出文件系统整体磁盘使用量)
这里还是给出两个命令的参数吧
du:
-a:列出所有文件及目录的容量
-h:以常见的容量单位呈现(G/M)
-s:列出总量,不细给出每个目录的用量
-S:不包括子目录下的
-k:以KB为单位
-m:以MB为单位
df:
-a:列出所有的文件系统,包括特殊的/proc
-k:以KB为单位
m:以MB为单位
h:以较为容易阅读的GB,MB,KB来显示
H:用1M=1000K来代替1M=1024K的进位
T:连同文件系统名也显示
i:不用硬盘容量,而使用inode的数量来显示
下来就具体创建软硬连接来查看:
ln passwd passwd-hd
du -sb ; df -i .
看到,在创建硬连接前后,/tmp目录下的总磁盘用量和inode量没有发生变化,尽管多了一个passwd-hd文件。
ls -li passwd*//查看以passwd开头的文件
passwd和passwd-hd两个文件一模一样,且inode号一样。
ln -s passwd passwd-so
ls -il passwd*
passwd-so和passwd文件的inode号明显不同,连接数为1,大小为6个bytes,即passwd的大小。
创建软连接文件后,整个磁盘的使用总量增加了,inode号的使用多了一个1,即新创建了一个文件。
当删除passwd文件后,我们看下硬连接和软连接是否还有效。
硬连接扔能正确查看
软连接显示没有该目录
再来看一下,passwd-hd的文件连接数由2变为1了。
综上,就是关于硬连接和软连接问题。