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的特点
总体来说,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总量以及剩余量的命令如下:
[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的单位大小及各种相关信息。
[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
处理方案:
创建一个大文件/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目录的空间已经被释放