“ 本文正在参加「金石计划 . 瓜分6万现金大奖」 ”
9.5 索引节点
索引节点(Inode)是Linux系统中的基础知识,这部分知识内容比较复杂,不易理解,因为其中会涉及Linux文件系统的核心知识,在这里读者尽力理解就行了,实在理解不了,等阅读了磁盘和文件系统的相关章节后再回头来看,相信那时再来理解就简单了。
索引节点Inode列的属性对应于“ll -hi /data”命令结果中第1列的一串数字,示例代码如下:
[root@centos7 ~]# ll -hi /data
33914868 -rw-r--r--. 1 root root 0 Oct 8 00:19 neteagle.txt
上面代码中带底纹的33914868这串数字就表示文件对应的索引节点,这里所提的文件也包含目录,广义地讲,Linux里一切皆文件,针对文件的说明几乎同样都适用于目录。
9.5.1 Linux磁盘存储数据的经典描述
一块磁盘从放入计算机到被Linux系统识别,再到最终考验存储数据是需要一系列处理过程的,具体过程如下。
1)磁盘要存储数据,就相当于盖房子住人。
2)磁盘要分区才能存储数据,相当于盖房后,要打隔断分出卧室、厨房、卫生间等区域。
3)磁盘分区完成后,还要进行格式化,创建文件系统才能存储数据,相当于房子打完隔断后还得装修(不同的装修风格相当于不同的文件系统)。
4)磁盘分完区格式化后还必须要挂载到指定的目录(即挂载点)下才能存放数据,这相当于为房子安装门和窗户,最终人才能进出、与外界通信以及居住。
希望通过这个比喻,读者对磁盘的适用过程有了一个基本的了解。
9.5.2 什么是索引节点
索引节点(Index node,Inode)在每个Linux存储设备(磁盘或硬盘)或存储设备的分区(此时的存储设备可以是硬盘、软皮、U盘,等等)中被格式化为ext系统文件系统之后,都会生成两部分内容:第一部分是Inode(默认大小为128或256字节),第二部分是Block(默认大小为1~4KB)。由于磁盘或分区一般都比较大,因此,Inode和Block都会存在很多个,并且都可以存放数据信息。
Inode本质上是一小块具备唯一数字编号的存储空间,主要用来存放文件(目录)属性(例如ls -l的结果)的数据信息,注意,Inode里面唯独不包含文件名本身(文件名不算文件的属性)。
Block称为磁盘块,是用来存放实际数据的实体单元(ext文件系统一般最大为4KB),即用来存放真正的数据,例如,照片、视频等普通文件数据,单个的大文件需要占用多个Block块来存储,特别小的单个文件如果不能占满整个Block块,那么剩余的空间也无法再利用。
Inode存储的属性信息(即ls -l的结果),包括但不限于文件大小、属主(用户)、归属的用户组、文件权限、文件类型,“修改”时间等,还包含指向文件的实体指针等(Block的位置,即Inode节点与Block的对应关系)。
9.5.3 查看文件内容与Inode和Block的关系
Inode除了要记录文件属性的信息之外,还会为每个文件进行信息索引,所以就有了Inode的数值。操作系统根据指令,即可通过Inode的值最快速地找到相对应的文件实体。文件、Inode和Block之间的关系见图9-4。
图9-4 查看文件内容与Inode和Block的关系
当我们使用ls命令查看某个目录或文件时,如果加上-i参数,就可以看到Inode节点了;根据前面所讲的例子,适用的命令ls -li中若带有-i参数,即可查看文件的Inode数值,示例代码如下:
[root@centos7 ~]# ll -i /etc/hosts
16808060 -rw-r--r--. 1 root root 158 Jun 7 2013 /etc/hosts
提示: 也可以适用stat查看文件属性,以及相应的Inode数值。
9.5.4 Inode和Block的特点
9.5.4.1 Inode的特点
总体来说,Inode具有如下一些特点。
- ext3/ext4文件系统(CentOS 5.x/6.x默认的文件系统)下,一个非空文件至少要占用一个Inode(有且只有一个)和一个Block(可以有多个)。
- Inode节点号相同的文件,互为硬链接文件,可以认为是一个文件的不同入口。
- Inode再某一个文件系统(分区)内是唯一的。
9.5.4.2 Block的特点
Block的特点具体如下。
- 磁盘读取数据是以Block为单位进行读取的。
- 每读取一个Block就会消耗一次硬盘I/O(input/putput,磁盘读写)。
- 若文件比较大,那么一个文件可能占用多个Block。
- 若文件比较小,那么一个Block的剩余空间会被浪费,无论内容有多小。
9.5.5 查看和管理Inode
查看文件系统Inode总量以及剩余量的命令如下:
[root@centos7 ~]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
devtmpfs 230226 373 229853 1% /dev
tmpfs 232876 1 232875 1% /dev/shm
tmpfs 232876 688 232188 1% /run
tmpfs 232876 16 232860 1% /sys/fs/cgroup
/dev/sda3 9960960 74449 9886511 1% /
/dev/sda1 131072 335 130737 1% /boot
tmpfs 232876 1 232875 1% /run/user/0
查看磁盘的使用量相当于是查看Block的情况,示例命令如下:
[root@centos7 ~]# df -h #Block是存放数据的位置,数据实体。
Filesystem Size Used Avail Use% Mounted on
devtmpfs 900M 0 900M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.5M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda3 19G 2.1G 17G 11% /
/dev/sda1 253M 157M 97M 62% /boot
tmpfs 182M 0 182M 0% /run/user/0
通过“ls -i”或者"stat 文件名"命令可以查看文件的Inode数值。
[root@centos7 ~]# ls -i /data/neteagle.txt
33914868 /data/neteagle.txt
[root@centos7 ~]# stat /data/neteagle.txt
File: ‘/data/neteagle.txt’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 803h/2051d Inode: 33914868 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:default_t:s0
Access: 2020-10-08 00:19:23.787073041 +0800
Modify: 2020-10-08 00:19:23.787073041 +0800
Change: 2020-10-08 00:19:23.787073041 +0800
Birth: -
通过dumpe2fs /dev/sda1命令可以查看分区的Inode和Block的单位大小及各种相关信息。
[root@centos6 ~]# dumpe2fs /dev/sda1
dumpe2fs 1.41.12 (17-May-2010)
Filesystem volume name: <none>
Last mounted on: /boot
Filesystem UUID: 57f61bfb-4cc4-43a0-a715-b23fe0762ee9
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 65536
Block count: 262144
Reserved block count: 13107
Free blocks: 233426
Free inodes: 65492
First block: 0
Block size: 4096
Fragment size: 4096
Reserved GDT blocks: 63
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 8192
Inode blocks per group: 512
Flex block group size: 16
Filesystem created: Mon Sep 14 02:24:43 2020
Last mount time: Tue Oct 13 00:19:00 2020
Last write time: Tue Oct 13 00:19:00 2020
Mount count: 17
Maximum mount count: -1
Last checked: Mon Sep 14 02:24:43 2020
Check interval: 0 (<none>)
Lifetime writes: 113 MB
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 256
Required extra isize: 28
Desired extra isize: 28
Journal inode: 8
Default directory hash: half_md4
Directory Hash Seed: b79723b1-a68c-49ed-8e32-cc075dd28cc9
Journal backup: inode blocks
Journal features: (none)
Journal size: 32M
Journal length: 8192
Journal sequence: 0x00000029
Journal start: 0
Group 0: (Blocks 0-32767) [ITABLE_ZEROED]
Checksum 0x9aa5, unused inodes 8148
Primary superblock at 0, Group descriptors at 1-1
Reserved GDT blocks at 2-64
Block bitmap at 65 (+65), Inode bitmap at 81 (+81)
Inode table at 97-608 (+97)
28581 free blocks, 8149 free inodes, 5 directories, 8148 unused inodes
Free blocks: 79, 90-95, 4194-32767
Free inodes: 43, 45-8192
Group 1: (Blocks 32768-65535) [ITABLE_ZEROED]
Checksum 0x8b26, unused inodes 8191
Backup superblock at 32768, Group descriptors at 32769-32769
Reserved GDT blocks at 32770-32832
Block bitmap at 66 (+4294934594), Inode bitmap at 82 (+4294934610)
Inode table at 609-1120 (+4294935137)
16624 free blocks, 8191 free inodes, 1 directories, 8191 unused inodes
Free blocks: 34596-34657, 34688, 34722-34723, 34738-34739, 34758-34759, 34791-34815, 42862-43007, 49152-65535
Free inodes: 8194-16384
Group 2: (Blocks 65536-98303) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
Checksum 0xbfa1, unused inodes 8192
Block bitmap at 67 (+4294901827), Inode bitmap at 83 (+4294901843)
Inode table at 1121-1632 (+4294902881)
32768 free blocks, 8192 free inodes, 0 directories, 8192 unused inodes
Free blocks: 65536-98303
Free inodes: 16385-24576
Group 3: (Blocks 98304-131071) [INODE_UNINIT, ITABLE_ZEROED]
Checksum 0xc8f4, unused inodes 8192
Backup superblock at 98304, Group descriptors at 98305-98305
Reserved GDT blocks at 98306-98368
Block bitmap at 68 (+4294869060), Inode bitmap at 84 (+4294869076)
Inode table at 1633-2144 (+4294870625)
32703 free blocks, 8192 free inodes, 0 directories, 8192 unused inodes
Free blocks: 98369-131071
Free inodes: 24577-32768
Group 4: (Blocks 131072-163839) [INODE_UNINIT, ITABLE_ZEROED]
Checksum 0x8cce, unused inodes 8192
Block bitmap at 69 (+4294836293), Inode bitmap at 85 (+4294836309)
Inode table at 2145-2656 (+4294838369)
24576 free blocks, 8192 free inodes, 0 directories, 8192 unused inodes
Free blocks: 139264-163839
Free inodes: 32769-40960
Group 5: (Blocks 163840-196607) [INODE_UNINIT, ITABLE_ZEROED]
Checksum 0xf5c9, unused inodes 8192
Backup superblock at 163840, Group descriptors at 163841-163841
Reserved GDT blocks at 163842-163904
Block bitmap at 70 (+4294803526), Inode bitmap at 86 (+4294803542)
Inode table at 2657-3168 (+4294806113)
32703 free blocks, 8192 free inodes, 0 directories, 8192 unused inodes
Free blocks: 163905-196607
Free inodes: 40961-49152
Group 6: (Blocks 196608-229375) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
Checksum 0xbccb, unused inodes 8192
Block bitmap at 71 (+4294770759), Inode bitmap at 87 (+4294770775)
Inode table at 3169-3680 (+4294773857)
32768 free blocks, 8192 free inodes, 0 directories, 8192 unused inodes
Free blocks: 196608-229375
Free inodes: 49153-57344
Group 7: (Blocks 229376-262143) [INODE_UNINIT, ITABLE_ZEROED]
Checksum 0xb45a, unused inodes 8192
Backup superblock at 229376, Group descriptors at 229377-229377
Reserved GDT blocks at 229378-229440
Block bitmap at 72 (+4294737992), Inode bitmap at 88 (+4294738008)
Inode table at 3681-4192 (+4294741601)
32703 free blocks, 8192 free inodes, 0 directories, 8192 unused inodes
Free blocks: 229441-262143
Free inodes: 57345-65536
9.5.6 磁盘空间不足导致企业故障的案例
在了解了磁盘的Inode和Block之后,我们就能够明白磁盘满了分两种情况:一种是Inode数量耗尽了,另一种则是Block满了。
Block耗尽的情况基本上大家都能理解,500GB磁盘存放600GB的大片,将直接耗尽所有的Block。但是Inode耗尽的情况,一般的运维人员可能就会搞不清楚了,因为每创建一个文件都会占用一个Inode,所以当文件无限多并且足够小的时候,Inode就会先于Block耗尽,导致看起来磁盘空间充足,但是却会收到提示“磁盘空间不够”的情况。
以下是磁盘装满的两种企业模拟案例。
环境准备,命令集合如下:
[root@centos7 ~]# mkdir -p /app/logs #创建用于挂载的目录。
[root@centos7 ~]# dd if=/dev/zero of=/dev/sdc bs=8k count=10 #创建指定大小的文件。
10+0 records in
10+0 records out
81920 bytes (82 kB) copied, 0.00050266 s, 163 MB/s
[root@centos7 ~]# mkfs.ext4 /dev/sdc #格式化。
mke2fs 1.42.9 (28-Dec-2013)
/dev/sdc is not a block special device.
Proceed anyway? (y,n) y
Filesystem too small for a journal
Discarding device blocks: done
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
16 inodes, 80 blocks
4 blocks (5.00%) reserved for the super user
First data block=1
1 block group
8192 blocks per group, 8192 fragments per group
16 inodes per group
Allocating group tables: done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
[root@centos7 ~]# mount -o loop /dev/sdc /app/logs #挂载。
[root@centos7 ~]# df -h #检查挂载结果。
Filesystem Size Used Avail Use% Mounted on
devtmpfs 900M 52K 900M 1% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.5M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda3 19G 2.1G 17G 11% /
/dev/sda1 253M 157M 97M 62% /boot
tmpfs 182M 0 182M 0% /run/user/0
/dev/loop0 73K 14K 54K 21% /app/logs
9.5.6.1 模拟Block被占满的测试案例
[root@centos7 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 900M 52K 900M 1% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.5M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda3 19G 2.1G 17G 11% /
/dev/sda1 253M 157M 97M 62% /boot
tmpfs 182M 0 182M 0% /run/user/0
/dev/loop0 73K 14K 54K 21% /app/logs #磁盘适用正常(Block)。
[root@centos7 ~]# cd /app/logs/
[root@centos7 /app/logs]# ll -h /bin/ls
-rwxr-xr-x. 1 root root 115K Aug 20 2019 /bin/ls
[root@centos7 /app/logs]# cp /bin/ls . #把大文件复制到这个磁盘分区中。
cp: error writing ‘./ls’: No space left on device #报错了,因为磁盘空间不够了。
cp: failed to extend ‘./ls’: No space left on device
[root@centos7 /app/logs]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 900M 52K 900M 1% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.5M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda3 19G 2.1G 17G 11% /
/dev/sda1 253M 157M 97M 62% /boot
tmpfs 182M 0 182M 0% /run/user/0
/dev/loop0 73K 71K 0 100% /app/logs #磁盘已满,这时Block用光了。
[root@centos7 /app/logs]# mv ls /tmp/ #解决方法就是删除对应的文件,这里选择移动到/tmp/中。
[root@centos7 /app/logs]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 900M 80K 900M 1% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.5M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda3 19G 2.1G 17G 11% /
/dev/sda1 253M 157M 97M 62% /boot
tmpfs 182M 0 182M 0% /run/user/0
/dev/loop0 73K 14K 54K 21% /app/logs #磁盘空间恢复了。
9.5.6.2 模拟Block耗尽的测试案例
[root@centos7 /app/logs]# touch {1..6}.txt
touch: cannot touch ‘6.txt’: No space left on device #创建文件的时候,提示磁盘空间不足。
[root@centos7 /app/logs]# touch 7.txt
touch: cannot touch ‘7.txt’: No space left on device #
[root@centos7 /app/logs]# df -h 查看磁盘空间的使用情况(Block)。
Filesystem Size Used Avail Use% Mounted on
devtmpfs 900M 80K 900M 1% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.5M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda3 19G 2.1G 17G 11% /
/dev/sda1 253M 157M 97M 62% /boot
tmpfs 182M 0 182M 0% /run/user/0
/dev/loop0 73K 15K 53K 23% /app/logs #还有剩余,这里指的是Block还有剩余。
[root@centos7 /app/logs]# df -i #查看磁盘空间适用情况(Inode)。
Filesystem Inodes IUsed IFree IUse% Mounted on
devtmpfs 230226 378 229848 1% /dev
tmpfs 232876 1 232875 1% /dev/shm
tmpfs 232876 694 232182 1% /run
tmpfs 232876 16 232860 1% /sys/fs/cgroup
/dev/sda3 9960960 74452 9886508 1% /
/dev/sda1 131072 335 130737 1% /boot
tmpfs 232876 1 232875 1% /run/user/0
/dev/loop0 16 16 0 100% /app/logs #但是Inode已经用光了,所以会提示磁盘空间不足。
[root@centos7 /app/logs]# mv *.txt /tmp/ #删除对用的肖文杰,这里移动到/tmp/中。
[root@centos7 /app/logs]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
devtmpfs 230226 378 229848 1% /dev
tmpfs 232876 1 232875 1% /dev/shm
tmpfs 232876 694 232182 1% /run
tmpfs 232876 16 232860 1% /sys/fs/cgroup
/dev/sda3 9960960 74457 9886503 1% /
/dev/sda1 131072 335 130737 1% /boot
tmpfs 232876 1 232875 1% /run/user/0
/dev/loop0 16 10 6 63% /app/logs #故障解决,Inode还有剩余空间。
[root@centos7 /app/logs]# touch 7.txt
#创建文件将不再报错了。
9.5.6.3 磁盘空间满了故障情况总结
情况一:Block耗尽的情况,例如500GB磁盘存放400GB+200GB的视频。
情况二:Inode耗尽的情况,产生大量的肖文杰(小于1KB)。
9.5.6.4 出现No space left on device问题的企业案例
如果想磁盘写入数据则会提示如下错误:No space left on device(磁盘空间不足),可通过df -h命令查看磁盘空间,若此时发现没满,请问可能的原因是什么?企业场景再什么情况下会导致这个问题发生?
解答:还是因为Inode耗尽了,多数情况下是基于日常Linux定时任务crond配置不当导致的,具体案例和解决方案请参见Linux定时任务章节。
9.6 硬链接及软链接数知识
软硬链接的概念是Linux系统中重要的基础知识之一,需要读者熟练掌握,本节会带领大家了解软硬链接的知识。硬链接数属性对应于前文"ll -hi /data"命令结果中的第3列(数字),示例代码如下:
[root@centos7 ~]# ll -hi /data
33914868 -rw-r--r--. 1 root root 0 Oct 8 00:19 neteagle.txt
说明: 上述代码中带底纹的1这样的数字列就表示文件(目录)对应的硬链接数。
9.6.1 链接的概念
在Linux系统中,链接可分为两种:一种为硬链接(Hard Link),另一种为软链接(Soft link)或符号链接(Symbolic Link)。前面讲解过,ln命令就是用来创建链接文件的,再默认不带任何参数的情况下,执行ln命令创建的链接是硬链接。
如果是适用ln -s创建的链接,则为软链接,软链接文件的文件类型为l(字母L的小写)。
创建硬链接的语法:“ln 原始文件 目标文件”(注意空格)。
创建软链接的语法:“ln -s 原始文件 目标文件”(目标文件不能事先存在)。
9.6.2 硬链接知识与实践
硬链接是指通过索引节点(Inode)进行的链接。在CentOS 6及以前的Linux(ext2、ext3、ext4)默认文件系统中,存在于在磁盘分区中的文件不管是什么类型都会为它分配一个唯一的编号,这个编号就称为索引节点编号(Index Inode),简称Inode,各个文件对应的这个索引节点编号就类似于我们生活中的身份证号码,在Linux同一文件系统中该编号是唯一的。
在Linux系统中,多个文件名指向同一个索引节点(Inode号相同)(Inode)是正常且被允许的。这种情况下的两个文件就称作互为硬链接文件,本质上就是相同文件的两个名字(类似真名和网名一样,都表示一个人)。在同一个分区/文件系统中,Inode号码相同的文件一定是硬链接文件。
硬链接文件就相当于是原始文件的另外一个访问入口。硬链接的作用之一是允许一个文件拥有多个有效的文件名(多个访问入口,类似于超市的多个入口),这样用户就可以建立硬链接到重要的文件上,为避免“误删”源数据加一份保险(很多应急存储的快照功能就应用了这个原理,增加一个快照就多了一个硬链接,多了一个硬链接就会增加一层数据的安全)。
因为文件系统(ext)的原理是,只要文件的索引节点(Inode Index)还有一个以上的硬链接,那么只删除其中的一个硬链接(即仅仅删除了该文件的链接指向)并不会影响索引节点本身和其他的链接(即数据文件实体并未被删除),只有在文件的最后一个硬链接被删除之后,此时如果有新数据要存储到硬盘上,或者系统通过类似的fsck做磁盘检查的时候,被删除的文件的数据块及目录的链接才会被释放,空间将被新数据占用并覆盖。当然,这样一来,数据就再也无法找回了。
也就是说,在Linux系统中,删除静态文件(没有进程调用的文件)的条件是与之相关的所有硬链接文件均被删除(暂时这样理解即可,后文会进一步介绍其与进程的占用也有关)。一个静态文件被彻底删除的条件就是该文件的硬链接数量为零。
下面给出一个文件的多个硬链接的形象图以帮助大家理解,图9-5即为硬链接原理图。
图9-5 文件硬链接原理图
根据硬链接示意图可以知道,当删除oldboyfile和pldboyfile_hard_link两者任意之一时,只相当于删除了该文件到Inode之间的连接,通过未删除的文件名依然可以访问到文件实体。
硬链接的创建方法为直接执行命令“ln 源文件 目标文件(硬链接文件)”,具体实例演示代码如下:
[root@centos7 ~]# echo "I am neteagle" >neteaglefile #创建源文件。
[root@centos7 ~]# cat neteaglefile #查看。
I am neteagle
[root@centos7 ~]# ln neteaglefile neteaglefile_hard_link #创建硬链接。
[root@centos7 ~]# cat neteaglefile_hard_link #查看硬链接,内容与源文件相同。
I am neteagle
[root@centos7 ~]# ll -i neteaglefile neteaglefile_hard_link #查看索引节点。
34509286 -rw-r--r--. 2 root root 14 Oct 12 18:49 neteaglefile #索引节点是相同的,链接数为2.
34509286 -rw-r--r--. 2 root root 14 Oct 12 18:49 neteaglefile_hard_link #索引节点是相同的。
[root@centos7 ~]# rm -f neteaglefile #删除源文件。
[root@centos7 ~]# ll -i neteaglefile neteaglefile_hard_link
ls: cannot access neteaglefile: No such file or directory #源文件已删。
34509286 -rw-r--r--. 1 root root 14 Oct 12 18:49 neteaglefile_hard_link #链接数变为1.
[root@centos7 ~]# cat neteaglefile_hard_link #内容依然存在,数据没有丢失。
I am neteagle
[root@centos7 ~]# ln neteaglefile_hard_link neteaglefile #反过来创建硬链接。
[root@centos7 ~]# ll -i neteaglefile neteaglefile_hard_link
34509286 -rw-r--r--. 2 root root 14 Oct 12 18:49 neteaglefile #又回来了,链接数又都为2了。
34509286 -rw-r--r--. 2 root root 14 Oct 12 18:49 neteaglefile_hard_link
[root@centos7 ~]# cat neteaglefile #文件回来了,内容又有了。
I am neteagle
硬链接知识小结
- 具有相同Inode节点号的多个文件互为硬链接文件,本质上是相同文件的不同文件名。
- 删除硬链接文件或者删除源文件任意之一,文件实体并未被删除。
- 只有删除了源文件与源文件对应的所有硬链接文件,文件实体才会被删除。
- 待所有的硬链接文件及源文件均被删除之后,再存放新的数据时,新数据会占用这个文件的空间。磁盘进行fsck检查的时候,删除的数据就会被系统回收(养成删除及使用多套环境测试的好习惯)。
- 硬链接文件就是文件的另一个入口(相当于超市的前门、后门)。
- 可以通过对文件设置硬链接文件,来防止重要文件被误删。
- 通过执行命令“ln 源文件 硬链接文件”,即可完成硬链接的创建。
- 硬链接文件是普通文件,因此可以使用rm命令删除。
- 对于静态文件(没有进程正在调用的文件)来讲,当对应的硬链接数为0(i-_link)时,文件就被删除。i-link的查看方法是执行ll -hi,然后查看结果的第三列。
- 创建硬链接只能针对文件,不能针对目录。