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 大小 1KB 2KB 4KB 最大单一文件限制 16GB 256GB 2TB 最大文件系统总容量 2TB 8TB 16TB 除此之外 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
-
/ 的 inode
通过挂载点的信息找到 inode 号码为 128 的根目录 inode,且 inode 规范的权限让我们可以读取该 block 的内容(有 r 和 x 权限)
-
/ 的 block
经过上面的步骤取得 block 的号码,并找到该内容有 etc/ 目录的 inode 号码(16777345)
-
etc/ 的 inode
读取 16777345 号 inode 得知具有 r 和 x 的权限,因此可以读取 etc/ 的 block 内容
-
etc/ 的 block
经过上个步骤取得 block 号码,并找到该内容有 passwd 文件的 inode 号码(18093270)
-
passwd 的 inode
读取 18093270 号 inode 得知有 r 的权限,因此就能读取 passwd 的 block 内容
-
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 <== 闪烁