首頁 > 軟體

Linux檔案系統的簡單操作 - df,du,ln

2020-06-16 17:56:26

現在我們知道磁碟的整體資料是在 superblock 區塊中,但是每個各別檔案的容量則在 inode 當中記載的。 那在文字介面底下該如何叫出這幾個資料呢?底下就讓我們來談一談這兩個命令:

df:列出檔案系統的整體磁碟使用量;

du:評估檔案系統的磁碟使用量(常用在推估目錄所占容量)

df:列出檔案系統的整體磁碟使用量;

du:評估檔案系統的磁碟使用量(常用在推估目錄所占容量)

df

[root@www ~]# df [-ahikHTm] [目錄或檔名]

選項與引數:

-a  :列出所有的檔案系統,包括系統特有的 /proc 等檔案系統;

-k  :以 KBytes 的容量顯示各檔案系統;

-m  :以 MBytes 的容量顯示各檔案系統;

-h  :以人們較易閱讀的 GBytes, MBytes, KBytes 等格式自行顯示;

-H  :以 M=1000K 取代 M=1024K 的進位方式;

-T  :連同該 partition 的 filesystem 名稱 (例如 ext3) 也列出;

-i  :不用硬碟容量,而以 inode 的數量來顯示

範例一:將系統內所有的 filesystem 列出來!

[root@www ~]# df

Filesystem      1K-blocks      Used Available Use% Mounted on

/dev/hdc2        9920624  3823112  5585444  41% /

/dev/hdc3        4956316    141376  4559108  4% /home

/dev/hdc1          101086    11126    84741  12% /boot

tmpfs              371332        0    371332  0% /dev/shm

# 在 Linux 底下如果 df 沒有加任何選項,那麼預設會將系統內所有的

# (不含特殊記憶體內的檔案系統與 swap) 都以 1 Kbytes 的容量來列出來!

# 至於那個 /dev/shm 是與記憶體有關的掛載,先不要理他!

範例二:將容量結果以易讀的容量格式顯示出來

[root@www ~]# df -h

Filesystem            Size  Used Avail Use% Mounted on

/dev/hdc2            9.5G  3.7G  5.4G  41% /

/dev/hdc3            4.8G  139M  4.4G  4% /home

/dev/hdc1              99M  11M  83M  12% /boot

tmpfs                363M    0  363M  0% /dev/shm

# 不同於範例一,這裡會以 G/M 等容量格式顯示出來,比較容易看啦!

範例三:將系統內的所有特殊檔案格式及名稱都列出來

[root@www ~]# df -aT

Filesystem    Type 1K-blocks    Used Available Use% Mounted on

/dev/hdc2    ext3  9920624 3823112  5585444  41% /

proc          proc        0      0        0  -  /proc

sysfs        sysfs        0      0        0  -  /sys

devpts      devpts        0      0        0  -  /dev/pts

/dev/hdc3    ext3  4956316  141376  4559108  4% /home

/dev/hdc1    ext3    101086  11126    84741  12% /boot

tmpfs        tmpfs    371332      0    371332  0% /dev/shm

none  binfmt_misc        0      0        0  -  /proc/sys/fs/binfmt_misc

sunrpc  rpc_pipefs        0      0        0  -  /var/lib/nfs/rpc_pipefs

# 系統裡面其實還有很多特殊的檔案系統存在的。那些比較特殊的檔案系統幾乎

# 都是在記憶體當中,例如 /proc 這個掛載點。因此,這些特殊的檔案系統

# 都不會佔據硬碟空間喔! ^_^

範例四:將 /etc 底下的可用的磁碟容量以易讀的容量格式顯示

[root@www ~]# df -h /etc

Filesystem            Size  Used Avail Use% Mounted on

/dev/hdc2            9.5G  3.7G  5.4G  41% /

# 這個範例比較有趣一點啦,在 df 後面加上目錄或者是檔案時, df

# 會自動的分析該目錄或檔案所在的 partition ,並將該 partition 的容量顯示出來,

# 所以,您就可以知道某個目錄底下還有多少容量可以使用了! ^_^

範例五:將目前各個 partition 當中可用的 inode 數量列出

[root@www ~]# df -ih

Filesystem            Inodes  IUsed  IFree IUse% Mounted on

/dev/hdc2              2.5M    147K    2.3M    6% /

/dev/hdc3              1.3M      46    1.3M    1% /home

/dev/hdc1                26K      34    26K    1% /boot

tmpfs                    91K      1    91K    1% /dev/shm

# 這個範例則主要列出可用的 inode 剩餘量與總容量。分析一下與範例一的關係,

# 你可以清楚的發現到,通常 inode 的數量剩餘都比 block 還要多呢

先來說明一下範例一所輸出的結果資訊為:

Filesystem:代表該檔案系統是在哪個 partition ,所以列出裝置名稱;

1k-blocks:說明底下的數位單位是 1KB 呦!可利用 -h 或 -m 來改變容量;

Used:顧名思義,就是使用掉的硬碟空間啦!

Available:也就是剩下的磁碟空間大小;

Use%:就是磁碟的使用率啦!如果使用率高達 90% 以上時, 最好需要注意一下了,免得容量不足造成系統問題喔!(例如最容易被灌爆的 /var/spool/mail 這個放置郵件的磁碟)

Mounted on:就是磁碟掛載的目錄所在啦!(掛載點啦!)

由於 df 主要讀取的資料幾乎都是針對一整個檔案系統,因此讀取的範圍主要是在 Superblock 內的資訊, 所以這個命令顯示結果的速度非常的快速!在顯示的結果中你需要特別留意的是那個根目錄的剩餘容量! 因為我們所有的資料都是由根目錄衍生出來的,因此當根目錄的剩餘容量剩下 0 時,那你的 Linux 可能就問題很大了。

du

[root@www ~]# du [-ahskm] 檔案或目錄名稱

選項與引數:

-a  :列出所有的檔案與目錄容量,因為預設僅統計目錄底下的檔案量而已。

-h  :以人們較易讀的容量格式 (G/M) 顯示;

-s  :列出總量而已,而不列出每個各別的目錄占用容量;

-S  :不包括子目錄下的總計,與 -s 有點差別。

-k  :以 KBytes 列出容量顯示;

-m  :以 MBytes 列出容量顯示;

範例一:列出目前目錄下的所有檔案容量

[root@www ~]# du

8      ./test4

8      ./test2

....中間省略....

12      ./.gconfd

220    .

# 直接輸入 du 沒有加任何選項時,則 du 會分析『目前所在目錄』

# 的檔案與目錄所佔用的硬碟空間。但是,實際顯示時,僅會顯示目錄容量(不含檔案),

# 因此 . 目錄有很多檔案沒有被列出來,所以全部的目錄相加不會等於 . 的容量喔!

# 此外,輸出的數值資料為 1K 大小的容量單位。

範例二:同範例一,但是將檔案的容量也列出來

[root@www ~]# du -a

12      ./install.log.syslog

8      ./.bash_logout

8      ./test4

8      ./test2

....中間省略....

12      ./.gconfd

220    .

範例三:檢查根目錄底下每個目錄所佔用的容量

[root@www ~]# du -sm /*

7      /bin

6      /boot

.....中間省略....

0      /proc

.....中間省略....

1      /tmp

3859    /usr

77      /var

# 這是個很常被使用的功能~利用萬用字元 * 來代表每個目錄,

# 如果想要檢查某個目錄下,哪個次目錄佔用最大的容量,可以用這個方法找出來

# 值得注意的是,如果剛剛安裝好 Linux 時,那麼整個系統容量最大的應該是 /usr

# 而 /proc 雖然有列出容量,但是那個容量是在記憶體中,不占硬碟空間。

與 df 不一樣的是,du 這個命令其實會直接到檔案系統內去搜尋所有的檔案資料, 所以上述第三個範例命令的執行會執行一小段時間!此外,在預設的情況下,容量的輸出是以 KB 來設計的, 如果你想要知道目錄占了多少 MB ,那麼就使用 -m 這個引數即可囉!而, 如果你只想要知道該目錄占了多少容量的話,使用 -s 就可以啦!

至於 -S 這個選項部分,由於 du 預設會將所有檔案的大小均列出,因此假設你在 /etc 底下使用 du 時, 所有的檔案大小,包括 /etc 底下的次目錄容量也會被計算一次。然後最終的容量 (/etc) 也會加總一次, 因此很多朋友都會誤會 du 分析的結果不太對勁。所以囉,如果想要列出某目錄下的全部資料, 或許也可以加上 -S 的選項,減少次目錄的加總喔!

Hard Link (實體連結, 硬式連結或實際連結)

[root@www ~]# ln /etc/crontab .

[root@www ~]# ll -i /etc/crontab /root/crontab

1912701 -rw-r--r-- 2 root root 255 Jan  6  2007 /etc/crontab

1912701 -rw-r--r-- 2 root root 255 Jan  6  2007 /root/crontab

你可以發現兩個檔名都連結到 1912701 這個 inode 號碼,所以您瞧瞧,是否檔案的許可權/屬性完全一樣呢? 因為這兩個『檔名』其實是一模一樣的『檔案』啦!而且你也會發現第二個欄位由原本的 1 變成 2 了! 那個欄位稱為『連結』,這個欄位的意義為:『有多少個檔名連結到這個 inode 號碼』的意思。 如果將讀取到正確資料的方式畫成示意圖,就類似如下畫面:

上圖的意思是,你可以透過 1 或 2 的目錄之 inode 指定的 block 找到兩個不同的檔名,而不管使用哪個檔名均可以指到 real 那個 inode 去讀取到最終???據!那這樣有什麼好處呢?最大的好處就是『安全』!如同上圖中, 如果你將任何一個『檔名』刪除,其實 inode 與 block 都還是存在的! 此時你可以透過另一個『檔名』來讀取到正確的檔案資料喔!此外,不論你使用哪個『檔名』來編輯, 最終的結果都會寫入到相同的 inode 與 block 中,因此均能進行資料的修改哩!

hard link 是有限制的:

不能跨 Filesystem;

不能 link 目錄。

Symbolic Link (符號連結,亦即是快捷方式)

相對於 hard link , Symbolic link 可就好理解多了,基本上, Symbolic link 就是在建立一個獨立的檔案,而這個檔案會讓資料的讀取指向他 link 的那個檔案的檔名!由於只是利用檔案來做為指向的動作, 所以,當來源檔被刪除之後,symbolic link 的檔案會『開不了』, 會一直說『無法開啟某檔案!』。實際上就是找不到原始『檔名』而已啦!

舉例來說,我們先建立一個符號連結檔案連結到 /etc/crontab 去看看:

[root@www ~]# ln -s /etc/crontab crontab2

[root@www ~]# ll -i /etc/crontab /root/crontab2

1912701 -rw-r--r-- 2 root root 255 Jan  6  2007 /etc/crontab

654687 lrwxrwxrwx 1 root root  12 Oct 22 13:58 /root/crontab2 -> /etc/crontab

由上表的結果我們可以知道兩個檔案指向不同的 inode 號碼,當然就是兩個獨立的檔案存在! 而且連結檔的重要內容就是他會寫上目標檔案的『檔名』, 你可以發現為什麼上表中連結檔的大小為 12 bytes 呢? 因為箭頭(-->)右邊的檔名『/etc/crontab』總共有 12 個英文,每個英文占用 1 個 byes ,所以檔案大小就是 12bytes了!

關於上述的說明,我們以如下圖示來解釋:

由 1 號 inode 讀取到連結檔的內容僅有檔名,根據檔名連結到正確的目錄去取得目標檔案的 inode , 最終就能夠讀取到正確的資料了。你可以發現的是,如果目標檔案(/etc/crontab)被刪除了,那麼整個環節就會無法繼續進行下去, 所以就會發生無法透過連結檔讀取的問題了!

這裡還是得特別留意,這個 Symbolic Link 與 Windows 的快捷方式可以給他劃上等號,由 Symbolic link 所建立的檔案為一個獨立的新的檔案,所以會占用掉 inode 與 block 喔!

[root@www ~]# ln [-sf] 來原始檔 目標檔案

選項與引數:

-s  :如果不加任何引數就進行連結,那就是hard link,至於 -s 就是symbolic link

-f  :如果 目標檔案 存在時,就主動的將目標檔案直接移除後再建立!

範例一:將 /etc/passwd 複製到 /tmp 底下,並且觀察 inode 與 block

[root@www ~]# cd /tmp

[root@www tmp]# cp -a /etc/passwd .

[root@www tmp]# du -sb ; df -i .

18340  .

Filesystem            Inodes  IUsed  IFree IUse% Mounted on

/dev/hdc2            2560864  149738 2411126    6% /

# 利用 du 與 df 來檢查一下目前的引數~那個 du -sb

# 是計算整個 /tmp 底下有多少 bytes 的容量啦!

範例二:將 /tmp/passwd 製作 hard link 成為 passwd-hd 檔案,並觀察檔案與容量

[root@www tmp]# ln passwd passwd-hd

[root@www tmp]# du -sb ; df -i .

18340  .

Filesystem            Inodes  IUsed  IFree IUse% Mounted on

/dev/hdc2            2560864  149738 2411126    6% /

# 仔細看,即使多了一個檔案在 /tmp 底下,整個 inode 與 block 的容量並沒有改變!

[root@www tmp]# ls -il passwd*

586361 -rw-r--r-- 2 root root 1945 Sep 29 02:21 passwd

586361 -rw-r--r-- 2 root root 1945 Sep 29 02:21 passwd-hd

# 原來是指向同一個 inode 啊!這是個重點啊!另外,那個第二欄的連結數也會新增!

範例三:將 /tmp/passwd 建立一個符號連結

[root@www tmp]# ln -s passwd passwd-so

[root@www tmp]# ls -li passwd*

586361 -rw-r--r-- 2 root root 1945 Sep 29 02:21 passwd

586361 -rw-r--r-- 2 root root 1945 Sep 29 02:21 passwd-hd

586401 lrwxrwxrwx 1 root root    6 Oct 22 14:18 passwd-so -> passwd

# passwd-so 指向的 inode number 不同了!這是一個新的檔案~這個檔案的內容是指向

# passwd 的。passwd-so 的大小是 6bytes ,因為 passwd 共有六個字元之故

[root@www tmp]# du -sb ; df -i .

18346  .

Filesystem            Inodes  IUsed  IFree IUse% Mounted on

/dev/hdc2            2560864  149739 2411125    6% /

# 呼呼!整個容量與 inode 使用數都改變囉~確實如此啊!

範例四:刪除原始檔 passwd ,其他兩個檔案是否能夠開啟?

[root@www tmp]# rm passwd

[root@www tmp]# cat passwd-hd

......正常顯示完畢!

[root@www tmp]# cat passwd-so

cat: passwd-so: No such file or directory

[root@www tmp]# ll passwd*

-rw-r--r-- 1 root root 1945 Sep 29 02:21 passwd-hd

lrwxrwxrwx 1 root root    6 Oct 22 14:18 passwd-so -> passwd

# 怕了吧!符號連結果然無法開啟!另外,如果符號連結的目標檔案不存在,

# 其實檔名的部分就會有特殊的顏色顯示喔!

關於目錄的 link 數量:

或許您已經發現了,那就是,當我們以 hard link 進行『檔案的連結』時,可以發現,在 ls -l 所顯示的第二欄位會新增一才對,那麼請教,如果建立目錄時,他預設的 link 數量會是多少? 讓我們來想一想,一個『空目錄』裡面至少會存在些什麼?呵呵!就是存在 . 與 .. 這兩個目錄啊! 那麼,當我們建立一個新目錄名稱為 /tmp/testing 時,基本上會有三個東西,那就是:

/tmp/testing

/tmp/testing/.

/tmp/testing/..

而其中 /tmp/testing 與 /tmp/testing/. 其實是一樣的!都代表該目錄啊~而 /tmp/testing/.. 則代表 /tmp 這個目錄,所以說,當我們建立一個新的目錄時, 『新的目錄的 link 數為 2 ,而上一級目錄的 link 數則會新增 1 』

本文永久更新連結地址http://www.linuxidc.com/Linux/2015-08/121134.htm


IT145.com E-mail:sddin#qq.com