1.系统中文件读取原理?
概念说明:
1.每个文件(普通文件或目录文件)都会占用一个inode
2.依据文件内容的大小分配一个或多个block使用
3.创建一个新文件时.生成一个新的inode,文件的属性信息放置在inode中.文件名放置在文件所在目录的block中.文件具体内容会放置在新生成的block中
4.文件名记录在目录的block中,(新增/删除/重命名)操作与目录的w权限有关
5.一切文件从根开始
文件读取流程:
1 /的inode
通过挂载点的信息找到inode号码为64的根目录inode.查看inode发现根目录权限为可读
2 /的block
通过根目录的inode表查找到根对应的block号码,从block中找到对应/etc及inode号码为33554497
3 /etc的inode
读取33554497inode号码取得/etc的权限可读可写,读取/etc block的内容
4 /etc的block
通过/etc目录的inode表查找到/etc对应的block号码,从block中找到对应文件passwd及inode号码为35239120
5 pass的inode
读取35239120inode号码取得passwd的权限可读,读取passwd block的内容
6 passwd的block
读取passwd block中内容
2.linux下文件删除的原理
注意:大多数服务在运行时,是不能删除对应的服务正在写入的日志文件.会删除不掉
1.linux下控制文件真正被删除的计数器
linux是通过link的数量来控制文件删除的.每个文件都有两个link计数器 i_link和i_count
i_link 介质连接的数量(硬链接的数量)
当创建文件的硬链接时,这个值会增加
i_count 当前文件使用者(或被调用)的数量
当一个文件被某一进程引用时,对应的这个值就会增加
真正删除一个文件,只有在文件未被进程调用的情况下,删除该文件的所有硬链接数即可
如果在进程调用时,通过rm 命令删除一个文件.是无法彻底删除的,该文件依然存在,只不过通过ls命令无法查看而已
2 删除文件时几种情况
01.文件被某个进程调用,rm删除文件(查看文件有没有被调用 losf | grep deleted )
rm 操作只是将i_link减少了,如果没有其他硬链接则i_link=0,但由于该文件仍被进程调用则i_count≠0,此时文件没有被删除,二调用进程仍会向文件中读取和写入内容,只是此时无法用ls查看文件,文件也没有被删除,
02.文件没有被调用,rm删除文件
rm操作减少了i_link,或者i_link=0 ,实际上会就是将inode的链接删除了,此时没有删除文件的block,如果系统没有任何操作,这个时候文件时可以被找回的,如果继续写入数据,则新数据会被分配到被删除数据的block中,则文件会被彻底清空
3真正删除一个文件
01.确保文件的硬链接数为0 i_link=0
02.确保文件没有被进程占用 i_count=0
4.实际遇到的问题
案例: 删除进程正在调用的/var/log/secure文件
[root@t-c6 ~]# ls /var/log/secure
/var/log/secure
[root@t-c6 ~]#
m -rf /var/log/secure
[root@t-c6 ~]# ls /var/log/secure
ls: 无法访问/var/log/secure: 没有那个文件或目录
通过命令lsof可以看到,该文件并未彻底删除,因为系统进程正在写入数据到该文件中,进程调用数不为零导致的!
[root@t-c6 ~]# lsof | grep deleted
rsyslogd 917 root 2w REG 252,1 5573745 41014 /var/log/secure (deleted)
如何解决该问题?
重启对应的服务
[root@t-c6 ~]# /etc/init.d/rsyslog restart
关闭系统日志记录器: [确定]
启动系统日志记录器: [确定]
将来有一天发现磁盘block满了,通过du -sh /* | grep G,并未发现太大的文件,可能是删除了不该删除的文件,导致文件大小一直增长,导致block满了,可通过 # lsof | grep deleted 查看
只有进程调用数为0并且硬链接数为0,该文件才能彻底删除!