理解inode以及软硬连接,和inode磁盘爆满的解决方案以及文件权限
理解Linux的软硬链接
创建硬链接的命令
[root@centos6 data]#ln /data/f1 /data/f2 [root@centos6 data]#ll -i
total 16
13 -rw-r--r-- 2 root root 0 May 12 09:19 f1
13 -rw-r--r-- 2 root root 0 May 12 09:19 f2
上图我们可以看出硬链接有着相同的inode号,只是文件的名字不一样,因此硬链接有着以下几点特性:
1 文件的inode号相同,文件名不同
2 只能对已经存在的文件做硬链接
3 硬链接不能跨分区创建
4 每链接一次,它的链接数会加1
5 硬链接不能对目录进行操作,只可以对文件进行操作
6 删除一个硬链接文件,不会影响其他相同inode号的文件
创建软链接的命令
[root@centos6 tmp]#ln -sv /etc/fstab /data/fstab `/data/fstab' -> `/etc/fstab' [root@centos6 tmp]#ln -sv /etc/issue /data/issue `/data/issue' -> `/etc/issue' lrwxrwxrwx 1 root root 10 May 12 09:35 fstab -> /etc/fstab lrwxrwxrwx 1 root root 10 May 12 09:37 issue -> /etc/issue
上图我们可以看出软链接与硬链接有着根本的不同:
1 可以对目录和文件做软链接
2 可以跨文件系统
3 创建链接时,链接计数不会增加
4 删除链接并不影响被指定的文件,弱删除原文件,则软链接则不可用
inode
解决inode爆满问题
一般inode爆满情况就较为严重了,程序运维会有问题,会报磁盘无空间 No space left on device。所以做好监控非常重要。
线上服务器inode爆满但是磁盘空间还有很大是什么原因呢?其实就是小文件太多了,占用了所在磁盘的所有元数据空间,解决方案就是删除这么小文件或者mv 掉这些小文件
如何排查哪个目录占用inode多少了 可以用 df -i
如果删除 直接用 rm -rf xxx 基本是行不通的 会报 Argument list too long 问题,就是要删除的文件太多了。
我一般会用
find . -ctime +7 --iname "*" | xargs rm -rf {}
大概解释一下这个命令,删除当前目录下 7天前所有数据,如果还有 Argument list too long问题,就把时间适当调前一些,比如30天前 -ctime +30
或者如果你发现是og文件等等的一个大文件,并且它处于被进程打开的状态下,你直接删除后是释放不了空间的,你可以这样做
> FILE
这样做即使有进程正在打开,也会立即释放空间
inode 是什么?
我们都知道一个文件是由数据和元数据组成,文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文名叫“索引节点”
每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。
查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令。
[root@centos6 data]#df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda2 6406144 134099 6272045 3% / tmpfs 125377 4 125373 1% /dev/shm /dev/sda1 65536 38 65498 1% /boot /dev/sda3 3203072 15 3203057 1% /data /dev/sr0 0 0 0 - /media/CentOS_6.10_Final
由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。
会报磁盘空间已满的错误 No space left on device
/Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。
目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。
ls -i命令列出整个目录文件,即文件名和inode号码:
ls -i /etc
如果要查看文件的详细信息,就必须根据inode号码,访问inode节点,读取信息。ls -l命令列出文件的详细信息。
ls -l /etc
理解了上面这些知识,就能理解目录的权限
目录文件的读权限(r)和写权限(w),都是针对目录文件本身(即不同用户能以什么权限访问操作对该目录文件,例如这里不同用户对tmp目录文件(d可以查出tmp是目录文件,d表示directory,即目录)分别为rwxr-xr-x,第一组的三个字符,即rwx,表示文件拥有者用户的对该文件的读写权限,第二组的三个字符,即r-x,表示文件拥有者用户所在的用户组里的其他用户对该文件的读写权限,第三组的三个字符,即r-x,表示文件拥有者用户所在的用户组以外的用户对该文件的读写权限。一个某个用户下运行的进程访问操作该目录文件只能以该用户所具有的对该目录文件的权限进行操作)。由于目录文件内只有文件名和inode号码,所以如果只有读权限,只能获取文件名,无法获取其他信息,因为其他信息都储存在inode节点中,而读取inode节点内的信息需要目录文件的执行权限(x)。
例如 drwxrwxr-- 2 user_a user_a
目录权限是774 这样除了user_a 用户及user_a所在组用户可以进入到 此目录中,其他用户都不可以进入。