开发者学堂课程【Linux企业运维实战 - 入门及常用命令:Linux高薪必备-软硬链接及文件系统inode】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/550/detail/7605
Linux高薪必备-软硬链接及文件系统inode
内容介绍:
一、rm和inode
二、硬链接
三、符号(或软)链接
四、mv和inode
五、确定文件内容
一、rm和inode
rm命令:
链接数递减,从而释放的inode号可以被重用
把数据块放在空闲列表中
删除目录项
数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖。
讲解:
在删除文件时,会回收节点编号。一旦回收,该节点编号就可以分配给新的文件使用。
文件名和节点编号的对应关系,对于用户,是文件名,对于系统识别节点编号,上节内容讲到文件夹的数据内容存放目录下每个文件以及节点编号对应关系。在linux中,允许针对一个文件,在同一节点编号情况下,起多个名。这种实现方法用硬链接实现。
二、硬链接
创建硬链接会增加额外的记录项以引用文件
对应于同一文件系统上一个物理文件
每个目录引用相同的inode号
创建时链接数递增
删除文件时:
rm命令递减计数的链接
文件要存在,至少有一个链接数
当链接数为零时,该文件被删除
不能跨越驱动器或分区
语法:
In filename [linkname ]
讲解:
比如现在有一个f1文件,查看到它的节点编号为68
输入 ll f1 -i
显示68 -rw-r--r--. 1 root root 0 Mar 30 14:55 f1
针对f1文件,再来创建一个文件名,但是与 f1有相同的节点编号,输入
ln f1 f2
查看两者是否使用相同的节点编号,输入
ll -i
结果显示,两者编号一样,但是名字不同
实际上ln是 link 的简写,创建硬链接。ln命令的语法是前面写旧文件,后面写生成的与它节点编号相同的新文件文件名。
两者属性相同,大小相同,内容相同。
注意到在创建硬链接前,输入ll f1 -i结果中有数字1,但是创建硬链接后,数字变为2,该数字为链接数。链接数代表着该节点编号对应有几个文件名。比如再用f2创建一个硬链接,输入ln f2 f3
再来查看,链接数应该变为3,输入ll -i
由于硬链接是一个文件起多个名字,所以不管通过哪个名字访问,得到的内容都相同。那么f1、f2、f3之间存在关系吗?
创建时f2根据f1创建,f3根据f2创建,如果将f1删除掉,f2、f3是否可以继续访问?
注意硬链接实质是将一个文件起多个名字,所以三者之间不依赖,是平等关系。现在删除f1,输入rm -f f1
删除后查看,输入ll -i
结果显示,链接数减1,f2和f3仍然存在
所以删除f1只是删除名字。
以上根据文件创建了硬链接,那么可以放在别的目录下吗?
比如创建一个etc下的hosts,放在mnt下,输入
ln /etc/hosts /mnt/hosts_link
成功运行,之后访问/etc/hosts或者/mnt/hosts_link内容一样。
再比如输入
ln f2 /root/f2_link
这时会报错,原因是因为跨了分区。因为data下的f2是一个分区,而root是在根分区中,是另一个分区。
输入df -h
进行查看
可以看到data和/是两个不同分区,不同分区不能创建硬链接。所以硬链接只能在同一分区不同目录或者同一目录下创建。当创建硬链接时,硬链接的编号会自动递增。
再来思考,现在创建一个文件夹,输入
mkdir dir1
ll
dir1这个文件夹可以创建链接吗?
输入ln dir1 dir2
结果显示不允许,硬链接不支持目录创建。但是观察到,创建文件夹时链接数为2。此时再创建一个f4文件,输入
touch f4
ll
说明该文件夹有两个名字
输入ll -i
显示如图可知dir1为它的一个名字
再来输入ll -i dir1/ -a
结果可以看到dir1下有.
.代表当前目录,当前目录是dir1,也是67,所以为2.而任何一个新建的文件夹是否都有.
所以新建的文件夹链接数至少都为2。现在再来增加为3,则再创建一个名dir11,输入
mkdir dir1/dir11
ll -i
结果显示链接数为3
三、符号(或软)链接
一个符号链接指向另一个文件
ls - l的显示链接的名称和引用的文件
一个符号链接的内容是它引用文件的名称
可以对目录进行
可以跨分区
指向的是另一个文件的路径;其大小为指向的路径字符串的长度﹔不增加或减少目标文件inode的引用计数;
语法:
ln -s filename [linkname]
软链接的创建方法是-s,又称符号链接。比如现在对f2文件创建一个软链接,输入
ln -s f2 f2_link
ll
结果可以看到创建出的f2_link为浅蓝色
但是两者不是同一个文件。再输入ll -i
,f2和f2_link节点编号不同,分别为68、70。再来输入cat f2显示结果为f1,输入cat f2_link
显示结果也为f1。
又观察出软链接的大小为2,与原始文件的大小没有任何关系。软链接大小与路径有关。
例如再创建f3的软链接进行对比。
输入:
ln -s f3 f3链接
ll
链接文件的大小就是路径的大小。
也能创建软链接的软链接,输入
ln -s f3链接 f3_link
f3_link占8个字节
但是如果删除原始文件f3,输入
rm -f f3
ll
结果如图,失效
再创建出f3,输入
touch f3
ll
显示正常
一般来说,创建硬链接都是针对不同目录创建。输入
ln /data/f4 /root/f4_link
创建硬链接不行,再来创建软链接,输入
ln -s /data/f4 /root/f4_link
创建成功后输入
ll /root/f4_link
可以看到是8个字节,可知是由路径大小数出:/data/f4,与原始文件大小无关。创建完后,软链接的链接数不会变化。
因为链接数的含义是同一个文件有几个文件名,但是创建软连接后已经不是同一个文件。软链接和原始文件不是同一个文件。
此外创建软链接也可以创建目录,输入
ln -s /data/dir1 /root/dir1_link
硬链接不能创建文件夹,软链接可以。
现在在data目录下,输入ls查看data目录下存在f2文件,再输入ln -s f2 /root/f2_link
,输入
ll /root/f2_link
结果显示红色报错,文件失效。写相对路径时不能写在相对当前工作目录下的路径,而是要相对软链接的路径。
所以即使现在f2在当前目录中,也要写相对软链接的路径,输入
Ln -s f2 /root/f2_link2
f2在data目录下,要是想要写f2_link2该文件的相对路径,先要回到根下,该文件在root下,回到上一级就是回到根上,输入
ln -s ../data/f2 /root/f2_link2
再来输入ll /root/f2_link2
结果显示正常
总结硬链接软链接区别:
本质上
硬链接:同一个文件多个名字
软链接:一个文件对应快捷方式,不同文件
1、链接数: 硬链接会增长链接数,软链接不会增长
2、跨分区: 软链接可以跨分区,硬链接不支持跨分区
3、目录: 硬链接不支持目录,软链接支持
4、原始和链接文件的关系: 硬链接原始文件和链接文件一样,独立平等。软链接文件依赖于原始文件
5、删除: 硬链接删除原始文件,新的链接不受影响。软链接删除原始文件,链接会失效
6、大小: 软链接大小由原始文件路径决定
想要查看一个软链接对应的原始文件路径,例如查看f2_link,使用ll命令,输入
ll f2_link
结果显示f2_link -> f2
如果使用ls命令,输入ls f2_link
结果显示f2_link
实际上有一个专门的命令readlink,输入
readlink f2_link
结果显示f2
再例如输入
readlink /etc/grub2.cfg
结果显示 ../boot/grub2/grub.cfg
在创建软链接时可以写绝对路径,也可以写相对路径,但是一般使用相对路径,相对路径是相对于软链接的路径。在系统中,硬链接和软链接最终实现的效果相似,是通过新的文件名访问原始文件,但是软链接使用更灵活,可以跨分区不受限制,使用更多。
例如部署一个软件nginx,输入
rm -rf *
ls
mkdir nginx-1.10
//该软件假设有版本1.10
将软件放在data目录下,输入
pwd
显示结果/data
输入ls
显示结果nginx-1.10
若是出现新版本,再建一个1.12,输入
mkdir nginx-1.12
ls
显示结果nginx-1.10 nginx-1.12
现在要将旧版本升级到新版本,还需修改路径,这时可以用软链接的方法更简单,输入
ln -s nginx-1.10 nginx
ll
结果显示如图,两种版本都命名为软链接nginx
若是版本淘汰要升级为新版本,只需将软链接指向的路径换为新的版本1.12。对于程序来讲,仍然访问的是nginx,但实际上指向的路径发生变化。
改为新版本,删除重建软链接,输入
rm -f nginx
ln -s nginx-1.12 nginx
ll
结果显示软链接nginx切换为版本1.12
最早讲述的网站mirrors.aliyun.com
进入后点击centos
7/本质上就指向的是最新版7.4.1708/,出现新版本,7/就又指向最新版。
此外,基于兼容性目的,软链接也存在意义,有些文件夹因为版本更迭,有些数据会迁到新位置。比如存在一个软件原来目录为/usr/ver1,后来改为/data/ver下
但是有的旧软件仍然会访问/usr/ver1,为了解决,创建一个软链接指向新路径。这样旧的路径还在,通过旧的路径仍然能访问。
四、mv和inode
如果mv命令的目标和源在相同的文件系统,作为mv命令
用新的文件名创建对应新的目录项
删除旧目录条目对应的旧的文件名
不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!
如果目标和源在一个不同的文件系统,mv相当于cp和rm
讲解:
移动命令在windows中:同一分区移动数据和不同分区移动该数据是有效率区别的。
同一分区不同目录下移动数据比不同分区移动数据快,因为数据在磁盘上,如果在同一分区移动,数据不动,只是调整了目录结构。文件从一个文件夹调到另一个文件夹,但是文件在磁盘上不动,所以速度快。但是不同分区移动是要将数据一个个转移。
不同分区移动相当于先复制再删除,先拷贝旧目标,再删除旧目标。
五、确定文件内容
文件可以包含多种类型的数据
检查文件的类型,然后确定适当的打开命令或应用程序使用
file [options] ...
常用选项:
-b列出文件辨识结果时,不显示文件名称
-f filelist列出文件filelist中文件名的文件类型
-F使用指定分隔符号替换输出文件名后默认的”:”分隔符
-L查看对应软链接对应文件的文件类型
--help显示命令在线帮助
讲解:
对于文件来说,在windows中是通过文件后缀来辨别文件类型,比如可执行的程序都是.exe后缀。但是在linux中,我们访问文件经常看到很多文件不带后缀,例如输入
ls /bin
如图
在 windows 中文件后缀很重要,如果修改a.exe成为a.txt,在windows中不能运行。
但是在 linux 中,加什么后缀对于linux并不重要,比如典型的tree命令
输入tree
显示刚才安装的软件
再来查看软件路径在哪,输入
which tree
结果显示/usr/bin/tree
该目录与bin目录一样,输入
ll /bin/tree
结果显示 -rwxr-xr-x. 1 root root 62768 Jun 10 2014 /bin/tree
在centos7中,bin目录实际上是一个软链接,输入
ll -d /bin
结果显示指向usr/bin
lrwxrwxrwx . 1 root root 7 Mar 28 01:54 /bin ->usr/bin
现在给该文件改名,改为txt,输入
mv /bin/tree /bin/tree.txt
tree.txt /data
结果照样执行
所以在 linux 中,修改后缀不对系统产生影响。不能通过后缀来判断此文件的类型,使用 file 命令进行查看,file命令可以判断文件的类型,而不是简单的看后缀。
判断原理是打开该文件,然后分析该文件结构,从结构中判断到底是什么类型。但是只看头部信息,一般来讲,不同类型文件,头部信息不同。
输入file /bin/tree.txt
结果显示是一个64位的可执行程序ELT 64-bit LSB executable
windows中的可执行程序与linux不同,头部信息也不同。
输入hexdump -C notepad.exe -n 100
显示如图
输入hexdump -C /bin/tree.txt -n 100
显示如图
再比如输入file /etc
结果显示/etc: directory
再比如输入 file /boot/vmlinuz-3.10.0-693.el7.x86_64
结果显示是一个 linux 内核文件 Linux kernel
再输入 file /etc/hosts
结果显示是一个文本文件/etc/hosts: ASCII text
再输入 file /etc/grub2.cfg
结果显示是一个符号链接即软链接/etc/grub2.cfg: symbolic link to ../boot/grub2/grub.cfg’
file 命令还有一些选项,例如-b
默认情况下结果显示时,会显示原始文件,加上-b,意味着不显示原始文件,输入
file -b /etc/
结果显示
directory
-f选项可以批量的判断多个文件,输入
nano filelist //先写filelist文件列表
进入后写入
/etc/hosts
/data
/bin/ls
以上文件
然后输入cat filelist
再输入file -f filelist
,使用f批量判断这个列表中保存的所有文件类型
结果显示
-F选项改变分隔符,默认使用:
作为分隔,改为===,输入
file -F “===” -f filelist
结果显示:变为===
-L选项对应软链接,输入
file /etc/grub2.cfg
结果显示
/etc/grub2.cfg: symbolic link to ../boot/grub2/grub.cfg’
要判断该软链接指向的原始文件时,加入L,输入
file -L /etc/grub2.cfg
结果显示/etc/grub2.cfg: ASCII text
再比如输入 file -L /bin
结果显示/bin:directory