歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux文件系統的簡單操作 - df,du,ln

Linux文件系統的簡單操作 - df,du,ln

日期:2017/2/28 13:59:24   编辑:Linux教程

現在我們知道磁盤的整體數據是在 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 』

Copyright © Linux教程網 All Rights Reserved