ln – 软链接与硬链接区别

ln – 软链接与硬链接区别引言在介绍硬链接和软链接之前 首先接受下硬盘相关的知识 主要是了解下 inode 硬盘硬盘设备是由大量的扇区组成的 以 MBR 分区为例 每个扇区的容量为 512 字节 其中第一个扇区最重要 它里面保存着主引导记录与分区表信息 就第一个扇区来讲 主引导记录需要占用 446 字节 分区表为 64 字节 结束符占用 2 字节 其中分区表每记录一个分区信息就需要 16 字节 这样一来 最多就只

引言

在介绍硬链接和软链接之前,首先介绍下硬盘相关的知识,主要是了解下 inode 。


硬盘

硬盘设备是由大量的扇区组成的。以 MBR 分区为例。每个扇区的容量为 512 字节。其中第一个扇区最重要。它里面保存着主引导记录与分区表信息。就第一个扇区来讲,主引导记录需要占用 446 字节,分区表为 64 字节,结束符占用 2 字节。其中分区表每记录一个分区信息就需要 16 字节,这样一来,最多就只有4个分区信息可以写到第一扇区中,这4个分区就是4个主分区。

也就是说,扩展分区并不是一个真正的分区,而像是有一个占用 16 字节的分区表空间的指针,一个指向另外一个分区的指针。这样一来,用户一般会选择使用3个主分区+1个扩展分区的方法,然后在扩展分区中创建无数个逻辑分区,从而来满足多分区(大于4个)的需求。

Linux 系统中有一个名为 superblock 的 “硬盘地图”。 Linux 并不是把文件内容直接写入到 superblock 中,而是在里面记录着整个文件系统的信息。

Linux 把每个文件的权限与属性记录在 inode(“索引节点:index node “) 中,而且每个文件占用一个独立的 inode 表格,该表格的默认大小为 128 字节。

里面记录着如下信息 :

  • 文件的访问权限(read、write、execute)
  • 该文件的所有者与所属组(owner、group)
  • 该文件的大小(size)
  • 该文件的创建或内容修改时间(ctime)
  • 该文件的最后一次访问时间(atime)
  • 该文件的修改时间(mtime)
  • 文件的特殊权限(SUID、SGID、SBIT)
  • 该文件的真实数据地址(point)。

在 Linux 系统中 ,inode 号才是文件的唯一标识而非文件名。文件名只是为了方便人们的记忆和适用。

ls -li total xx  drwxr-xr-x 9 apple apple 4096 May 4 10:22 apache-tomcat-8.5.41  -rw-rw-r-- 1 apple apple 18 Jun 1 23:50 helloWolrd  drwxr-xr-x 4 apple apple 4096 Jun 3 10:15 hi-cat  drwxrwxr-x 6 apple apple 4096 May 28 09:37 program  drwxrwxr-x 3 apple apple 4096 Mar 4 11:31 project 

如上述命令 “ls -li” 结果中的第一列就是文件的 inode 号。系统是通过 inode 号寻找正确的文件数据块。

文件的实际内容则保存在 block 中(大小可以是 1KB、2KB 或 4KB),一个 inode 的默认大小为 128B (在 Ext3 文件系统中),记录一个 block 则消耗 4B 。当文件的 inode 被写满后,Linux 系统会自动分配出一个 Block 块,专门用于像 innode 那样记录其他 block 块的信息,这样能把各个 block 块的内容串到一起,就能够让用户读到完整的文件内容了。

对于存储文件内容的的 Block 块,有以下两种常见情况,以 4KB 的 block 大小为例说明情况 :

  1. 文件很小(1KB) , 但依然会占用一个 block ,因此会潜在占用 3kb。
  2. 文件很大(5kb) , 那么会占用两个 block。

软、硬链接方式

在 Windows 系统中,快捷方式是指向原始文件的一个链接文件。可以让用户从不同的位置来访问原始的文件;原文件一旦被删除或剪切到其他地方后,会导致链接文件失效。

但是在 Linux 系统中,”快捷方式”就不太一样 。在 Linux 系统存在硬链接和软链接两种文件。


硬链接(hard link) : 可以将它理解为一个 “指向原始文件 inode 的指针”,系统不为它分配独立的 inode 和 文件。所以,硬链接文件与原始文件其实是同一个文件,只是名字不同。我们每添加一个硬链接,该文件的 innode 连接数就会增加 1 ; 而且只有当该文件的 inode 连接数为 0 时,才算彻底被将它删除。因此即便删除原始文件,依然可以通过硬链接文件来访问。需要注意的是,我们不能跨分区对文件进行链接。(我第一次看硬链接的时候,满脸都是问号,大家不要纠结概念,看下面图。)

此时新建一个硬链接

ln fileName newFileName 

ln - 软链接与硬链接区别

从上图中可以看出,fileName 和 newFileName 都指向同一个文件,因此,无论你编辑哪一个文件,另一个文件也会做相应的改变。比如

echo "helloWorld" >> newFileName vim fileName // 此时原文件中也多出了 helloWorld。 

我相信大家产生疑惑的地方是删除文件。如果此时我们删除原文件,如下图:

在这里插入图片描述

用代码表示:

rm fileName // 删除源文件 vim newFileName // 文件仍然存在,我们删除的仅仅是一个指向真实文件的指针而已。或者说只是让 inode 连接数 -1 。 

用代码表示:

rm newFileName // 删除硬链接 vim fileName // 原文件仍然存在 

我们可以这样理解,在 Linux 系统中,文件名本身就相当于硬链接,文件名仅仅是一个指针。


因为笔者是个菜鸡 Java 成员,如果不会 Java ,忽略下面代码即可。

尝试用下 Java 来描述下硬链接, :

 Student student = new Student(); // 等同于在 Linux 新建了一个文件 Student newStudent = student; // 等同于给 Linux 文件新建一个硬链接 student = null; // 删除原文件(的指针) if (newStudent != null) { System.out.println("newStudent 不为空"); // 对象仍然存在 等同于 文件仍然存在 } // 输出了 newStudent 不为空 

软链接

软链接(symbolic link) : 等同于 Windows 系统下的快捷方式。仅仅包括所含链接文件的路径名字。因此能链接目录,也能跨文件系统链接。但是,当删除原始文件后,链接文件也将失效。


ln – 新建链接

ln 用于创建软或硬链接。

参数 作用
-s 创建软链接(如果不带 -s 参数,默认创建硬链接)
-f 强制创建文件或目录的链接
-i 覆盖前先询问
-v 显示创建链接的过程

软链接示例 :

[apple@VM_0_8_centos ~]$ echo "hello world" > helloWorld [apple@VM_0_8_centos ~]$ ln -s helloWorld sHelloWorld [apple@VM_0_8_centos ~]$ cat helloWorld hello world [apple@VM_0_8_centos ~]$ cat sHelloWorld hello world [apple@VM_0_8_centos ~]$ rm helloWorld [apple@VM_0_8_centos ~]$ cat sHelloWorld cat: sHelloWorld: No such file or directory 

硬链接示例 :

[apple@VM_0_8_centos ~]$ echo "hello world" > helloWorld [apple@VM_0_8_centos ~]$ ln helloWorld hardHelloWorld [apple@VM_0_8_centos ~]$ cat helloWorld hello world [apple@VM_0_8_centos ~]$ cat hardHelloWorld hello world [apple@VM_0_8_centos ~]$ ls -lhi hardHelloWorld helloWorld  -rw-rw-r-- 2 apple apple 12 Jun 4 17:10 hardHelloWorld // 第一列为 inode 号,第三列为 inode 连接数  -rw-rw-r-- 2 apple apple 12 Jun 4 17:10 helloWorld // 两个文件的 inode 号是一样的。 [apple@VM_0_8_centos ~]$ rm helloWorld [apple@VM_0_8_centos ~]$ cat hardHelloWorld hello world 

问题


延伸

我在 Linux 上安装了 Python3,建立了 python3 的软链接 。但有时候会忘记 Python3 的存放路径,可以通过以下命令找到 python3 的位置:

$ ls -l $(which python3) lrwxrwxrwx 1 root root 9 Mar 4 11:11 /usr/local/bin/python3 -> python3.7 

同理也可以找到系统的 python 路径 :

ls -l $(which python) lrwxrwxrwx 1 root root 7 Feb 12 14:32 /usr/bin/python -> python2 

引用

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/205151.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午6:41
下一篇 2026年3月19日 下午6:41


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号