浅谈linux中的硬链接和软链接文件以及ln的使用方法

在linux系统中有一种文件叫做链接文件,可以为解决文件的共享使用。链接的方式可以分为两种,一种是硬链接(Hard Link),另一种是软链接或者也称为符号链接(Symbolic Link)。

一、基本概念

1、硬链接

开始之前,先解释一个概念,叫做索引节点(Inode)。

在Linux的文件系统中,保存在磁盘分区中的文件,不管是什么类型,系统都会给它分配一个编号,这个编号被称为索引节点编号(Inode Index),它是该文件或者目录在linux文件系统中的唯一标识。有了这个编号值,就可以查到该文件的详细内容。

同时,Linux系统还规定,可以允许多个文件名同时指向同一个索引节点(Inode),这就是硬链接。这样设计有一个好处就是,只要文件的索引节点还存在一个以上的链接,删除其中一个链接并不影响索引节点本身和其他的链接(也就是说该文件的实体并未删除),而只有当最后一个链接被删除后,且此时有新数据要存储到磁盘上,那么被删除的文件的数据块及目录的链接才会被释放,存储空间才会被新数据所覆盖。因此,该机制可以有效的防止误删操作。

硬链接只能在同一类型的文件系统中进行链接,不能跨文件系统。同时它只能对文件进行链接,不能链接目录。

2、软链接

软链接(也叫符号链接),类似于windows系统中的快捷方式,与硬链接不同,软链接就是一个普通文件,只是数据块内容有点特殊,文件用户数据块中存放的内容是另一文件的路径名的指向,通过这个方式可以快速定位到软连接所指向的源文件实体。

软链接常用来解决空间不足的问题,比如某个文件文件系统空间已经用完了,但是现在必须在该文件系统下创建一个新的目录并存储大量的文件,那么可以把另一个剩余空间较多的文件系统中的目录链接到该文件系统中。

软链接可以跨文件系统而链接,也可以同时对文件或目录进行链接。

3、二者区别

  • 软链接以存放另一个文件的路径的形式存在,硬链接以文件副本的形式存在;
  • 软链接可以跨不同的文件系统而链接,硬链接不可以;
  • 软链接可以对目录进行链接,而硬链接不可以;
  • 软链接可以对一个不存在的文件名进行链接,硬链接必须要有源文件。
  • 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接就变成了死链接。删除硬链接的话,只要索引节点的个数不为零,则不会对原始文件造成任何影响;

注意:不论是硬链接或软链接都不会将原本的目标文件完全复制一份,而只会占用非常少量的存储空间。

二、创建方式(ln命令)

软链接和硬链接都是通过ln命令来创建,只是参数不同。命令格式如下:

ln 参数 源文件或目录 目标文件或目录

注意:源目录和目标目录都必须是绝对路径!

参数:

  • -i 交互模式,文件存在则提示用户是否覆盖;
  • -s 软链接(符号链接);
  • -d 允许超级用户制作目录的硬链接;
  • -b 删除,覆盖以前建立的链接;
  • -f 强制执行;
  • -n 把符号链接视为一般目录;
  • -v 显示详细的处理过程;

所以,总结起来就是:

  • 创建软链接 (符号链接)使用:ln -s source target
  • 创建硬链接 (实体链接)使用:ln source target

比如:

--------------------------------------------------------------------------------------------------------
leon@Ubuntu:~/temp$ ll													# 首先创建一个测试目录和测试文件
total 16
drwxrwxr-x  3 leon leon 4096 Aug 29 14:21 ./
drwxr-xr-x 23 leon leon 4096 Aug 29 14:20 ../
drwxrwxr-x  2 leon leon 4096 Aug 29 14:21 testdir/
-rw-rw-r--  1 leon leon   40 Aug 29 14:21 testfile
--------------------------------------------------------------------------------------------------------
leon@Ubuntu:~/temp$ ln testdir hard_link								# 不能对目录创建硬链接
ln: testdir: hard link not allowed for directory
--------------------------------------------------------------------------------------------------------
leon@Ubuntu:~/temp$ ln -s testdir soft_link_for_dir						# 可以对目录创建软链接
leon@Ubuntu:~/temp$ ll
total 16
drwxrwxr-x  3 leon leon 4096 Aug 29 14:26 ./
drwxr-xr-x 23 leon leon 4096 Aug 29 14:20 ../
lrwxrwxrwx  1 leon leon    7 Aug 29 14:26 soft_link_for_dir -> testdir/
drwxrwxr-x  2 leon leon 4096 Aug 29 14:21 testdir/
-rw-rw-r--  1 leon leon   40 Aug 29 14:21 testfile
--------------------------------------------------------------------------------------------------------
leon@Ubuntu:~/temp$ ln testfile hard_link_for_file						# 可以对文件创建硬链接
leon@Ubuntu:~/temp$ ll
total 20
drwxrwxr-x  3 leon leon 4096 Aug 29 14:27 ./
drwxr-xr-x 23 leon leon 4096 Aug 29 14:20 ../
-rw-rw-r--  2 leon leon   40 Aug 29 14:21 hard_link_for_file
drwxrwxr-x  2 leon leon 4096 Aug 29 14:21 testdir/
-rw-rw-r--  2 leon leon   40 Aug 29 14:21 testfile
--------------------------------------------------------------------------------------------------------
leon@Ubuntu:~/temp$ ln -s testfile soft_link_for_file					# 可以对文件创建软链接
leon@Ubuntu:~/temp$ ll
total 20
drwxrwxr-x  3 leon leon 4096 Aug 29 14:28 ./
drwxr-xr-x 23 leon leon 4096 Aug 29 14:20 ../
lrwxrwxrwx  1 leon leon    8 Aug 29 14:28 soft_link_for_file -> testfile
drwxrwxr-x  2 leon leon 4096 Aug 29 14:21 testdir/
-rw-rw-r--  2 leon leon   40 Aug 29 14:21 testfile
--------------------------------------------------------------------------------------------------------

三、注意事项

1、对目录创建软链接之前,不用提前建立好目标目录,直接ln命令就会自动建立。如果你提前建立了目标目录,则使用ln命令之后,建立的目标目录会出现嵌套,这一点要千万注意!

leon@Ubuntu:~/temp$ ll testdir/												# 首先查看下源目录下的文件情况
total 8
drwxrwxr-x 2 leon leon 4096 Aug 29 14:29 ./
drwxrwxr-x 3 leon leon 4096 Aug 29 14:28 ../
-rw-rw-r-- 1 leon leon    0 Aug 29 14:29 test

# 下面的语句是直接创建软链接,可以看出软链接的结果是正确的
leon@Ubuntu:~/temp$ ln -s testdir soft_link_for_dir							# 创建软链接1
leon@Ubuntu:~/temp$ ll soft_link_for_dir									# 查看软链接1的详情
lrwxrwxrwx 1 leon leon 7 Aug 29 14:26 soft_link_for_dir -> testdir/

# 下面的语句是先创建好目标目录,然后再创建软链接。可以看出软链接的结果是不正确的
leon@Ubuntu:~/temp$ mkdir soft_link_for_dir2								# 先创建一个目录
leon@Ubuntu:~/temp$ ln -s testdir soft_link_for_dir2						# 然后再创建软链接2
leon@Ubuntu:~/temp$ ll soft_link_for_dir2									# 查看软链接2的详情
total 8
drwxrwxr-x 2 leon leon 4096 Aug 29 14:34 ./
drwxrwxr-x 4 leon leon 4096 Aug 29 14:34 ../
lrwxrwxrwx 1 leon leon    7 Aug 29 14:34 testdir -> testdir

2、对目录创建软链接时,不要携带’/‘符号,否则创建出来的软链接所指向的源目录也会携带一个’/'符号。虽然表面上看上去可以正常访问,但是不能保证在某些特殊情况下会出现问题。这一点也要千万注意!

leon@Ubuntu:~/temp$ ln -s testdir/ soft_link_for_dir1						# 不建议这么操作
leon@Ubuntu:~/temp$ ln -s testdir soft_link_for_dir2						# 这才是正确的
leon@Ubuntu:~/temp$ ll
total 16
drwxrwxr-x  3 leon leon 4096 Aug 29 15:41 ./
drwxr-xr-x 23 leon leon 4096 Aug 29 14:20 ../
lrwxrwxrwx  1 leon leon    8 Aug 29 15:40 soft_link_for_dir1 -> testdir//
lrwxrwxrwx  1 leon leon    7 Aug 29 15:41 soft_link_for_dir2 -> testdir/
drwxrwxr-x  2 leon leon 4096 Aug 29 14:29 testdir/
-rw-rw-r--  1 leon leon   40 Aug 29 14:21 testfile

3、删除软链接时,不能携带’/'符号,否则你删除的就是软链接目标目录下的资源(即源文件),而不是软链接本身。

--------------------------------------------------------------------------------------------------------
leon@Ubuntu:~/temp$ rm -rf soft_link_for_dir1								# 这是正确的删除软链接的方式
leon@Ubuntu:~/temp$ ll														# 当前目录下的链接文件已经被删了
total 16
drwxrwxr-x  3 leon leon 4096 Aug 29 15:53 ./
drwxr-xr-x 23 leon leon 4096 Aug 29 14:20 ../
drwxrwxr-x  2 leon leon 4096 Aug 29 14:29 testdir/
-rw-rw-r--  1 leon leon   40 Aug 29 14:21 testfile
leon@Ubuntu:~/temp$ ls -al testdir/											# 并且,源目录下的原始文件还在
total 12
drwxrwxr-x 2 leon leon 4096 Aug 29 15:55 .
drwxrwxr-x 3 leon leon 4096 Aug 29 15:54 ..
-rw-rw-r-- 1 leon leon   18 Aug 29 15:53 new_file
--------------------------------------------------------------------------------------------------------
leon@Ubuntu:~/temp$ rm -rf soft_link_for_dir/								# 这是错误的删除软链接的方式
leon@Ubuntu:~/temp$ ll														# 当前目录下的链接文件没有被删掉
total 16
drwxrwxr-x  3 leon leon 4096 Aug 29 15:54 ./
drwxr-xr-x 23 leon leon 4096 Aug 29 14:20 ../
lrwxrwxrwx  1 leon leon    7 Aug 29 15:54 soft_link_for_dir -> testdir/
drwxrwxr-x  2 leon leon 4096 Aug 29 15:54 testdir/
-rw-rw-r--  1 leon leon   40 Aug 29 14:21 testfile
leon@Ubuntu:~/temp$ ls -al testdir/											# 而源目录下的原始文件却被删掉了
total 8
drwxrwxr-x 2 leon leon 4096 Aug 29 15:54 .
drwxrwxr-x 3 leon leon 4096 Aug 29 15:54 ..
--------------------------------------------------------------------------------------------------------
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章