投票制作网站,影视广告公司网页设计,域名注册网站建设网络实名,沈阳seo#x1f33b;个人主页#xff1a;路飞雪吖~ #x1f320;专栏#xff1a;Linux 目录 一、理解文件系统
#x1f320;磁盘结构
二、软硬连接
#x1f31f;软硬链接
#x1f320;软链接#xff1a;
#x1f320;硬链接#xff1a;
#x1f31f;理解软硬链接的应… 个人主页路飞雪吖~ 专栏Linux 目录 一、理解文件系统
磁盘结构
二、软硬连接
软硬链接
软链接
硬链接
理解软硬链接的应用场景
✨软链接
✨硬链接 如若对你有帮助记得关注、收藏、点赞哦~ 您的支持是我最大的动力
若有误望各位在评论区留言或者私信我 指点迷津谢谢 ヾ(≧▽≦*)o \( •̀ ω •́ )/ 一、理解文件系统 磁盘结构 1 任何磁盘结构 磁盘由上亿的小磁铁构成【磁铁--南北极 -- 二进制】 (1) 磁盘物理结构 a. 磁盘在进行摆动旋转【磁头的左右摆动】可以进行数据的寻址。 b. 磁头悬浮在盘片上【要求在真空环境中】。 (2) 磁盘存储结构 a. 磁头在摆动的本质定位磁道柱面 b. 磁头定位好一个磁道后盘面在进行旋转时就可以把各个不同的扇区依次放在磁头的正下方让磁头来确定一个扇区上面的 01 值 c. 磁盘盘片旋转的本质定位扇区。 d. 扇区是磁盘存储数据的基本单位512字节块设备 e. 磁盘若有3片就有6面每一面都有一个磁头【h0~h5】 f. 读写哪一个磁头本质是读写哪一个面 g. 如何定位一个扇区【CHS地址定位法】 • 先定位磁头(header) • 确定磁头要访问哪一个柱面磁道cylinder • 定位一个扇区sector h. 文件 内容 属性 这些都是数据数据无非就是占据哪几个扇区的问题能定位一个扇区就能定位多个扇区了。 i. 传动臂上的磁头是共进退的 (3) 磁盘逻辑结构 磁带上面可以储存数据我们可以把磁带“拉直”形成线性结构 磁盘本质上是硬质的但是逻辑上我们可以把磁盘想象成为卷在一起的磁带那么磁盘的逻辑存储结构就类似于 这样每一个扇区就有了一个线性地址其实就是数组下标这种地址叫做LBA 柱面是一个逻辑上的概念其实就是每一个面上相同半径的磁道逻辑上构成柱面。所以磁盘物理上分了很多面但是在我们看来逻辑上磁盘整体是由“柱面”卷起来的。 整盘 整个磁盘不就是多张二维的扇区数组表(三维数组?) 所有寻址一个扇区:先找到哪一个柱面(Cylinder)在确定柱面内哪一个磁道(其实就是磁头位置Head)在确定扇区(Sector)所以就有了CHS。 我们之前学过C/C的数组在我们看来其实全部都是一维数组: 所以每一个扇区都有一个下标我们叫做LBA(Logical Block Address)地址,其实就是线性地址。所以怎么计算得到这个LBA地址呢? • 扇区的编号从1开始LBA从0开始【数组下标】。 ✨CHS转成LBA: • 磁头数*每磁道扇区数 单个柱面的扇区总数 • LBA 柱面号C*单个柱面的扇区总数 磁头号H*每磁道扇区数 扇区号S-1 • 即:LBA 柱面号C*(磁头数*每磁道扇区数) 磁头号H*每磁道扇区数扇区号S-1 • 扇区号通常是从1开始的而在LBA中地址是从0开始的 • 柱面和磁道都是从0开始编号的 • 总柱面磁道个数扇区总数等信息在磁盘内部会自动维护上层开机的时候会获取到这些参数。 ✨LBA转成CHS: • 柱面号C LBA //(磁头数*每磁道扇区数)【就是单个柱面的扇区总数】 • 磁头号H (LBA %(磁头数*每磁道扇区数)) // 每磁道扇区数 • 扇区号S (LBA % 每磁道扇区数)1 • //;表示除取整 LBA地址 --转换-- CHS地址谁来做磁盘自己来做固件硬件电路、伺服系统 所以从此往后在磁盘使用者看来根本就不关心CHS地址而是直接使用LBA地址磁盘内部自己转换。 所以从现在开始磁盘就是一个 元素为扇区 的一维数组数组的下标就是每一个扇区的LBA地址。OS使用磁盘就可以用一个数字访问磁盘扇区了。 2 理解分区格式化 OS和磁盘进行IO的时候以扇区为基本单位512字节单次IO的数据量1KB2KB3KB4KB8KB等4KB数据块 ---- 8个扇区。 OS如何管理分区-- 分组 【分治思想】 3 Linux文件系统Ext*系列的文件系统inode号和inode • Block Groupext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。政府管理各区的例子 • 超级块Super Block【表示文件系统管理整个分区】存放文件系统本身的结构信息。记录的信息主要有bolck 和 inode的总量未使用的block和inode的数量一个block和inode的大小最近一次挂载的时间最近一次写入数据的时间最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏可以说整个文件系统结构就被破坏了 • GDTGroup Descriptor Table块组描述符描述块组属性信息 • 块位图Block BitmapBlock Bitmap中记录着Data Block中哪个数据块已经被占用哪个数据块没有被占用 • inode位图inode Bitmap每个bit表示一个inode是否空闲可用。 • i节点表:存放文件属性 如 文件大小所有者最近修改时间等 • 数据区存放文件内容 文件系统以分区为单位一个分区一套文件系统 分区和分区之间是互相独立的不同的分区可以用不同的文件系统 小贴士 • 文件 内容 属性文件属性也是数据 • 在Linux当中会以结构体的方式构建出来【inode】 • 一个文件只有一个inodeinode是文件属性数据的集合 一个inode就是一个结构体【struct inode】 • inode的大小一般为128字节【跟系统有关】一个块组中可能会存在100或1000个文件就会存在100或1000个inode文件系统会把当前你要新建的文件文件的属性节点在内存里面定义出来【struct inode】把属性值填入接着把inode节点写入到磁盘当中指定的inode Table里面。 • OS在和磁盘进行IO交互的时磁盘中一个块有4KB那一个块就有 4KB/128字节 个inode都存放在一个组当中的inode Table中为此 每个文件都要有自己的文件编号【inode值】inode彼此之间互不重复【有条件】 其中在Linux系统中文件名这个属性不在inode中保存 • inode Table 包含了当前组里面所有的文件属性集。 • data block 用来存放文件的内容里面全是划分好的4KB大小的块 Linux下文件属性和文件内容是分开存储的 ✨如何找文件 拿到对应的inode接着在inode Table里面找到inodeinode属性里面还有inode映射表 【int block[NUM]】数组里面记录了对应inode所对应的数据在哪。 • inode Bitmap inode Table有多少个inodeinoed Bitmap就需要有多少个比特位当inode号为0inode Bitmap对应的位图比特位就会记录下来【有效】inode Bitmap会按比特位来检查inode号是否有效有效才会去inode属性里面获取有效的inode属性。 • 对于inode Bitmap的一次进行修改修改的原则哪怕是一个Bite也要把4KB的数据全部放到内存里面修改完成之后再写回磁盘去 ✨修改位图时 磁盘当中是以扇区为单位的当要修改时先把要修改的扇区搬到内存里以比特位修改位图修改完成之后直接写回到磁盘分组的 inode Bitmap 里面的位置。 ✨在data block里面很多块号我们怎么样才能知道哪些被占用/空闲 black Bitmap也是一个位图它的二进制位图中表明哪些被占用/空闲因此在一个组当中有了Block BItmap、inode Bitmap、inode Table、Data blocks后面这四块我们就可以对一个分组的内容和属性进行基本的管理了。 有了inode Bitmap、inode Table这两张位图有开始和结束我们就可以清楚的知道这两张位图所对应的区域即inode Bitmap 和 inode Table 都有自己对应的编号可以通过位图来得到 ✨过程 新建一个文件并向这个文件写入hello world字符串 • 新建一个文件要在inode Table里面先分配一个inode接着在inode Bitmap里面去查某一个对应的位图有没有被使用没有被使用就会修改对应的位图【由0--1】接着在inode Table里面拿着对应的inode号初始化节点编号、填写权限、属主、时间、文件大小.....写入之后统计需要多少个块就回去Block Bitmap里面查位图申请所需的块数申请完之后把对应的“hello world”字符串写入到对应的块号里面接着拿着这个块号返回到inode Bitmap找到inode Table里面的数组在里面写入块号(属性) 接着在inode Table中找到对应的data blocks进行数据的写入内容。 因此我们只需要知道文件的inode编号就可以找到这个文件 • 在Linux中删除的本质是设置inode和block无效 删一个文件可以恢复我们只需要把这个文件的inode Bitmap对应的【1/0 --置为-- 1】,接着再查找inode Table里面的块【int block[NUM];】所对应的块号在Block Bitmap里面对应的块号【由0 --- 1】,这个文件就会被恢复。 不小心删除了数据不要随便操作以免被删除的的inode和block被占用/覆盖就恢复不了了。 ✨如何评判当前块组【Block group 0】已经满了/放不下了呢已经使用了多少/还剩多少 因此每一个块组都有一个Group Descriptor Table【GDT】块组描述符。 ✨Boot Block跟分组关系不大【以磁盘硬件为单位】一般是整个磁盘里面最开始的一个小区域与启动有关一般保存这个磁盘里面的总容量是多少【第一个分区开始和结束的扇区】启动信息、分区表、操作系统的内核所在的地址.....(不考虑)。 ✨Super Block 表示的就是文件系统对整个分区管理的数据结构【包括整个文件系统的文件系统名、什么文件系统】。在整个分区里面不需要给每个分区里都保存Super Block整个分区里面也不知是只有一个Super Block。混在组的内部里面可能会存在两三份并且里面的数据是完全一样的。【在整个分区里面不是每个分组里面都有Super Block 也绝不是只有其中一个分组里面有Super Block 】 ✨为什么不是在整个分区里面保存一个Super Block呢在一个分区里面若Super Block挂掉了整个分区的文件系统就全部都没了分组情况都摸不清了文件系统里面的整体情况都不知道了。所以会被打散到不同的分组里面不一定每个分组都有可能会同时存在两三份因此一个Super Block坏掉/出现问题了我们对应的文件系统就可以直接区其他块组里面去找对应的Super Block把Super Block给覆盖回来此时就能进行文件系统恢复了。 ✨文件系统以分区为单位一个分区一套文件系统不同的分区可以写不同的文件系统。 ✨格式化写入空的文件系统 磁盘分区---分组--- 在组里面划分好相关区域【inode Bitmap、Block Bitmap全部清零....】划分的区域是多大... 写入文件信息 4 理解 文件、目录、文件系统 • 在一个块组里面 inode号的个数block个数都是固定的【这两个的占比是最多的】 • 存在 inode Table 用完【存的全部都是小文件】 Data Block没用完的情况 ✨关于inode • inode只能在特定分区下有效inode以分区为单位一套inode; • 在格式化分区的时候要格式化出很多分组其中在分组当中inode在分配的时候只需要确定起始inode即可inode不能跨分区inode里面有分组每一个组里面的inode编号是固定的这些值一般保存到GDT组描述符里面只需要记录起始inode即可。 Super Block 和 Group Descriptor Table 是两个固定的数据结构大小也是固定的。 ✨关于block • 整个分区块号也是统一编号的【保存到GDT组描述符里面】 ✨在一个组里面我们是如何分配一个inode的 • 在inode Bitmap一旦确定好开始和结束起始的inode Bitmap里面是位图位图里面记录的inode 组里面分组好的起始inode值 新的inode; 这个inode在分区当中具有唯一性 ✨在一个组里面我们是如何分配一个data block的 • data block也是一样的它的块号也是加上分组好的起始的block值这些值都在GDT里面 ✨inode和data block都是全局建立的 当块号不够的时候可以进行跨组建立 OS如何进行管理文件系统OS对每个Super Block 和 Group Descriptor Table进行 先描述再组织 来管理文件系统【内存级操作】【Super Block 和 Group Descriptor Table的数据结构会被加载到内存里】 ✨如何查找一个文件 在一个分区里通过inode怎么找到对应的文件呢根据inode确定文件在哪个组里面接着拿着inode减去start_inode再查inode Bitmap找到之后inode Table就找到inode找到了inode就找到了文件的属性【inode结构】和 块的映射关系就有了即就找到了块号最终找到内容。 ✨如何删除一个文件 前提条件就是查找找到之后把inode Bitmap的位图直接【由1--置为--0】再找到inode属性和块的映射关系拿到了块号把 Block Bitmap的位图直接【由1--置为--0】inode就被释放了GDT里面记录的已使用的inode就得减一最后再把属性进行更新就完成了删除。 ✨如何修改一个文件 前提条件就是查找 修改要么是对属性进行修改改掉文件对应的创建时间、文件的大小、文件权限...拿着文件的inode,按照查找方式找到文件把inode加载到内存里改完再写回对应的位置 要么就是对内容进行修改找到文件把磁盘内容Data Block加载到内存里【文件的内核缓冲区】改完之后写回磁盘此时对文件的属性和内容就都能进行修改了。 ✨如何新增一个文件 首先要确定在哪一个组里面操作系统由文件系统自动来进行确定 遍历GDT去找根据要新增文件的基本信息【新增文件的大小、文件名称、...】找到了对应的一个组其中就要分配inode号首先查位图找到一个局部性的值【偏移量】把inode Bitmap、Block Bitmap【由0--置为--1】,最后给用户返回一个inode, start_inode inode Bitmap里面的偏移量即返回inode号。 ✨inode 和 block 究竟是怎么映射的 ✨凭什么拿到inode?我们访问的好像都是文件名【Linux文件名不在inode中保存】inode存在哪里文件类型【文本文件、二进制、普通文件、目录】存在自己所处的目录的数据块中【数据块存文件名和映射关系】 ✨如何理解目录文件 目录 inode block 属性 内容内容也要有对应的数据块目录的数据块里面存的是文件名和 inode的映射关系因此我们在查一个文件时我们只要找到当前目录根据目录的inode找到目录的数据块【data block】再根据文件名进行inode映射找到inode就可以找到属性和内容。 文件名 和 inode号 是互为映射的任何目录不能存在同名文件文件名 --映射-- inode 这就是为什么拿到文件名这个字符串就能找到文件是因为拿着文件名【ls命令】操作系统就会在当前目录下打开当前目录把当前目录的文件名按字符串查找找到inode根据inode号查一个文件属性和内容就全有了。 重新理解目录权限rwx • 当我们对一个目录没有 r 权限时我们就查不了这个目录里面的内容没有读权限对目录没有读权限时就无法读取目录的data block【内容】操作系统不让读就得不到文件名和inode的映射关系拿不到inode就访问不到文件 • 目录没有 w 权限就不能在该目录新建文件没有写权限就无法把文件名和inode的映射关系的字符串信息、文本信息写到目录数据块当中。 • 目录没有 x 权限就进不去本质是打不开。 文件类型【文本文件、二进制、普通文件、目录】文件名和映射关系是保存在普通文件里面的在磁盘级文件系统里面的inode Table、Data block、inode Bitmap、Block Bitmap这个层面上不区分文件是普通文件还是目录不管是文件还是目录在底层都叫inode、data block。 在Linux中找文件要用inode去找呢文件名不在inode保存是保存在当前所处的目录所对应的数据块当中的如果没有inode我们的文件名就存在属性里这时查找文件时都是按照文件名【字符串】来查找文件的字符串可长可短影响查找的效率而inode是一个整数效率更高。 命令ls -l在操作系统底层上干了什么就会把当前目录在底层上给我们打开接着遍历该目录对应的文件名和inode映射关系把所有文件的inode全部拿到接着把每个文件依次在文件系统当中进行查找根据inode找到inode的值把属性和文件名进行罗列出来。 找到文件名首先要打开当前目录当前目录也是文件也有文件名 ---- 逆向的路径解析这就是为什么访问任何一个文件都要有路径没有路径就根本不可能找到这个文件文件名和inode的映射关系就建立不起来必须要有全路径才能在linux内部进行路径解析才能找到最终文件名和inode的映射关系。 每一个进程都有一个CWD 任何目标文件的路径都是进程给的在bash里做的任何操作都是进程操作所以进程内部保存了任何文件的CWD保存了你所要找的CWD不管你怎么访问绝对路径/相对路径它都能拼成最终的完整路径最终进行路径解析方便查找。 当我们连续对相同路径下的文件进行访问【即就是不断地进行访问磁盘文件系统】此时Linux系统需要进行对路径结构进行缓存【内存级缓存】 Linux系统在磁盘上不需要维护任何的路径关系只需要在数据块里记录这个目录里存的是什么文件和inode的映射关系 在磁盘上没有路径地概念只要inode、data block根本就没有路径那么此时路径是谁在维护呢1.由进程提供2.由对应的每个文件的 data block 给我们提供的映射关系相当于在data block 构建了一张磁盘级简单的路径关系【多叉树】跟文件系统没有关系。 Linux要以什么样的数据结构来缓存路径呢多叉树在Linux系统当中在操作系统加载的时候只需要把根目录挂上就能找到相应的路径 构建的路径缓存【占磁盘级文件当中极少会把用户曾经访问过的目录构建成节点缓存起来没有访问过的目录就不需要了所以这个缓存是一个内存级的缓存这样我们在内存里就有一个对应的多叉树的路径了】当第一次访问这个文件时就构建好了路径树第二次再访问时不需要再进行访问磁盘了直接查找缓存结构【树】。 struct dentry维护的是再Linux当中帮我们维护一个dentry树来进行路径缓存。 find /home -name test.txt ---- 在磁盘上找这个文件【根据文件路径去不断进行路径解析去磁盘当中访问磁盘从根目录开始】find首次找会慢一点第二次会快第二次访问的时候路径结构被缓存起来了dentry会指导我们找到任何一个目录的inode和内容。 在Linux中每一个文件【目录、普通文件....】都要配一个struct dentry{...}因为要把这个文件挂接在这个目录树里面方便进行查找。 宏观认识 磁盘上存有很多的文件系统Linux系统里默认会在全局当中找到dentry里的根目录当想要打开一个文件时进程就必须给提供一个路径 【/home/zxl/test.txt】Linux系统根据根目录开始查dentrydentry打开后和路径里的字符串进行比较找对应的字符串【home ,加载home所对应的属性inode和内容在home所对应的内容里找zxl此时就形成了路径/home/zxl再打开zxl数据块的内容得到test.txtx的内容和属性得到test.txtx的文件名和inode的映射关系[1234]】此时dentry就会根据路径所找到文件的inode在磁盘指定的分区下找[1234]对应的inode找到后加载到inode的文件属性里面【磁盘加载到内存】在内核当中形成dentry结构构建dentry节点【test.txt】 最终用dentry构建节点【test.txt】指向inode属性要打开【test.txtx】这个文件内核就要创建struct_file打开struct_file[文件描述符表]--- struct file --- struct path f_path --- struct dentry --- 找到所对应的inode 这个inode就指向加载到属性里面的inode再让struct path里的dentry指向新建的dentry最后再磁盘上把文件的内容加载到文件内核缓冲区里面【磁盘加载到内存】。 ※操作系统内打开一个文件 • 创建内核数据结构 • 再磁盘当中读取数据加载数据到内存构建对应的映射关系 • 加载内容、加载文件的inode、添加路径关系到Linux系统内部的路径缓存dentry当中 5 做一个小实验 $ dd if/dev/zero of./disk.img bs1M count5 #制作⼀个⼤的磁盘块就当做⼀个分区
$ mkfs.ext4 disk.img # 格式化写⼊⽂件系统
$ mkdir /mnt/mydisk # 建⽴空⽬录
$ df -h # 查看可以使⽤的分区
Filesystem Size Used Avail Use% Mounted on
udev 956M 0 956M 0% /dev
tmpfs 198M 724K 197M 1% /run
/dev/vda1 50G 20G 28G 42% /
tmpfs 986M 0 986M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 986M 0 986M 0% /sys/fs/cgroup
tmpfs 198M 0 198M 0% /run/user/0
tmpfs 198M 0 198M 0% /run/user/1002
$ sudo mount -t ext4 ./disk.img /mnt/mydisk/ # 将分区挂载到指定的⽬录
$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 956M 0 956M 0% /dev
tmpfs 198M 724K 197M 1% /run
/dev/vda1 50G 20G 28G 42% /
tmpfs 986M 0 986M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 986M 0 986M 0% /sys/fs/cgroup
tmpfs 198M 0 198M 0% /run/user/0
tmpfs 198M 0 198M 0% /run/user/1002
/dev/loop0 4.9M 24K 4.5M 1% /mnt/mydisk
$ sudo umount /mnt/mydisk # 卸载分区
whbbite:/mnt$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 956M 0 956M 0% /dev
tmpfs 198M 724K 197M 1% /run
/dev/vda1 50G 20G 28G 42% /
tmpfs 986M 0 986M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 986M 0 986M 0% /sys/fs/cgroup
tmpfs 198M 0 198M 0% /run/user/0
tmpfs 198M 0 198M 0% /run/user/1002怎么确认在哪一个分区里面-- 访问任何一个文件都要有路径路径的前缀就可以指明在哪一个分区上 多个分区 -- 一个分区包含/ -- 若干个普通目录 -- /a /b /c /d... 只要分区该分区无法直接使用分区必须经过“挂载”到目录上分区才可以被用通过路径的方式进行访问 ✨任何一个分区天然就有了基本的路径了【路径一部分是挂载点提供的一部分是自己产生的】 二、软硬连接
软硬链接 软链接 • 软连接是一个独立的文件有独立的 inode软链接内容上保存的是目标文件的路径【window上的快捷方式】 • 在用户层 使用软连接【file-soft.link】 等同于 使用目标文件【file.txt】 • ln -s file.txt file-soft.link 【后者去链接前者】 • 当我们建立软链接就是在当前目录下新建一个软链接文件/快捷方式。 硬链接 • 硬链接不是独立的文件【没有独立的inode】硬链接本质就是一组文件名和已经存在的文件的映射关系 • ln file.txt file-hard.link 【后者去链接前者】 • 当我们建立一个硬链接就是再当前目录所处的目录内部当中新增一个新的文件名和inode对应的映射关系所以硬链接所查到的 inode 和 目标文件的 inode 是一样的。 • 在当前目录下新建一个普通文件普通文件的文件名在文件所处目录的内容中保存硬链接会映射到同一个 inode【inode 特别像一个指针一样的东西】当我们想使用文件名来找对应文件时Linux是通过inode去找文件的硬链接使得两个文件名指向同一个inode文件, 此时这个文件如何才算是删除呢在整个系统里没有任何文件名字符串和这个文件inode有映射关系时才算是被删除我们如何知道有多少个文件名通过和inode号来产生对应的映射关系呢在inode当中存在一个引用计数【atomic_t d_count;】硬链接数。 • 建立一个普通文件本质上就是在不断地进行建立硬链接【文件名和inode的映射关系只有一份所以数字就会减一】 理解软硬链接的应用场景
✨软链接 可执行文件在当前目录上如何不带路径就可以直接执行文件呢 1 环境变量把当前的所处的路径添加到系统环境变量里 2 把 .exe可执行文件拷贝到系统的默认路径下 3 给对应的可执行程序重新进行命名建立软链接 • 作用当被执行的可执行程序放在比较深的目录下【路径很长】时可以在深得路径下建立软链接也可以给目录进行软链接直接一步进入想要进的目录里面。 主要是能让我们快速定位某一个文件以最简单的方式进入。 一般在一个磁盘分区里面软链接建在哪里都可以。 • 软链接快捷方式可以帮我们快速找到指令和对应的库。 ✨硬链接 • “.” [文件名] 所映射的inode编号和当前所处的【/empty】目录inode编号是一样的文件名不同【. empty】但指向的inode是一样的所以 “.” 就表示当前工作路径所以在创建一个空目录时一个是它自己【有一个文件名和inode有映射关系】。 “.”和 “..”目的是为了路径的快速切换如何做到的呢本质就是 文件所指向的inode就是上级路径因此当 cd 切换路径时要找到目标路径的inode方便显式目标路径里面的文件。 • 文件备份就可以不用拷贝也能找到内容 • Linux下不允许对目录新建硬链接【原因怕进行硬链接之后形成一些环状路径】 软链接【直接指向文件里面保存的时路径字符串】我们在进行查找软链接时并不会对软链接做任何解析。