Linux高薪必备-软硬链接及文件系统inode| 学习笔记

简介: 快速学习Linux高薪必备-软硬链接及文件系统inode

开发者学堂课程【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进行查看

image.png

可以看到data和/是两个不同分区,不同分区不能创建硬链接。所以硬链接只能在同一分区不同目录或者同一目录下创建。当创建硬链接时,硬链接的编号会自动递增。

再来思考,现在创建一个文件夹,输入

mkdir dir1

ll

dir1这个文件夹可以创建链接吗?

输入ln dir1 dir2

结果显示不允许,硬链接不支持目录创建。但是观察到,创建文件夹时链接数为2。此时再创建一个f4文件,输入

touch f4

ll

image.png说明该文件夹有两个名字

输入ll -i显示如图可知dir1为它的一个名字

image.png

再来输入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为浅蓝色

image.png

但是两者不是同一个文件。再输入ll -i,f2和f2_link节点编号不同,分别为68、70。再来输入cat f2显示结果为f1,输入cat f2_link显示结果也为f1。

又观察出软链接的大小为2,与原始文件的大小没有任何关系。软链接大小与路径有关。

例如再创建f3的软链接进行对比。

输入:

ln -s f3 f3链接

ll

image.png

链接文件的大小就是路径的大小。

也能创建软链接的软链接,输入

ln -s f3链接 f3_link

image.png

f3_link占8个字节

但是如果删除原始文件f3,输入

rm -f f3

ll

结果如图,失效

image.png

再创建出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

image.png

若是版本淘汰要升级为新版本,只需将软链接指向的路径换为新的版本1.12。对于程序来讲,仍然访问的是nginx,但实际上指向的路径发生变化。

改为新版本,删除重建软链接,输入

rm -f nginx

ln -s nginx-1.12 nginx

ll

结果显示软链接nginx切换为版本1.12

最早讲述的网站mirrors.aliyun.com

进入后点击centos

image.png

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

如图

image.png

在 windows 中文件后缀很重要,如果修改a.exe成为a.txt,在windows中不能运行。

但是在 linux 中,加什么后缀对于linux并不重要,比如典型的tree命令

输入tree

显示刚才安装的软件

image.png

再来查看软件路径在哪,输入

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

结果照样执行

image.png所以在 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

显示如图

image.png

再比如输入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批量判断这个列表中保存的所有文件类型

结果显示

image.png

-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

相关文章
|
2月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
2天前
|
存储 Linux 文件存储
Linux文件系统
Linux文件系统 一切皆文件 在Linux中,“一切皆文件”的概念意味着系统中的所有资源,包括硬件设备、目录及进程等,均被视为文件。这种设计简化了操作和管理,具体包括: 普通文件:存储数据的常规文件。 目录文件:包含其他文件和子目录的文件。 进程文件:在/proc目录下代表系统中运行的进程。 设备文件:位于/dev目录,代表硬件设备。 网络字节流套接字文件:用于网络通信的数据流。 链接文件:指向另一个文件的符号链接或硬链接。 管道文件:用于进程间通信的文件。
26 7
|
29天前
|
并行计算 Ubuntu Linux
Ubuntu学习笔记(三):Linux下操作指令大全
Ubuntu学习笔记,介绍了Linux操作系统中常用的命令和操作,如文件管理、系统信息查看、软件安装等。
44 3
|
1月前
|
Linux 数据安全/隐私保护 索引
linux inode索引节点使用率100% 解决+hustoj忘记密码+最新MDK注册方法
linux inode索引节点使用率100% 解决+hustoj忘记密码+最新MDK注册方法
40 1
|
2月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
2月前
|
存储 Linux 索引
Linux 下最主流的文件系统格式——ext
【9月更文挑战第8天】硬盘被划分为若干相同大小的块(Block),默认大小为4K,便于灵活管理文件数据。文件数据分散存放于这些块中,提高了数据添加、删除和插入的便利性。
|
3月前
|
编解码 Linux 程序员
深度探索Linux操作系统 —— 构建根文件系统2
深度探索Linux操作系统 —— 构建根文件系统
44 12
|
3月前
|
Linux Shell 网络安全
深度探索Linux操作系统 —— 构建根文件系统1
深度探索Linux操作系统 —— 构建根文件系统
51 6
|
3月前
|
存储 人工智能 数据管理
深入理解Linux操作系统之文件系统管理探索人工智能:从理论到实践的旅程
【8月更文挑战第30天】在探索Linux的无限可能时,我们不可避免地会遇到文件系统管理这一核心话题。本文将深入浅出地介绍Linux文件系统的基础知识、操作命令及高级技巧,帮助你更有效地管理和维护你的系统。从基础概念到实践应用,我们将一步步揭开Linux文件系统的神秘面纱。
|
3月前
|
存储 监控 Linux