inode与block的关系及相关企业问题

一、inode和block的联系

索引节点(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的对应关系)。

例如:

把硬盘比做一本书,书的每一页就是一个block,书的每一页的内容就是block里面的数据,同时书的每一页的大小是一样的(同一个硬盘分区的block的大小是一样的);书的目录页就是inode,记录了书的每一页知识点(文件/目录的属性)。

Inode除了要记录文件属性的信息之外,还会为每个文件进行信息索引,所以就有了Inode的数值。操作系统根据指令,即可通过Inode的值最快速地找到相对应的文件实体。

二、inode和block的特点

1.Inode的特点

总体来说,Inode具有如下一些特点。
1、ext3/ext4文件系统(CentOS 5.x/6.x默认的文件系统)下,一个非空文件至少要占用一个Inode(有且只有一个)和一个Block(可以有多个)。
2、Inode节点号相同的文件,互为硬链接文件,可以认为是一个文件的不同入口。
3、Inode在某一个文件系统(分区)内是唯一的。

2.Block的特点

Block的特点具体如下。
1、磁盘读取数据是以Block为单位进行读取的。
2、每读取一个Block就会消耗一次磁盘I/O(input/output,磁盘读写)。
3、若文件比较大,那么一个文件可能占用多个Block。
4、若文件比较小,那么一个Block的剩余空间会被浪费,无论内容有多小。

三、查看inode和block

查看文件系统Inode总量以及剩余量的命令如下:

[root@node1 /]# df -i
Filesystem     Inodes IUsed  IFree IUse% Mounted on
/dev/sda3      479552 56299 423253   12% /
tmpfs          127032     1 127031    1% /dev/shm
/dev/sda1       51200    38  51162    1% /boot

查看磁盘的使用量相当于是查看Block的情况,示例命令如下:

[root@node1 data]# df –h  #Block是存放数据的位置,数据实体
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       9.2G  1.6G  7.2G  19% /
tmpfs           937M     0  937M   0% /dev/shm
/dev/sda1       194M   34M  151M  19% /boot
/dev/sdb         99M  5.6M   89M   6% /mnt

通过“ls-i”或者“stat文件名”命令可以查看文件的Inode数值。

[root@node1 ~]# ls -i /etc/hosts
33586486 /etc/hosts

[root@node1 ~]# stat /etc/hosts
  File: ‘/etc/hosts’
  Size: 158           Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d    Inode: 33586486    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-09-24 22:32:25.297273504 +0800
Modify: 2013-06-07 22:31:32.000000000 +0800
Change: 2020-07-26 13:32:55.213170757 +0800
 Birth: -

通过dumpe2fs /dev/sda1命令可以查看分区的Inode和Block的单位大小及各种相关信息。

注意:dumpe2fs只能查看ext类型的文件系统。

[root@node1 ~]# dumpe2fs /dev/sdb1
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          91e41148-30bd-4889-bc45-57a1b978e40a
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit 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:              261888
Reserved block count:     13094
Free blocks:              253029
Free inodes:              65525
First block:              0
Block size:               4096
Fragment size:            4096
Group descriptor size:    64
Reserved GDT blocks:      127
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Flex block group size:    16
Filesystem created:       Thu Sep 24 15:23:05 2020
Last mount time:          Thu Sep 24 15:23:23 2020
Last write time:          Thu Sep 24 15:23:23 2020
Mount count:              1
Maximum mount count:      -1
Last checked:             Thu Sep 24 15:23:05 2020
Check interval:           0 (<none>)
Lifetime writes:          17 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:      ee0db236-1990-4426-a0e6-e43c56727152
Journal backup:           inode blocks
Journal features:         journal_64bit
Journal size:             16M
Journal length:           4096
Journal sequence:         0x00000002
Journal start:            1


Group 0: (Blocks 0-32767) [ITABLE_ZEROED]
  Checksum 0xf711, unused inodes 8181
  Primary superblock at 0, Group descriptors at 1-1
  Reserved GDT blocks at 2-128
  Block bitmap at 129 (+129), Inode bitmap at 145 (+145)
  Inode table at 161-672 (+161)
  28521 free blocks, 8181 free inodes, 2 directories, 8181 unused inodes
  Free blocks: 142-144, 153-160, 4258-32767
  Free inodes: 12-8192
Group 1: (Blocks 32768-65535) [INODE_UNINIT, ITABLE_ZEROED]
  Checksum 0x107d, unused inodes 8192
  Backup superblock at 32768, Group descriptors at 32769-32769
  Reserved GDT blocks at 32770-32896
  Block bitmap at 130 (bg #0 + 130), Inode bitmap at 146 (bg #0 + 146)
  Inode table at 673-1184 (bg #0 + 673)
  32639 free blocks, 8192 free inodes, 0 directories, 8192 unused inodes
  Free blocks: 32897-65535
  Free inodes: 8193-16384
Group 2: (Blocks 65536-98303) [INODE_UNINIT, ITABLE_ZEROED]
  Checksum 0x2ca4, unused inodes 8192
  Block bitmap at 131 (bg #0 + 131), Inode bitmap at 147 (bg #0 + 147)
  Inode table at 1185-1696 (bg #0 + 1185)
  28672 free blocks, 8192 free inodes, 0 directories, 8192 unused inodes
  Free blocks: 69632-98303
  Free inodes: 16385-24576
Group 3: (Blocks 98304-131071) [INODE_UNINIT, ITABLE_ZEROED]
  Checksum 0x48b3, unused inodes 8192
  Backup superblock at 98304, Group descriptors at 98305-98305
  Reserved GDT blocks at 98306-98432
  Block bitmap at 132 (bg #0 + 132), Inode bitmap at 148 (bg #0 + 148)
  Inode table at 1697-2208 (bg #0 + 1697)
  32639 free blocks, 8192 free inodes, 0 directories, 8192 unused inodes
  Free blocks: 98433-131071
  Free inodes: 24577-32768
Group 4: (Blocks 131072-163839) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x40f3, unused inodes 8192
  Block bitmap at 133 (bg #0 + 133), Inode bitmap at 149 (bg #0 + 149)
  Inode table at 2209-2720 (bg #0 + 2209)
  32768 free blocks, 8192 free inodes, 0 directories, 8192 unused inodes
  Free blocks: 131072-163839
  Free inodes: 32769-40960
Group 5: (Blocks 163840-196607) [INODE_UNINIT, ITABLE_ZEROED]
  Checksum 0x69fe, unused inodes 8192
  Backup superblock at 163840, Group descriptors at 163841-163841
  Reserved GDT blocks at 163842-163968
  Block bitmap at 134 (bg #0 + 134), Inode bitmap at 150 (bg #0 + 150)
  Inode table at 2721-3232 (bg #0 + 2721)
  32639 free blocks, 8192 free inodes, 0 directories, 8192 unused inodes
  Free blocks: 163969-196607
  Free inodes: 40961-49152
Group 6: (Blocks 196608-229375) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0xdc33, unused inodes 8192
  Block bitmap at 135 (bg #0 + 135), Inode bitmap at 151 (bg #0 + 151)
  Inode table at 3233-3744 (bg #0 + 3233)
  32768 free blocks, 8192 free inodes, 0 directories, 8192 unused inodes
  Free blocks: 196608-229375
  Free inodes: 49153-57344
Group 7: (Blocks 229376-261887) [INODE_UNINIT, ITABLE_ZEROED]
  Checksum 0x1403, unused inodes 8192
  Backup superblock at 229376, Group descriptors at 229377-229377
  Reserved GDT blocks at 229378-229504
  Block bitmap at 136 (bg #0 + 136), Inode bitmap at 152 (bg #0 + 152)
  Inode table at 3745-4256 (bg #0 + 3745)
  32383 free blocks, 8192 free inodes, 0 directories, 8192 unused inodes
  Free blocks: 229505-261887
  Free inodes: 57345-65536

四、磁盘空间不足导致企业故障的案例

1、出现No space left on device问题的企业案例

把/dev/sdb1挂载到/data目录下,/dev/sdb1 =1G

mkdir /data
mount /dev/sdb1 /data

情况一:inode满了

[root@node1 data]# df -i
Filesystem       Inodes IUsed    IFree IUse% Mounted on
/dev/sda3      50075136 60574 50014562    1% /
devtmpfs         121762   370   121392    1% /dev
tmpfs            124487     1   124486    1% /dev/shm
tmpfs            124487   691   123796    1% /run
tmpfs            124487    16   124471    1% /sys/fs/cgroup
/dev/sda1        256000   326   255674    1% /boot
tmpfs            124487     1   124486    1% /run/user/0
/dev/sdb1         65536    11    65525    1% /data

创建大量的小文件

[root@node1 data]# for i in $(echo {1..1000000});do touch ${i}.log;done
touch; cannot touch '856200.log': No space left on device
[root@node1 ~]# df -i
Filesystem       Inodes IUsed    IFree IUse% Mounted on
/dev/sda3      50075136 60574 50014562    1% /
devtmpfs         121762   370   121392    1% /dev
tmpfs            124487     1   124486    1% /dev/shm
tmpfs            124487   701   123786    1% /run
tmpfs            124487    16   124471    1% /sys/fs/cgroup
/dev/sda1        256000   326   255674    1% /boot
tmpfs            124487     1   124486    1% /run/user/0
/dev/sdb1         65536 65154      382  100% /data #<===inode已经满了

处理方案:

删除文件

[root@node1 data]# rm -f *.log
[root@node1 data]# ls
lost+found
[root@node1 data]# df -i
Filesystem       Inodes IUsed    IFree IUse% Mounted on
/dev/sda3      50075136 60574 50014562    1% /
devtmpfs         121762   370   121392    1% /dev
tmpfs            124487     1   124486    1% /dev/shm
tmpfs            124487   691   123796    1% /run
tmpfs            124487    16   124471    1% /sys/fs/cgroup
/dev/sda1        256000   326   255674    1% /boot
tmpfs            124487     1   124486    1% /run/user/0
/dev/sdb1         65536    11    65525    1% /data #<===inode恢复

情况二:block满了

[root@node1 data]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        96G  2.0G   94G   3% /
devtmpfs        476M     0  476M   0% /dev
tmpfs           487M     0  487M   0% /dev/shm
tmpfs           487M  7.6M  479M   2% /run
tmpfs           487M     0  487M   0% /sys/fs/cgroup
/dev/sda1       497M  120M  378M  25% /boot
tmpfs            98M     0   98M   0% /run/user/0
/dev/sdb1       991M  2.6M  922M   1% /data

创建一个大的文件来占满/data空间

[root@node1 data]# dd if=/dev/zero of=/data/test.log count=1 bs=1024000000
dd: error writing ‘/data/test.log’: No space left on device
1+0 records in
0+0 records out
1017675776 bytes (1.0 GB) copied, 71.3958 s, 14.3 MB/s
[root@node1 data]# ll -h
total 971M
drwx------ 2 root root  16K Sep 24 15:23 lost+found
-rw-r--r-- 1 root root 971M Sep 24 15:38 test.log

[root@node1 data]# dd if=/dev/zero of=/data/test2.log count=1 bs=1024000000
dd: error writing ‘/data/test.log’: No space left on device
1+0 records in
0+0 records out
1017675776 bytes (1.0 GB) copied, 42.3178 s, 24.0 MB/s
[root@node1 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        96G  2.0G   94G   3% /
devtmpfs        476M     0  476M   0% /dev
tmpfs           487M     0  487M   0% /dev/shm
tmpfs           487M  7.6M  479M   2% /run
tmpfs           487M     0  487M   0% /sys/fs/cgroup
/dev/sda1       497M  120M  378M  25% /boot
tmpfs            98M     0   98M   0% /run/user/0
/dev/sdb1       991M  975M     0 100% /data

处理方案:

删除大文件即可

2、提示空间快满,使用rm删除了很大的无用文件后,df仍然看到空间不足,为什么?如何解决

创建一个大文件/data/test.log,使用vim打开

[root@node1 data]# dd if=/dev/zero of=/data/test2.log count=1 bs=1024000000
dd: error writing ‘/data/test2.log’: No space left on device
1+0 records in
0+0 records out
1000202240 bytes (1.0 GB) copied, 42.1879 s, 23.7 MB/s
[root@node1 data]# vim test.log

另外开启一个ssh窗口删除/data/test.log

[root@node1 data]# rm -f /data/test.log
[root@node1 data]# ll
total 16
drwx------ 2 root root 16384 Sep 24 15:23 lost+found
-rw-r--r-- 1 root root     0 Sep 24 15:41 test2.log

[root@node1 data]# rm -f /data/test.log
[root@node1 data]# ls
lost+found  test2.log

[root@node1 data]# rm -f test.log 
[root@node1 data]# ls
lost+found
[root@node1 data]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        96G  2.0G   94G   3% /
devtmpfs        476M     0  476M   0% /dev
tmpfs           487M     0  487M   0% /dev/shm
tmpfs           487M  7.7M  479M   2% /run
tmpfs           487M     0  487M   0% /sys/fs/cgroup
/dev/sda1       497M  120M  378M  25% /boot
tmpfs            98M     0   98M   0% /run/user/0
/dev/sdb1       991M  975M     0 100% /data #<===/data任然是满的

原因是:

删除的大文件test.log被其它用户在使用,因此删除了test.log文件但还没有释放空间

处理方案:

#使用lsof命令来查看,可以发现/data/test.log虽然删除,但是还在被vim使用,并没有释放空间
[root@node1 data]# lsof |grep delete
vim       100146         root    3r      REG               8,17 1000202240         12 /data/test.log (deleted)
#使用kill命令来杀掉该进程
[root@node1 data]# lsof |grep delete
vim       100146         root    3r      REG               8,17 1000202240         12 /data/test.log (deleted)
[root@node1 data]# kill 100146
[root@node1 data]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        96G  2.0G   94G   3% /
devtmpfs        476M     0  476M   0% /dev
tmpfs           487M     0  487M   0% /dev/shm
tmpfs           487M  7.7M  479M   2% /run
tmpfs           487M     0  487M   0% /sys/fs/cgroup
/dev/sda1       497M  120M  378M  25% /boot
tmpfs            98M     0   98M   0% /run/user/0
/dev/sdb1       991M   22M  903M   3% /data #<===/data目录的空间已经被释放

3、No space left on device问题的处理流程图

posted @ 2020-09-24 16:24  yaowx  阅读(473)  评论(0编辑  收藏  举报