inode与block详解
2016.6.25
12-2-1.inode和block概述
- 文件存储在硬盘上,硬盘的最小存储单位叫做“扇区”(sector),
- 操作系统读取硬盘的时候,不会一个个扇区读取,这样效率太低,而是一次性连续读取多个扇区,及一次性读取一个“块”(block)。这种由多个扇区组成的“块”,是文件存取的最小单位。“块”的大小,最常见的是4KB,即连续八个sector组成的一个block
- 文件数据存储在“块”中,那么还必须找到一个地方存储文件的源信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种存储文件原信息的区域就叫做inode,中文译名为“索引节点”,也叫i节点
- 一个文件必须占用一个inode,但至少占用一个block
12-2-2.inode的内容
- inode包含文件的元信息,例如:
- 文件的字节数
- 文件拥有者的User ID
- 文件的Group ID
- 文件的读、写、执行权限
- 文件的时间戳
可以用stat命令,查看某个文件的inode信息
stat install.log
[root@test2 ~]# stat install.log
File: `install.log'
Size: 49565 Blocks: 112 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 651523 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2016-06-25 11:02:25.010000000 +0800
Modify: 2016-05-18 04:13:40.284999783 +0800
Change: 2016-05-18 04:13:49.250999781 +0800
[root@test2 ~]#
12-2-3.目录文件的结构
- 目录也是一种文件
- 目录文件的结构
- 每个inode都有一个号码,操作系统用inode号码来识别不同的文件
- linux系统内不使用文件名,而是用inode号码来识别文件。对于系统来说,文件名只是inode便于识别的别称
12-2-4.inode的号码
- 表面上,用户通过文件名,打开文件
- 实际上,系统内部这个过程分成散步:
- 1系统找到这个文件名对应的inode号码
- 2通过inode号码,获取inode信息
- 3根据inode信息,找到文件数据所在的bloc,读出数据
- 使用ls -i命令,可以看到文件名对应的inode号码:ls -i aa.txt
- 使用stat命令,查看文件inode信息中的inode号码:stat aa.txt
ls -i
[root@test2 ~]# ls -i
671131 anaconda-ks.cfg 651523 install.log 673046 Pictures
673040 Desktop 651524 install.log.syslog 673043 Public
673044 Documents 673062 man2.txt 673042 Templates
673041 Downloads 673064 man.txt 673047 Videos
673059 etc.tar.gz 673045 Music
680618 home.bak.tar.gzip 671075 mvtotrash
[root@test2 ~]#
ls -il
[root@test2 ~]# ls -il
total 115528
671131 -rw-------. 1 root root 1578 May 18 04:13 anaconda-ks.cfg
673040 drwxr-xr-x. 3 root root 4096 Jun 23 11:18 Desktop
673044 drwxr-xr-x. 2 root root 4096 Jun 15 20:52 Documents
673041 drwxr-xr-x. 2 root root 4096 May 25 01:00 Downloads
673059 -rw-r--r-- 1 root root 10061329 Jun 4 14:23 etc.tar.gz
680618 -rw-r--r-- 1 root root 108117207 Jun 15 20:51 home.bak.tar.gzip
651523 -rw-r--r--. 1 root root 49565 May 18 04:13 install.log
651524 -rw-r--r--. 1 root root 10033 May 18 04:11 install.log.syslog
673062 -rw-r--r-- 1 root root 206 Jun 4 17:32 man2.txt
673064 -rw-r--r-- 1 root root 206 Jun 4 17:35 man.txt
673045 drwxr-xr-x. 2 root root 4096 May 25 01:00 Music
671075 drwxr-xr-x 2 root root 4096 Jun 10 21:21 mvtotrash
673046 drwxr-xr-x. 2 root root 4096 May 25 01:00 Pictures
673043 drwxr-xr-x. 2 root root 4096 May 25 01:00 Public
673042 drwxr-xr-x. 2 root root 4096 May 25 01:00 Templates
673047 drwxr-xr-x. 2 root root 4096 May 25 01:00 Videos
12-2-5.访问文件的简单流程
- 当一个用户在linux系统中试图访问一个文件时,系统会先根据文件名去查找它的inode,看该用户是否具有访问这个文件的权限
- 如果有,就指向相对应的数据bloc
- 如果没有,就返回Permission denied
12-2-6.inode的大小
- inode也会消耗硬盘空间,每个inode的大小,一般是128字节或256字节
- inode的总数,在格式化时就给定
- 查看每个硬盘分区的inode总数和已经使用的数量,可以使用命令:df -i
- 查看每个inode的大小,可以使用命令:
- dumpe2fs -h /dev/mapper/VolGroup-lv_root | grep "Inode size"
df -ih
[root@test2 ~]# df -ih
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vg_jason-lv_root 1.1M 135K 988K 12% /
tmpfs 983K 3 983K 1% /dev/shm
/dev/sda1 126K 39 125K 1% /boot
/dev/sdc1 1.3M 4.5K 1.3M 1% /home
/dev/md1 386K 11 386K 1% /mdata2
/dev/mapper/mail_store-mbox 7.5M 16 7.5M 1% /mailbox
[root@test2 ~]#
12-2-7.inode的特殊作用
- 由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象
- 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode,就能起到删除文件的作用。
- 移动文件或重命名文件,只是改变文件名,不影响inode号码
- 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名
- 这使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版本文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,就版文件的inode则被回收
LVM的文件系统当中无法查找到inode
[root@test2 ~]# dumpe2fs -h /dev/sdb2
dumpe2fs 1.41.12 (17-May-2010)
dumpe2fs: Bad magic number in super-block while trying to open /dev/sdb2
Couldn't find valid filesystem superblock.
[root@test2 ~]# dumpe2fs -h /dev/sdb3
dumpe2fs 1.41.12 (17-May-2010)
dumpe2fs: Bad magic number in super-block while trying to open /dev/sdb3
Couldn't find valid filesystem superblock.
dumpe2fs -h /dev/sda1
[root@test2 ~]# dumpe2fs -h /dev/sda1
dumpe2fs 1.41.12 (17-May-2010)
Filesystem volume name: <none>
Last mounted on: /boot
Filesystem UUID: 12a13375-c595-4876-9fc2-3158f535861d
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 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: 128016
Block count: 512000
Reserved block count: 25600
Free blocks: 455890
Free inodes: 127977
First block: 1
Block size: 1024
Fragment size: 1024
Reserved GDT blocks: 256
Blocks per group: 8192
Fragments per group: 8192
Inodes per group: 2032
Inode blocks per group: 254
Flex block group size: 16
Filesystem created: Wed May 18 04:04:23 2016
Last mount time: Sat Jun 25 15:29:23 2016
Last write time: Sat Jun 25 15:29:23 2016
Mount count: 36
Maximum mount count: -1
Last checked: Wed May 18 04:04:23 2016
Check interval: 0 (<none>)
Lifetime writes: 75 MB
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 128
Journal inode: 8
Default directory hash: half_md4
直接查找到Inode size的方式:
dumpe2fs -h /dev/sda1 | grep -i "Inode size"
[root@test2 ~]# dumpe2fs -h /dev/sda1 | grep -i "Inode size"
dumpe2fs 1.41.12 (17-May-2010)
Inode size: 128
dumpe2fs -h失败的案例:
[root@test2 ~]# dumpe2fs -h /dev/sda3
dumpe2fs 1.41.12 (17-May-2010)
dumpe2fs: No such file or directory while trying to open /dev/sda3
Couldn't find valid filesystem superblock.
[root@test2 ~]# dumpe2fs -h /dev/sda
dumpe2fs 1.41.12 (17-May-2010)
dumpe2fs: Bad magic number in super-block while trying to open /dev/sda
Couldn't find valid filesystem superblock.
[root@test2 ~]# dumpe2fs -h /dev/sdb
dumpe2fs 1.41.12 (17-May-2010)
dumpe2fs: Bad magic number in super-block while trying to open /dev/sdb
Couldn't find valid filesystem superblock.
[root@test2 ~]# dumpe2fs -h /dev/sdb1
dumpe2fs 1.41.12 (17-May-2010)
dumpe2fs: Bad magic number in super-block while trying to open /dev/sdb1
Couldn't find valid filesystem superblock.