Linux学习-09-Linux ln命令:建立硬链接和软链接文件

3.11 Linux ln命令:建立链接(硬链接和软链接)文件

  • 计算器就是处理各种数据的,数据在硬盘上以二进制存储,机器来识别运行二进制数据,人们需要借助翻译器,将这些二进制的数据还原成看懂的文件形式,这个工作就是由文件系统来完成的,文件系统的目的就是实现数据的查询和存储,由于使用场合、使用环境的不同,Linux 有多种文件系统,不同文件系统采用不同的方法来管理磁盘空间,各有优劣;
  • 文件系统是具体到分区的,所以格式化针对的是分区,分区格式化是指采用指定的文件系统类型对分区空间进行登记、索引并建立相应的管理表格的过程。文件系统是管理数据的,而可以存储数据的物理设备有硬盘、U 盘、SD 卡、NAND FLASH、NOR FLASH、网络存储设备等。不同的存储设备其物理结构不同,不同的物理结构就需要不同的文件系统去管理,比如管理 NAND FLASH 的话使用 YAFFS 文件系统,管理硬盘、SD 卡的话就是 ext 文件系统等等。
  • Linux 下的文件系统主要有 ext2、ext3、ext4 等文件系统。Linux 还支持其他的 UNIX 文件系统,比如 XFS、JFS、UFS 等,也支持 Windows 的 FAT 文件系统和网络文件系统 NFS 等。主要讲一下 Linux 自带的 ext2、ext3 和 ext4 文件系统。
    • ext2:具有极快的速度和极小的CPU占用率,可用于硬盘和移动存储设备,是 Linux 早期的文件系统,但是随着技术的发展 ext2 文件系统已经不推荐使用了,ext2是一个非日志文件系统,大多数的 Linux 发行版都不支持 ext2 文件系统了。
    • ext3:在 ext2 的基础上发展起来的文件系统,完全兼容 ext2 文件系统,ext3 是一个日志文件系统,ext3 支持大文件,ext3 文件系统的特点有如下:
      • 高可靠性:使用 ext3 文件系统的话,即使系统非正常关机、发生死机等情况,恢复 ext3 文件系统也只需要数十秒。日志功能,可回溯追踪
      • 数据完整性:ext3 提高了文件系统的完整性,避免意外死机或者关机对文件系统的伤害。
      • 文件系统速度:ext3 的日志功能对磁盘驱动器读写头进行了优化,文件系统速度相对与 ext2来说没有降低。
      • 数据转换:从 ext2 转换到 ext3 非常容易,只需要两条指令就可以完成转换。用户不需要花时间去备份、恢复、格式化分区等,用 ext3 文件系统提供的工具 tune2fs 即可轻松的将 ext2 文件系统转换为 ext3 日志文件系统。ext3 文件系统不需要经过任何修改,可以直接挂载成 ext2 文件系统。
    • ext4日志式文件系统,支持1EB(1024*1024TB),最大单文件16TB,支持连续写入可减少文件碎片。在 ext3 上发展起来的,ext4 相比与 ext3 提供了更佳的性能和可靠性,并且功能更丰富,ext4 向下兼容 ext3 和 ext2,因此可以将 ext2 和 ext3 挂载为 ext4。
    • rhel6:默认文件系统
    • xfs:可以管理500T的硬盘。rhel7默认文件系统
    • brtfs:文件系统针对固态盘做优化

EXT(Extended file system)是延伸文件系统、扩展文件系统,ext1于1992年4月发表,是为linux核心所做的第一个文件系统。格式化命令:mkfs -t <文件系统类型> <分区设备文件名>

mkfs -t xfs /dev/sdb1

  • windows操作系统的文件系统类型:
  • FAT16:MS—DOS和win95采用的磁盘分区格式,采用16位的文件分配表,只支持2GB的磁盘分区,最大单文件2GB,且磁盘利用率低
  • FAT32:(即Vfat)采用32位的文件分配表,支持最大分区128GB,最大文件4GB
  • NTFS:支持最大分区2TB,最大文件2TB,安全性和稳定性非常好,不易出现文件碎片。
  • 其他的文件系统类型:
  • RAMFS:内存文件系统 /ISO 9660:光盘
  • NFS:网络文件系统/SMBAFS/CIFS:支持Samba协议的网络文件系统
  • Linux swap:交换分区,用以提供虚拟内存
  • Linux 终端中输入如下命令来查询当前磁盘挂载的啥文件系统
df -T –h

Linux学习-09-Linux ln命令:建立硬链接和软链接文件_第1张图片

“/dev/vda1”就是我们的磁盘分区,可以看出这个磁盘分区类型是 ext4,它的挂载点是“/”,也就是根目录

  • ext4 文件系统结构:
    Linux学习-09-Linux ln命令:建立硬链接和软链接文件_第2张图片

  • 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。例如,有一个 9KB 的文件需要存储,则会占用 3 个 block,虽然最后一个 block 不能占满,但也不能再放入其他文件的数据。这 3 个 block 有可能是连续的,也有可能是分散的。

  1. 每个文件都独自占用一个 inode,文件内容由 inode 的记录来指向;
  2. 如果想要读取文件内容,就必须借助目录中记录的文件名找到该文件的 inode,才能成功找到文件内容所在的 block 块;
  3. 用户可以通过这种机制建立硬链接到一些重要文件上,防止误删
  • 知道了Linux 系统底层文件的存储状态后,接下来学习 ln 命令。

  • ln 命令用于给文件创建链接,根据 Linux 系统存储文件的特点,链接的方式分为以下 2 种:

    • 软链接/符号连接(Symbolic Link):类似于 Windows 系统中给文件创建快捷方式,即产生一个特殊的文件,该文件用来指向另一个文件,此链接方式同样适用于目录。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。比如:A 是 B 的软链接(A 和 B 都是文件名),A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号不相同,A 和 B 指向的是两个不同的 inode,继而指向两块不同的数据块。但是 A 的数据块中存放的只是 B 的路径名(可以根据这个找到 B 的目录项)。A 和 B 之间是“主从”关系,如果 B 被删除了,A 仍然存在(因为两个是不同的文件),但指向的是一个无效的链接。
  • 硬链接:我们知道,文件的基本信息都存储在 inode 中,而硬链接指的就是给一个文件的 inode 分配多个文件名,即一个文件拥有多个路径,通过任何一个文件名,都可以找到此文件的 inode,从而读取该文件的数据信息。

    • 硬连接指通过索引节点来进行连接。在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在 Linux 中,多个文件名指向同一索引节点是存在的。比如:A 是 B 的硬链接(A 和 B 都是文件名),则 A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号相同,即一个 inode 节点对应两个不同的文件名,两个文件名指向同一个文件,A 和 B 对文件系统来说是完全平等的。删除其中任何一个都不会影响另外一个的访问。

      硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

  • ln 命令的基本格式如下:

[root@CncLucZK ~]# ln [选项] 源文件 目标文件
  • 选项:

    • -s:建立软链接文件。如果不加 “-s” 选项,则建立硬链接文件;
    • -f:强制。如果目标文件已经存在,则删除目标文件后再建立链接文件;
  • 创建硬链接:

[root@CncLucZK test]# touch tmp.txt
[root@CncLucZK test]# ln tmp.txt tmp_h.txt
[root@CncLucZK test]# ll -i *.txt
1048608 -rwxr-xr-x 1 zk   zk     90 Oct 13 18:56 demo2.txt
1048611 -rw-r--r-- 1 root root   90 Oct 13 20:06 demonew.txt
1048609 -rw-r--r-- 1 root root   90 Oct 14 00:53 demoold.txt
1048600 -rw-r--r-- 1 root root 2612 Oct 12 23:10 demotmo.txt
1048612 -rw-rw-rw- 1 zk   root 2612 Oct 15 23:01 demo.txt
1048606 -rw-r--r-- 1 root root    0 Oct 13 19:03 differ.txt
1048585 -rw-r--r-- 3 root root   95 Oct 12 23:10 hardlink.txt
1048580 -rw-r--r-- 1 root root   37 Oct 12 23:10 replace.txt
1048593 -rw-r--r-- 2 root root    6 Oct 12 23:10 tmp_h.txt
1048583 lrwxrwxrwx 1 root root    7 Oct 12 23:10 tmp_s.txt -> tmp.txt
1048593 -rw-r--r-- 2 root root    6 Oct 12 23:10 tmp.txt

#从上面的结果中可以看出,硬连接文件 tmp_h.txt 与原文件tmp.txt 的 inode 节点相同,均为 1048593,然而符号连接文件的 inode 节点不同。
[root@CncLucZK test]# ln tmp.txt user/
[root@CncLucZK test]# ll -i users
total 32
1048591 -rw-r--r-- 1 root root   35 Oct 12 23:10 demo.txt.gz
1048589 drwxr-xr-x 2 root root 4096 Oct  6 09:09 tmp
1048585 -rw-r--r-- 3 root root   95 Oct 12 23:10 tmp_h.txt
1048593 -rw-r--r-- 4 root root    6 Oct 12 23:10 tmp.txt
#建立硬链接文件,若目标文件没有写文件名,会和原名一致
#也就是/root/users/tmp.txt 是硬链接文件
  • 仅仅修改hardlink.txt文件添加一些内容,发现tmp.txt同样有这些内容
    Linux学习-09-Linux ln命令:建立硬链接和软链接文件_第3张图片
    在这里插入图片描述

  • 创建软链接:目标文件tmp是源文件softlink的链接

[root@CncLucZK test]# touch tmp.txt
#建立软链接文件tmp链接指向softlink文件
[root@CncLucZK test]# ln -s tmp_s.txt tmp
[root@CncLucZK test]# ll -i *.txt
1048608 -rwxr-xr-x 1 zk   zk     90 Oct 13 18:56 demo2.txt
1048611 -rw-r--r-- 1 root root   90 Oct 13 20:06 demonew.txt
1048609 -rw-r--r-- 1 root root   90 Oct 14 00:53 demoold.txt
1048600 -rw-r--r-- 1 root root 2612 Oct 12 23:10 demotmo.txt
1048612 -rw-rw-rw- 1 zk   root 2612 Oct 15 23:01 demo.txt
1048606 -rw-r--r-- 1 root root    0 Oct 13 19:03 differ.txt
1048585 -rw-r--r-- 3 root root   95 Oct 12 23:10 hardlink.txt
1048580 -rw-r--r-- 1 root root   37 Oct 12 23:10 replace.txt
1048593 -rw-r--r-- 2 root root    6 Oct 12 23:10 tmp_h.txt
1048583 lrwxrwxrwx 1 root root    7 Oct 12 23:10 tmp_s.txt -> tmp.txt
1048593 -rw-r--r-- 2 root root    6 Oct 12 23:10 tmp.txt
#从上面的结果中可以看出,硬连接文件 tmp_h.txt 与原文件tmp.txt 的 inode 节点相同,均为 1048593,然而符号连接文件的 inode 节点不同。

注意:软链接文件的源文件的路径。
Linux学习-09-Linux ln命令:建立硬链接和软链接文件_第4张图片

[root@CncLucZK test]# cat tmp
789456132[root@CncLucZK test]# cat softlink
789456132[root@CncLucZK test]# 
  • 对比:当删除原始文件 后,硬连接文件不受影响,但是符号连接文件无效
[root@CncLucZK test]# cat tmp.txt
123456
[root@CncLucZK test]# cat tmp_h.txt
123456
[root@CncLucZK test]# cat tmp_s.txt
123456
[root@CncLucZK test]# rm -f tmp.txt
[root@CncLucZK test]# cat tmp_h.txt
123456
[root@CncLucZK test]# cat tmp_s.txt
cat: tmp_s.txt: No such file or directory
  • 可以做一些相关的测试,可以得到以下全部结论:
    • 1).删除符号连接tmp_s.txt,对tmp.txt,tmp_h.txt无影响;
    • 2).删除硬连接tmp_h.txt,对tmp.txt,tmp_s.txt也无影响;
    • 3).删除原文件tmp.txt,对硬连接tmp_h.txt没有影响,导致符号连接tmp_s.txt失效;
    • 4).同时删除原文件tmp.txt,硬连接tmp_h.txt,整个文件会真正的被删除。
    • 链接文件有自己的数据文件指,这个文件里面存放了指向源文件的路径,硬连接是对源文件另起一个文件名!
    • 修改链接文件内容,源文件,硬连接都会同步,源文件修改后,软、硬连接都同步
[root@CncLucZK test]# vi tmp_s.txt
[root@CncLucZK test]# cat tmp_s.txt
123456haha
abcde
345
hello world
lala
linux
======
[root@CncLucZK test]# cat tmp.txt
123456haha
abcde
345
hello world
lala
linux
======
[root@CncLucZK test]# cat tmp_h.txt
123456haha
abcde
345
hello world
lala
linux
======
#echo定向到一些文件中输入字符串,或单独输出字符串
[root@CncLucZK test]# echo 'php' >> tmp.txt
[root@CncLucZK test]# cat tmp.txt
123456haha
abcde
345
hello world
lala
linux
======
php
[root@CncLucZK test]# cat tmp_h.txt
123456haha
abcde
345
hello world
lala
linux
======
php
[root@CncLucZK test]# cat tmp_s.txt
123456haha
abcde
345
hello world
lala
linux
======
php

参考文献:
Linux ln命令:建立链接(硬链接和软链接)文件
Linux 文件与目录管理

下一篇:Linux学习-10-环境变量及作用

你可能感兴趣的:(linux,云,linux,学习,运维)