一、问题描述
zabbix 收到一台服务器的Free inodes is less than 20% on volume / 高警
二、原因分析
产生这类告警,一般就是因为小文件比较多,占用大量的inode节点。如果inode占满,也会报 “no space left on device”。
登录服务器查看:
# df -i
三、处理方法
一般如果不是自己程序建立的文件比较多,就是/var/spool/postfix/maildrop目录下文件比较多。
此时如果直接ls -l ,很可能会直接卡死。
在确保数据安全的情况下,可以用如下命令删除这个目录下30天前的文件
# find /var/spool/postfix/maildrop -type f -mtime +30 | xargs rm -rf
如何想要查找出哪个目录下文件最多,可以执行如下命令:
# cd /# for i in /*; do echo $i; find $i |wc-l ;done --查找每个目录下面的文件数
/bin 1
/boot 323
/dev 378
/etc 2450
/home 8
/lib 1
/lib64 1
/media 1
/mnt 1
/opt 9
/oracle 50741
/oradata 2575
/proc 64529
/root 15
/run 566
/sbin 1
/srv 1
/sys 44366
/tmp 9
/usr 33599
/var 5049
然后看看哪个目录下面的文件比较多,可以删除一些没用的文件。
四、inode介绍
1.inode是什么?
理解inode,要从文件储存说起。
文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。
操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。
文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。
每个存储设备(例如硬盘)或存储设备的分区被格式化为文件系统后,应该有inode和Block,Block是用来存储数据用的。而inode呢,就是用来存储这些数据的信息,这些信息包括文件大小、属主、归属的用户组、读写权限等。inode为每个文件进行信息索引,所以就有了inode的数值。操作系统根据指令,能通过inode值最快的找到相对应的文件。
####2. inodes 里面存储了什么?
每个索引节点都存储对象数据的属性和对应的磁盘块位置。对象数据的属性包含元数据(上次更改的时间、访问、修改的时间)和所有者等。
说明如下:
- 文件的字节数
- 文件拥有者的User ID
- 文件的Group ID
- 文件的读、写、执行权限
- 文件的时间戳(共3个,ctime:inode上一次变动的时间,mtime:文件内容上一次变动的时间,atime:文件上一次打开的时间。)
- 链接数(即有多少文件名指向这个inode)
- 文件数据block的位置
总之,除了文件名以外的所有文件信息,都存在inode之中。至于为什么没有文件名,下文会有详细解释。
可以用stat命令,查看某个文件的inode信息:
# stat .bashrcFile: ‘.bashrc’Size: 176 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 201713342 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:admin_home_t:s0
Access: 2022-01-13 10:38:06.205845621 +0800
Modify: 2013-12-29 10:26:31.000000000 +0800
Change: 2021-11-09 18:57:20.618997178 +0800Birth: -
3.inodes 的大小取决于什么,一个磁盘的 inodes 是多大?
inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。
每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的1/8空间(12.5%)。
查看每个硬盘分区的inode总数和已经使用的数量,可以使用如下命令:
# df -iFilesystem Inodes IUsed IFree IUse% Mounted on
devtmpfs 2030365 376 2029989 1% /dev
tmpfs 2033357 1 2033356 1% /dev/shm
tmpfs 2033357 566 2032791 1% /run
tmpfs 2033357 16 2033341 1% /sys/fs/cgroup
/dev/mapper/rhel-root 52428800 89471 52339329 1% /
/dev/sda1 1048576 325 1048251 1% /boot
/dev/mapper/rhel-home 16777216 10 16777206 1% /home
tmpfs 2033357 1 2033356 1% /run/user/0
不难发现,磁盘容量会与inode数成正比。
注:
由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。
这时,就无法在硬盘上创建新文件。
会报磁盘空间已满的错误 No space left on device
4.inode号码
每个inode都有一个号码,操作系统用inode号码来识别不同的文件。
值得注意的是,Unix/linux系统内部不使用文件名,而是使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。
表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:1)系统找到这个文件名对应的inode号码;2)通过inode号码,获取inode信息;3)根据inode信息,找到文件数据所在的block,读出数据。
使用 ls -i 命令,可以看到文件名对应的 inode 号码:
# ls -i .bashrc201713342 .bashrc
5.目录文件
Unix/Linux系统中,目录(directory)也是一种文件,打开目录实际上就是打开目录文件。
目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项由两部分组成:1)所包含文件的文件名;2)该文件名对应的inode号码。
ls 命令只列出目录文件中的所有文件名:
# ls /etcadjtime DIR_COLORS gss logrotate.conf passwd- resolv.conf.save sudo.conf
aliases DIR_COLORS.256color host.conf logrotate.d pkcs11 rhsm sudoers
aliases.db DIR_COLORS.lightbgcolor hostname lvm pki rpc sudoers.d
alternatives dnf hosts machine-id plymouth rpm sudo-ldap.conf
anacrontab dracut.conf hosts.allow magic pm rsyslog.conf sysconfig
asound.conf dracut.conf.d hosts.deny makedumpfile.conf.sample polkit-1 rsyslog.d sysctl.conf
audisp e2fsck.conf init.d man_db.conf popt.d rwtab sysctl.d
audit environment inittab mke2fs.conf postfix rwtab.d systemd
bash_completion.d ethertypes inputrc modprobe.d ppp sasl2 system-release
bashrc exports iproute2 modules-load.d prelink.conf.d securetty system-release-cpe
binfmt.d favicon.png issue motd printcap security tcsd.conf
chkconfig.d filesystems issue.net mtab profile selinux terminfo
cron.d firewalld kdump.conf my.cnf profile.d services tmpfiles.d
cron.daily fstab kernel my.cnf.d protocols sestatus.conf tuned
cron.deny fuse.conf krb5.conf NetworkManager python shadow udev
cron.hourly gcrypt krb5.conf.d networks rc0.d shadow- vconsole.conf
cron.monthly glvnd kshrc nsswitch.conf rc1.d shells virc
crontab gnupg ld.so.cache nsswitch.conf.bak rc2.d skel vmware-tools
cron.weekly GREP_COLORS ld.so.conf odbcinst.ini rc3.d ssh wpa_supplicant
crypttab groff ld.so.conf.d openldap rc4.d ssl X11
csh.cshrc group libaudit.conf opt rc5.d statetab xdg
csh.login group- libnl oraInst.loc rc6.d statetab.d xinetd.d
dbus-1 grub2.cfg libuser.conf oratab rc.d subgid yum
default grub.d locale.conf os-release rc.local subgid- yum.conf
depmod.d gshadow localtime pam.d redhat-release subuid yum.repos.d
dhcp gshadow- login.defs passwd resolv.conf subuid-
ls -i 命令列出整个目录文件,即文件名和inode号码:
# ls -i /etc
134443061 adjtime 151185352 group 67284068 NetworkManager 201452390 sasl2
134320308 aliases 134415083 group- 134443063 networks 134320327 securetty
134916194 aliases.db 134348086 grub2.cfg 134442999 nsswitch.conf 270099 security
134327184 alternatives 201331521 grub.d 134327167 nsswitch.conf.bak 201458282 selinux
134443259 anacrontab 151185350 gshadow 134336276 odbcinst.ini 134320328 services
134413082 asound.conf 134415081 gshadow- 291083 openldap 134443168 sestatus.conf
201699895 audisp 201449904 gss 134320334 opt 151185357 shadow67568306 audit 134320317 host.conf 154704955 oraInst.loc 134415254 shadow-67108977 bash_completion.d 134320206 hostname 154704957 oratab 134320330 shells
134320309 bashrc 134320318 hosts 134320298 os-release 201331530 skel
134320329 binfmt.d 134320319 hosts.allow 270120 pam.d 134443046 ssh
201332980 chkconfig.d 134320320 hosts.deny 151185356 passwd 67199423 ssl
201547437 cron.d 134335451 init.d 134415252 passwd- 134415246 statetab
134413210 cron.daily 134443062 inittab 134335699 pkcs11 67284072 statetab.d
134459648 cron.deny 134320321 inputrc 417 pki 134914531 subgid
201547432 cron.hourly 134336030 iproute2 201645541 plymouth 144406280 subgid-300200 cron.monthly 134320296 issue 201331529 pm 144406279 subuid
134443258 crontab 134320297 issue.net 299964 polkit-1 144406278 subuid-67284200 cron.weekly 134628806 kdump.conf 1903 popt.d 134733348 sudo.conf
134320195 crypttab 67568500 kernel 201687830 postfix 134733349 sudoers
134320310 csh.cshrc 134347194 krb5.conf 201547347 ppp 201700232 sudoers.d
134320311 csh.login 67218243 krb5.conf.d 134327144 prelink.conf.d 134733347 sudo-ldap.conf
201547026 dbus-1 134336275 kshrc 134320324 printcap 426 sysconfig1136 default 151185364 ld.so.cache 144406273 profile 151173688 sysctl.conf67283732 depmod.d 134337236 ld.so.conf 420 profile.d 299669 sysctl.d384701 dhcp 67190527 ld.so.conf.d 134320326 protocols 67283774 systemd
134382822 DIR_COLORS 134335583 libaudit.conf 67218310 python 134320306 system-release
134347184 DIR_COLORS.256color 134335683 libnl 134335454 rc0.d 134320307 system-release-cpe
134382836 DIR_COLORS.lightbgcolor 134414540 libuser.conf 134335455 rc1.d 134914532 tcsd.conf385789 dnf 134320205 locale.conf 134335488 rc2.d 134327044 terminfo
134415125 dracut.conf 134320204 localtime 134335489 rc3.d 299670 tmpfiles.d
201458583 dracut.conf.d 134414869 login.defs 134335490 rc4.d 134628233 tuned
134733405 e2fsck.conf 134413212 logrotate.conf 134335491 rc5.d 67283813 udev
134320312 environment 284616 logrotate.d 134335492 rc6.d 134320198 vconsole.conf
134348138 ethertypes 67492796 lvm 1914 rc.d 134336029 virc
134320313 exports 134442992 machine-id 134415247 rc.local 201677544 vmware-tools
134413092 favicon.png 134335609 magic 134320305 redhat-release 134348090 wpa_supplicant
134320314 filesystems 134628807 makedumpfile.conf.sample 134320197 resolv.conf 134320333 X11385447 firewalld 134733210 man_db.conf 134916195 resolv.conf.save 67108979 xdg
134320194 fstab 134733406 mke2fs.conf 284377 rhsm 201331531 xinetd.d
134336080 fuse.conf 134415242 modprobe.d 134336458 rpc 67277725 yum67190687 gcrypt 201547028 modules-load.d 67108970 rpm 134414753 yum.conf
215364340 glvnd 134320322 motd 134628230 rsyslog.conf 134414754 yum.repos.d
134414578 gnupg 134320196 mtab 67283770 rsyslog.d
134335450 GREP_COLORS 134414826 my.cnf 134443064 rwtab2171 groff 67277739 my.cnf.d 201455948 rwtab.d
如果要查看文件的详细信息,就必须根据 inode 号码,访问 inode 节点,读取信息。ls -l 命令列出文件的详细信息:
# ls -l /etc
total 1072
-rw-r--r--. 1 root root 16 Nov 9 19:00 adjtime
-rw-r--r--. 1 root root 1518 Jun 7 2013 aliases
-rw-r--r--. 1 root root 12288 Nov 9 19:08 aliases.db
drwxr-xr-x. 2 root root 262 Nov 9 19:32 alternatives
-rw-------. 1 root root 541 Feb 14 2019 anacrontab
-rw-r--r--. 1 root root 55 Mar 11 2019 asound.conf
drwxr-x---. 3 root root 43 Nov 9 18:57 audisp
drwxr-x---. 3 root root 83 Nov 9 19:08 audit
drwxr-xr-x. 2 root root 166 Nov 9 18:57 bash_completion.d
-rw-r--r--. 1 root root 2853 Jun 21 2018 bashrc
drwxr-xr-x. 2 root root 26 Nov 9 19:32 binfmt.d
drwxr-xr-x. 2 root root 6 Jun 6 2017 chkconfig.d
drwxr-xr-x. 2 root root 36 Nov 9 19:32 cron.d
drwxr-xr-x. 2 root root 55 Nov 9 18:57 cron.daily
-rw-------. 1 root root 0 Feb 14 2019 cron.deny
drwxr-xr-x. 2 root root 22 Nov 9 18:56 cron.hourly
drwxr-xr-x. 2 root root 6 Dec 28 2013 cron.monthly
-rw-r--r--. 1 root root 451 Dec 28 2013 crontab
drwxr-xr-x. 2 root root 6 Dec 28 2013 cron.weekly
-rw-------. 1 root root 0 Nov 9 18:55 crypttab
-rw-r--r--. 1 root root 1620 Jun 21 2018 csh.cshrc
-rw-r--r--. 1 root root 866 Jun 21 2018 csh.login
drwxr-xr-x. 4 root root 78 Nov 9 18:56 dbus-1
drwxr-xr-x. 2 root root 44 Nov 9 19:33 default
drwxr-xr-x. 2 root root 23 Nov 9 18:56 depmod.d
drwxr-x---. 4 root root 53 Nov 9 18:56 dhcp
-rw-r--r--. 1 root root 5090 Mar 16 2019 DIR_COLORS
-rw-r--r--. 1 root root 5725 Mar 16 2019 DIR_COLORS.256color
-rw-r--r--. 1 root root 4669 Mar 16 2019 DIR_COLORS.lightbgcolor
drwxr-xr-x. 3 root root 21 Nov 9 18:57 dnf
-rw-r--r--. 1 root root 1285 Jun 19 2019 dracut.conf
drwxr-xr-x. 2 root root 6 Jun 19 2019 dracut.conf.d
-rw-r--r--. 1 root root 112 Jun 19 2019 e2fsck.conf
-rw-r--r--. 1 root root 0 Jun 21 2018 environment
-rw-r--r--. 1 root root 1317 Oct 26 2017 ethertypes
-rw-r--r--. 1 root root 0 Jun 7 2013 exports
lrwxrwxrwx. 1 root root 56 Nov 9 18:56 favicon.png -> /usr/share/icons/hicolor/16x16/apps/fedora-logo-icon.png
-rw-r--r--. 1 root root 70 Jun 21 2018 filesystems
drwxr-x---. 7 root root 133 Nov 9 18:57 firewalld
-rw-r--r--. 1 root root 541 Nov 9 18:55 fstab
-rw-r--r--. 1 root root 38 Jul 24 2018 fuse.conf
drwxr-xr-x. 2 root root 6 Feb 28 2017 gcrypt
drwxr-xr-x. 2 root root 6 Aug 28 2018 glvnd
drwxr-xr-x. 2 root root 6 Jun 21 2018 gnupg
-rw-r--r--. 1 root root 94 Mar 25 2017 GREP_COLORS
drwxr-xr-x. 4 root root 40 Nov 9 18:56 groff
-rw-r--r--. 1 root root 499 Nov 9 19:42 group
-rw-r--r--. 1 root root 489 Nov 9 19:36 group-
lrwxrwxrwx. 1 root root 22 Nov 9 18:57 grub2.cfg -> ../boot/grub2/grub.cfg
drwx------. 2 root root 182 Nov 9 18:57 grub.d
----------. 1 root root 395 Nov 9 19:42 gshadow
----------. 1 root root 387 Nov 9 19:36 gshadow-
drwxr-xr-x. 3 root root 20 Nov 9 18:56 gss
-rw-r--r--. 1 root root 9 Jun 7 2013 host.conf
-rw-r--r--. 1 root root 8 Nov 9 19:00 hostname
-rw-r--r--. 1 root root 158 Jun 7 2013 hosts
-rw-r--r--. 1 root root 370 Jun 7 2013 hosts.allow
-rw-r--r--. 1 root root 460 Jun 7 2013 hosts.deny
lrwxrwxrwx. 1 root root 11 Nov 9 18:56 init.d -> rc.d/init.d
-rw-r--r--. 1 root root 511 Mar 29 2019 inittab
-rw-r--r--. 1 root root 942 Jun 7 2013 inputrc
drwxr-xr-x. 2 root root 159 Nov 9 18:56 iproute2
-rw-r--r--. 1 root root 23 Jul 3 2019 issue
-rw-r--r--. 1 root root 22 Jul 3 2019 issue.net
-rw-r--r--. 1 root root 7274 Nov 9 18:57 kdump.conf
drwxr-xr-x. 3 root root 24 Nov 9 18:57 kernel
-rw-r--r--. 1 root root 641 Dec 19 2018 krb5.conf
drwxr-xr-x. 2 root root 6 Dec 19 2018 krb5.conf.d
-rw-r--r--. 1 root root 1128 Aug 31 2018 kshrc
-rw-r--r--. 1 root root 28902 Nov 9 19:42 ld.so.cache
-rw-r--r--. 1 root root 28 Feb 28 2013 ld.so.conf
drwxr-xr-x. 2 root root 106 Jul 12 2019 ld.so.conf.d
-rw-r-----. 1 root root 191 Mar 2 2019 libaudit.conf
drwxr-xr-x. 2 root root 35 Nov 9 18:56 libnl
-rw-r--r--. 1 root root 2391 Oct 13 2013 libuser.conf
-rw-r--r--. 1 root root 19 Nov 9 19:00 locale.conf
lrwxrwxrwx. 1 root root 35 Nov 9 19:00 localtime -> ../usr/share/zoneinfo/Asia/Shanghai
-rw-r--r--. 1 root root 2027 May 3 2019 login.defs
-rw-r--r--. 1 root root 662 Jul 31 2013 logrotate.conf
drwxr-xr-x. 2 root root 111 Nov 9 18:57 logrotate.d
drwxr-xr-x. 6 root root 100 Nov 9 18:57 lvm
-r--r--r--. 1 root root 33 Nov 9 18:56 machine-id
-rw-r--r--. 1 root root 111 Jun 6 2018 magic
-rw-r--r--. 1 root root 5122 Jun 22 2019 makedumpfile.conf.sample
-rw-r--r--. 1 root root 5171 Jul 10 2018 man_db.conf
-rw-r--r--. 1 root root 936 Jun 19 2019 mke2fs.conf
drwxr-xr-x. 2 root root 81 Nov 9 18:57 modprobe.d
drwxr-xr-x. 2 root root 6 Jun 19 2019 modules-load.d
-rw-r--r--. 1 root root 0 Jun 7 2013 motd
lrwxrwxrwx. 1 root root 17 Nov 9 18:55 mtab -> /proc/self/mounts
-rw-r--r--. 1 root root 570 May 14 2019 my.cnf
drwxr-xr-x. 2 root root 31 Nov 9 18:56 my.cnf.d
drwxr-xr-x. 7 root root 134 Nov 9 18:57 NetworkManager
-rw-r--r--. 1 root root 58 Mar 29 2019 networks
-rw-r--r--. 1 root root 1949 Nov 9 18:56 nsswitch.conf
-rw-r--r--. 1 root root 1938 Apr 30 2019 nsswitch.conf.bak
-rw-r--r--. 1 root root 577 Aug 7 2019 odbcinst.ini
drwxr-xr-x. 3 root root 36 Nov 9 18:56 openldap
drwxr-xr-x. 2 root root 6 Dec 15 2017 opt
-rw-r--r--. 1 root root 55 Nov 9 19:56 oraInst.loc
-rw-rw-r--. 1 oracle oinstall 786 Nov 9 19:56 oratab
-rw-r--r--. 1 root root 532 Jul 3 2019 os-release
drwxr-xr-x. 2 root root 4096 Nov 9 19:37 pam.d
-rw-r--r--. 1 root root 941 Nov 9 19:42 passwd
-rw-r--r--. 1 root root 841 Nov 9 19:36 passwd-
drwxr-xr-x. 3 root root 21 Nov 9 18:56 pkcs11
drwxr-xr-x. 14 root root 189 Nov 9 19:32 pki
drwxr-xr-x. 2 root root 28 Nov 9 18:57 plymouth
drwxr-xr-x. 5 root root 52 Nov 9 18:55 pm
drwxr-xr-x. 5 root root 72 Nov 9 18:56 polkit-1
drwxr-xr-x. 2 root root 6 Jan 27 2014 popt.d
drwxr-xr-x. 2 root root 154 Nov 9 18:57 postfix
drwxr-xr-x. 3 root root 123 Nov 9 18:56 ppp
drwxr-xr-x. 2 root root 78 Nov 9 18:56 prelink.conf.d
-rw-r--r--. 1 root root 233 Jun 7 2013 printcap
-rw-r--r--. 1 root root 1993 Nov 9 19:38 profile
drwxr-xr-x. 2 root root 251 Nov 9 18:56 profile.d
-rw-r--r--. 1 root root 6545 Jun 21 2018 protocols
drwxr-xr-x. 2 root root 35 Nov 9 18:56 python
lrwxrwxrwx. 1 root root 10 Nov 9 18:56 rc0.d -> rc.d/rc0.d
lrwxrwxrwx. 1 root root 10 Nov 9 18:56 rc1.d -> rc.d/rc1.d
lrwxrwxrwx. 1 root root 10 Nov 9 18:56 rc2.d -> rc.d/rc2.d
lrwxrwxrwx. 1 root root 10 Nov 9 18:56 rc3.d -> rc.d/rc3.d
lrwxrwxrwx. 1 root root 10 Nov 9 18:56 rc4.d -> rc.d/rc4.d
lrwxrwxrwx. 1 root root 10 Nov 9 18:56 rc5.d -> rc.d/rc5.d
lrwxrwxrwx. 1 root root 10 Nov 9 18:56 rc6.d -> rc.d/rc6.d
drwxr-xr-x. 10 root root 127 Nov 9 18:56 rc.d
lrwxrwxrwx. 1 root root 13 Nov 9 18:56 rc.local -> rc.d/rc.local
-rw-r--r--. 1 root root 52 Jul 3 2019 redhat-release
-rw-rw-r--. 1 root root 1 Jan 12 11:02 resolv.conf
-rw-rw-r--. 1 root root 1 Nov 9 19:08 resolv.conf.save
drwxr-xr-x. 6 root root 104 Nov 9 18:57 rhsm
-rw-r--r--. 1 root root 1634 Dec 25 2012 rpc
drwxr-xr-x. 2 root root 66 Nov 9 19:41 rpm
-rw-r--r--. 1 root root 3232 Apr 8 2019 rsyslog.conf
drwxr-xr-x. 2 root root 25 Apr 8 2019 rsyslog.d
-rw-r--r--. 1 root root 966 Mar 29 2019 rwtab
drwxr-xr-x. 2 root root 23 Mar 29 2019 rwtab.d
drwxr-xr-x. 2 root root 24 Nov 9 18:57 sasl2
-rw-------. 1 root root 221 Jun 21 2018 securetty
drwxr-xr-x. 6 root root 4096 Nov 9 19:37 security
drwxr-xr-x. 5 root root 81 Nov 9 18:57 selinux
-rw-r--r--. 1 root root 670293 Jun 7 2013 services
-rw-r--r--. 1 root root 216 Jun 25 2019 sestatus.conf
----------. 1 root root 707 Nov 9 19:42 shadow
----------. 1 root root 688 Nov 9 19:36 shadow-
-rw-r--r--. 1 root root 63 Nov 9 19:32 shells
drwxr-xr-x. 2 root root 76 Nov 9 19:32 skel
drwxr-xr-x. 2 root root 225 Nov 9 19:08 ssh
drwxr-xr-x. 2 root root 19 Nov 9 18:56 ssl
-rw-r--r--. 1 root root 212 Mar 29 2019 statetab
drwxr-xr-x. 2 root root 6 Mar 29 2019 statetab.d
-rw-r--r--. 1 root root 20 Nov 9 19:36 subgid
-rw-r--r--. 1 root root 0 Jun 21 2018 subgid-
-rw-r--r--. 1 root root 20 Nov 9 19:36 subuid
-rw-r--r--. 1 root root 0 Jun 21 2018 subuid-
-rw-r-----. 1 root root 1786 Mar 26 2019 sudo.conf
-r--r-----. 1 root root 4328 Mar 26 2019 sudoers
drwxr-x---. 2 root root 6 Mar 26 2019 sudoers.d
-rw-r-----. 1 root root 3181 Mar 26 2019 sudo-ldap.conf
drwxr-xr-x. 7 root root 4096 Nov 9 19:42 sysconfig
-rw-r--r--. 1 root root 776 Nov 16 15:40 sysctl.conf
drwxr-xr-x. 2 root root 28 Nov 9 18:56 sysctl.d
drwxr-xr-x. 4 root root 151 Nov 9 18:56 systemd
lrwxrwxrwx. 1 root root 14 Nov 9 18:55 system-release -> redhat-release
-rw-r--r--. 1 root root 45 Jul 3 2019 system-release-cpe
-rw-------. 1 tss tss 7046 May 27 2017 tcsd.conf
drwxr-xr-x. 2 root root 6 Aug 15 2017 terminfo
drwxr-xr-x. 2 root root 6 Jun 19 2019 tmpfiles.d
drwxr-xr-x. 3 root root 109 Nov 9 18:57 tuned
drwxr-xr-x. 3 root root 54 Nov 9 19:08 udev
-rw-r--r--. 1 root root 37 Nov 9 19:00 vconsole.conf
-rw-r--r--. 1 root root 1982 Jun 14 2019 virc
drwxr-xr-x. 5 root root 231 Nov 9 18:57 vmware-tools
drwxr-xr-x. 2 root root 33 Nov 9 18:57 wpa_supplicant
drwxr-xr-x. 6 root root 103 Nov 9 19:41 X11
drwxr-xr-x. 4 root root 38 Nov 9 18:56 xdg
drwxr-xr-x. 2 root root 6 Dec 15 2017 xinetd.d
drwxr-xr-x. 6 root root 100 Nov 9 18:56 yum
-rw-r--r--. 1 root root 813 May 17 2019 yum.conf
drwxr-xr-x. 2 root root 25 Nov 9 19:32 yum.repos.d
理解了上面这些知识后,我们继续深入解读目录文件的权限。
目录文件的权限有:读权限(r)、写权限(w)和执行权限(x)。
读权限(r)和写权限(w),都是针对目录文件本身(即不同用户能以什么权限访问操作该目录文件。
例如上面的查询显示不同用户对yum目录文件(首字符d表示directory,所以可以看出yum是目录文件)的访问访问权限为rwxr-xr-x。
- 第一组的三个字符(rwx),表示文件拥有者用户对该文件有读写权限;
- 第二组的三个字符(r-x),表示文件拥有者用户所在的用户组里的其他用户对该文件有读和执行权限;
- 第三组的三个字符(r-x),表示文件拥有者用户所在的用户组以外的用户对该文件有读和执行权限。
用户运行进程访问操作目录文件只能以该用户所具有的对该目录文件的权限进行操作。
由于目录文件内只有文件名和inode号码,所以如果只有读权限,只能获取文件名,无法获取其他信息,因为其他信息都储存在inode节点中,而读取inode节点内的信息需要目录文件的执行权限。
例如: drwxrwxr-- 2 user_a user_a
目录权限是774 ,所以除了user_a 用户及user_a所在组其他用户可以进入到此目录中,其他用户都不可以进入。
6.硬链接
一般情况下,文件名和inode号码是"一一对应"关系,即一个inode号码对应一个文件名。
但是,Unix/Linux系统中,允许多个文件名指向同一个inode号码。
这意味着,可以用不同的文件名访问同样的内容。这种情况就被称为"硬链接"(hard link)。
硬链接有如下特点:
- 对文件内容进行修改,会影响到所有文件名;
- 删除一个文件名,不影响另一个文件名的访问。
ln 命令可以创建硬链接:
# ln 源文件 目标文件
运行上面这条命令以后,源文件与目标文件的 inode 号码相同,都指向同一个 inode。inode 信息中有一项叫做"链接数",记录指向该 inode 的文件名总数,这时就会增加1。
反过来,删除一个文件名,就会使得 inode 节点中的"链接数"减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个 inode 号码以及其所对应 block 区域。
这里顺便说一下目录文件的"链接数"。 inode 信息中有一项叫做"链接数",记录指向该inode的文件名总数。
创建目录时,默认会生成两个目录项:".“和”…"。前者的 inode 号码就是当前目录的 inode 号码,等同于当前目录的"硬链接";后者的 inode 号码就是当前目录的父目录的 inode 号码,等同于父目录的"硬链接"。所以,任何一个目录的"硬链接"总数,总是等于2(某一目录的父目录名和该目录的当前目录名)加上它的子目录总数(含隐藏目录)。
7.软链接
除了硬链接以外,还有一种特殊情况。
文件 A 和文件 B 的 inode 号码虽然不一样,但是文件 A 的内容是文件 B 的路径。读取文件 A 时,系统会自动将访问者导向文件 B。因此,无论打开哪一个文件,最终读取的都是文件 B。这时,文件 A 就称为文件 B 的"软链接"(soft link)或者"符号链接"(symbolic link)。
这意味着,文件 A 依赖于文件 B 而存在,如果删除了文件 B,打开文件 A 就会报错:“No such file or directory”。这是软链接与硬链接最大的不同:文件 A 指向文件 B 的文件名,而不是文件 B 的 inode 号码,文件 B 的 inode "链接数"不会因此发生变化。
ln -s 命令可以创建软链接:
# ln -s 源文文件或目录 目标文件或目录
8.inode的特殊作用
由于 inode 号码与文件名分离,这种机制导致了一些 Unix/Linux 系统特有的现象。
-
有时,文件名包含特殊字符,无法正常删除。这时,直接删除 inode 节点,就能起到删除文件的作用。
-
移动文件或重命名文件,只是改变文件名,不影响 inode 号码。
-
打开一个文件以后,系统就以 inode 号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从 inode 号码得知文件名。
第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过 inode 号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的 inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的 inode 则被回收。
图片来源于网络
参考链接:
https://www.cnblogs.com/operationhome/p/12249415.html
https://www.cnblogs.com/wangyh702/p/11712651.html