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


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

  • 相关阅读:
    Cipherlab CPT9300手持扫描枪开发体验 [转]
    引用(ajaxfileupload.js) ajaxfileupload.js报jQuery.handleError is not a function错误解决方法
    C#锐利体验2.0:泛型编程
    Visual C#中调用Windows服务初探
    C#操作XML代码整理
    个人代码库のC#背景色渐变的功能
    ~~ C#数字时钟 ~~
    DevExpress随笔10.1.5的汉化与破解
    用C#获取局域网内所有机器
    C# 图片格式(JPG,BMP,PNG,GIF)等转换为ICO图标
  • 原文地址:https://www.cnblogs.com/zp751060301/p/12857185.html
Copyright © 2020-2023  润新知