7.5 硬链接和软链接:
Linux链接分两种:
• 1、一种被称为硬链接(Hard Link)
【硬连接】:硬连接指通过索引节点号来进行连接。inode是可以对应多个文件名的
#扩展阅读
inode信息中有一项叫做”链接数”,记录指向该inode的文件名总数,这时就会增加1。反过来,删 除一个文件名,就会使得inode节点中的”链接数”减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。
这里顺便说一下目录文件的”链接数”。创建目录时,默认会生成两个目录项:和前者的 inode号码就是当前目录的inode号码,等同于当前目录的"硬链接";后者的inod e号码就是当前目 录的父目录的inode号码,等同于父目录的"硬链接"。所以,任何一个目录的"硬链接"总数,总是等 于2加上它的子目录总数(含隐藏目录),这里的2是父目录对其的"硬链接”和当前目录下的硬链接"。
• 2、另一种被称为软链接,即符号链接(Symbolic Link)
软链接文件有类似于Window s的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上 是一个文本文件,其中包含的有另一文件的位置信息。
如下图所示
文件2和文件1的inod e号码虽然不一样,但是文件2的内容是文件1的路径。读取文件2时,系统会自 动将访问者导向文件1。因此,无论打开哪一个文件,最终读取的都是文件1。这时,文件2就称为文 件1的"软链接"(soft link)或者''符号链接(symbolic link)。
这意味着,文件2依赖于文件1而存在,如果删除了文件1,打开文件2就会报错:"No such file or directory'o这是软链接与硬链接最大的不同:文件2指向文件1的路径,而不是文件1的inode号码,文件1的inode”链接数"不会因此发生变化。
硬链接知识点提炼:
0.对硬链文件内容进行修改,会影响到所有文件名;
1.硬链接文件与源文件具有相同inode的不同文件名:一个文件只能有一个inode号,但多个文件的inode号可以相同
2.删除硬链接或者原文件之一,不影响另一个文件名的访问,除非所有的都删除掉,所以硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止"误删”的功能。
3.删除所有硬链接,数据会在被磁盘检查或者新数据写入时候删除回收。
4.通过ln [原文件][目标文件]设置硬链接
5.通过rm -f删除硬链接
6.目录不可创建硬链接,并且硬链接无法跨区
# 示例
命令# touch small_egon .txt
命令# ln small_egon.txt big_egon.txt
命令# ls -i small_egon.txt
l7696460 small_egon.txt
命令# ls -i big_egon.txt
l7696460 big_egon.txt
命令# ll small_egon.txt # 两个硬链接文件的硬链接数均为2
-rw-r--r-- 2 root root 0 l2 月 l6 l7:05 small egon .txt
命令# ll big_egon.txt # 两个硬链接文件的硬链接数均为2
-rw-r--r-- 2 root root 0 l2 月 l6 l7:05 big_egon.txt
软链接知识提炼:
#0. 对软链的源文件或目标文件内容进行修改, 会影响到所有文件名;
#l. 软链接文件与源文件具有不同的inode号
#2. 删除软连接文件的源文件, 软链接文件将无法使用, 软链接作用
-l .软件升级
-2 .企业代码发布
-3 .不方便目录移动
#3. 删除源文件后, 软连接文件无效, 应该也一起删除掉, 以便回收
#4. 执行ln —s [ 原文件] [ 目标文件]创建软链接
#5. rm —f 删除软链接
#6、可以对目录创建软链接, 并且软连接可以跨分区
命令# touch l.txt
命令# ln -s l.txt 2.txt
命令# ls -i l.txt
l7696462 l.txt
命令# ls -i 2.txt
l7696463 2.txt
命令# ll l.txt # 两个软链接文件的硬链接数均为l
-rw-r--r-- l root root 0 l2 月 l6 l7:26 l.txt
命令# ll 2.txt # 两个软链接文件的硬链接数均为l
lrwxrwxrwx l root root 5 l2 月 l6 l7:26 2.txt -> l.txt
命令# rm -rf l.txt # 删掉l.txt, 会发现2.txt不可用
命令# ll 2.txt
lrwxrwxrwx l root root 5 l2 月 l6 l7:26 2.txt -> l.txt
命令# mkdir /dirl
命令# ln /dirl /dir2
ln: " /dirl ": 不允许将硬链接指向目录
命令# ln -s /dirl / /dir2
7.6实战应用:
磁盘有空间但创建不了文件
实战场景:在一台配置较低的Linux服务器(内存、硬盘比较小)的/data分区内创建文件时, 系统提示磁盘空间不足, 用df -h命令查看了一下磁盘使用情况,发现/data分区只使用了80%, 还有1.9G的剩余空间, 但是无法创建新的文件。当时使用的是root用户。服务器没有被黑。
[rootmxxx ~]# df -h
文件系统 容量已用 可用 已用8 挂载点
/dev/sda3 l0G 8 .0G l .9G 80%/
常识: 只要权限够, 磁盘上有空间一定可以创建文件。这个是错的。
排查:
[root@xxx ~]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/sda3 5242880 0 52428800 100%/
后来用df-i查看了一下/data所在的分区的索引节点(inode),发现已经用满(IUsed=100%),导致系统无法创建新目录和文件。
查找原因: /data/cache目录中存在数量非常多的小字节缓存文件,占用的Block不多,但是占用了大量的inode。
解决方案1:删除/data/cache目录中的部分文件,释放出/data分区的一部分inode。
解决方案2:在/data备份好一些文件,然后删除这些文件,释放一些inode,然后创建一个文件夹/data/cache2。在cache2下挂载一个新分区:sda4,下次写数据需要写到新分区cache2目录下。
命令# mkfs.xfs /dev/sdb
meta-data=/dev/sdb isize=512 agcount=4, agsize=1310720 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=5242880,imaxpct=25
= sunit=0 swidth=blocks=5242880
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime=none extsz=4096 blocks=0, rtextents=0
命令# mkdir /data/cache2
命令# mount /dev/sdb /data/cache2/
ps:inode分区完后,不可以增加inode数量,改变inode大小
其他场景:
1.大量的小文件问题:可能会使inode耗尽,使得文件文法创建。(磁盘利用率低)--->对于小文件比较多的场景,将block划分小一点。
2.大文件问题:一个文件占用多个block,使得文件读写速率慢。----> 将block划分大一点。3.ext文件系统——xfs文件系统
Linux中软链接和硬链接的区别:
1.从定义:linux系统中,链接有两种,一种被称为软链接,类似于快捷方式,存放指向原文件inode的 信息,与原文件inode不同。一种是硬链接,与原文件有相同的inode,可以指向数据block。
2.从创建方式:硬链接命令In[原文件][目标文件],软链接命令In -s[原文件][目标文件]
3.从创建对象:In命令不能对目录创建硬链接,但是可以对目录创建软链接。因为软链接可以跨越文件 系统,硬链接则不能。对目录和为客户创建的文件软链接经常用到。
4.删除软链接文件,对硬链接和原文件无影响。
5.删除文件硬链接,对原文件及软链接文件无影响
6.删除原文件,对硬链接读取数据无影响,软链接则失效。会出现红底白字状。
7.同时删除原文件和硬链接,原文件才会被真正删除
8.很多硬件设备中的快照原理,类似于硬链接原理