2021-05-12 14:32:11
Linux檔案系統的簡單操作 - df,du,ln
現在我們知道磁碟的整體資料是在 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
相關文章