温故而知新——Linux 磁盘与文件系统管理(一)

Linux 磁盘与文件系统管理(一)

1、认识 Linux 文件系统

1.1、文件系统特性

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

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

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

每个 inode 和 block 都有编号,至于这三个数据的意义可以简略说明如下:

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

我们将 inode 与 block 区块用图解来说明一下,如下图所示,文件系统先格式化出 inode 与 block 的区块,假设某一个文件的属性与权限数据是放置到 inode 4 号,而这个 inode 记录了文件数据的实际放置点为 2,7,13,15 这四个 block 号码,此时我们的操作系统就能够据此来排列磁盘的阅读顺序,可以一口气将四个 block 内容阅读出来。

在这里插入图片描述

这种数据存取方式我们称为索引式文件系统

1.2、Linux 的 EXT2 文件系统(inode)

inode 的内容在记录文件的权限与相关属性,至于 block 区块则是在记录文件的实际内容。而且文件系统一开始就将 inode 与 block 规划好了,除非重新格式化(或者利用 resize2fs 等指令变更文件系统大小),否则 inode 和 block 固定后就不再变动。而且,EXT2 文件系统在格式化的时候基本上是区分为多个区块群组(block group)的,每个区块群组都有独立的 inode/block/superblock 系统

在这里插入图片描述

文件系统最前面有一个启动扇区(boot sector),这个启动扇区可以安装开机管理程序。至于每一个区块群组(block group)的六个主要内容说明如下:

  • data block(资料区块)

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

    Block 大小1KB2KB4KB
    最大单一文件限制16GB256GB2TB
    最大文件系统总容量2TB8TB16TB

    除此之外 Ext2 文件系统的 block 还有什么限制?

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

    inode 记录的文件数据至少有底下这些

    • 该文件的存取模式(read/write/execute);
    • 该文件的拥有者与群组(owner/group);
    • 该文件的容量;
    • 该文件建立或状态改变的时间(ctime);
    • 最近一次的读取时间(atime);
    • 最近修改的时间(mtime);
    • 定义文件特性的旗帜(flag),如 SUID…;
    • 该文件真正内容的指向(pointer);

    inode 的数量与大小也是在格式化时就已固定,除此之外 inode 还有哪些特色?

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

    实际的索引结构,多级索引

    在这里插入图片描述

  • Superblock(超级区块)

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

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

    相关的 superblock 信息可以由 dumpe2fs 指令来呼叫出来观察

  • Filesystem Description(文件系统描述说明)

    这个区段可以描述每个 block group 的开始与结束的 block 号码,以及说明每个区段分别介于哪一个 block 号码之间。这部分也可以使用 dumpe2fs 来查看。

  • block bitmap(区块对照表)

    block bitmap 记录哪些 block 是空的!

  • inode bitmap(inode 对照表)

    inode bitmap 记录空的 inode。

1.3、与目录树的关系

  • 目录

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

    如果想观察 root 家目录内的文件所占用的 inode 号码,可以使用 ls -i 这个选项来处理:

    [root@MiWiFi-R4A-srv ~]# ls -il
    total 8
    35726127 -rw-------. 1 root root 2723 Aug 10 16:32 anaconda-ks.cfg
     2967485 drwxr-xr-x. 2 root root    6 Aug 14 11:29 Desktop
     2967486 drwxr-xr-x. 2 root root    6 Aug 14 11:29 Documents
    17486905 drwxr-xr-x. 2 root root    6 Aug 14 11:29 Downloads
    ...
    
  • 文件

    新建一个文件时,ext2 会分配一个 inode 与相对于该文件大小的 block 数量给该文件。

1.3.1、目录树读取

inode 本身并不记录文件名,文件名的记录是在目录的 block 中。因此,在文件与目录的权限中,我们才会提到 “新增/删除/更名文件与目录的 w 权限有关”。那么因为文件名是记录在目录的 block 中,因此当我们要读取某个文件时,就务必会经过目录的 inode 与 block,然后才能找到那个待读取文件的 inode 号码,最终才能读到正确的文件的 block 内的数据。

比如,我们想要读取 /etc/passwd 这个文件:

[root@MiWiFi-R4A-srv ~]# ll -di / /etc /etc/passwd
     128 dr-xr-xr-x.  18 root root  237 Aug 22 15:29 /
16777345 drwxr-xr-x. 150 root root 8192 Aug 27 09:46 /etc
18093270 -rw-r--r--.   1 root root 2632 Aug 21 15:39 /etc/passwd
  1. / 的 inode

    通过挂载点的信息找到 inode 号码为 128 的根目录 inode,且 inode 规范的权限让我们可以读取该 block 的内容(有 r 和 x 权限)

  2. / 的 block

    经过上面的步骤取得 block 的号码,并找到该内容有 etc/ 目录的 inode 号码(16777345)

  3. etc/ 的 inode

    读取 16777345 号 inode 得知具有 r 和 x 的权限,因此可以读取 etc/ 的 block 内容

  4. etc/ 的 block

    经过上个步骤取得 block 号码,并找到该内容有 passwd 文件的 inode 号码(18093270)

  5. passwd 的 inode

    读取 18093270 号 inode 得知有 r 的权限,因此就能读取 passwd 的 block 内容

  6. passwd 的 block

    最后将该 passwd 内容的数据读出来

挂载点的意义:将文件系统与目录树结合的动作称为 “挂载”。挂载点一定是目录,该目录为进入该文件系统的入口

1.4、其他 Linux 支持的文件系统与 VFS

常见的支持文件系统有:

  • 传统文件系统:ext2 / minix / MS-DOS / FAT / iso9660 等等;
  • 日志式文件系统:ext3 / ext4 / ReiserFS / Windows‘NTFS / IBM’s JFS / SGI‘s XFS / ZFS
  • 网络文件系统:NFS / SMBFS

想要知道你的 Linux 支持的文件系统有哪些,可以查看底下这个目录:

[root@MiWiFi-R4A-srv ~]# ll /lib/modules/$(uname -r)/kernel/fs
total 20
-rw-r--r--. 1 root root 7768 Jun  2 00:26 binfmt_misc.ko.xz
drwxr-xr-x. 2 root root   30 Aug 10 16:26 cachefiles
drwxr-xr-x. 2 root root   24 Aug 10 16:26 ceph
drwxr-xr-x. 2 root root   24 Aug 10 16:26 cifs
drwxr-xr-x. 2 root root   26 Aug 10 16:26 cramfs
drwxr-xr-x. 2 root root   23 Aug 10 16:26 dlm
drwxr-xr-x. 2 root root   24 Aug 10 16:26 ext4
drwxr-xr-x. 2 root root   60 Aug 10 16:26 fat
drwxr-xr-x. 2 root root   27 Aug 10 16:26 fscache
drwxr-xr-x. 2 root root   46 Aug 10 16:26 fuse
drwxr-xr-x. 2 root root   24 Aug 10 16:26 gfs2
drwxr-xr-x. 2 root root   25 Aug 10 16:26 isofs
drwxr-xr-x. 2 root root   24 Aug 10 16:26 jbd2
drwxr-xr-x. 2 root root   25 Aug 10 16:26 lockd
-rw-r--r--. 1 root root 4892 Jun  2 00:26 mbcache.ko.xz
drwxr-xr-x. 5 root root  120 Aug 10 16:26 nfs
drwxr-xr-x. 2 root root   46 Aug 10 16:26 nfs_common
drwxr-xr-x. 2 root root   24 Aug 10 16:26 nfsd
drwxr-xr-x. 2 root root 4096 Aug 10 16:26 nls
drwxr-xr-x. 2 root root   27 Aug 10 16:26 overlayfs
drwxr-xr-x. 2 root root   27 Aug 10 16:26 pstore
drwxr-xr-x. 2 root root   28 Aug 10 16:26 squashfs
drwxr-xr-x. 2 root root   23 Aug 10 16:26 udf
drwxr-xr-x. 2 root root   23 Aug 10 16:26 xfs

系统目前已加载到内存中支持的文件传统:

[root@MiWiFi-R4A-srv ~]# cat /proc/filesystems
nodev   sysfs
nodev   tmpfs
nodev   bdev
nodev   proc
nodev   cgroup
nodev   cgroup2
nodev   cpuset
nodev   devtmpfs
nodev   configfs
nodev   debugfs
nodev   tracefs
nodev   securityfs
nodev   sockfs
nodev   bpf
nodev   pipefs
nodev   ramfs
nodev   hugetlbfs
nodev   devpts
nodev   autofs
nodev   pstore
nodev   mqueue
nodev   selinuxfs
        fuseblk
nodev   fuse
nodev   fusectl
        xfs
nodev   rpc_pipefs
  • Linux VFS(Virtual Filesystem Switch)

    Linux 的内核是如何管理这些认识的文件传统呢?其实,整个 Linux 的系统都是通过一个名为 Virtual Filesystem Switch 的核心功能去读取 filesystem 的。也就是说,整个 Linux 认识的 filesystem 其实就是 VFS 在进行管理,我们使用者并不知道每个 partition 上头的 filesystem 是什么。

    在这里插入图片描述

1.5、XFS 文件系统简介

xfs 系统在资料的分布上,主要规划为三个部分,一个是资料区(data section)、一个文件系统活动登录区(log section)以及一个实时运作区(realtime section)

  • 资料区(data section)

    基本上,数据区就跟之前的 ext 家族一样,包括了 inode/data block/superblock 等数据,都放置在这个区块。这个数据区跟 ext 家族的 block group 类似,也是分为多个存储区群组来分别放置文件系统所需要的数据。每个存储区群组都包含了(1)整个文件系统的 superblock、(2)剩余空间的管理机制、(3)inode 的分配与追踪。此外,inode 与 block 都是系统徐亚用到时,这才动态分配,所以格式化很快。

    与 ext 家族不一样的是,xfs 的 block 与 inode 有多种不同的容量可供选择,block 容量可由 512bytes~64K 调配。

  • 文件系统活动登录区(log section)

    在登录区这个区域主要被用来记录文件系统的变化。文件的变化会在这里记录下来,直到该变化完整地写入到数据区后,该笔记录才会被终结。如果文件系统因为某些缘故挂掉了,系统会拿这个登录区来进行检验,看看系统挂掉之前,文件系统正在运作啥动作,快速修复。

  • 实时运作区(realtime section)

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

1.5.1、XFS 文件系统的描述观察
[root@MiWiFi-R4A-srv ~]# xfs_info 挂载点|设备文件名
范例一:找出系统 /root 这个挂载点底下的文件传统的 superblock 记录
[root@MiWiFi-R4A-srv ~]# df -T /boot
Filesystem     Type 1K-blocks   Used Available Use% Mounted on
/dev/sda1      xfs     301728 180756    120972  60% /boot

[root@MiWiFi-R4A-srv ~]# xfs_info /dev/sda1
meta-data=/dev/sda1              isize=512    agcount=4, agsize=19200 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=76800, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=1368, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
  • 第 1 行里面的 isize 指的是 inode 的容量,每个有 512bytes 这么大。至于 agcount 则是存储区群组(allocation group)的个数,共有 4 个,agsize 则是指每个存储区群组具有 19200 个 block。配合 block 设定为 4K,因此整个文件系统的容量为 4*19200*4K 这么大;
  • 第 2 行里面的 sectsz 指的是逻辑扇区(sector)的容量设定为 512bytes;
  • 第 5 行里面的 bsize 指的是 block 的容量,每个 block 为 4K,共有 76800 个 block;
  • 第 6 行里面的 sunit 和 swidth 与磁盘阵列的 stripe 相关性高;
  • 第 8 行里面的 internal 指的是这个登录区的位置在文件系统内,而不是外部设备的意思;
  • 第 9 行里面的 realtime 区域,里面的 extent 容量为 4K。

2、文件系统的简单操作

2.1、磁盘与目录容量

现在我们知道磁盘的整体数据是在 superblock 区块中,但是每个个别文件的容量则在 inode 当中记录的。那如何在文字接口底下显示出这些数据呢?

  • df:列出文件系统的整体磁盘使用量;
  • du:评估文件系统的磁盘使用量(常用于推估目录所占容量)。
2.1.1、df
[root@server ~]# df [-ahikHTm] [目录或文件名]
选项与参数:
-a	:列出所有的文件系统,包括系统特有的/proc等文件系统
-k	:以Bytes的容量显示
-m	:以MBytes的容量显示
-h	:较为易读的方式显示
-H	:以十进制代替二进制显示
-T	:连同分区的文件系统名称也列出
-i	:不用磁盘容量,而以inode数量显示
范例一:将系统内所有的 filesystem 列出来
[root@MiWiFi-R4A-srv ~]# df
Filesystem     1K-blocks    Used Available Use% Mounted on
devtmpfs          381684       0    381684   0% /dev
tmpfs             400580       0    400580   0% /dev/shm
tmpfs             400580    6164    394416   2% /run
tmpfs             400580       0    400580   0% /sys/fs/cgroup
/dev/sda3       18555904 5275944  13279960  29% /
/dev/sda1         301728  180756    120972  60% /boot
tmpfs              80116       0     80116   0% /run/user/0
tmpfs              80116       4     80112   1% /run/user/1000

范例二:将容量结果以易读的格式显示
[root@MiWiFi-R4A-srv ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        373M     0  373M   0% /dev
tmpfs           392M     0  392M   0% /dev/shm
tmpfs           392M  6.1M  386M   2% /run
tmpfs           392M     0  392M   0% /sys/fs/cgroup
/dev/sda3        18G  5.1G   13G  29% /
/dev/sda1       295M  177M  119M  60% /boot
tmpfs            79M     0   79M   0% /run/user/0
tmpfs            79M  4.0K   79M   1% /run/user/1000

范例三:将系统内的所有特殊文件格式及名称都列出来
[root@MiWiFi-R4A-srv ~]# df -aT
Filesystem     Type            1K-blocks    Used Available Use% Mounted on
sysfs          sysfs                   0       0         0    - /sys
proc           proc                    0       0         0    - /proc
devtmpfs       devtmpfs           381684       0    381684   0% /dev
securityfs     securityfs              0       0         0    - /sys/kernel/security
tmpfs          tmpfs              400580       0    400580   0% /dev/shm
devpts         devpts                  0       0         0    - /dev/pts
tmpfs          tmpfs              400580    6164    394416   2% /run
tmpfs          tmpfs              400580       0    400580   0% /sys/fs/cgroup
cgroup         cgroup                  0       0         0    - /sys/fs/cgroup/systemd
pstore         pstore                  0       0         0    - /sys/fs/pstore
bpf            bpf                     0       0         0    - /sys/fs/bpf
cgroup         cgroup                  0       0         0    - /sys/fs/cgroup/cpu,cpuacct
cgroup         cgroup                  0       0         0    - /sys/fs/cgroup/net_cls,net_prio
cgroup         cgroup                  0       0         0    - /sys/fs/cgroup/pids
cgroup         cgroup                  0       0         0    - /sys/fs/cgroup/freezer
cgroup         cgroup                  0       0         0    - /sys/fs/cgroup/perf_event
cgroup         cgroup                  0       0         0    - /sys/fs/cgroup/devices
cgroup         cgroup                  0       0         0    - /sys/fs/cgroup/memory
cgroup         cgroup                  0       0         0    - /sys/fs/cgroup/blkio
cgroup         cgroup                  0       0         0    - /sys/fs/cgroup/cpuset
cgroup         cgroup                  0       0         0    - /sys/fs/cgroup/hugetlb
cgroup         cgroup                  0       0         0    - /sys/fs/cgroup/rdma
none           tracefs                 0       0         0    - /sys/kernel/tracing
configfs       configfs                0       0         0    - /sys/kernel/config
/dev/sda3      xfs              18555904 5275944  13279960  29% /
selinuxfs      selinuxfs               0       0         0    - /sys/fs/selinux
systemd-1      autofs                  0       0         0    - /proc/sys/fs/binfmt_misc
mqueue         mqueue                  0       0         0    - /dev/mqueue
hugetlbfs      hugetlbfs               0       0         0    - /dev/hugepages
debugfs        debugfs                 0       0         0    - /sys/kernel/debug
fusectl        fusectl                 0       0         0    - /sys/fs/fuse/connections
/dev/sda1      xfs                301728  180756    120972  60% /boot
sunrpc         rpc_pipefs              0       0         0    - /var/lib/nfs/rpc_pipefs
tmpfs          tmpfs               80116       0     80116   0% /run/user/0
gvfsd-fuse     fuse.gvfsd-fuse         0       0         0    - /run/user/0/gvfs
tmpfs          tmpfs               80116       4     80112   1% /run/user/1000
gvfsd-fuse     fuse.gvfsd-fuse         0       0         0    - /run/user/1000/gvfs

范例四:将 /etc 底下的可用的磁盘容量以易读的容量格式显示
[root@MiWiFi-R4A-srv ~]# df -h /etc/
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        18G  5.1G   13G  29% /

范例五:将目前各个 partition 当中可用的 inode 数量列出
[root@MiWiFi-R4A-srv ~]# df -ih
Filesystem     Inodes IUsed IFree IUse% Mounted on
devtmpfs          94K   375   93K    1% /dev
tmpfs             98K     1   98K    1% /dev/shm
tmpfs             98K   702   98K    1% /run
tmpfs             98K    17   98K    1% /sys/fs/cgroup
/dev/sda3        8.9M  147K  8.8M    2% /
/dev/sda1        150K   310  150K    1% /boot
tmpfs             98K     9   98K    1% /run/user/0
tmpfs             98K    12   98K    1% /run/user/1000
2.1.2、du
[root@server ~]# du [-ahskm] 目录或文件名
选项与参数:
-a	:列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已
-h	:易读的方式
-s	:列出总量而已,而不列出每个个别的目录占用容量
-S	:不包括子目录下的总计
-k	:以KBytes列出容量
-m	:以MBytes列出容量
范例一:列出目前目录下的所有文件容量
[root@MiWiFi-R4A-srv ~]# du
4       ./.cache/mesa_shader_cache/1a
4       ./.cache/mesa_shader_cache/d5
4       ./.cache/mesa_shader_cache/fc
4       ./.cache/mesa_shader_cache/19
...

范例二:检查根目录下每个目录所占用的容量
[root@MiWiFi-R4A-srv ~]# du -sm /*
0       /bin
159     /boot
0       /dev
29      /etc
...

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

在 Linux 底下的链接文件有两种:一种是类似 Windows 的快捷方式功能的文件,可以让你快速的链接到目标文件(或目录);另一种是通过文件系统的 inode 链接来产生新文件名,而不是产生新文件。这种称为实体链接(hard link)!

2.2.1、Hard Link(实体链接,硬链接)

文件名只与目录有关,但是文件内容则与 inode 有关。有没有可能多个文件名对应到同一个 inode 呢?hard link 的原理:只是在某个目录下新增一笔文件名链接到某 inode 号码的关联记录而已

[root@MiWiFi-R4A-srv ~]# ll -i /etc/crontab
17449533 -rw-r--r--. 1 root root 451 Jan 12  2021 /etc/crontab	<== inode 号码为 17449533,链接字段为 1
[root@MiWiFi-R4A-srv ~]# ln /etc/crontab .
[root@MiWiFi-R4A-srv ~]# ll -i /etc/crontab crontab
17449533 -rw-r--r--. 2 root root 451 Jan 12  2021 crontab		<== inode 号码为 17449533,链接字段为 2
17449533 -rw-r--r--. 2 root root 451 Jan 12  2021 /etc/crontab	<== inode 号码为 17449533,链接字段为 2

在这里插入图片描述

优点:最大的好处是 “安全”!如果你将任何一个 “文件名” 删除,其实 inode 和 block 都还是存在的!此时你还可以通过另一个 “文件名” 来取到正确的文件数据!此外,不论你使用哪个 “文件名” 来编辑,最终的结果都会写入到相同的 inode 和 block 中。hard link 只是在某个目录下的 block 多写入一个关联数据而已,既不会增加 inode 也不会消耗 block。

缺点:1、不能跨 filesystem;2、不能链接目录。

2.2.2、Symbolic Link(符号链接,亦即快捷方式)

Symbolic Link 就是在建立一个独立的文件,而这个文件会让数据的读取指向它 link 的那个文件的文件名。所以,当来源文件被删除后,symbolic link 的文件会 “打不开”。

[root@MiWiFi-R4A-srv ~]# ln -s /etc/crontab crontab2
[root@MiWiFi-R4A-srv ~]# ll -i /etc/crontab /root/crontab2
17449533 -rw-r--r--. 2 root root 451 Jan 12  2021 /etc/crontab		<== inode 号码为 17449533
33589849 lrwxrwxrwx. 1 root root  12 Aug 27 15:34 /root/crontab2 -> /etc/crontab <== inode 号码为 33589849

两个文件指向了不同的 inode 号码,当然就是两个不同的文件!

在这里插入图片描述

symbolic link 所建立的是一个新文件,所以会占用 inode 和 block。

[root@server ~]# ln [-sf] 源文件 链接文件
选项与参数:
-s:如果不加任何参数,那就是硬链接,至于-s则是符号链接
-f:如果链接文件存在,就主动将链接文件删除后再建立
范例一:将 /etc/passwd 复制到 /tmp 底下,并观察 inode 和 block
[root@MiWiFi-R4A-srv tmp]# du -sb; df -i .
56403   .		<== 注意一下这个容量
Filesystem      Inodes  IUsed   IFree IUse% Mounted on
/dev/sda3      9283072 150095 9132977    2% /

范例二:将 /tmp/passwd 制作 hard link 成为 passwd-hd 文件,并观察文件与容量
[root@MiWiFi-R4A-srv tmp]# ln passwd passwd-hd
[root@MiWiFi-R4A-srv tmp]# du -sb; df -i .
56403   .		<== 并没有改变
Filesystem      Inodes  IUsed   IFree IUse% Mounted on
/dev/sda3      9283072 150095 9132977    2% /

[root@MiWiFi-R4A-srv tmp]# ll -i passwd*
2902493 -rw-r--r--. 2 root root 2632 Aug 21 15:39 passwd
2902493 -rw-r--r--. 2 root root 2632 Aug 21 15:39 passwd-hd

范例三:将 /tmp/passwd 建立一个符号链接
[root@MiWiFi-R4A-srv tmp]# ln -s passwd passwd-so
[root@MiWiFi-R4A-srv tmp]# ll -i passwd*
2902493 -rw-r--r--. 2 root root 2632 Aug 21 15:39 passwd
2902493 -rw-r--r--. 2 root root 2632 Aug 21 15:39 passwd-hd
2902505 lrwxrwxrwx. 1 root root    6 Aug 27 15:42 passwd-so -> passwd	<== inode 号码不同
[root@MiWiFi-R4A-srv tmp]# du -sb; df -i .
56409   .		<== 大小改变了
Filesystem      Inodes  IUsed   IFree IUse% Mounted on
/dev/sda3      9283072 150096 9132976    2% /

范例四:删除源文件 passwd,其他两个能不能打开
[root@MiWiFi-R4A-srv tmp]# rm passwd
rm: remove regular file 'passwd'? y
[root@MiWiFi-R4A-srv tmp]# cat passwd-hd	<== 实体链接可以打开
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
...
[root@MiWiFi-R4A-srv tmp]# cat passwd-so	<== 符号链接无法打开
cat: passwd-so: No such file or directory
[root@MiWiFi-R4A-srv tmp]# ll -i passwd*
2902493 -rw-r--r--. 1 root root 2632 Aug 21 15:39 passwd-hd
2902505 lrwxrwxrwx. 1 root root    6 Aug 27 15:42 passwd-so -> passwd	<== 闪烁
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值