Linux硬连接和软连接详解
Lnux也有类似于windows下的快捷方式,这种快捷方式在linux下称作硬连接(hard link)或软连接(symbolic link,又称作符号链接)。
创建链接文件
创建linkfile.txt文件
[root@localhost tmp]# touch linkfile.txt
[root@localhost tmp]# echo 'testlink' > linkfile.txt
创建硬连接
[root@localhost tmp]# ln linkfile.txt hardlink
创建软连接
[root@localhost tmp]# ln -s linkfile.txt softlink
读取文件内容,可以看出三个文件的内容都是一样的
[root@localhost tmp]# cat hardlink
testlink
[root@localhost tmp]# cat softlink
testlink
[root@localhost tmp]# cat linkfile.txt
testlink
通过链接文件修改文件内容
[root@localhost tmp]# echo 'testlink2' >> hardlink
[root@localhost tmp]# cat linkfile.txt
testlink
testlink2
[root@localhost tmp]# echo 'testlink3' >> softlink
[root@localhost tmp]# cat linkfile.txt
testlink
testlink2
testlink3
可以看出,通过修改链接文件内容,源文件的内容也发生了改变。这就是链接文件的作用,链接文件基本上代表了源文件,通过链接文件可以查看修改源文件内容,也可以通过链接文件修改源文件属性等等。
硬连接和软连接有什么不同?
实际上软连接更接近windows的快捷方式,可以看下面的操作。
我将源文件给删除了,通过硬连接依然可以读取文件内容,软连接则显示文件不存在(源文件被删除,软连接文件的颜色都发生了改变)。这就奇怪了,源文件都删除了,为啥还可以读取文件内容?这涉及到linux的文件系统原理,linux中一个文件是由inode和block来存储的,block中存放文件内容,inode存放文件属性和block的位置。当用户读取文件内容的时候,系统会先找到该文件对应的inode,从inode中获取该用户是否有权限读取文件内容,如果有权限,则通过inode中存放的block位置找到相应的block,获取文件的内容。我这里只是简单的介绍linux的文件系统,详细内容推荐去看下linux相关书籍。
我们再重复最开始的操作,创建源文件,创建链接文件。
[root@localhost tmp]# rm -rf testlink.txt
[root@localhost tmp]# rm -rf hardlink
[root@localhost tmp]# rm -rf softlink
[root@localhost tmp]# touch testlink.txt
[root@localhost tmp]# ln testlink.txt hardlink
[root@localhost tmp]# ln -s testlink.txt softlink
[root@localhost tmp]# ll -i testlink.txt hardlink softlink
50801629 -rw-r--r-- 2 root root 0 Nov 16 15:54 hardlink
50801663 lrwxrwxrwx 1 root root 12 Nov 16 15:54 softlink -> testlink.txt
50801629 -rw-r--r-- 2 root root 0 Nov 16 15:54 testlink.txt
其中ll -i 指令可以查看文件的inode(第一列为inode编号)。可以看到hardlink和testlink.txt对应的是同一个inode,而softlink则占用了另外一个inode。软连接是指向源文件的,所以当删除源文件后,由于无法找到源文件的inode,自然就无法读取源文件的内容。但是对于硬连接来说,硬连接和源文件共享同一个inode,删除了源文件,inode和对应的block并没有被删除,所以依然可以通过硬连接来读取源文件的内容。
这样看来,硬连接貌似更安全。删除了源文件,依然可以通过硬连接来查看源文件的内容。但是由于硬连接的限制比较多,比如不能给文件夹创建硬连接。所以实际上,软连接用得更多一些。
给文件夹创建软连接
[root@localhost tmp]# mkdir dirlinktest
[root@localhost tmp]# ln dirlinktest/ dirhardlink
ln: ‘dirlinktest/’: hard link not allowed for directory --不允许给文件夹创建硬连接
[root@localhost tmp]# ln -s dirlinktest/ dirsoftlink
上一篇: Mac下使用自带终端SSH功能
下一篇: Oracle常用批量操作