如何理解linux的inode
看了很多关于inode的资料,理解inode对于理解linux文件系统非常重要,并对于理解软硬链接及文件存储方式很有帮助,我结合了网上的资料及我自己学到的知识,总结了inode的一些基本知识,作为学习的笔记。
文件系统??磁盘存储文件一盘是以扇区为单位,每个扇区为512字节,操作系统读取硬盘时不是一个一扇区读取,而是一次读取多个扇区,多个扇区划分成一个“块”(block),linux以块为单位存储数据,一般块的大小为4KB,也就是8个扇区组成一个块。 ??第一部分是引导扇区,负责加载内核;第二部分是superblock,存储inode/block的总量、使用和剩余量及文件系统的信息;第三部分是inode,存储文件的元数据和数据所在的block号;第四部分是block,存储文件的数据。 什么是inode??inode(index node)是linux和unix文件系统的一基本概念,inode在传统的类unix文件系统如ext3或ext4,linux扩展文件系统如ext2或ext3维护这个inode数据:inode表,每一个linux文件或目录(技术角度本质上没有什么区别),每个对象在文件系统中用一个inode表示,但什么是对像?每一个文件在linux中有下列的结构:
?? 注意inode不存文件名字只存内容,所有以上信息都存在一个inode中,简而言之,inode就是标识文件或目录属性,每一个inode都有一个唯一的inode号,也称为index number. ??下图为文件系统的block、inode、目录项的指向情况:可以看到有两个目录项指向同一个inode,链接数会记录在inode中,只有当链接数为0时该文件才会被删除,也就是只有删除所有指向这个inode的文件名时才能删除文件 如何检查inode如果你想查看Ext文件系统中的inode,可以使用一些命令查看其属性
[[email?protected] data]# stat /etc/bashrc File: ‘/etc/bashrc’ Size: 2853 Blocks: 8 IO Block: 4096 regular file Device: 802h/2050d Inode: 3145765 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Context: system_u:object_r:etc_t:s0 Access: 2019-05-19 15:21:20.360016057 +0800 Modify: 2018-10-31 03:48:10.000000000 +0800 Change: 2019-05-16 22:14:01.457994270 +0800 Birth: - 这个stat输出告诉你文件时间戳,所有者,权限和存储位置等,文件的数据存储在磁盘的块中,在stat中都可显示出来。 #stat --format=%i /etc/bashrc 3145765
#ls -il /etc total 1324 3146085 -rw-r--r--. 1 root root 16 May 16 22:16 adjtime 3145764 -rw-r--r--. 1 root root 1518 Jun 7 2013 aliases 3148068 -rw-r--r--. 1 root root 12288 May 16 22:17 aliases.db 3145741 drwxr-xr-x. 2 root root 4096 May 16 22:14 alternatives 3146180 -rw-------. 1 root root 541 Apr 11 2018 anacrontab 3145975 -rw-r--r--. 1 root root 55 Oct 30 2018 asound.conf 3148004 drwxr-x---. 3 root root 4096 May 16 22:14 audisp 3148009 drwxr-x---. 3 root root 4096 May 16 22:17 audit 3145794 drwxr-xr-x. 2 root root 4096 May 16 22:14 bash_completion.d 3145765 -rw-r--r--. 1 root root 2853 Oct 31 2018 bashrc 3146020 drwxr-xr-x. 2 root root 4096 Oct 31 2018 binfmt.d 3145851 -rw-r--r--. 1 root root 38 Nov 23 21:16 centos-release 第一列显示为inode number,你可以显示出各别的文件的inode number #ls -i /etc/bashrc 3145765 /etc/bashrc
这个信息非常有用,如果你的分区如果有很多非常小的文件,这会耗尽可用的inode空间但磁盘空间没有满。
#tune2fs -l /dev/sda1 | grep inode 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 Free inodes: 65202 First inode: 11 Journal inode: 8 Journal backup: inode blocks 目录的inode结构??如上所述,目录在linux中也是做一个文件来处理,目录是一个特别的文件,他是将文件名映射到inode number,也就目录条目或文件,当我们说目录包含文件或目录时,也就是说目录映射了这些目录和文件到它们的inode number,这也说明为什么一个目录中不能有两个相同的名字,因为它不能映射一个名子到两个不同的inode number. # ls -ld /data drwxr-xr-x. 7 root root 4096 May 18 16:26 /data 当一个文件映射到他的父目录时,那么它的最顶级目录(如/目录)如何的呢?/目录的inode number是固定的,永远是2 #stat / File: ‘/’ Size: 4096 Blocks: 8 IO Block: 4096 directory Device: 802h/2050d Inode: 2 Links: 20 Access: (0555/dr-xr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Context: system_u:object_r:root_t:s0 Access: 2019-05-19 16:13:40.569926753 +0800 Modify: 2019-05-16 23:03:45.731938337 +0800 Change: 2019-05-16 23:03:45.731938337 +0800 Birth: - #stat /boot File: ‘/boot’ Size: 4096 Blocks: 8 IO Block: 4096 directory Device: 801h/2049d Inode: 2 Links: 6 Access: (0555/dr-xr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Context: system_u:object_r:boot_t:s0 Access: 2019-05-19 15:50:37.520966086 +0800 Modify: 2019-05-16 22:17:31.300988303 +0800 Change: 2019-05-16 22:17:31.300988303 +0800 Birth: - 文件的链接??链接和index number,在权限和所有者之间的数字是链接数量,链接数是指链接到这个文件的硬链接数,链接分为两种类型,软链接和硬链接。
#ln -s /home/bobbin/sync.sh filesync 文件filesync是一个软链接到sync.sh文件,可以想像成一个快捷方式,便捷filesync文件就是编辑原始的文件,如果你移动或删除了原始文件,那么filesync文件将不会再可用。 #ls -l filesync lrwxrwxrwx 1 root root 20 Apr 7 06:08 filesync -> /home/bobbin/sync.sh 软链接的内容只是目标文件的名称,你可以看到软链接的权限完全打开的,因为权限不是它来管理的。 #ls -il /home/bobbin/sync.sh filesync 258674 lrwxrwxrwx 1 root root 20 Apr 7 06:08 filesync -> /home/bobbin/sync.sh 517333 -rw-r----- 1 root root 5 Apr 7 06:09 /home/bobbin/sync.sh 原始文件真接连接到inode,但软链接指向它的名字,软链接文件很小它是参考引用文件名的字节数,因为没有其它信息可用在软链接文件中。 但注意在软链接建立时如果引用的是相于路径,那么要参考软链接文件位置的相于路径,不是参考原始文件的相对路径,否则你可以使用绝对路径。 [[email?protected] data]#ln -s 1.sh test/test1/1link [[email?protected] data]#ll test/test1/1link lrwxrwxrwx. 1 root root 4 May 19 17:07 test/test1/1link -> 1.sh (会有红色闪烁表示不可用) 正确的方法是: [[email?protected] data]#ln -s ../../1.sh test/test1/2link [[email?protected] data]#ll test/test1/2link lrwxrwxrwx. 1 root root 10 May 19 17:11 test/test1/2link -> ../../1.sh
[[email?protected] data]# ls -l 1.sh -rwx------. 2 root root 0 May 18 15:53 1.sh [[email?protected] data]# ln 1.sh test/test1/1hard [[email?protected] data]# ll test/test1/1hard -rwx------. 2 root root 0 May 18 15:53 test/test1/1hard 让我们比较一下这两个文件: [[email?protected] data]# ll -il 1.sh test/test1/1hard 15 -rwx------. 2 root root 0 May 18 15:53 1.sh 15 -rwx------. 2 root root 0 May 18 15:53 test/test1/1hard 这两个文件没有什么区别,除了名字不一样,你也可以注意到硬链接和软链接不同,它不是一个特殊的文件,它们的inode number都是15,指向了同一个文件,并且可以看到链接数都为2,但硬链接有两个局性:
[[email?protected] data]# ln /boot/vmlinuz-3.10.0-957.el7.x86_64 /data/bootlinux ln: failed to create hard link ‘/data/bootlinux’ => ‘/boot/vmlinuz-3.10.0-957.el7.x86_64’: Invalid cross-device link 关于目录的链接数上面说了,目录不能做为硬链接,但同学们有没有注意到,当你列目录时,目录的链接数最小是2,有的大于2。 [[email?protected] data]# ll -id /data 2 drwxr-xr-x. 8 root root 4096 May 19 18:07 /data 因为在目录创建时本身下会自动创建有一个.和..的代表目录本身和上级目录,它的子文件夹下也会有你表目录本身和上级目录的.和..。 [[email?protected] data]# ls -al /data total 2344 drwxr-xr-x. 8 root root 4096 May 19 18:07 . dr-xr-xr-x. 20 root root 4096 May 16 23:03 .. 所以文件夹中有几个子文件夹那么它的硬链接的个数就是子文件夹数量+2,如/data目录的inode number是8,它下面就有6个子文件夹。 [[email?protected] data]# ls -ild /data 2 drwxr-xr-x. 8 root root 4096 May 19 18:07 /data [[email?protected] data]# ls -ild /data/*/ 1835009 drwxr-xr-x. 2 root root 4096 May 19 16:14 /data/aaaa/ 1703937 drwxr-xr-x. 3 root root 4096 May 18 14:54 /data/app/ 917505 drwxrwxr-x. 4 root root 4096 May 19 17:58 /data/test/ 3014657 drwxrws---. 2 root g1 4096 May 18 16:26 /data/testdir/ 1048577 drwxr-sr-x. 2 root root 4096 May 18 16:17 /data/testsgid/ 262145 drwxr-xr-t. 2 root root 4096 May 18 16:23 /data/teststicky/ 如何在linux中查找硬链接你可以检索所有的文件名指向的inode number,意思是你可以检索硬链接,因为它是指向相同内容(inode),你可以使用find带有-inum参数 [[email?protected] data]# find / -inum 15 /sys/fs/selinux/checkreqprot /sys/devices/platform/power /sys/kernel/debug/boot_params/data /data/1.sh /data/test/test1/1hard /boot/grub/splash.xpm.gz /lib64 注意你要分清文件系统,不是同一个文件系统的文件是完全不同的文件,虽然inode number相同。 linux中与inode相关的操作大多数的操作,如copy,执行影响实际链接的文件(但mv,rm将会删除或移动软链接本身)
[[email?protected] data]# cp test/test1/2link test [[email?protected] data]# ll -il 1.sh test/2link 15 -rwx------. 2 root root 0 May 18 15:53 1.sh 917513 -rwx------. 1 root root 0 May 19 17:47 test/2link 2link是1.sh的软链接文件,可见新的文件建立了自己的inode number
[[email?protected] data]# ls -il samlefile.txt 18 -rw-r--r--. 1 root root 0 May 19 17:58 samlefile.txt [[email?protected] data]# mv samlefile.txt test [[email?protected] data]# ls -il test/samlefile.txt 18 -rw-r--r--. 1 root root 0 May 19 17:58 test/samlefile.txt
[[email?protected] data]# ls -il samplefile.txt samplefile_hardlink.txt 21 -rw-r--r--. 2 root root 15 May 19 18:06 samplefile_hardlink.txt 21 -rw-r--r--. 2 root root 15 May 19 18:06 samplefile.txt [[email?protected] data]# rm samplefile_hardlink.txt [[email?protected] data]# ls -il samplefile.txt 21 -rw-r--r--. 1 root root 15 May 19 18:06 samplefile.txt 你可以看到inode number减少为1 结论??每一个linux文件都有一个inode, 并且inode包含文件的所有属性,但不是文件名称,软链接是指向原如文件的快捷方式,硬链接就像一个文件的复本,原文件和硬链接文件没什么不同,他们指定相同的inode. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |