Linux下的软连接和硬链接


纸上得来终觉浅,绝知此事要躬行。

Linux下的软连接和硬链接


在 Linux 操作系统中链接会分两种,一种被称为硬链接,另一种被称为符号链接,即软链接。而默认情况下,ln 命令产生的是硬链接。

Linux 软硬链接

1. 如何查看inode

关于inode是什么,可以看这篇文章:Inode 详解

# 查看文件和文件夹的inode号
$ ll -di /boot / /app

# 查看挂载点文件夹的inode号
$ df -i

2. 做inode增长实验

文件粉碎工具shredshred -uzvn10 FILE重复随机写入 10 次覆盖源文件,然后最后删除此文件。

# 创建60万个文件的方法1(效率不高)
$ for i in {1..600000}; do touch file$1; echo file$i is created;done

# 创建60万个文件的方法2(效率高)
$ echo file{1..600000} | xargs touch

# 删除前20万个文件
$ echo file{1..200000} | xargs rm

# 在创建的过程中,可以另开一个窗口,用下面命令,每隔1秒运行df -hi命令,可以查看inode的增长情况
$ watch -n1 df -hi

3. 硬链接、软链接

软链接

  • 就相当于 Windows 的快捷方式,删掉源文件,快捷方式就失效了,软链接就找不到源文件了。

硬链接

  • 相当于多个链接指向同一份数据存储区域,每多一个硬链接,硬链接数+1,如果一个文件,有 n 个硬链接,删除 n-1 个硬链接,源文件还在,直到删除所有硬链接,才会删除源文件。

1. 复制(cp

  • 复制过程中,复制软连接相当于复制了快捷方式,速度很快,而且可以跨分区。
  • 复制过程中,复制硬链接分为两种情形:
    • 同一分区复制,相当于多创建一个链接指向原数据存储位置,速度很快。
    • 不同分区复制,相当于把原来分区的数据拷贝过去存储,同时创建一个指向新数据区域的指针,速度比较慢。

2. 删除(rm

  • 删除过程中,删除软连接相当于删除了快捷方式,源文件还在。
  • 删除过程中,删除硬连接相当于删除了一个到数据块的指针,除非删除所有硬链接文件,源文件才删除。

3. 移动(mv

  • 移动过程中,移动软连接相当于移动了快捷方式而已。
  • 移动过程中,移动硬连接分为两种情形:
    • 同一分区移动,相当于创建了一个新 inode,指向数据块,并把原来的 inode 删掉
    • 不同分区移动,要把数据块复制到新分区,然后在新分区创建新的 inode 号指向新的数据块,并且把原来分区的 inode 号和数据块都删掉。

4. 软连接支持对目录创建,硬链接不支持

【问题 1】:当我们看到一个磁盘,使用空间没满,但是却提示”no space left on device”

  • 那可能是inode用完了

【问题 2】:如何删除数量很多的文件(比如前面做实验创建的 60 万个文件)

  • 技巧是使用管道|xargs,管道|后面会讲,管道是指的是前面命令的输出作为后面命令的输入。xargs,前面命令多个输出,可以用xargs一个个的传给后面的命令,而不是已下载全传给后面命令,可以解决参数太长的情况
  • ls | xargs rm
# 创建不成功
ln dir1 dir2

# 创建成功
ln /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/ens33

5. 如何写软连接相对路径

  • 软连接写相对路径,要根据软连接文件的路径来写。
# 例如要在把/etc/issue 软连接到/app/d1/d2/d3/ilink
ln -s ../../../../../etc/issue /app/d1/d1/d3/ilink

6. 如何软链接设备文件

  • 设备文件比较特殊,如果要创建设备文件的链接,需要用到mknod命令:
[root@centos7 etc]# ll /dev/sda
brw-rw----. 1 root disk 8, 0 May 22 09:06 /dev/sda #得到主设备号和复设备号。
mknod /app/sda b 8 0
ll -i /dev/sda /app/sda

软链接练习

# 1.  创建一个目录tomcat-8.5.23,创建一个软连接tomcat到这个目录;在创建一个目录tomcat-9.0.1, 把tomcat的软连接指向新的tomcat-9.0.1目录。
ln -sv tomcat-8.5.23 tomcat
rm -rf tomcat
ln -sv tomcat-9.0.1 tomcat

# 2.  创建一个目录/mnt/lfs/tools, 然后创建/mnt/lfs/tools的软连接/tools,一般有这样的命令:ln -sv /mnt/lfs/tools /tools,如何可以更短?
mkdir -v /mnt/lfs/tools
ln -sv /mnt/lfs/tools /

4. file 命令的使用

常用选项

  • -b 列出文件辨识结果时,不显示文件名称
  • -f 列出文件中文件名的文件类型
  • -F 使用指定分隔符号替换输出文件名后默认的”:”分隔符
  • -L 查看对应软链接对应文件的文件类型
  • --help 显示命令在线帮助

注意事项

  • file命令就是查看的文件头部的信息,可以用hexdump查看源文件源码信息 (也可以用xxd命令看)。
  • 如果是二进制文件,会显示二进制的头信息。
  • 如果是文本文件,就直接是文本。
[root@centos7 ~]# hexdump -C -n 100 /bin/ls
00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............|
00000010 02 00 3e 00 01 00 00 00 48 4b 40 00 00 00 00 00 |..>.....HK@.....|
00000020 40 00 00 00 00 00 00 00 18 c4 01 00 00 00 00 00 |@...............|
00000030 00 00 00 00 40 00 38 00 09 00 40 00 1e 00 1d 00 |....@.8...@.....|
00000040 06 00 00 00 05 00 00 00 40 00 00 00 00 00 00 00 |........@.......|
00000050 40 00 40 00 00 00 00 00 40 00 40 00 00 00 00 00 |@.@.....@.@.....|
00000060 f8 01 00 00 |....|
00000064

[root@centos7 ~]# hexdump -C -n 100 /etc/issue
00000000 5c 53 0a 4b 65 72 6e 65 6c 20 5c 72 20 6f 6e 20 |\S.Kernel \r on |
00000010 61 6e 20 5c 6d 0a |an \m.|
00000016

  • 读取软连接指向的真实路径
[root@centos7 ~]$ readlink /etc/redhat-release
centos-release

文章作者: Escape
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Escape !
  目录