提示:先来说明一下在Linux系统中文件和目录的基本存储,这样更方便我们理解和学习Linux系统中的硬链接和软链接。

1、文件和目录的基本存储

之前说过分区,每个分区都可以理解为分成两部分,一小部分里边是存放文件的i节点信息,大部分放的是Block文件块。

在文件的i节点当中保存的信息有:i节点号,时间,权限,保存位置。而Block块中保存的是文件中的数据。

每个文件夹中都会有i节点和对应的Block文件。

  • 但是有一个问题,一个文件的文件名是存放哪里?

    我们就以在文件夹root中有一个文件abc为例。文件路径为/root/abc

    root目录中,所有的文件都有i节点名和对应的Block块,而root目录也有自己的i节点信息。有i节点信息,就有与之对应的Block块,root目录的Block块中存放的数据是root目录下所有的子文件和子目录的文件名,和它对应的i节点号。

    也就是说,root目录下文件的文件名,没有写在该文件的i节点里。而是写在上级目录的Block块中。

    如果我要查找abc文件的文件名,要先找到root文件夹的i节点,然后在root目录的Block块中找到abc的文件名和对应的i节点号才能找到。通过abc文件的i节点号最终读取到abc文件中的数据。

  • root目录的文件名或者说是i节点存储在哪里?

    root目录是在根目录下的,根目录会有自己的i节点信息,也会有自己的Block,综上所述,那root目录的文件名和i节点号的信息是放在根目录的Block块中的。

    那根的i节点号怎么获取?

    根的i节点号是固定的,根的i节点号为2。(因为编号1在系统内核加载的时候被占用了)

    [root@192 ~]# ls -ild /
    2 dr-xr-xr-x. 25 root root 4096 12月 27 22:27 /
    第一位显示的就是i节点号。
  • 总结

    综上所诉,要查看abc文件的内容,就先用通过根的i节点号,读取根的Block块中数据,找到root目录的i节点信息,读取root目录的Block块中数据,找到abc文件的i节点信息,读取abc文件的Block块中数据。

    以上就是文件和目录的基本存储。

2、In命令介绍

(1)我们来看看ln命令的基本信息

  • 命令名称:ln
  • 英文原意:make links between file
  • 所在路径:/bin/ln
  • 执行权限:所有用户。
  • 功能描述:在文件之间建立链接。

(2)ln命令的基本格式

[root@localhost ~ ] # ln [选项] 源文件 目标文件

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

3、创建硬链接

(1)如何创建硬链接

示例如下:

[root@localhost ~] # touch cangls
[root@localhost ~ ]# ln /root/cangls /tmp/ # 建立硬链接文件,目标文件没有写文件名,会和原合一致
# 也就是/root/cangls和/tmp/cangls 是硬链接文件

说明ln命令应用:

# 新创建一个文件abc,查看abc文件的硬连接数
[root@192 ~]# touch abc
[root@192 ~]# ls -il abc
1043285 -rw-r--r--. 1 root root 0 12月 29 18:18 abc
# 可以看到abc文件的硬连接数为1。 # 在tmp目录中给abc文件创建一个硬连接文件,然后查看这两个文件硬连接数。
[root@192 ~]# ln abc /tmp/abc_h
[root@192 ~]# ls -il abc /tmp/abc_h
1043285 -rw-r--r--. 2 root root 0 12月 29 18:18 abc
1043285 -rw-r--r--. 2 root root 0 12月 29 18:18 /tmp/abc_h
# 可以看到abc文件的引用计数(硬连接数)增加了1。
# 同时还可以看到,上边的两个文件的i节点号是一样的。

(2)硬链接特征

  • 源文件和硬链接文件拥有相同的InodeBlock
  • 修改任意一个文件,另一个都改变。
  • 删除任意一个文件,另一个都能使用。
  • 硬链接标记不清,很难确认硬链接文件位置(很难确定这是一个硬连接文件,自己创建的还可能记住,要是别人创建的,我根本无法判定一个文件是硬连接文件),不建议使用。
  • 硬链接不能链接目录
  • 硬链接不能跨分区(因为两个文件需要同一个分区的同一个i节点号。所以跨分区找不到)。

(3)硬连接原理

我上边在root目录下创建了一个abc文件,然后在/tmp/目录下创建一个abc文件硬连接文件abc_h

root目录、abc文件、tmp目录,每个都有自己的i节点号和对应的Block块。通过root目录的i节点号,找到对应的Block块。Block块中记录着abc文件的名称和i节点号,就可以找到abc文件。而硬连接文件abc_hi节点号和文件名是记录在tmp目录的Block块中的。并且上边查询到abc文件和abc_h硬连接文件的i节点号是相同的,所以通过tmpBlock块中的abc_h信息,也可以找到abc文件的i节点号。

所以root目录中记录的abc文件信息和tmp目录记录的abc_h文件信息,都指向了root目录下的abc文件。

看下图:

所以上图证明了:

修改任意一个文件,另一个都改变。

删除任意一个文件,另一个都能使用。

4、创建软链接

(1)如何创建软链接

软连接可以直接看作为Windows系统中的快捷方式。

建立软链接文件,如下:

[root@localhost ~]# touch abc
[root@localhost ~]# ln -s /root/abc /tmp/

root目录中cde文件,然后创建软连接/tmp/cde_s文件,查看这两个文件。

如下图所示:

#
[root@localhost ~ ] # touch cde
[root@localhost ~ ] # ln -s /root/cde /tmp/cde_s
[root@localhost ~ ] # ls -il /root/cde /tmp/cde_s
1055972-rw-r--r--1 root root 0 2月1715:30 /root/cde
261634 1rwxrwxrwx 1root root 9 2月1715:30 /tmp/cde_s->/root/cde

说明:

  • 第一:可以看到创建的软连接文件有明确的提示这个一个软链接文件,和它的源文件的位置在哪里。

    /tmp/cde_s->/root/cde。这也就是为什么说硬连接标记不清的原因。
  • 第二:文件的引用链接数没有增加。
  • 第三:两个文件的i节点号完全不同。
  • 第四:源文件abc是0字节,空的。而软连接的文件大小为9个字节。

(2)软链接特征

  • 软链接和源文件拥有不同的InodeBlock
  • 两个文件修改任意一个,另一个都改变。
  • 删除软链接,源文件不受影响;删除源文件,软链接不能使用,因为软链接没有实际数据,只保存源文件的Inode,不论源文件多大,软链接文件大小不变。
  • 软链接的权限是最大权限lrwxrwxrwx.,但是由于没有实际数据,最终访问时需要参考源文件权限
  • 软链接可以链接目录,软链接可以跨分区
  • 软链接特征明显,建议使用软连接

(3)软连接原理

root目录下有一个cde文件,在tmp目录创建一个cde文件的软链接文件cde_s。通过root目录的i节点号,可以找到root目录的block块,root目录的block块中记录了cde文件的文件名和i节点号。查到cde文件的i节点号就找到了cde文件的block块,就能读取里边的数据。

tmp目录有自己的i节点号,与之对应的block块,tmp目录的block块中有cde_s文件的文件名和i节点号,(之前说硬连接这两个i节点号是相同的,所以指向的同一个文件),而软连接文件和源文件的i节点号是不相同的。说明cde_s文件有自己的i节点号,并且cde_s文件有自己的block块。

现在的关键是,cde_s文件的block块中存放的是什么?

如果里边存放的是数据,那cde文件和cde_s文件就不是链接的关系了,就完全是复制关系了,这样就不会出现修改源文件时软链接文件也变,修改软链接文件后源文件也改变的情况。

其实在cde_s文件的block块中存放的是源文件的i节点号。

如下图:

这也就说明了为什么新创建的软连接文件创建完成后就有数据,并且数据大小不随源文件的改变而改变。

还有一点要注意,软链接文件的权限是最大的,但这个权限是针对软链接文件的,软链接文件的block块中并不存放数据,如果要操作源文件,还是要看源文件权限,这里需要注意。

(4)说明

Windows系统中创建快捷方式是为了软件安装位置太深,不好找,所以在桌面创建一个快捷方式,那Linux系统创建软链接的作用是什么,反正都是通过目录访问?

在Linux系统中,软链接最主要的作用是照顾管理员的使用习惯。

如下图:

在老式的Linux系统中,/etc/rc.local文件的位置我们用着已经习惯了,系统更新之后,为了升级的需要,/etc/rc.local文件的位置改变了。我们在找这个文件就很麻烦了。解决这个问题的方法就是给这两个文件创建一个软链接来解决上边问题,既照顾了升级需要,也照顾了使用习惯。

还要注意一个情况,用相对路径创建def文件的软链接,用绝对路径创建anaconda-ks.cfg文件的软链接。

从上图中可以看到用相对路径创建的软链接出现了报错。

提示:创建软链接时一定要使用绝对路径,硬连接没有要求。

『学了就忘』Linux基础命令 — 22、Linux中的硬链接和软链接的更多相关文章

  1. Linux中的硬链接和软链接

    软链接和硬链接 命令ln ln是创建链接的命令: 创建硬链接:ln file link 创建软链接:ln -s file link 硬链接 硬链接(hard link)是Unix系统最早的创建链接的方 ...

  2. linux系统中的硬链接和软链接

    首先我们需要了解linux下硬链接以及软连接的基本概念.硬链接:新建的文件是已经存在的文件的一个别名,当原文件删除时,新建的文件仍然可以使用.软链接:也称为符号链接,新建的文件以“路径”的形式来表示另 ...

  3. 『学了就忘』Linux基础 — 6、VMware虚拟机安装Linux系统(超详细)

    目录 1.打开VMware虚拟机软件 2.选择Linux系统的ISO安装镜像 3.开启虚拟机安装系统 (1)进入Linux系统安装界面 (2)硬件检测 (3)检测光盘 (4)欢迎界面 (5)选择语言 ...

  4. 『学了就忘』Linux基础 — 16、Linux系统与Windows系统的不同

    目录 1.Linux严格区分大小写 2.Linux一切皆文件 3.Linux不靠扩展名区分文件类型 4.Linux中所有的存储设备都必须在挂载之后才能使用 5.Windows下的程序不能直接在Linu ...

  5. 『学了就忘』Linux基础命令 — 18、Linux命令的基本格式

    目录 1.命令提示符说明 2.命令的基本格式 (1)举例ls命令 (2)说明ls -l命令的 输出内容 1.命令提示符说明 [root@localhost ~] # []:这是提示符的分隔符号,没有特 ...

  6. 『学了就忘』Linux基础命令 — 24、文件基本权限的相关命令

    目录 1.chmod命令 2.权限模式 (1)用户身份. (2)赋予方式. (3)权限. 3.数字权限 4.文件常用权限 5.chown命令 6.chgrp命令 7.总结 常用基本权限操作命令: ch ...

  7. 『学了就忘』Linux基础命令 — 26、帮助命令

    目录 1.man命令 (1)man命令的快捷键 (2)man命令的帮助级别(了解即可) (3)man命令的使用 2.info命令 3.help命令 4.--help选项 1.man命令 man是最常见 ...

  8. 『学了就忘』Linux基础命令 — 30、find命令详细说明

    目录 1.find命令的基本信息 2.find命令基本使用 3.按照文件大小搜索 4.按照修改时间搜索 5.按照权限搜索 6.按照所有者和所属组搜索 7.按照文件类型搜索 8.逻辑运算符 (1)-a: ...

  9. 『学了就忘』Linux基础命令 — 37、Linux中挂载操作的相关命令

    目录 1.mount命令介绍 (1)mount命令说明 (2)mount命令格式 2.mount命令示例 3.mount -a命令说明 4.-o特殊选项说明 5.exec/noexec选项说明 挂载就 ...

随机推荐

  1. mysql中varchar类型和datetime类型字段进行比较

    我是在mysql5.7版本进行比较 表a的字段order_no和表iwebshop_tmp的字段order_no一样 需要更新iwebshop_member_order表的datetime类型expi ...

  2. 探究java的intern方法

    本文主要解释java的intern方法的作用和原理,同时会解释一下经常问的String面试题. 首先先说一下结论,后面会实际操作,验证一下结论.intern方法在不同的Java版本中的实现是不一样的. ...

  3. Java基础系列(41)- 冒泡排序

    冒泡排序 冒泡排序无疑是最为出名的排序算法之一,总共有八大排序 冒泡的代码还是相当简单的,两层循环,外层冒泡轮数,里层依次比较,江湖中人人尽皆知 我们看到的嵌套循环,应该立马就可以得出这个算法的时间复 ...

  4. Linux系列(7) - 链接命令

    硬链接 拥有相同的i节点和存储block块,可以看做事同一个文件 可通过i节点识别 不能跨分区 不能针对目录使用,只能针对文件 软链接 类似Windows快捷方式 软链接拥有自己的i节点和block块 ...

  5. 『Python』优雅的记录日志——loguru

    1. 安装 pip install loguru 2. 初识 from loguru import logger logger.debug("This is a debug..." ...

  6. YbtOJ#463-序列划分【二分答案,线段树,dp】

    正题 题目链接:https://www.ybtoj.com.cn/problem/463 题目大意 给出长度为\(n\)的序列\(A,B\).要求划分成若干段满足 对于任何\(i<j\),若\( ...

  7. 01 ASP.NET Core 3 启动过程(一)

    ASP.NET Core 3 启动过程(一) 最近又忙于各种扯淡,今天来一个需求,明天又来一个需求,后天需求又变了,这可能是很多人遇到的情况.正在紧张的忙碌着,突然一个信息把所有计划打乱了," ...

  8. MFC读写.txt文件时进度条显示实时进度

    整体实现方式:先获得文件长度,然后用每次读取的长度,计算出完成的百分比,用百分比的值设置进度条. 一.MFC进度条 Progress Control 相关函数 1. create() --创建Prog ...

  9. github注册教程最新版(十年程序员保姆级教程)

    您可以在墨抒颖的网站体验本文章的纯净版 准备 拥有一个可以接受信息的邮箱即可 开始 点击github官网github step1.进入注册页面 点击Sign Up进入注册流程 step2.输入邮箱 这 ...

  10. Java入门基础,必读!Java单行、多行和文档注释!

    在编写Java的过程中,我们需要对一些程序进行注释.除了方便自己阅读之外,我们还需要为他人更好地理解我们的程序.因此,我们需要对一些程序进行注释,这些注释可以是编程思想,也可以是程序的作用,可以说是J ...