iptables-linux(ls)-inode
Posted JasonXu徐晓峰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iptables-linux(ls)-inode相关的知识,希望对你有一定的参考价值。
Part1:iptables
环境:centos6.7
Part2:linux ls命令
当输出的内容超出一屏时,可以使用管道(|)结合more命令来实现分屏显示
1 ls | more
按enter键 是向上滚动一行
按空格键 是向上滚动一页
ls
命令选项 (非必选项)
-a 列出目录下所有文件,包含以.开头的隐藏文件
-A显示出.和..以外的所有文件
-d显示目录的自身属性,不显示目录下的文件(不是很清楚,只显示一个.)
-l列出目录和文件的详细信息
-h 和 -l参数合用,以人可读取的方式显示文件的大小,如4k,2M,3G,
-i 显示文件或者目录的inode信息,即索引信息
-t 按修改时间排序显示文件或者目录(时间由近及远排序)
-r 与其他参数一起使用,使之反向排序
--color=auto 让输出的内容按照类别显示颜色(grep中也有该参数)
part3:Linux索引节点inode
1.inode的简介
文件存储在硬盘上,硬盘的最小存储单位叫做"扇区"(sector).每个扇区存储512字节(相当于0.5kb)。
操作系统读取硬盘的时候不会一个一个扇区的读取,这样效率太低,而是一次性读取多个扇区,即一次性读取一个“块”(block)。这种由多个扇区组成的“块”,是文件存
储的最小单位。“块”的大小,最常见的是“4KB”,即连续的八个扇区(sector)组成一个block。
文件数据都存储在“块”中,那么显然,我们必须找到一个地方存储文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种存储文件元信息的区域就
叫做inode,中文译名“索引节点”。
2.inode的内容
inode包含文件的元信息,具体来说有以下内容:
*文件的字节数
*文件拥有者的User ID
*文件的Group ID
*文件的读写执行权限
*文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
*链接数,即有多少文件名指向这个inode
*文件数据block的位置
可以用stat命令,查看某个文件的inode的信息:
[[email protected]**** /]# stat bin
总之,除了文件名以外的所有文件信息,都存放在inode之中。
3.inode的大小
inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域,一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所
包含的信息。
每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或2KB就设置一个inode。
查看每个硬盘分区的inode的总数和已经使用的数量,可以使用df命令。
1 [root@izr**** ~]# df -i 2 Filesystem Inodes IUsed IFree IUse% Mounted on 3 /dev/xvda1 2621440 37659 2583781 2% / 4 tmpfs 240056 1 240055 1% /dev/shm
查看每个inode节点的大小,可以用一下的命令
1 [root@izr**** ~]# dumpe2fs -h /dev/xvda1 | grep "Inode size" 2 dumpe2fs 1.41.12 (17-May-2010) 3 Inode size: 256
由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还没存满的情况。这时,就无法在硬盘上存放新文件。
4.inode号码
没有inode都有一个号码,操作系统用inode号码来识别不同的文件。
这里值得重复一遍,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。
表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三部:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;
最后,根据inode信息,找到文件数据所在的block,读出数据。
使用ls -i 命令,可以看到文件名对应的inode号码:
1 [root@iZr**** /]# ls -i 2 1835009 bin 786433 home 1048577 media 131073 root 1 sys 3 1966081 boot 393217 lib 655361 mnt 1441793 sbin 2228225 tmp 4 4 dev 262145 lib64 917505 opt 524289 selinux 1310721 usr 5 2490369 etc 11 lost+found 1 proc 131076 srv 2097153 var
5.目录文件
Unix/Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。
目录文件的结构非常简单,就是一些列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。
ls命令只列出目录文件中的所有文件名:
1 [root@iZr**** ~]# ls / 2 bin dev home lib64 media opt root selinux sys usr 3 boot etc lib lost+found mnt proc sbin srv tmp var
ls -i命令列出整个目录文件,即文件名和inode号码:
1 [root@iZr**** ~]# ls -i / 2 1835009 bin 786433 home 1048577 media 131073 root 1 sys 3 1966081 boot 393217 lib 655361 mnt 1441793 sbin 2228225 tmp 4 4 dev 262145 lib64 917505 opt 524289 selinux 1310721 usr 5 2490369 etc 11 lost+found 1 proc 131076 srv 2097153 var
如果要查看文件的详细信息,就必须根据inode号码,访问inode节点,读取信息。ls -l命令列出文件的详细信息。
1 [root@iZr**** ~]# ls -l / 2 total 96 3 dr-xr-xr-x. 2 root root 4096 Jun 25 07:20 bin 4 dr-xr-xr-x. 4 root root 4096 Jun 25 07:16 boot 5 drwxr-xr-x 16 root root 3380 Oct 14 18:05 dev 6 drwxr-xr-x. 69 root root 4096 Oct 14 18:05 etc 7 drwxr-xr-x. 2 root root 4096 Sep 23 2011 home 8 dr-xr-xr-x. 9 root root 4096 Jun 25 07:20 lib 9 dr-xr-xr-x. 9 root root 12288 Jun 25 07:20 lib64 10 drwx------. 2 root root 16384 Jun 25 07:13 lost+found 11 drwxr-xr-x. 2 root root 4096 Sep 23 2011 media 12 drwxr-xr-x. 2 root root 4096 Sep 23 2011 mnt 13 drwxr-xr-x. 2 root root 4096 Sep 23 2011 opt 14 dr-xr-xr-x 93 root root 0 Oct 15 2017 proc 15 dr-xr-x---. 4 root root 4096 Jul 18 11:00 root 16 dr-xr-xr-x. 2 root root 12288 Jun 25 07:21 sbin 17 drwxr-xr-x. 2 root root 4096 Jun 25 07:13 selinux 18 drwxr-xr-x. 2 root root 4096 Sep 23 2011 srv 19 drwxr-xr-x 13 root root 0 Oct 15 2017 sys 20 drwxrwxrwt. 3 root root 4096 Oct 14 18:05 tmp 21 drwxr-xr-x. 13 root root 4096 Jun 25 07:13 usr 22 drwxr-xr-x. 18 root root 4096 Jun 25 07:19 var
6.硬链接
一般情况下,文件名和inode号码是“一一对应”关系,每个inode号码对应一个文件名。但是,Unix/Linux系统,允许多个文件名指向同一个inode号码。这意味着,可以
用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为“硬链接”(hard
link)
ln命名可以创建硬链接
1 [root@iZr**** init.d]# ln sshd sshdbak 2 [root@iZr**** init.d]# ls 3 aegis cloud-init-upgrade iscsi network saslauthd 4 agentwatch crond iscsid nscd single 5 atd ecs_mq-service killall ntpd sshd 6 auditd eni-service lvm2-lvmetad ntpdate sshdbak 7 blk-availability functions lvm2-monitor postfix sysstat 8 cloud-config halt mdmonitor rdisc udev-post 9 cloud-final ip6tables multipathd restorecond xinetd 10 cloud-init iptables netconsole rsyslog 11 cloud-init-local irqbalance netfs sandbox
注意:文件夹不能创建硬链接(hard link)
运行上面这条命令后,源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中有一项叫做“链接数”,记录指向该inode的文件名总数,这是就会增加1。
反过来,删除一个文件名,就会使得inode节点中的“链接数”减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block
区域
目录文件的“链接数”。创建目录时,默认会生成两个目录项:“.”和“..”。前者的inode号码就是当前目录的inode号码,等同于当前目录的“硬链接”;后者的inode号码就是
当前目录的父目录的inode号码,等同于父目录的“硬链接”。所以,任何一个目录的“硬链接”总数,总是等于2加上它的子目录总数(含隐藏目录),这里的2是本身自己的
“硬链接”和当前目录下的“.硬链接”。
7.软链接
除了硬链接以外,还有一种特殊情况。文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件的B。因
此,无论打开哪一个文件,最终读取的都是文件B。这是文件A就称为文件B的“软链接”(soft link)或者符号链接(symblic link)。
这就意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:“No such file or directory”。这是软链接与硬链接最大的不同:文件A指向文件B的文
件名,而不是文件B的inode号码,文件B的inode“链接数”不会因此发生改变。
ln -s 命令可以创建软链接
1 [root@iZr**** ~]# ln /etc/init.d/sshd sshdbak 2 [root@iZr**** ~]# ls 3 Finished Package Running sshdbak 4 [root@iZr**** ~]# stat sshdbak 5 File: `sshdbak‘ 6 Size: 4621 Blocks: 16 IO Block: 4096 regular file 7 Device: ca01h/51713d Inode: 2490875 Links: 2 8 Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) 9 Access: 2017-10-14 10:32:25.014202525 +0800 10 Modify: 2017-03-22 16:33:18.000000000 +0800 11 Change: 2017-10-14 23:09:46.819151064 +0800 12 [[email protected]**** ~]# stat /etc/init. 13 init.conf init.d/ 14 [[email protected]**** ~]# stat /etc/init.d/sshd 15 File: `/etc/init.d/sshd‘ 16 Size: 4621 Blocks: 16 IO Block: 4096 regular file 17 Device: ca01h/51713d Inode: 2490875 Links: 2 18 Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) 19 Access: 2017-10-14 10:32:25.014202525 +0800 20 Modify: 2017-03-22 16:33:18.000000000 +0800 21 Change: 2017-10-14 23:09:46.819151064 +0800 22 [root@iZr**** ~]# ln -s /etc/init.d/sshd sshdbakk 23 [root@iZr**** ~]# ls 24 Finished Package Running sshdbak sshdbakk 25 [root@iZr**** ~]# stat sshdbakk 26 File: `sshdbakk‘ -> `/etc/init.d/sshd‘ 27 Size: 16 Blocks: 0 IO Block: 4096 symbolic link 28 Device: ca01h/51713d Inode: 131097 Links: 1 29 Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root) 30 Access: 2017-10-14 23:11:26.788314281 +0800 31 Modify: 2017-10-14 23:11:24.983275362 +0800 32 Change: 2017-10-14 23:11:24.983275362 +0800
8.inode的特殊作用
由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。
1.有时,文件名包含特殊的字符,无法正常删除。这是直接删除inode节点,就能起到删除文件的作用。
2.移动文件或者重命名文件,只是改变文件名,不影响inode号码
3.打开一个文件以后,系统就以inode号码来识别这个文件,不在考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。
第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版的
文件以同样的文件名,生成一个新的inode,不会影响的运行中的文件,等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。
9.实际问题
在一台配置较低的Linux服务器(内存、硬盘比较小)的/data分区内创建文件时,系统提示磁盘空间不足,用df -h命令查看了一下磁盘使用情况,发现/data分区只使用
了66%,还有12G的剩余空间,按理说不会出现这种问题。 后来用df -i查看了一下/data分区的索引节点(inode),发现已经用满(IUsed=100%),导致系统无法创建新目录和
文件。
查找原因:
/data/cache目录中存在数量非常多的小字节缓存文件,占用的Block不多,但是占用了大量的inode。
解决方案:
1.删除/data/cache目录中的部分文件,释放出/data分区的一部分inode。
2.用软连接将空闲分区/opt中的newcache目录连接到/data/cache,使用/opt分区的inode来缓解/data分区inode不足的问题:
1 [root@izp**** /]# ln -s /opt/newcache /data/cache
就是/data/cache的内容是指向/opt/newcache的路径。
以上是关于iptables-linux(ls)-inode的主要内容,如果未能解决你的问题,请参考以下文章