文件读取原理和文件删除原理

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,该文件才能彻底删除!

原文地址:https://www.cnblogs.com/zp751060301/p/12857185.html