1. 認識 EXT2 文件系統
1.1硬盤組成與分割的複習
1.2.文件系統特性
傳統的磁盤與文件系統之應用中,一個分割槽就是隻可以被格式化成爲一個文件系統,因此咱們能夠說一個 filesystem 就是一個 partition。可是因爲新技術的利用,例如咱們常聽到的LVM與軟件磁盤陣列(software raid), 這些技術能夠將一個分割槽格式化爲多個文件系統(例如LVM),也可以將多個分割槽合成一個文件系統(LVM, RAID)! 因此說,目前咱們在格式化時已經再也不說成針對 partition 來格式化了, 一般咱們能夠稱呼一個可被掛載的數據爲一個文件系統而不是一個分割槽喔!
較新的操做系統的文件數據除了文件實際內容外, 一般含有很是多的屬性,例如 Linux 操做系統的文件權限(rwx)與文件屬性(擁有者、羣組、時間參數等)。 文件系統一般會將這兩部份的數據分別存放在不一樣的區塊,權限與屬性放置到 inode 中,至於實際數據則放置到 data block 區塊中。 另外,還有一個超級區塊 (superblock) 會記錄整個文件系統的總體信息,包括 inode 與 block 的總量、使用量、剩餘量等。
每一個 inode 與 block 都有編號,至於這三個數據的意義能夠簡略說明以下:
- superblock:記錄此 filesystem 的總體信息,包括inode/block的總量、使用量、剩餘量, 以及文件系統的格式與相關信息等;
- inode:記錄文件的屬性,一個文件佔用一個inode,同時記錄此文件的數據所在的 block 號碼;
- block:實際記錄文件的內容,若文件太大時,會佔用多個 block
1.索引式文件系統(indexed allocation)
因爲每一個 inode 與 block 都有編號,而每一個文件都會佔用一個 inode ,inode 內則有文件數據放置的 block 號碼。 所以,咱們能夠知道的是,若是可以找到文件的 inode 的話,那麼天然就會知道這個文件所放置數據的 block 號碼, 固然也就可以讀出該文件的實際數據了。這是個比較有效率的做法,由於如此一來咱們的磁盤就可以在短期內讀取出所有的數據, 讀寫的效能比較好囉。
2.FAT
那有沒有其餘的慣用文件系統能夠比較一下啊? 有的,那就是咱們慣用的閃盤(閃存),閃盤使用的文件系統通常爲 FAT 格式。FAT 這種格式的文件系統並無 inode 存在,因此 FAT 沒有辦法將這個文件的全部 block 在一開始就讀取出來。每一個 block 號碼都記錄在前一個 block 當中, 他的讀取方式有點像底下這樣:
3.總結
經常會聽到所謂的『
碎片整理』吧? 須要碎片整理的緣由就是文件寫入的 block 太過於離散了,此時文件讀取的效能將會變的不好所致。 這個時候能夠透過碎片整理將同一個文件所屬的 blocks 彙整在一塊兒,這樣數據的讀取會比較容易啊! 想固然爾,FAT 的文件系統須要常常的碎片整理一下,那麼 Ext2 是否須要磁盤重整呢?
因爲 Ext2 是索引式文件系統,基本上不太須要經常進行碎片整理的。可是若是文件系統使用過久, 經常刪除/編輯/新增文件時,那麼仍是可能會形成文件數據太過於離散的問題,此時或許會須要進行重整一下的。 不過,老實說,鳥哥卻是沒有在 Linux 操做系統上面進行過 Ext2/Ext3 文件系統的碎片整理說!彷佛不太須要啦!^_^
1.3.Linux 的 EXT2 文件系統(inode):
1.data block (數據區塊)
data block 是用來放置文件內容數據地方,在 Ext2 文件系統中所支持的 block 大小有 1K, 2K 及 4K 三種而已
因爲 block 大小的差別,會致使該文件系統可以支持的最大磁盤容量與最大單一文件容量並不相同。 由於 block 大小而產生的 Ext2 文件系統限制以下
除此以外 Ext2 文件系統的 block 還有什麼限制呢?有的!基本限制以下:
- 原則上,block 的大小與數量在格式化完就不可以再改變了(除非從新格式化);
- 每一個 block 內最多隻可以放置一個文件的數據;
- 承上,若是文件大於 block 的大小,則一個文件會佔用多個 block 數量;
- 承上,若文件小於 block ,則該 block 的剩餘容量就不可以再被使用了(磁盤空間會浪費)。
既然大的 block 可能會產生較嚴重的磁盤容量浪費,那麼咱們是否就將 block 大小訂爲 1K 便可? 這也不妥,由於若是 block 較小的話,那麼大型文件將會佔用數量更多的 block ,而 inode 也要記錄更多的 block 號碼,此時將可能致使文件系統不良的讀寫效能。
2.inode table (inode 表格)
inode 記錄的文件數據至少有底下這些
- 該文件的存取模式(read/write/excute);
- 該文件的擁有者與羣組(owner/group);
- 該文件的容量;
- 該文件建立或狀態改變的時間(ctime);
- 最近一次的讀取時間(atime);
- 最近修改的時間(mtime);
- 定義文件特性的旗標(flag),如 SetUID...;
- 該文件真正內容的指向 (pointer);
inode 的數量與大小也是在格式化時就已經固定了,除此以外 inode 還有些什麼特點呢?
- 每一個 inode 大小均固定爲 128 bytes;
- 每一個文件都僅會佔用一個 inode 而已;
- 承上,所以文件系統可以建立的文件數量與 inode 的數量有關;
- 系統讀取文件時須要先找到 inode,並分析 inode 所記錄的權限與用戶是否符合,若符合纔可以開始實際讀取 block 的內容
咱們約略來分析一下 inode / block 與文件大小的關係好了。inode 要記錄的數據很是多,但恰恰又只有 128bytes 而已, 而 inode 記錄一個 block 號碼要花掉 4byte ,假設我一個文件有 400MB 且每一個 block 爲 4K 時, 那麼至少也要十萬筆 block 號碼的記錄呢!
inode 哪有這麼多可記錄的信息?爲此咱們的系統很聰明的將 inode 記錄 block 號碼的區域定義爲12個直接,一個間接, 一個雙間接與一個三間接記錄區。這是啥?咱們將 inode 的結構畫一下好了。
這樣子 inode 可以指定多少個 block 呢?咱們以較小的 1K block 來講明好了,能夠指定的狀況以下:
因爲是直接指向,因此總共可記錄 12 筆記錄,所以總額大小爲如上所示;
每筆 block 號碼的記錄會花去 4bytes,所以 1K 的大小可以記錄 256 筆記錄,所以一個間接能夠記錄的文件大小如上;
第一層 block 會指定 256 個第二層,每一個第二層能夠指定 256 個號碼,所以總額大小如上;
- 三間接: 256*256*256*1K=2563K
第一層 block 會指定 256 個第二層,每一個第二層能夠指定 256 個第三層,每一個第三層能夠指定 256 個號碼,所以總額大小如上;
- 總額:將直接、間接、雙間接、三間接加總,獲得 12 + 256 + 256*256 + 256*256*256 (K) = 16GB
此時咱們知道當文件系統將 block 格式化爲 1K 大小時,可以容納的最大文件爲 16GB,比較一下
文件系統限制表的結果可發現是一致的!
但這個方法不能用在 2K 及 4K block 大小的計算中, 由於大於 2K 的 block 將會受到 Ext2 文件系統自己的限制,因此計算的結果會不太符合之故。
3.Superblock (超級區塊)
Superblock 是記錄整個 filesystem 相關信息的地方, 沒有 Superblock ,就沒有這個 filesystem 了。他記錄的信息主要有:
- block 與 inode 的總量;
- 未使用與已使用的 inode / block 數量;
- block 與 inode 的大小 (block 爲 1, 2, 4K,inode 爲 128 bytes);
- filesystem 的掛載時間、最近一次寫入數據的時間、最近一次檢驗磁盤 (fsck) 的時間等文件系統的相關信息;
- 一個 valid bit 數值,若此文件系統已被掛載,則 valid bit 爲 0 ,若未被掛載,則 valid bit 爲 1 。
4.Filesystem Description (文件系統描述說明)
5.block bitmap (區塊對照表)
6.inode bitmap (inode 對照表)
7.dumpe2fs
1.4.與目錄樹的關係
由前一小節的介紹咱們知道在 Linux 系統下,每一個文件(無論是通常文件仍是目錄文件)都會佔用一個 inode , 且可依據文件內容的大小來分配多個 block 給該文件使用。而由
第六章的權限說明中咱們知道目錄的內容在記錄文件名, 通常文件纔是實際記錄數據內容的地方。那麼目錄與文件在 Ext2 文件系統當中是如何記錄數據的呢? 基本上能夠這樣說:
1.目錄
當咱們在 Linux 下的 ext2 文件系統建立一個目錄時,
ext2 會分配一個 inode 與至少一塊 block 給該目錄。其中,inode 記錄該目錄的相關權限與屬性,並可記錄分配到的那塊 block 號碼; 而 block 則是記錄在這個目錄下的文件名與該文件名佔用的 inode 號碼數據。
若是想要實際觀察 root 家目錄內的文件所佔用的 inode 號碼時,可使用 ls -i 這個選項來處理:
2.文件:
當咱們在 Linux 下的 ext2 建立一個通常文件時,
ext2 會分配一個 inode 與相對於該文件大小的 block 數量給該文件。例如:假設個人一個 block 爲 4 Kbytes ,而我要建立一個 100 KBytes 的文件,那麼 linux 將分配一個 inode 與 25 個 block 來儲存該文件! 但同時請注意,因爲 inode 僅有 12 個直接指向,所以還要多一個 block 來做爲區塊號碼的記錄喔!
3.目錄樹讀取:
通過上面的說明你也應該要很清楚的知道
inode 自己並不記錄文件名,文件名的記錄是在目錄的 block 當中。 所以在第六章文件與目錄的權限說明中, 咱們纔會提到『新增/刪除/改名文件名與目錄的 w 權限有關』的特點!那麼由於文件名是記錄在目錄的 block 當中, 所以當咱們要讀取某個文件時,就務必會通過目錄的 inode 與 block ,而後纔可以找到那個待讀取文件的 inode 號碼, 最終纔會讀到正確的文件的 block 內的數據。
因爲
目錄樹是由根目錄開始讀起,所以系統透過掛載的信息能夠找到掛載點的 inode 號碼(通常一個 filesystem 的最頂層 inode 號碼會由 2 號開始喔!),此時就可以獲得根目錄的 inode 內容,並依據該 inode 讀取根目錄的 block 內的文件名數據,再一層一層的往下讀到正確的檔名。
在鳥哥的系統上面與 /etc/passwd 有關的目錄與文件數據如上表所示,該文件的讀取流程爲(假設讀取者身份爲 vbird 這個通常身份使用者):
/ 的 inode: 透過掛載點的信息找到 /dev/hdc2 的 inode 號碼爲 2 的根目錄 inode,且 inode 規範的權限讓咱們能夠讀取該 block 的內容(有 r 與 x) ; / 的 block: 通過上個步驟取得 block 的號碼,並找到該內容有 etc/ 目錄的 inode 號碼 (1912545); etc/ 的 inode: 讀取 1912545 號 inode 得知 vbird 具備 r 與 x 的權限,所以能夠讀取 etc/ 的 block 內容; etc/ 的 block: 通過上個步驟取得 block 號碼,並找到該內容有 passwd 文件的 inode 號碼 (1914888); passwd 的 inode: 讀取 1914888 號 inode 得知 vbird 具備 r 的權限,所以能夠讀取 passwd 的 block 內容; passwd 的 block: 最後將該 block 內容的數據讀出來。 |
4.filesystem 大小與磁盤讀取效能:
1.4 EXT2/EXT3 文件的存取與日誌式文件系統的功能
上一小節談到的僅是讀取而已,那麼若是是新建一個文件或目錄時,咱們的 Ext2 是如何處理的呢? 這個時候就得要 block bitmap 及 inode bitmap 的幫忙了!假設咱們想要新增一個文件,此時文件系統的行爲是:
- 先肯定用戶對於欲新增文件的目錄是否具備 w 與 x 的權限,如有的話才能新增;
- 根據 inode bitmap 找到沒有使用的 inode 號碼,並將新文件的權限/屬性寫入;
- 根據 block bitmap 找到沒有使用中的 block 號碼,並將實際的數據寫入 block 中,且升級 inode 的 block 指向數據;
- 將剛剛寫入的 inode 與 block 數據同步升級 inode bitmap 與 block bitmap,並升級 superblock 的內容。
通常來講,咱們
將 inode table 與 data block 稱爲數據存放區域,至於其餘例如 superblock、 block bitmap 與 inode bitmap 等區段就被稱爲 metadata (中介數據) 囉,由於 superblock, inode bitmap 及 block bitmap 的數據是常常變更的,每次新增、移除、編輯時均可能會影響到這三個部分的數據,所以才被稱爲中介數據的啦
1.數據的不一致 (Inconsistent) 狀態
2.日誌式文件系統 (Journaling filesystem)
爲了不上述提到的文件系統不一致的狀況發生,所以咱們的前輩們想到一個方式, 若是在咱們的 filesystem 當中規劃出一個區塊,該區塊專門在記錄寫入或修訂文件時的步驟, 那不就能夠簡化一致性檢查的步驟了?也就是說:
- 預備:當系統要寫入一個文件時,會先在日誌記錄區塊中紀錄某個文件準備要寫入的信息;
- 實際寫入:開始寫入文件的權限與數據;開始升級 metadata 的數據;
- 結束:完成數據與 metadata 的升級後,在日誌記錄區塊當中完成該文件的紀錄
那麼咱們的
ext2 可達到這樣的功能嗎?固然能夠啊! 就透過 ext3 便可! ext3 是 ext2 的升級版本,而且可向下兼容 ext2 版本呢! 因此囉,目前咱們才建議你們,可以直接使用 ext3 這個 filesystem 啊! 若是你還記得 dumpe2fs 輸出的信息,能夠發現 superblock 裏面含有底下這樣的信息:
1.5Linux 文件系統的運行:
咱們如今知道了目錄樹與文件系統的關係了,可是由
第零章的內容咱們也知道, 全部的數據都得要加載到內存後 CPU 纔可以對該數據進行處理。想想,若是你經常編輯一個好大的文件, 在編輯的過程當中又頻繁的要系統來寫入到磁盤中,因爲磁盤寫入的速度要比內存慢不少, 所以你會經常耗在等待硬盤的寫入/讀取上。真沒效率!
咱們的 Linux 使用的方式是透過一個稱爲異步處理 (asynchronously) 的方式。所謂的異步處理是這樣的:
當系統加載一個文件到內存後,若是該文件沒有被更動過,則在內存區段的文件數據會被配置爲乾淨(clean)的。 但若是內存中的文件數據被更改過了(例如你用 nano 去編輯過這個文件),此時該內存中的數據會被配置爲髒的 (Dirty)。此時全部的動做都還在內存中運行,並無寫入到磁盤中! 系統會不定時的將內存中配置爲『Dirty』的數據寫回磁盤,以保持磁盤與內存數據的一致性。 你也能夠利用
第五章談到的 sync命令來手動強迫寫入磁盤。
所以咱們 Linux 系統上面文件系統與內存有很是大的關係喔:
- 系統會將經常使用的文件數據放置到主存儲器的緩衝區,以加速文件系統的讀/寫;
- 承上,所以 Linux 的物理內存最後都會被用光!這是正常的狀況!可加速系統效能;
- 你能夠手動使用 sync 來強迫內存中配置爲 Dirty 的文件回寫到磁盤中;
- 若正常關機時,關機命令會主動呼叫 sync 來將內存的數據回寫入磁盤內;
- 但若不正常關機(如跳電、死機或其餘不明緣由),因爲數據還沒有回寫到磁盤內, 所以從新啓動後可能會花不少時間在進行磁盤檢驗,甚至可能致使文件系統的損毀(非磁盤損毀)。
1.6掛載點的意義 (mount point):
每一個 filesystem 都有獨立的 inode / block / superblock 等信息,這個文件系統要可以連接到目錄樹才能被咱們使用。 將文件系統與目錄樹結合的動做咱們稱爲『掛載』。
重點是:掛載點必定是目錄,該目錄爲進入該文件系統的入口。 所以並非你有任何文件系統都能使用,必需要『掛載』到目錄樹的某個目錄後,纔可以使用該文件系統的。
舉例來講,若是你是依據鳥哥的方法安裝你的 CentOS 5.x 的話, 那麼應該會有三個掛載點纔是,分別是 /, /boot, /home 三個 (鳥哥的系統上對應的裝置文件名爲 /dev/hdc2, /dev/hdc1, /dev/hdc3)。 那若是觀察這三個目錄的 inode 號碼時,咱們能夠發現以下的狀況:
看到了吧!因爲 filesystem 最頂層的目錄之 inode 通常爲 2 號,所以能夠發現 /, /boot, /home 爲三個不一樣的 filesystem 囉! (由於每一行的文件屬性並不相同,且三個目錄的掛載點也均不相同之故。)
. 與 .. 是相同的東西, 由於權限是如出一轍嘛!若是使用文件系統的觀點來看,同一個 filesystem 的某個 inode 只會對應到一個文件內容而已(由於一個文件佔用一個 inode 之故), 所以咱們能夠透過判斷 inode 號碼來確認不一樣文件名是否爲相同的文件喔!因此能夠這樣看:
上面的信息中因爲掛載點均爲 / ,所以三個文件 (/, /., /..) 均在同一個 filesystem 內,而這三個文件的 inode 號碼均爲 2 號,所以這三個檔名都指向同一個 inode 號碼,固然這三個文件的內容也就徹底如出一轍了! 也就是說,根目錄的上一級 (/..) 就是他本身!這麼說,看的懂了嗎? ^_^
1.7其餘 Linux 支持的文件系統與 VFS
雖然 Linux 的標準文件系統是 ext2 ,且還有添加了日誌功能的 ext3 ,事實上,Linux 還有支持不少文件系統格式的, 尤爲是最近這幾年推出了好幾種速度很快的日誌式文件系統,包括 SGI 的 XFS 文件系統, 能夠適用更小型文件的 Reiserfs 文件系統,以及 Windows 的 FAT 文件系統等等, 都可以被 Linux 所支持喔!常見的支持文件系統有:
- 傳統文件系統:ext2 / minix / MS-DOS / FAT (用 vfat 模塊) / iso9660 (光盤)等等;
- 日誌式文件系統: ext3 / ReiserFS / Windows' NTFS / IBM's JFS / SGI's XFS
- 網絡文件系統: NFS / SMBFS
要知道你的 Linux 支持的文件系統有哪些,能夠察看底下這個目錄:
系統目前已加載到內存中支持的文件系統則有:
1.Linux VFS (Virtual Filesystem Switch)
其實,整個 Linux 的系統都是透過一個名爲 Virtual Filesystem Switch 的核心功能去讀取 filesystem 的。 也就是說,整個 Linux 認識的 filesystem 其實都是 VFS 在進行管理
假設你的 / 使用的是 /dev/hda1 ,用 ext3 ,而 /home 使用 /dev/hda2 ,用 reiserfs , 那麼你取用 /home/dmtsai/.bashrc 時,有特別指定要用的什麼文件系統的模塊來讀取嗎? 應該是沒有吧!這個就是 VFS 的功能啦!透過這個 VFS 的功能來管理全部的 filesystem, 省去咱們須要自行配置讀取文件系統的定義啊~方便不少!整個 VFS 能夠約略用下圖來講明:
2. 文件系統的簡單操做
2.1 磁盤與目錄的容量: df, du
如今咱們知道磁盤的總體數據是在 superblock 區塊中,可是每一個各別文件的容量則在 inode 當中記載的。 那在文字接口底下該如何叫出這幾個數據呢?底下就讓咱們來談一談這兩個命令:
- df:列出文件系統的總體磁盤使用量;
- du:評估文件系統的磁盤使用量(經常使用在推估目錄所佔容量)
df
先來講明一下範例一所輸出的結果信息爲:
- Filesystem:表明該文件系統是在哪一個 partition ,因此列出裝置名稱;
- 1k-blocks:說明底下的數字單位是 1KB 呦!可利用 -h 或 -m 來改變容量;
- Used:顧名思義,就是使用掉的硬盤空間啦!
- Available:也就是剩下的磁盤空間大小;
- Use%:就是磁盤的使用率啦!若是使用率高達 90% 以上時, 最好須要注意一下了,省得容量不足形成系統問題喔!(例如最容易被灌爆的 /var/spool/mail 這個放置郵件的磁盤)
- Mounted on:就是磁盤掛載的目錄所在啦!(掛載點啦!)
du
與 df 不同的是,du 這個命令其實會直接到文件系統內去搜尋全部的文件數據, 因此上述第三個範例命令的運行會運行一小段時間!此外,在默認的狀況下,容量的輸出是以 KB 來設計的, 若是你想要知道目錄佔了多少 MB ,那麼就使用 -m 這個參數便可囉!而, 若是你只想要知道該目錄佔了多少容量的話,使用 -s 就能夠啦!
至於 -S 這個選項部分,因爲 du 默認會將全部文件的大小均列出,所以假設你在 /etc 底下使用 du 時, 全部的文件大小,包括 /etc 底下的次目錄容量也會被計算一次。而後最終的容量 (/etc) 也會加總一次, 所以不少朋友都會誤會 du 分析的結果不太對勁。因此囉,若是想要列出某目錄下的所有數據, 或許也能夠加上 -S 的選項,減小次目錄的加總喔!
2.2 實體連接與符號連接: ln
在 Linux 底下的連結檔有兩種,
一種是相似 Windows 的快捷方式功能的文件,可讓你快速的連接到目標文件(或目錄); 另外一種則是透過文件系統的 inode 連結來產生新檔名,而不是產生新文件!這種稱爲實體連接 (hard link)。 這兩種玩意兒是徹底不同的東西呢!如今就分別來談談。
1.Hard Link (實體連接, 硬式連結或實際連結)
在前一小節當中,咱們知道幾件重要的信息,包括:
- 每一個文件都會佔用一個 inode ,文件內容由 inode 的記錄來指向;
- 想要讀取該文件,必需要通過目錄記錄的文件名來指向到正確的 inode 號碼才能讀取。
也就是說,其實文件名只與目錄有關,可是文件內容則與 inode 有關。那麼想想, 有沒有可能有多個檔名對應到同一個 inode 號碼呢?有的!那就是 hard link 的由來。 因此簡單的說:hard link 只是在某個目錄下新增一筆檔名連接到某 inode 號碼的關連記錄而已。
舉個例子來講,假設我係統有個 /root/crontab 他是 /etc/crontab 的實體連接,也就是說這兩個檔名連結到同一個 inode , 天然這兩個文件名的全部相關信息都會如出一轍(除了文件名以外)。實際的狀況能夠以下所示:
你能夠發現兩個檔名都連結到 1912701 這個 inode 號碼,因此您瞧瞧,是否文件的權限/屬性徹底同樣呢? 由於這兩個『檔名』實際上是如出一轍的『文件』啦!並且你也會發現第二個字段由原
本的 1 變成 2 了! 那個字段稱爲『連結』,這個字段的意義爲:『有多少個檔名連接到這個 inode 號碼』的意思。 若是將讀取到正確數據的方式畫成示意圖,就相似以下畫面:
上圖的意思是,你能夠透過 1 或 2 的目錄之 inode 指定的 block 找到兩個不一樣的檔名,而無論使用哪一個檔名都可以指到 real 那個 inode 去讀取到最終數據!那這樣有什麼好處呢?最大的好處就是『安全』!如同上圖中, 若是你將任何一個『檔名』刪除,其實 inode 與 block 都仍是存在的! 此時你能夠透過另外一個『檔名』來讀取到正確的文件數據喔!此外,不論你使用哪一個『檔名』來編輯, 最終的結果都會寫入到相同的 inode 與 block 中,所以均能進行數據的修改哩!
通常來講,使用 hard link 配置連接文件時,磁盤的空間與 inode 的數目都不會改變! 咱們仍是由圖 2.2.1 來看,由圖中能夠知道, hard link 只是在某個目錄下的 block 多寫入一個關連數據而已,既不會添加 inode 也不會耗用 block 數量哩!
由圖 2.2.1 其實咱們也可以知道,事實上 hard link 應該僅能在單一文件系統中進行的,應該是不可以跨文件系統纔對! 由於圖 2.2.1 就是在同一個 filesystem 上嘛!因此 hard link 是有限制的:
- 不能跨 Filesystem;
- 不能 link 目錄。
2.Symbolic Link (符號連接,亦便是快捷方式)
相對於 hard link , Symbolic link 可就好理解多了,基本上, Symbolic link 就是在建立一個獨立的文件,而這個文件會讓數據的讀取指向他 link 的那個文件的檔名!因爲只是利用文件來作爲指向的動做, 因此,當來源檔被刪除以後,symbolic link 的文件會『開不了』, 會一直說『沒法開啓某文件!』。實際上就是找不到原始『檔名』而已啦!
舉例來講,咱們先建立一個符號連接文件連接到 /etc/crontab 去看看:
由上表的結果咱們能夠知道兩個文件指向不一樣的 inode 號碼,固然就是兩個獨立的文件存在! 並且連結檔的重要內容就是他會寫上目標文件的『文件名』, 你能夠發現爲何上表中連結檔的大小爲 12 bytes 呢?
由於箭頭(-->)右邊的檔名『/etc/crontab』總共有 12 個英文,每一個英文佔用 1 個 byes ,因此文件大小就是 12bytes了!
關於上述的說明,咱們以以下圖示來解釋:
由 1 號 inode 讀取到連結檔的內容僅有檔名,根據檔名連接到正確的目錄去取得目標文件的 inode , 最終就可以讀取到正確的數據了。你能夠發現的是,若是目標文件(/etc/crontab)被刪除了,那麼整個環節就會沒法繼續進行下去, 因此就會發生沒法透過連結檔讀取的問題了!
這裏仍是得特別留意,這個 Symbolic Link 與 Windows 的快捷方式能夠給他劃上等號,由 Symbolic link 所建立的文件爲一個獨立的新的文件,因此會佔用掉 inode 與 block 喔!
ln
1.要注意囉!使用 ln 若是不加任何參數的話,那麼就是 Hard Link 囉!如同範例二的狀況,添加了 hard link 以後,能夠發現使用 ls -l 時,顯示的 link 那一欄屬性添加了!而若是這個時候砍掉 passwd 會發生什麼事情呢?passwd-hd 的內容仍是會跟原來 passwd 相同,可是 passwd-so 就會找不到該文件啦
2.而若是 ln 使用 -s 的參數時,就作成差很少是 Windows 底下的『快捷方式』的意思。當你修改 Linux 下的 symbolic link 文件時,則更動的實際上是『原始檔』, 因此不論你的這個原始檔被連結到哪裏去,只要你修改了連結檔,原始檔就跟着變囉! 以上面爲例,因爲你使用 -s 的參數建立一個名爲 passwd-so 的文件,則你修改 passwd-so 時,其內容與 passwd 徹底相同,而且,當你按下儲存以後,被改變的將是 passwd 這個文件!
2.3 關於目錄的 link 數量:
或許您已經發現了,那就是,當咱們以 hard link 進行『文件的連結』時,能夠發現,在 ls -l 所顯示的第二字段會添加一纔對,那麼請教,若是建立目錄時,他默認的 link 數量會是多少? 讓咱們來想想,一個『空目錄』裏面至少會存在些什麼?呵呵!就是存在 . 與 .. 這兩個目錄啊! 那麼,當咱們建立一個新目錄名稱爲 /tmp/testing 時,基本上會有三個東西,那就是:
- /tmp/testing
- /tmp/testing/.
- /tmp/testing/..
因此說,當咱們建立一個新的目錄時, 『新的目錄的 link 數爲 2 ,而上一級目錄的 link 數則會添加 1 』 不信的話,咱們來做個測試看看:
瞧!本來的所謂上一級目錄 /tmp 的 link 數量由 5 添加爲 6 ,至於新目錄 /tmp/testing 則爲 2 ,這樣能夠理解目錄的 link 數量的意義了嗎? ^_^
3. 磁盤的分割、格式化、檢驗與掛載
3.1 磁盤分區: fdisk, partprobe
3.2 磁盤格式化: mkfs, mke2fs
3.3 磁盤檢驗: fsck, badblocks
3.4 磁盤掛載與卸除: mount, umount
3.5 磁盤參數修訂: mknod, e2label, tune2fs, hdparm
4. 配置啓動掛載:
4.1 啓動掛載 /etc/fstab 及 /etc/mtab
4.2 特殊裝置 loop 掛載(映象檔不刻錄就掛載使用)
5. 內存置換空間(swap)之建置:
還記得在安裝 Linux 以前你們經常會告訴你的話吧!
就是安裝時必定須要的兩個 partition 囉! 一個是根目錄,另一個就是 swap(內存置換空間)。關於內存置換空間的解釋在第四章安裝 Linux 內的磁盤分區時有約略提過, swap 的功能就是在應付物理內存不足的狀況下所形成的內存延伸記錄的功能
通常來講,若是硬件的配備足夠的話,那麼 swap 應該不會被咱們的系統所使用到, swap 會被利用到的時刻一般就是物理內存不足的狀況了。從
第零章的計算器概論當中,咱們知道 CPU 所讀取的數據都來自於內存, 那當內存不足的時候,爲了讓後續的程序能夠順利的運行,所以在內存中暫不使用的程序與數據就會被挪到 swap 中了。 此時內存就會空出來給須要運行的程序加載。因爲
swap 是用硬盤來暫時放置內存中的信息, 因此用到 swap 時,你的主機硬盤燈就會開始閃個不停啊!
雖然目前(2009)主機的內存都很大,至少都有 1GB 以上囉!所以在我的使用上你不要配置 swap 應該也沒有什麼太大的問題。
不過服務器可就不這麼想了~因爲你不會知道什麼時候會有大量來自網絡的要求,所以你最好可以預留一些 swap 來緩衝一下系統的內存用量! 至少達到『備而不用』的地步啊!
如今想象一個狀況,你已經將系統建立起來了,此時卻纔發現你沒有建置 swap ~那該如何是好呢? 透過本章上面談到的方法,你可使用以下的方式來建立你的 swap 囉!
- 配置一個 swap partition
- 建立一個虛擬內存的文件
5.1 使用實體分割槽建置swap
5.2 使用文件建置swap
5.3 swap使用上的限制
6. 文件系統的特殊觀察與操做
6.1 boot sector 與 superblock 的關係
6.2 磁盤空間之浪費問題
咱們在前面的
block 介紹中談到了一個 block 只能放置一個文件, 所以太多小文件將會浪費很是多的磁盤容量。但你有沒有注意到,整個文件系統中包括 superblock, inode table 與其餘中介數據等其實都會浪費磁盤容量喔!因此當咱們在 /dev/hdc6 建立起 ext3 文件系統時, 一掛載就馬上有不少容量被用掉了!
另外,不知道你有沒有發現到,當你使用 ls -l 去查詢某個目錄下的數據時,第一行都會出現一個『total』的字樣! 那是啥東西?其實那就是該目錄下的全部數據所耗用的實際 block 數量 * block 大小的值。 咱們能夠透過 ll -s 來觀察看看上述的意義:
從上面的特殊字體部分,那就是每一個文件所使用掉 block 的容量!舉例來講,那個 crontab 雖然僅有 255bytes , 不過他卻佔用了兩個 block (每一個 block 爲 4K),將全部的 block 加總就獲得 104Kbytes 那個數值了。 若是計算每一個文件實際容量的加總結果,其實只有 56.5K 而已~因此囉,這樣就耗費掉好多容量了!
若是想要查詢某個目錄所耗用的全部容量時,那就使用
du 吧!不過 du 若是加上 -s 這個選項時, 還能夠依據不一樣的規範去找出文件系統所消耗的容量喔!舉例來講,咱們就來看看 /etc/ 這個目錄的容量狀態吧!
使用 bytes 去分析時,發現到實際的數據佔用約 103.3Mbytes,可是使用 block 去測試,就發現其實耗用了 118Mbytes, 此時文件系統就耗費了約 15Mbytes 囉!這樣看的懂咱們在講的數據了吧?
6.3 利用 GNU 的 parted 進行分割行爲
7. 重點回顧