首页 > 编程知识 正文

简述软连接和硬链接的区别,ln命令删除软连接

时间:2023-05-04 18:43:33 阅读:52387 作者:2661

引言在介绍硬链接和软链接之前,首先介绍硬盘的相关知识,主要了解索引节点。

硬盘驱动器由大量扇区组成。 以MBR分区为例。 每个扇区的容量为512字节。 其中第一个扇区是最重要的。 包含主引导记录和分区表信息。 在第一个扇区中,主引导记录需要446字节,分区表需要64字节,结束符需要2字节。 其中分区表每记录一个分区信息需要16字节,因此最多只能向第一扇区写入四个分区信息,这四个分区是四个主分区。

第一个扇区最多只能创建四个分区吗?

要解决分区数量不够的问题,可以提取第一个扇区分区表的16字节(本来写入主分区信息)空间(称为扩展分区)指向另一个分区。

这意味着扩展分区不是真正的分区,而是像占用16字节分区表空间的指针和指向另一个分区的指针。 因此,用户通常选择使用三个主分区和一个扩展分区的方法,并在扩展分区上创建无数个逻辑分区以满足多个分区(四个或更多)的需要。

在Linux系统上有一个名为superblock的“硬盘地图”。 Linux不直接将文件内容写入superblock,而是lqdxmt记录整个文件系统的信息。

Linux在inode('indexnode ) '中记录每个文件的权限和属性,每个文件占用一个独立的inode表。 此表的默认大小为128字节。

其中记录了以下信息:

的权限(读取、写入、执行)文件的所有者和所属组(owner、group )文件大小(size )文件的创建时间或内容修改时间(ctime )文件的上次访问时间) 文件名只是为了方便人们的记忆和应用。

ls-litotalxx 533124 drwxr-xr-x9apple apple 4096 may 410336022 Apache-Tomcat-8.5.41360908-rw-rw-r-1 apple 974 3217 drwxrwxr-x6a pple apple 4096 may 2809:37 program 518079 drwxrwxr-x3 96 mar411:31 project上述命令“ls -li”结果的第一列是文件的I 系统通过inode编号查找正确的文件数据块。

文件的实际内容以1KB、2KB或4KB的大小存储在块中。 一个inode的默认大小为128b(ext3文件系统),如果记录一个block,则会消耗4B。 当文件的inode已满时,Linux系统会自动分配块并记录其他块的信息,就像innode一样。 这将连接每个块的内容,以便用户可以读取完整文件的内容。

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

文件很小(1KB ),但仍然占用一个块,因此可能占用3kb。 由于文件大小(5kb )较大,因此占用两个块。 总结:

superBlock :存储整个文件系统的信息。

inode :保存文件的权限和属性。

data block :实际存储文件的内容。

在软硬链接Windows系统中,快捷方式是指向原始文件的链接文件。 允许用户从其他位置访问原始文件; 如果原始文件被删除或剪切到其他位置,链接文件将被禁用。

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

硬链接(hard link ) :可以将其视为指向原始文件inode的指针,系统不分配独立的inode和文件。 所以,硬链接文件和原文件其实是同一个文件,只是名字不同而已。 每次添加硬链接时,此文件的innode连接数增加1。 此外,只有当此文件的inode连接数为0时,才会永久删除。 因此,即使删除原始文件,也可以通过硬链接的文件进行访问。 需要注意的是,不能在分区之间链接文件。 (我第一次看到硬链接的时候,脸上有问号。 大家不要在意概念,请看下图。 )

例如,磁盘上有一个文件。

将创建新的硬链接

ln fileName newFileName

从上图中可以看到,fileName和newFileName指向同一文件,因此无论编辑哪一个文件,另一个文件都会相应地更改。 例如

欧盟

ho "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 360888 -rw-rw-r-- 2 apple apple 12 Jun 4 17:10 hardHelloWorld // 第一列为 inode 号,第三列为 inode 连接数360888 -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 问题

硬链接占据空间吗 ? 比如我有一个 1G 的文件,现在我给这个文件建了一个硬链接。那么会占据 2G 空间吗?
不会,之前我们说了硬链接是一个指针或者说是文件的引用。只占一点点空间。

延伸

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

$ ls -l $(which python3)lrwxrwxrwx 1 root root 9 Mar 4 11:11 /usr/local/跳跃的萝莉/python3 -> python3.7

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

ls -l $(which python)lrwxrwxrwx 1 root root 7 Feb 12 14:32 /usr/跳跃的萝莉/python -> python2 引用

https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/index.html
《Linux 就该这么学》

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。