1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        rm 刪除文件空間就釋放了嗎?

        共 2531字,需瀏覽 6分鐘

         ·

        2020-07-01 23:22

        580888f93fb7aabbe3d4f1a99a6c70ed.webpd37df26928c1325de87b588af270d639.webp


        點(diǎn)擊「閱讀原文」查看良許原創(chuàng)精品視頻。

        來(lái)自:編程珠璣

        在 Linux,你是不是曾經(jīng)天真的以為,使用rm刪除一個(gè)文件,占用的空間就釋放了?事情可能不是常常如人意。

        產(chǎn)生一個(gè)指定大小的隨機(jī)內(nèi)容文件

        我們先看一下當(dāng)前各個(gè)掛載目錄的空間大?。?/span>

        $?df?-h
        /dev/sda11??????454M??280M??147M??66%?/boot

        我這里挑選了其中一個(gè)結(jié)果展示(你可以選擇任一掛載目錄),接下來(lái)準(zhǔn)備在/boot下生成一個(gè)文件。

        首先我們產(chǎn)生一個(gè)50M大小的文件:

        $?dd?if=/dev/urandom?of=/boot/test.txt?bs=50M?count=1

        至此,我們產(chǎn)生了一個(gè)50M大小的文件,再看boot下:

        $?df?-h
        /dev/sda11??????454M??312M??115M??74%?/boot

        這里你不用關(guān)心到底多了多少,你只需要關(guān)注,/boot下的文件增多了。

        測(cè)試程序:

        #include
        #include
        int?main(void)
        {
        ????FILE?*fp?=?NULL;
        ????fp?=?fopen("/boot/test.txt",?"rw+");
        ????if(NULL?==?fp)
        ????{
        ???????perror("open?file?failed");
        ???????return?-1;
        ????}
        ????while(1)
        ????{
        ???????//do?nothing
        ???????sleep(1);
        ????}
        ????fclose(fp);
        ????return?0;
        }

        至于程序本身,也沒(méi)干啥實(shí)際的事情,就是打開(kāi)一個(gè)文件,然后一直循環(huán)。編譯并運(yùn)行:

        $?gcc?-o?openFile?openFile.c
        $?./openFile

        打開(kāi)另外一個(gè)窗口,刪掉test.txt:

        $?rm?/boot/test.txt

        再看一下boot空間:

        $?df?-h
        dev/sda11??????454M??312M??115M??74%?/boot

        咦?空間大小怎么一點(diǎn)都沒(méi)變?。∶髅魇褂胷m把它刪除了?。?/span>

        我們把openFile程序停掉,再看看:

        $$?df?-h
        /dev/sda11??????454M??280M??147M??66%?/boot

        乖乖,空間馬上就釋放掉了,也就是按照預(yù)期,我們的文件被刪除了。

        一個(gè)文件什么情況下才會(huì)被刪除?

        實(shí)際上,只有當(dāng)一個(gè)文件的引用計(jì)數(shù)為0(包括硬鏈接數(shù))的時(shí)候,才可能調(diào)用unlink刪除,只要它不是0,那么就不會(huì)被刪除。所謂的刪除,也不過(guò)是文件名到 inode 的鏈接刪除,只要不被重新寫(xiě)入新的數(shù)據(jù),磁盤(pán)上的block數(shù)據(jù)塊不會(huì)被刪除,因此,你會(huì)看到,即便刪庫(kù)跑路了,某些數(shù)據(jù)還是可以恢復(fù)的。換句話說(shuō),當(dāng)一個(gè)程序打開(kāi)一個(gè)文件的時(shí)候(獲取到文件描述符),它的引用計(jì)數(shù)會(huì)被+1,rm雖然看似刪除了文件,實(shí)際上只是會(huì)將引用計(jì)數(shù)減1,但由于引用計(jì)數(shù)不為0,因此文件不會(huì)被刪除。

        struct?inode?{
        struct?hlist_node???i_hash;?/*?hash鏈表的指針?*/
        struct?list_head????i_list;?/*?backing?dev?IO?list?*/
        struct?list_head????i_sb_list;?/*?超級(jí)塊的inode鏈表?*/
        struct?list_head????i_dentry;?/*?引用inode的目錄項(xiàng)對(duì)象鏈表頭?*/
        unsigned?long????i_ino;?/*?索引節(jié)點(diǎn)號(hào)?*/
        atomic_t?????????i_count;?/*?引用計(jì)數(shù)?*/
        unsigned?int?????i_nlink;?/*?硬鏈接數(shù)目?*/

        關(guān)于里面的細(xì)節(jié),還有很多內(nèi)容(如硬鏈接數(shù)量也會(huì)影響文件是否被刪除),這里不一一展開(kāi)。

        如何釋放已經(jīng)被刪除文件占用的空間?

        關(guān)于釋放,前面已經(jīng)說(shuō)了,重啟打開(kāi)該文件的進(jìn)程即可。但是有沒(méi)有方法找到哪些文件被刪除了,但還是被某些進(jìn)程打開(kāi)了呢?

        自然是有方法的:

        $?lsof?|grep?deleted

        其中被標(biāo)記為deleted的文件,就是這樣的一些文件。

        其實(shí)在前面的例子中,我們也可以很容易觀察到(openFile程序運(yùn)行,test.txt文件被刪除):

        $?ls?-al?/proc/`pidof?openFile`/fd
        total?0
        lrwx------?1?root?root?64?5月???4?09:27?0?->?/dev/pts/25
        lrwx------?1?root?root?64?5月???4?09:27?1?->?/dev/pts/25
        lrwx------?1?root?root?64?5月???4?09:27?2?->?/dev/pts/25
        lrwx------?1?root?root?64?5月???4?09:27?3?->?/boot/test.txt?(deleted)

        看見(jiàn)沒(méi)有,test.txt后面還有deleted字樣。

        既然我們都說(shuō)了,這樣的情況下文件是沒(méi)有被刪除的,那么還能不能恢復(fù)呢?實(shí)際上還是可以讀取的。

        總結(jié)

        實(shí)際上對(duì)于這種文件被刪除了,常常出現(xiàn)于程序的日志文件中,可能你有一個(gè)定時(shí)任務(wù)去清理程序產(chǎn)生的日志文件,但是如果程序本身忘記關(guān)閉句柄,就會(huì)導(dǎo)致磁盤(pán)空間得不到釋放,最終就是你認(rèn)為文件都被刪除了,但是磁盤(pán)卻依然被占著。所以,養(yǎng)成好習(xí)慣,打開(kāi)文件后,不用時(shí),記得關(guān)閉文件描述符。

        如果發(fā)現(xiàn)明明已經(jīng)刪除了大量文件,但是空間卻并沒(méi)有恢復(fù)正常,那么不妨看看是不是還有程序打開(kāi)了這些文件。

        - End -

        良許個(gè)人微信


        添加良許個(gè)人微信即送3套程序員必讀資料


        → 精選技術(shù)資料共享

        → 高手如云交流社群





        本公眾號(hào)全部博文已整理成一個(gè)目錄,請(qǐng)?jiān)诠娞?hào)里回復(fù)「m」獲??!

        推薦閱讀:

        10M/S!百度網(wǎng)盤(pán)偷偷更新,終于實(shí)現(xiàn)免費(fèi)不限速了!

        如何在Vim中更改顏色和主題

        張一鳴:我的大學(xué)四年收獲及工作感悟


        5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹(shù)莓派,等等。在公眾號(hào)內(nèi)回復(fù)「1024」,即可免費(fèi)獲?。?!


        瀏覽 40
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            午夜爱爱电影 | 午夜伦理中文字幕 | 色老久 | 欧美操逼逼| AV天天插 | 91久久国产最好的精华液 | 秘书啊灬啊别停灬啊灬快 | 同桌上课扣我下面好爽好舒服 | 青娱乐国产精品视频 | 美女视频免费一区二区 |