Linux知识点整理(五)—— Linux 磁盘与文件系统管理

一、Linux磁盘与文件系统管理

1、磁盘组成与分割

磁盘的物理组成,整颗磁盘的组成主要有:

  • 圆形的磁盘(主要是记录数据的部分);
  • 机械手臂,与在机械手臂上的磁盘读取头(可读写磁盘盘上的数据);
  • 主轴马达,可以转动磁盘,让机械手臂的读取头在磁盘盘上读写数据。

从上面可以知道,数据保持与读取的重点在于磁盘盘,而磁盘盘上的物理组成则为:

磁盘盘组成示意图

  • 磁区为最小的物理存储保存单位,且依据磁盘设计的不同,目前有512bytes与4k两种格式;
  • 将磁区组成一个圆,就是一个磁柱;
  • 早期的分割主要是以磁柱为最小分割单位,现在的分割通常使用磁区为最小分割单位(每个磁区都有其号码);
  • 磁盘分割表中主要有两种格式,一个是限制较多的MBR分割表,一种是较新且限制较少的GPT分割表;
  • MBR分割表中,第一个磁区最重要,里面有:(1)主要开机区(Master boot record, MBR)以及分割表(partition tables),其中MBR占有446bytes,而parition table占有64bytes;
  • GPT分割表处理分割数量扩充较多之外,支持的磁盘容量也可以超过2TB。

磁盘的文件命名部分,基本上,所有的实体磁盘的文件名都被仿真为/dev/sd[a-p]的格式,第一颗磁盘文件名为/dev/sda。而分区的文件名若以第一颗磁盘为例,则为 /dev/sda[1-128] 。除了实体磁盘之外,虚拟机的磁盘通常为 /dev/vd[a-p] 的格式。

  • /dev/sd[a - p] [1-128]:为实体磁盘的磁盘文件名;
  • /dev/vd[a-d] [1-128]:为虚拟磁盘的磁盘文件名

关于磁盘分割。以前磁盘分割最小单位经常时磁柱,但CentOS 7的分割软件,已经将最小单位改为磁区了,所以容量大小的分割可以切的更细了。此外,由于新的大容量磁盘大多得使用GPT分割表才能够使用全部的容量,因此过去那个MBR的传统磁盘分割表限制就不会存在。

2、文件系统特征

磁盘分割完毕后还需要进行格式化,之后操作系统才能够使用这个文件系统。为什么需要格式化?这是因为每种操作系统所设置的文件属性/权限并不相同。为了存放这些文件文件系统所需要的数据,因此就需要将分区格式化,已成为操作系统能够利用的【文件系统格式(filesystem)】。

由此知道,每种操作系统能够使用的文件系统并不相同。Linux的正文件系统时Ext2。

传统的磁盘文件与文件系统之应用中,一个分区就只能被格式化成为一个文件系统,所以我们可以说一个filesystem就是一个 partition。但是由于新技术的利用,例如我们常听到的LVM与软件磁盘数组(software raid), 这些技术可以将一个分区格式化为多个文件系统(例如LVM),也能够将多个分区合成一个文件系统(LVM, RAID)! 所以说,目前我们在格式化时已经不再说成针对 partition 来格式化了, 通常我们可以称呼一个可被挂载的数据为一个文件系统而不是一个分区喔!

文件系统是如何工作的?这与操作系统的文件数据有关。较新的操作系统的文件数据除了文件实际内容外,通常含有非常多的属性。例如Linux操作系统的文件权限(rwx)与文件属性(拥有者、群组、时间参数等)。文件系统通常将这两部分数据分别存放在不同的区块,权限与属性放到inode中,至于实际数据则放到data block区块中。另外还有一个超级区块(superblock)会记录下整个文件系统的信息。

每个inode与block都有编号,这三个数据的意义:

  • superblock:记录此filesystem的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息;
  • inode:记录文件属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码;
  • block:实际记录文件的内容,若文件太大就会占用多个block。

由于每个inode与block都有编号,而每个文件都会占用一个inode,inode内则有文件数据放置的block号码。因此,我们可以知道的是,如果能够找到文件的inode的话,那么自然就知道这个文件数据放置的block号码,也就能够读出该文件的实际数据。这是比较高效的做法。

inode/block 数据访问示意图

在上图中,文件系统先格式化出inode与block的区块,假设某一点的属性与权限数据是放置到inode4号,而这个inode记录了文件了数据的实际放置点位2, 7, 13, 15这四个block号码,此时我们的操作系统能够根据此来排列磁盘的读取顺序,可以一口气将四个block内容读出来。所以这个可以转一圈就读出文件的数据。与下面的FAT文件系统不同。

这种数据访问的方法称为索引文件系统。还有一种文件系统时FAT格式,比如(闪存),FAT这种格式的文件系统没有inode存在,所以FAT没有办法将这个文件系统所有的block在一开始就读取出来。每个block号码都记录在前一个block当作,它的读取方式如下;
FAT文件系统数据访问示意图

如果同一个文件数据写入的 block 分散的太过厉害时,则我们的磁盘读取头将无法在磁盘转一圈就读到所有的数据, 因此磁盘就会多转好几圈才能完整的读取到这个文件的内容

磁盘重组是什么?需要磁盘重组的原因就是文件写入的block过于离散化了,此时文件读取的性能能将会变的很差所致。这个时候可以透过磁盘重组将同一个文件所属的block汇整在一起。这样数据的读取会比较容易啊!

由于Ext2是索引文件系统,基本上不太需要常常进行磁盘重组,但是如果文件系统使用太久,常常删除/编辑/添加文件时,那么还是可能造成文件数据太过离散化的问题。此时或许会需要进行重整一下的。

3、Linux的ETX2文件(inode)

Linux的文件除了原有的数据内容外,还有非常多的权限与属性,这些权限与属性是为了保证每个用户所拥有数据的隐秘性。右面的的内容我们也知道filesystem 里面可能含有的 inode/block/superblock等。标准的Linux文件系统Ext2就是使用这种inode为基础的文件系统。

inode的内容在记录文件的权限与相关属性,至于block区块则是记录文件的实际内容,而且文件系统一开始就是inode和block规划好,除非重新格式化,否则inode和block固定后不再变动。但是如果我的文件系统高达数百GB时,那么将所有的inode和block通通放置在一起将是很不明智的选择,因为inode与block的数量太庞大,不容易管理。

因此Ext2文件系统在格式化的时候基本是分区为多个区块群组(block group)的,每个区块群组都有独立的 inode/block/superblock系统。

在这里插入图片描述
在整体的规划中,文件系统最前面有一个开机磁区(boot sector),这个开机磁区可以安装开机管理程序,这是非常重要的设计,因为如此以来我们就能够将不同的开机管理程序安装到个别的文件系统最前端,而不用覆盖整颗磁盘唯一的MBR。

· data block(数据区块)

data block 是用来放置文件内容数据的地方,在Ext2文件系统中所支持的block大小由1k, 2k以及4k三种而已。在格式化时block的大小就固定了,且每个block都有编号,以方便inode的记录。不过要注意由于block大小的差异,会导致该文件系统能够支持的最大磁盘容量与最大单一文件容量并不相同。

Block 大小 1KB 2KB 4KB
最大单一文件限制 16GB 256GB 2TB
最大文件系统总容量 2TB 8TB 16TB

你需要注意的是,虽然 Ext2 已经能够支持大于 2GB 以上的单一文件容量,不过某些应用程序依然使用旧的限制, 也就是说,某些程序只能够捉到小于 2GB 以下的文件而已,这就跟文件系统无关了!

Ext2文件系统的基本限制:

  • 原则上,block的大小与数量在格式化完就不能再改变(除非重新格式化);
  • 每个block内最多只能放置一个文件的数据;
  • 承上,如果文件大于block的大小,则一个文件就会占用多个block数量;
  • 承上,如果文件小于block,则该block的剩余容量就不能再被使用,造成磁盘空间浪费。

由于每个 block 仅能容纳一个文件的数据而已,因此如果你的文件都非常小,但是你的 block 在格式化时却选用最大的 4K 时,可能会产生一些容量的浪费。

那既然这样,我们将block大小换成1k。这也不妥,因为弱国block较小的话,那么大型文件将会占用数量更多的block,而inode也要记录更多的block号码,此时可能会导致文件系统不良的读写性能。

所以再进行文件系统的格式化之前,请先想好该文件系统预计使用的情况。

· inode table(inode 表格)

inode内容记录文件的属性以及该文件实际数据是放置在几号block内,基本上,inode记录的文件数据至少有以下这些:

  • 该文件访问模式(read/write/execute);
  • 该文件拥有者与群组(owner/group);
  • 该文件的容量;
  • 该文件创建或状态改变的时间(ctime);
  • 最近修改的时间(atime);
  • 定义文件特征的旗标(flag), 如SetUID;
  • 该文件真正内容的指向(pointer);

inode的数量与大小也是在格式化时就已经固定了。

  • 每个inode大小均为固定128bytes(新的etx4与xfs可设置到256bytes)
  • 每个文件都仅会占用一个inode而已;
  • 承上,因此系统文件能创建的文件数目与inode数量有关;
  • 系统读取文件时需要先找打inode,并分析inode所记录的权限与用户是否符号,若符合才能够实际读取block的内容。

分析ETX2的inode/block与文件大小的关系。inode要记录的数据非常多,但只有128bytes,而inode记录一个block号码要花掉4bytes,假设一个文件有几万个block,inode无法记录。inode的解决方案是将inode记录block号码的区域定义为12个直接,一个间接,一个双间接与一个三间接记录区。

在这里插入图片描述

上图最左边为 inode 本身 (128 bytes),里面有 12 个直接指向 block 号码的对照,这 12 笔记录就能够直接取得 block 号码啦! 至于所谓的间接就是再拿一个 block 来当作记录 block 号码的记录区,如果文件太大时, 就会使用间接的 block 来记录号码。同理,如果文件持续长大,那么就会利用所谓的双间接,第一个 block 仅再指出下一个记录号码的 block 在哪里, 实际记录的在第二个 block 当中。依此类推,三间接就是利用第三层 block 来记录号码。

  • 间接: 256*1K=256K
    每笔 block 号码的记录会花去 4bytes,因此 1K 的大小能够记录 256 笔记录,因此一个间接可以记录的文件大小如上;

  • 双间接: 2562561K=2562K
    第一层 block 会指定 256 个第二层,每个第二层可以指定 256 个号码,因此总额大小如上;

  • 三间接: 256256256*1K=2563K
    第一层 block 会指定 256 个第二层,每个第二层可以指定 256 个第三层,每个第三层可以指定 256 个号码,因此总额大小如上;

  • 总额:将直接、间接、双间接、三间接加总,得到 12 + 256 + 256256 + 256256*256 (K) = 16GB

但这个方法不能用在 2K 及 4K block 大小的计算中, 因为大于 2K 的 block 将会受到 Ext2 文件系统本身的限制,所以计算的结果会不太符合之故。

· superblock(超级区块)

Superblock 是记录整个 filesystem 相关信息的地方, 没有 Superblock ,就没有这个 filesystem 了。

记录的信息主要有:

  • block 与 inode 的总量;
  • 未使用与已使用的 inode / block 数量;
  • block 与 inode 的大小 (block 为 1, 2, 4K,inode 为 128bytes 或 256bytes);
  • filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘 (fsck) 的时间等文件系统的相关信息;
  • 一个 valid bit 数值,若此文件系统已被挂载,则 valid bit 为 0 ,若未被挂载,则 valid bit 为 1 。

Superblock 是非常重要的,因为这个文件系统的基本信息都写在这里,一般来说, superblock 的大小为 1024bytes。

此外,每个 block group 都可能含有 superblock !但是一个文件系统应该仅有一个 superblock 而已,那是怎么回事啊? 事实上除了第一个 block group 内会含有 superblock 之外,后续的 block group 不一定含有 superblock , 而若含有 superblock 则该 superblock 主要是做为第一个 block group 内 superblock 的备份。

·Filesystem Description(文件系统描述说)

这个区段可以描述每个 block group 的开始与结束的 block 号码,以及说明每个区段 (superblock, bitmap, inodemap, data block) 分别介于哪一个 block 号码之间。这部份也能够用 dumpe2fs 来观察的。

·block bitmap(区块对照表)

从 block bitmap 当中可以知道哪些 block 是空的,因此我们的系统就能够很快速的找到可使用的空间来处置文件。

同样的,如果你删除某些文件时,那么那些文件原本占用的 block 号码就得要释放出来, 此时在 block bitmap 当中相对应到该 block 号码的标志就得要修改成为『未使用中』!这就是 bitmap 的功能。

·inode bitmap(inode 对照表)

这个其实与 block bitmap 是类似的功能,只是 block bitmap 记录的是使用与未使用的 block 号码, 至于 inode bitmap 则是记录使用与未使用的 inode 号码!

** dumpe2fs: 查找 Ext 家族 superblock 信息的指令

# dumpe2fs [-bh] 设备文件名
选项与参数:
-b :列出保留为坏轨的部分(一般用不到吧!?)
-h :仅列出 superblock 的数据,不会列出其他的区段内容!

4、与目录树的关系

从上面知道,在Linux系统下,每个文件(不管是一般文件还是目录文件)都会占用一个inode,且依据文件内容的大小来分配多个block给该文件使用。我们知道目录的内容在记录文件名, 一般文件才是实际记录数据内容的地方。那么目录与文件在文件系统当中是如何记录数据的呢?

· 目录

当我们在 Linux 下的文件系统创建一个目录时,文件系统会分配一个 inode 与至少一块 block 给该目录。其中,inode 记录该目录的相关权限与属性,并可记录分配到的那块 block 号码; 而 block 则是记录在这个目录下的文件名与该文件名占用的 inode 号码数据。也就是说目录所占用的 block 内容在记录如下的信息:

目录占用的 block 记录的数据示意图

目录并不只会占用一个 block 而已,也就是说: 在目录底下的文件数如果太多而导致一个 block 无法容纳的下所有的文件名与 inode 对照表时,Linux 会给予该目录多一个 block 来继续记录相关的数据。

· 文件:

当我们在 Linux 下的 ext2 创建一个一般文件时, ext2 会分配一个 inode 与相对于该文件大小的 block 数量给该文件。例如:假设我的一个 block 为 4 Kbytes ,而我要创建一个 100 KBytes 的文件,那么 linux 将分配一个 inode 与 25 个 block 来保存该文件! 但同时请注意,由于 inode 仅有 12 个直接指向,因此还要多一个 block 来作为区块号码的记录!

· 目录树读取:

过上面的说明可以清楚的知道 inode 本身并不记录文件名,文件名的记录是在目录的 block 当中。 为什么要有『添加/删除/更名文件名与目录的 w 权限有关』东西!那么因为文件名是记录在目录的 block 当中, 因此当我们要读取某个文件时,就务必会经过目录的 inode 与 block ,然后才能够找到那个待读取文件的 inode 号码, 最终才会读到正确的文件的 block 内的数据。

由于目录树是由根目录开始读起,因此系统透过挂载的信息可以找到挂载点的 inode 号码,此时就能够得到根目录的 inode 内容,并依据该 inode 读取根目录的 block 内的文件名数据,再一层一层的往下读到正确的文件名。

5、EXT2/EXT3/EXT4 文件的访问与日志式文件系统的功能

如果想要添加一个文件。此时文件系统的行为是:

  • 先确定用户对于欲添加文件的目录是否具有w与x的权限,若有的话才能添加;
  • 根据inode bitmap找到没有使用的inode号码,并将新文件的权限/属性写入;
  • 根据block bitmap找到没有使用的block号码,并将实际的数据写入block中,且更新inode的block指向数据;
  • 将刚刚写入的inode与block数据同步更新inode bitmap与block bitmap并更新superblock的内容。

一般来说,将inode table与data block称为数据存放区域,至于其它的区段称为metadata(中介数据)。

· 数据的不一致状态

数据不一致指的是写入的数据仅有inode table与data block而已。最后一个同步更新中介数据的步骤并没有做完,此时就会发生metadata的内容与实际数据存放区产生不一致的情况了。

· 日志式文件系统

为了避免上述提到的不一致情况的发生,解决方案是:如果我们在filesystem当中规划出一个区块,该区块专门在记录写入或修订文件时的步骤,也就说:

  • 1、预备:当系统要写入一个文件系统时,会先在日志记录区块中记录某个文件准备要写入的信息;
  • 2、实际写入:开始写入文件的权限与数据;开始更新metadata的数据;
  • 3、结束:完成数据与metadata的更新后,在日志记录区当中完成该文件的记录。

6、Linux文件系统的运作

我们知道所有的数据都得要加载到内存后CPU才能对该数据进行处理,想一想,如果编辑一个很大的文件,在编辑过程中又频繁的要系统写入磁盘中,由于磁盘写入的速度比内存慢得多,效率低下。

为解决上面效率的问题,Linux使用的方式是透过一个称为异步处理的方式。

异步处理是这样的:当系统加载一个文件到内存后,如果该文件没有被更动过,则在内存区段的文件数据会被设置为干净(clean)的。 但如果内存中的文件数据被更改过了(例如你用 nano 去编辑过这个文件),此时该内存中的数据会被设置为脏的 (Dirty)。此时所有的动作都还在内存中运行,并没有写入到磁盘中! 系统会不定时的将内存中设置为『Dirty』的数据写回磁盘,以保持磁盘与内存数据的一致性。

Linux 系统上面文件系统与内存有非常大的关系:

  • 系统会将常用的文件数据放置到主内存的缓冲区,以加速文件系统的读/写;
  • 承上,因此 Linux 的物理内存最后都会被用光!这是正常的情况!可加速系统性能;
  • 你可以手动使用 sync 来强迫内存中设置为 Dirty 的文件回写到磁盘中;
  • 若正常关机时,关机指令会主动调用 sync 来将内存的数据回写入磁盘内;
  • 但若不正常关机(如跳电、当机或其他不明原因),由于数据尚未回写到磁盘内, 因此重新开机后可能会花很多时间在进行磁盘检验,甚至可能导致文件系统的损毁(非磁盘损毁)。

7、XFS文件系统简介

· EXT家族问题:支持度最广,但格式化超慢!

Ext 文件系统家族对于文件格式化的处理方面,采用的是预先规划出所有的 inode/block/meta data 等数据,未来系统可以直接取用, 不需要再进行动态配置的作法。这个作法在早期磁盘容量还不大的时候还算 OK 没啥问题,但现在,磁盘容量越来越大,传统的 MBR 都已经被 GPT 所取代,系统要预先分配inode与block消耗时间会非常多。

· XFS 文件系统的配置

基本上xfs就是一个日志式文件系统,CentOS 7将其当缺省文件系统。

xfs文件系统在数据的分布上,主要规划为三部分:一个数据区(data section), 一个文件系统活动登入区(log section)以及一个即时运作区(realtime section):

  • 数据区(data section)

    基本上,数据区跟之前谈到的ext家族一样,包括inode/data block/superblock等数据,都放置在这个区块。这个数据区跟ext的blokc group类似,也是分为多个保存区群组来分别放置文件系统所需要的数据。每个保存群组都包含了

    ​ (1)整个文件系统的superblock

    (2)剩余空间的管理机制

    (3)inode的分配与追踪。

    此外,inode与block都是系统需要用到时,这才动态产生,所以格式化动作超级快。

    另外,与ext家族不同的是,xfs的block与inode有多种不同的容量可供设置,block 容量可由 512bytes ~ 64K 调配,至于 inode 容量可由 256bytes 到 2M 这么大!不过,大概还是保留 256bytes 的默认值就很够用了!

  • 文件系统活动登入去(log section)

    在登录区这个区域主要被用来纪录文件系统的变化,其实有点像是日志区啦!文件的变化会在这里纪录下来,直到该变化完整的写入到数据区后, 该笔纪录才会被终结。如果文件系统因为某些缘故 (例如最常见的停电) 而损毁时,系统会拿这个登录区块来进行检验,看看系统挂掉之前, 文件系统正在运作些啥动作,借以快速的修复文件系统。

    因为系统所有动作的时候都会在这个区块做个纪录,因此这个区块的磁盘活动是相当频繁的!xfs 设计有点有趣,在这个区域中, 你可以指定外部的磁盘来作为 xfs 文件系统的日志区块。

  • 即时运作区(realtime section)

    当有文件要被创建时,xfs 会在这个区段里面找一个到数个的 extent 区块,将文件放置在这个区块内,等到分配完毕后,再写入到 data section 的 inode 与 block 去。

** xfs_info 观察superblock内容

# xfs_info 挂载点|设备文件名

二、文件系统的简单操作

1、磁盘与目录的容量

· df:列出文件系统的整体磁盘使用量

 # df [-ahikHTm] [目录或文件名]
选项与参数:
-a  :列出所有的文件系统,包括系统特有的 /proc 等文件系统;
-k  :以 KBytes 的容量显示各文件系统;
-m  :以 MBytes 的容量显示各文件系统;
-h  :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
-H  :以 M=1000K 取代 M=1024K 的进位方式;
-T  :连同该 partition 的 filesystem 名称 (例如 xfs) 也列出;
-i  :不用磁盘容量,而以 inode 的数量来显示

由于 df 主要读取的数据几乎都是针对一整个文件系统,因此读取的范围主要是在 Superblock 内的信息, 所以这个指令显示结果的速度非常的快速!

· du:评估文件系统的磁盘使用量(常用在推估目录所占容量)

# du [-ahskm] 文件或目录名称
选项与参数:
-a  :列出所有的文件与目录容量,因为缺省仅统计目录底下的文件量而已。
-h  :以人们较易读的容量格式 (G/M) 显示;
-s  :列出总量而已,而不列出每个各别的目录占用容量;
-S  :不包括子目录下的总计,与 -s 有点差别。
-k  :以 KBytes 列出容量显示;
-m  :以 MBytes 列出容量显示;

与 df 不一样的是,du 这个指令其实会直接到文件系统内去搜索所有的文件数据.

2、实体链接与符号链接: ln

关于链接(link)数据我们第五章的Linux文件属性Linux文件种类与扩展名当中提过一些信息, 不过当时由于尚未讲到文件系统,因此无法较完整的介绍链接档啦。不过在上一小节谈完了文件系统后, 我们可以来了解一下链接档这玩意儿了。

在 Linux 底下的链接档有两种,一种是类似 Windows 的捷径功能的文件,可以让你快速的链接到目标文件(或目录); 另一种则是透过文件系统的 inode 链接来产生新文件名,而不是产生新文件!这种称为实体链接 (hard link)。 这两种玩意儿是完全不一样的东西呢!现在就分别来谈谈。

· Hard Link (实体链接, 硬式链接或实际链接)

hard link 只是在某个目录下添加一笔文件名链接到某 inode 号码的关连记录而已。

举个例子来说,假设我系统有个 /root/crontab 他是 /etc/crontab 的实体链接,也就是说这两个文件名链接到同一个 inode , 自然这两个文件名的所有相关信息都会一模一样(除了文件名之外)。

实体链接的文件读取示意图

最大的好处就是『安全』!如同上图中, 如果你将任何一个『文件名』删除,其实 inode 与 block 都还是存在的! 此时你可以透过另一个『文件名』来读取到正确的文件数据喔!此外,不论你使用哪个『文件名』来编辑, 最终的结果都会写入到相同的 inode 与 block 中,因此均能进行数据的修改哩!

一般来说,使用 hard link 设置链接档时,磁盘的空间与 inode 的数目都不会改变! 我们还是由图 7.2.1 来看,由图中可以知道, hard link 只是在某个目录下的 block 多写入一个关连数据而已,既不会增加 inode 也不会耗用 block 数量哩!

hard link 是有限制的:

  • 不能跨 Filesystem;
  • 不能 link 目录。

· Symbolic Link (符号链接,亦即是捷径)

Symbolic link 就是在创建一个独立的文件,而这个文件会让数据的读取指向他 link 的那个文件的文件名!由于只是利用文件来做为指向的动作, 所以,当来源档被删除之后,symbolic link 的文件会『开不了』, 会一直说『无法开启某文件!』。实际上就是找不到原始『文件名』而已啦!

符号链接的文件读取示意图

由 1 号 inode 读取到链接档的内容仅有文件名,根据文件名链接到正确的目录去取得目标文件的 inode , 最终就能够读取到正确的数据了。你可以发现的是,如果目标文件(/etc/crontab)被删除了,那么整个环节就会无法继续进行下去, 所以就会发生无法透过链接档读取的问题了!

由上面的说明来看,似乎 hard link 比较安全,因为即使某一个目录下的关连数据被杀掉了, 也没有关系,只要有任何一个目录下存在着关连数据,那么该文件就不会不见。

不过由于 Hard Link 的限制太多了,包括无法做『目录』的 link , 所以在用途上面是比较受限的!反而是 Symbolic Link 的使用方面较广

# ln [-sf] 来源档 目标档
选项与参数:
-s  :如果不加任何参数就进行链接,那就是hard link,至于 -s 就是symbolic link
-f  :如果 目标档 存在时,就主动的将目标档直接移除后再创建!

参考资料:
【1】第七章、Linux 磁盘与文件系统管理

猜你喜欢

转载自blog.csdn.net/weixin_43763859/article/details/106896683