Linuxln命令:在⽂件之间建⽴链接(硬链接和软链接)详解版Linux ln命令:在⽂件之间建⽴链接(硬链接和软链接)详解版<  >
如果要想说清楚 ln 命令,则必须先解释下 ext ⽂件系统(Linux ⽂件系统)是如何⼯作的。我们在前⾯讲解了分区的格式化就是写⼊⽂件系统,⽽我们的 Linux ⽬前使⽤的是 ext4 ⽂件系统。如果⽤⼀张⽰意图来描述 ext4 ⽂件系统,则可以参考图 1。
图 1 ext4 ⽂件系统⽰意图
ext4 ⽂件系统会把分区主要分为两⼤部分(暂时不提超级块):⼩部分⽤于保存⽂件的 inode (i 节点)信息;剩余的⼤部分⽤于保存 block 信息。
inode 的默认⼤⼩为 128 Byte,⽤来记录⽂件的权限(r、w、x)、⽂件的所有者和属组、⽂件的⼤⼩、⽂件的状态改变时间(ctime)、⽂件的最近⼀次读取时间(atime)、⽂件的最近⼀次修改时间(mtime)、⽂件的数据真正保存的 block 编号。每个⽂件需要占⽤⼀个inode。⼤家如果仔细查看,就会发现 inode 中是不记录⽂件名的,那是因为⽂件名记录在⽂件所在⽬录的 block 中。
block 的⼤⼩可以是 1KB、2KB、4KB,默认为 4KB。block ⽤于实际的数据存储,如果⼀个 block 放不下数据,则可以占⽤多个 block。例如,有⼀个 10KB 的⽂件需要存储,则会占⽤ 3 个 block,虽然最后⼀个 block 不能占满,但也不能再放⼊其他⽂件的数据。这 3 个 block 有可能是连续的,也有可能是分散的。
由此,我们可以知道以下 2 个重要的信息:
1. 每个⽂件都独⾃占⽤⼀个 inode,⽂件内容由 inode 的记录来指向;
2. 如果想要读取⽂件内容,就必须借助⽬录中记录的⽂件名到该⽂件的 inode,才能成功到⽂件内容所在的 block 块;
了解了 Linux 系统底层⽂件的存储状态后,接下来学习 ln 命令。
ln 命令⽤于给⽂件创建链接,根据 Linux 系统存储⽂件的特点,链接的⽅式分为以下 2 种:
软链接:类似于 Windows 系统中给⽂件创建快捷⽅式,即产⽣⼀个特殊的⽂件,该⽂件⽤来指向另⼀个⽂件,此链接⽅式同样适⽤于⽬录。
硬链接:我们知道,⽂件的基本信息都存储在 inode 中,⽽硬链接指的就是给⼀个⽂件的 inode 分配多个⽂件名,通过任何⼀个⽂件名,都可以到此⽂件的 inode,从⽽读取该⽂件的数据信息。
ln 命令的基本格式如下:
[root@localhost ~]# ln [选项] 源⽂件⽬标⽂件
选项:
-s:建⽴软链接⽂件。如果不加 "-s" 选项,则建⽴硬链接⽂件;
-f:强制。如果⽬标⽂件已经存在,则删除⽬标⽂件后再建⽴链接⽂件;
【例 1】创建硬链接:
[root@localhost ~]# touch cangls
[root@localhost ~]# ln /root/cangls /tmp
#建⽴硬链接⽂件,⽬标⽂件没有写⽂件名,会和原名⼀致
#也就是/tmp/cangls 是硬链接⽂件
【例 2】创建软链接:
[root@localhost ~]# touch bols
[root@localhost ~]# In -s /root/bols /tmp
#建⽴软链接⽂件
这⾥需要注意,软链接⽂件的源⽂件必须写成绝对路径,⽽不能写成相对路径(硬链接没有这样的要求);否则软链接⽂件会报错。这是初学者⾮常容易犯的错误。
ln创建链接的深度剖析
建⽴硬链接和软链接⾮常简单,那这两种链接有什么区别?它们都有什么作⽤?这才是链接⽂件最不容易理解的地⽅,我们分别来讲讲。ln创建硬链接
我们再来建⽴⼀个硬链接⽂件,然后看看这两个⽂件的特点。
[root@localhost ~]# touch test
#建⽴源⽂件
[root@localhost ~]# ln /root/test /tmp/test-hard
#给源⽂件建⽴硬链接⽂件 /tmp/test-hard
[root@localhost ~]# ll -i /root/test /tmp/test-hard
262147 -rw-r--r-- 2 root root 0 6⽉ 19 10:06 /root/test
hard
262147 -rw-r--r-- 2 root root 0 6⽉ 19 10:06 /tmp/test-hard
#查看两个⽂件的详细信息,可以发现这两个⽂件的 inode 号是⼀样的,"ll"等同于"ls -l"。
这⾥有⼀件很奇怪的事情,我们之前在讲 inode 号的时候说过,每个⽂件的 inode 号都应该是不⼀样的。inode 号就相当于⽂件 ID,我们在查⽂件的时候,要先查 inode 号,才能读取到⽂件的内容。
但是这⾥源⽂件和硬链接⽂件的 inode 号居然是⼀样的,那我们在查⽂件的时候,到底到的是哪⼀个⽂件呢?我们来画⼀张⽰意图,如图 2 所⽰。
图 2 硬链接⽰意图
在 inode 信息中,是不会记录⽂件名称的,⽽是把⽂件名记录在上级⽬录的 block 中。也就是说,⽬录的 block 中记录的是这个⽬录下所有⼀级⼦⽂件和⼦⽬录的⽂件名及 inode 的对应;⽽⽂件的 block 中记录的才是⽂件实际的数据。
当我们查⼀个⽂件,⽐如 /root/test 时,要经过以下步骤:
1. ⾸先到根⽬录的 inode(根⽬录的 inode 是系统已知的,inode 号是 2),然后判断⽤户是否有权限访问根⽬录的 block。
2. 如果有权限,则可以在根⽬录的 block 中访问到 /root 的⽂件名及对应的 inode 号。
3. 通过 /root/ ⽬录的 inode 号,可以查到 /root/ ⽬录的 inode 信息,接着判断⽤户是否有权限访问 /root/ ⽬录的 block。
4. 如果有权限,则可以从 /root/ ⽬录的 block 中读取到 test ⽂件的⽂件名及对应的 inode 号。
5. 通过 test ⽂件的 inode 号,就可以到 test ⽂件的 inode 信息,接着判断⽤户是否有权限访问 test ⽂件的 block。
6. 如果有权限,则可以读取 block 中的数据,这样就完成了 /root/test ⽂件的读取与访问。
按照这个步骤,在给源⽂件 /root/test 建⽴了硬链接⽂件 /tmp/test-hard 之后,在 /root/ ⽬录和 /tmp/ ⽬录的 block 中就会建⽴ test 和 test-hard 的信息,这个信息主要就是⽂件名和对应的 inode 号。但是我们会发现 test 和 test-hard 的 inode 信息居然是⼀样的,那么,我们⽆论访问哪个⽂件,最终都会访问 inode 号是 262147 的⽂件信息。
这就是硬链接的原理。硬链接的特点如下:
不论是修改源⽂件(test ⽂件),还是修改硬链接⽂件(test-hard ⽂件),另⼀个⽂件中的数据都会发⽣改变。
不论是删除源⽂件,还是删除硬链接⽂件,只要还有⼀个⽂件存在,这个⽂件(inode 号是 262147 的⽂件)都可以被访问。
硬链接不会建⽴新的 inode 信息,也不会更改 inode 的总数。
硬链接不能跨⽂件系统(分区)建⽴,因为在不同的⽂件系统中,inode 号是重新计算的。
硬链接不能链接⽬录,因为如果给⽬录建⽴硬链接,那么不仅⽬录本⾝需要重新建⽴,⽬录下所有的⼦⽂件,包括⼦⽬录中的所有⼦⽂件都需要建⽴硬链接,这对当前的 Linux 来讲过于复杂。
硬链接的限制⽐较多,既不能跨⽂件系统,也不能链接⽬录,⽽且源⽂件和硬链接⽂件之间除 inode 号是⼀样的之外,没有其他明显的特征。这些特征都使得硬链接并不常⽤,⼤家有所了解就好。
我们通过实验来测试⼀下。
[root@localhost ~]# echo 1111 >>/root/test
#向源⽂件中写⼊数据
[root@localhost ~]# cat /root/test
1111
[root@localhost ~]# cat /tmp/test-hard
1111
#源⽂件和硬链接⽂件都会发⽣改变
[root@localhost ~]# echo 2222 >> /tmp/test-hard
#向硬链接⽂件中写⼊数据
[root@localhost ~]# cat /root/test
1111
2222
[root@localhost ~】# cat /tmp/test-hard
1111
2222
#源⽂件和硬链接⽂件也都会发⽣改变
[root@localhost ~]# rm -rf/root/test
#删除源⽂件
[root@localhost ~]# cat /tmp/test-hard
1111 2222
#硬链接⽂件依然可常读取
ln创建软链接
软链接也称作符号链接,相⽐硬链接来讲,软链接就要常⽤多了。我们先建⽴⼀个软链接,再来看看软链接的特点。
[root@localhost ~]# touch check
#建⽴源⽂件
[root@localhost ~]# ln -s /root/check /tmp/check-soft
#建⽴软链接⽂件
[root@localhost ~]# ll -id /root/check /tmp/check-soft
262154 -rw-r--r-- 1 root root 0 6⽉ 19 11:30 /root/check
917507 lrwxrwxrwx 1 root root 11 6⽉ 19 11:31 /tmp/ check-soft -> /root/check
#软链接和源⽂件的 inode 号不⼀致,软链接通过 -> 明显地标识出源⽂件的位置
#在软链接的权限位 lrwxrwxrwx 中,l 就代表软链接⽂件
再强调⼀下,软链接的源⽂件必须写绝对路径,否则建⽴的软链接⽂件就会报错,⽆法正常使⽤。
软链接的标志⾮常明显,⾸先,权限位中"l"表⽰这是⼀个软链接⽂件;其次,在⽂件的后⾯通过 "->" 显⽰出源⽂件的完整名字。所以软链接⽐硬链接的标志要明显得多,⽽且软链接也不像硬链接的限制那样多,⽐如软链接可以链接⽬录,也可以跨分区来建⽴软链接。
软链接完全可以当作 Windows 的快捷⽅式来对待,它的特点和快捷⽅式⼀样,我们更推荐⼤家使⽤软链接,⽽不是硬链接。
⼤家在学习软链接的时候会有⼀些疑问:Windows 的快捷⽅式是由于源⽂件放置的位置过深,不容易到,建⽴⼀个快捷⽅式放在桌⾯,⽅便查,那 Linux 的软链接的作⽤是什么呢?
笔者个⼈觉得,软链接主要是为了照顾管理员的使⽤习惯。⽐如,有些系统的⾃启动⽂件 /etc/rc.local 放置在 /etc ⽬录中,⽽有些系统却将其放置在 /etc/rc.d/rc.local 中,那么⼲脆对这两个⽂件建⽴软链接,不论你习惯操作哪⼀个⽂件,结果都是⼀样的。
如果你⽐较细⼼,则应该已经发现软链接和源⽂件的 inode 号是不⼀致的,我们也画⼀张⽰意图来看看软链接的原理,如图 3 所⽰。
图 3 软链接⽰意图
软链接和硬链接在原理上最主要的不同在于:硬链接不会建⽴⾃⼰的 inode 索引和 block(数据块),⽽是直接指向源⽂件的 inode 信息和block,所以硬链接和源⽂件的 inode 号是⼀致的;⽽软链接会真正建⽴⾃⼰的 inode 索引和 block,所以软链接和源⽂件的 inode 号是不⼀致的,⽽且在软链接的 block 中,写的不是真正的数据,⽽仅仅是源⽂件的⽂件名及 inode 号。
我们来看看访问软链接的步骤和访问硬链接的步骤有什么不同。
1. ⾸先到根⽬录的 inode 索引信息,然后判断⽤户是否有权限访问根⽬录的 block。
2. 如果有权限访问根⽬录的 block,就会在 block 中查到 /tmp/ ⽬录的 inode 号。
3. 接着访问 /tmp/ ⽬录的 inode 信息,判断⽤户是否有权限访问 /tmp/ ⽬录的 block。
4. 如果有权限,就会在 block 中读取到软链接⽂件 check-soft 的 inode 号。因为软链接⽂件会真正建⽴⾃⼰的 inode 索引和 block,所以
软链接⽂件和源⽂件的 inode 号是不⼀样的。
linux所有命令都无法使用
5. 通过软链接⽂件的 inode 号,到了 check-soft ⽂件 inode 信息,判断⽤户是否有权限访问 block。
6. 如果有权限,就会发现 check-soft ⽂件的 block 中没有实际数据,仅有源⽂件 check 的 inode 号。
7. 接着通过源⽂件的 inode 号,访问到源⽂件 check 的 inode 信息,判断⽤户是否有权限访问 block。
8. 如果有权限,就会在 check ⽂件的 block 中读取到真正的数据,从⽽完成数据访问。
通过这个过程,我们就可以总结出软链接的特点(软链接的特点和 Windows 中的快捷⽅式完全⼀致)。
不论是修改源⽂件(check),还是修改硬链接⽂件(check-soft),另⼀个⽂件中的数据都会发⽣改变。
删除软链接⽂件,源⽂件不受影响。⽽删除原⽂件,软链接⽂件将不到实际的数据,从⽽显⽰⽂件不存在。
软链接会新建⾃⼰的 inode 信息和 block,只是在 block 中不存储实际⽂件数据,⽽存储的是源⽂件的⽂件名及 inode 号。
软链接可以链接⽬录。
软链接可以跨分区。
我们测试⼀下软链接的特性。
[root@localhost ~]# echo 111>>/root/check
#修改源⽂件
[root@localhost ~]# cat /root/check
111
[root@localhost ~]# cat /tmp/check-soft
111
#不论是源⽂件还是软链接⽂件,数据都发⽣改变
[root@localhost ~]# echo 2222 >>/tmp/check-soft
#修改软链接⽂件
[root@localhost ~]# cat /tmp/check-soft
111
2222
[root@localhost ~]# cat /root/check
111
2222
#不论是源⽂件还是软链接⽂件,数据也都会发⽣改变[root@localhost ~]# rm -rf/root/check
#删除源⽂件
[root@localhost ~]# cat /tmp/check-soft
cat: /tmp/check-soft:没有那个⽂件或⽬录
#软链接⽆法正常使⽤
软链接是可以链接⽬录的,例如:
[root@localhost ~]# mkdir test
#建⽴源⽬录
[root@localhost ~]# ln -s /root/test/ /tmp/
[root@localhost ~]# ll -d /tmp/test
lrwxrwxrwx 1 root root 11 6⽉ 19 12:43 /tmp/test->/root/test/ #软链接可以链接⽬录

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。