Zabbix :Free inodes is less than 20% on volume / 告警分析

一、问题描述

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 .bashrc

File: ‘.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 +0800
 Birth: -
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 -i

Filesystem              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 .bashrc

201713342 .bashrc
5.目录文件

Unix/Linux系统中,目录(directory)也是一种文件,打开目录实际上就是打开目录文件。

目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项由两部分组成:1)所包含文件的文件名;2)该文件名对应的inode号码。

ls 命令只列出目录文件中的所有文件名:

# ls /etc

adjtime            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 shadow
 67568306 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 sysconfig
     1136 default                  151185364 ld.so.cache               144406273 profile            151173688 sysctl.conf
 67283732 depmod.d                 134337236 ld.so.conf                      420 profile.d             299669 sysctl.d
   384701 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.conf
   385789 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 X11
   385447 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 yum
 67190687 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 rwtab
     2171 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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值