第 21 章 檔案系統與權限設定 著作權所有 © 旗標出版股份有限公司
前言 - 檔案系統 當所有人都把目光投注在作業系統身上時, 卻常常忘記了一個極為重要的配角 - 檔案系統 檔案系統的優劣與否, 和作業系統的執行效率、穩定性以及可靠度息息相關
本章提要 認識系統的目錄 檔案系統的結構 設定目錄與檔案使用權限 使用者與群組的權限關係 連結與符號連結
認識系統的目錄 在安裝 Linux 的磁碟中會有許多系統預設的目錄, 這些目錄依照不同的用途而放置特定的檔案:
認識系統的目錄
認識系統的目錄
認識系統的目錄
認識系統的目錄
認識系統的目錄
認識系統的目錄
檔案系統的結構 Fedora Core 預設採用 ext3 檔案系統 ext3 是 ext2 的下一代 ext3 與 ext2 的相異處在於 ext3 是一個日誌式檔案系統 (Journal File System) 也就是在原來的 ext2 的格式下, 再加上日誌功能
檔案系統的結構 ext3 的優點 ext3 使用的 inode 檔案結構 實際儲存檔案的資料區塊 inode 的數量 inode 的內容
ext3 的優點 日誌式檔案系統最大的優點在於提供了更好的安全性 ext3 檔案系統會將整個磁碟所做過的更動, 像寫日記一樣完整的記錄下來 一旦發生非預期的當機狀況, 會在下次啟動時, 自動檢查已記錄的日誌,然後依照日誌記錄的動作再做一次,將系統恢復到當機前的正常狀態
ext3 的優點 若非預期的當機狀況發生在 ext2 檔案系統時, 便需要辛苦地執行 fsck 指令檢查與修復整個檔案系統 現在動輒數十 GB 的磁碟空間, 一旦不正常關機, 便要耗費相當多的時間來檢查及修復檔案系統, 且不能百分之百保證所有的資料都不會流失
ext3 的優點 可讓資料更具安全性 可大幅減少不正常關機後所花費的系統修復時間, 讓資料的使用更有效率 ext3 與 ext2的轉換十分容易, 使用者不必經歷繁瑣的資料備份動作, 便可以將 ext2 更新為 ext3 (由於其與 ext2 的架構完全相同, 唯一的相異處僅在於多出一個日誌檔案來記錄磁碟的狀態)
如何將 ext2 轉換為 ext3? 在 ext3 檔案系統問世之前, 許多 Linux 發行版都採用 ext2 做為預設的檔案系統 (或者支援此檔案系統) 在安裝此 Linux 發行版時, 當然也可以選擇使用 ext2 檔案系統
如何將 ext2 轉換為 ext3? 若硬碟中的某個分割區原本是使用 ext2 檔案系統, 現在想將其改為 ext3, 可使用 tune2fs -j 指令 tune2fs -j 指令可以為檔案系統是 ext2 的分割區建立日誌, 不需要重新格式化, 就能讓舊硬碟使用新的檔案系統
如何將 ext2 轉換為 ext3? 若要將 /dev/hda3 的檔案系統由 ext2 轉換為 ext3, 可如下操作 :
如何將 ext2 轉換為 ext3? 建立日誌之後, 請修改 /etc/fstab 檔:
ext3 使用的 inode 檔案結構 ext3 與 ext2 檔案系統所使用的檔案結構相同, 稱為 inode (index node) 檔案的類型 檔案的大小 檔案的權限 檔案的擁有者 檔案連結的數目 以及指向資料區塊 (block) 的指標 (pointer)
ext3 使用的 inode 檔案結構
ext3 使用的 inode 檔案結構 inode 中存放的指標, 會指到磁碟中實際存放檔案資料的區塊 小的檔案僅需用到 direct blocks 的空間 若再大則會用到 indirect blocks、double indirect blocks 或 triple indirect blocks
實際儲存檔案的資料區塊 ext3 檔案結構中的 inode 記錄檔案屬性, 並不實際儲存檔案資料 存放檔案資料的地方, 是資料區塊
實際儲存檔案的資料區塊 先來看看資料區塊的數量如何決定: 每個分割區中的資料區塊數量, 可以藉由以下公式算出: 建立 ext3 檔案系統時, 使用者可以自行決定每個資料區塊的大小是 1024、2048 或 4096 Bytes 若沒有指定, 則系統預設值為 4096 Bytes 每個分割區中的資料區塊數量, 可以藉由以下公式算出:
實際儲存檔案的資料區塊 只要將硬碟分割區中的資料區塊數量乘上大小, 也可以反推得知該分割區的容量 可以使用 dumpe2fs 指令來查看硬碟分割區中有多少資料區塊:
實際儲存檔案的資料區塊 接著檢視 dumpe2fs.txt 可以得知以下資訊:
實際儲存檔案的資料區塊 因此可以用以下算式算出該分割區的大小:
inode 的數量 inode 的數量與資料區塊的數量相關, 不過兩者間的消長, 並沒有等比例的對應關係 比如有一個大小為 50 KB 的檔案, 儲存在資料區塊大小為 4 KB 的分割區內, 便會佔用 13 個資料區塊, 卻僅用掉 1 個 inode 當然也有比較特殊的狀況, 像是 /proc 目錄, 因為其中的檔案實際上都不存在, 所以並沒有消耗資料區塊, 但是卻佔用 inode
inode 的數量 假設某分割區的磁碟空間被 1000 個大型檔案塞滿, 全部的資料區塊都用完了, 雖然這些檔案只佔用了 1000 個 inodes, 此時即使還有可以使用的 inode, 也無法再儲存其他的檔案 換個方向來看, 若先把 inode 用完 (理論上可以, 實際上若正確規劃, 很難發生), 就算還有很多資料區塊尚未使用, 也會因為 inode 耗盡而無法再存放其他檔案
inode 的數量 在最初建立檔案系統時, 就應依據將來系統運作時, 檔案資料可能的儲存狀況, 來決定資料區塊的大小及 inode 的數量 以比較特殊的 BBS 為例 BBS 網站中的文章數量眾多, 但每篇文章所佔空間都不大 所以用來儲存資料的分割區, 便應採用較小的資料區塊, 以增加資料區塊的數量 inode 的數量則可以設定成與資料區塊的數量相同
inode 的數量 如果不知道該如何指定 inode 的數量, 只要系統並沒有特殊的用途, 在不指定的狀況下, 系統會自動根據資料區塊數量, 建立一般狀況下適用的 inode 數量 資料區塊大小及 inode 數量可以在執行 mke2fs 指令, 建立檔案系統時指定
inode 的數量 執行 df -i 指令可觀察 inode 的數量:
inode 的數量 執行 df 指令可得知各個分割區的大小、使用率及剩餘空間等資訊 若想得知每個目錄佔用磁碟空間的資訊, 則請執行 du 指令
inode 的內容 node 裡面記錄了一些資訊, 包括檔案的權限、使用者識別碼、群組識別碼與檔案的大小等等 檔案模式 (mode) : 這些資料可以是一個檔案、目錄、符號連結 (symbolic link) 或周邊設備代號 (包括儲存設備的分割區編號) 等 此外還有關於權限設定的資訊, 這在多人多工的作業系統中是極為重要的環節
inode 的內容 擁有者資訊 (owner information): 檔案大小 (size): 時間戳記 (timestamp): 檔案或目錄擁有者的 UID 與 GID 這些資訊和權限設定息息相關 檔案大小 (size): 單位以 byte 計算 時間戳記 (timestamp): inode 對應之資料的最初建立時間與最後修改時間
inode 的內容 資料區塊位址 (address of data block): 存放檔案必定會佔用資料區塊, 且每個資料區塊都有其存在的位址 如果 inode 所對應的資料為實體檔案, 而非虛擬檔案 (如 /proc 目錄內的檔案), 則 inode 會指出這些位址, 讓系統得以順利找到檔案並使用它 一個 inode 能夠指向 12 個資料區塊, 如果 12 個資料區塊還放不下這個檔案, 它就會啟用間接指向指標 (indirect pointer), 透過另一個資料區塊指向更多的資料區塊, 以便容納大型檔案
設定目錄與檔案使用權限 ext3 檔案系統中的目錄及檔案, 可依實際需要來設定讀取、寫入與執行等權限:
設定目錄與檔案使用權限 權限的意義 改變權限 改變擁有權
權限的意義 執行 ls -l 或 ls -al 指令時, 第一欄共 10 個字元用來標示該檔案的屬性及權限:
權限的意義 除了第一個字元標明檔案的屬性外 每個檔案的權限, 都可以分別對該檔案的擁有者、同群組的使用者, 以及其他使用者這 3 種類別的人加以設定 以下便來仔細看看, 這些屬性及權限設定字元所代表的意義為何
權限的意義 檔案屬性 一般權限 特殊權限
檔案屬性 10 個字元中的第 1 個字元, 用於標示檔案屬性:
一般權限 第 2~10 字元當中每 3 個為一組, 分別標示不同使用者的權限: r (Read, 讀取): 對檔案而言, 使用者具有讀取檔案內容的權限 對目錄而言, 使用者擁有瀏覽目錄內容的權限 (但不一定可以讀取該目錄下的檔案, 是否可讀取, 仍取決於要讀取 "檔案" 的 "r" 讀取權限)
一般權限 w (Write, 寫入): x (eXecute, 執行): -: 對檔案而言, 使用者有修改檔案內容的權限 對目錄而言, 使用者具有刪除、或移動目錄內檔案的權限 x (eXecute, 執行): 對檔案而言, 使用者具有執行檔案的權限 對目錄而言, 使用者有進入目錄的權限 (但是否可以瀏覽目錄, 取決於該目錄的 "r" 讀取權限) -: 表示不具有該項權限
一般權限 講清楚點就是說每個檔案或目錄, 都可分別對擁有者、同群組使用者, 以及其他使用者這 3 種類別的人設定讀取、寫入與執行的權限 Linux 系統下的『執行檔』, 其副檔名毋需為 .exe, 只要加上可執行的權限, 該檔案就是執行檔
一般權限 舉些範例說明會更清楚:
一般權限 每個使用者都擁有自己的家目錄, 這些目錄通常集中放置於 /home 目錄下 這些家目錄的預設權限為 "drwx------", 表示目錄擁有者本身具備全部權限, 而同群組與其他使用者皆無法進入該目錄:
一般權限 執行 mkdir 指令建立目錄時, 新建目錄的權限預設為 "rwxr-xr-x" 可以視實際需求而定, 去變更目錄的權限
特殊權限 檔案與目錄的權限設定, 還有所謂的特殊權限存在 由於特殊權限會擁有一些 『特權』 因而若無特殊需求, 不應該去開啟這些權限, 避免安全方面出現嚴重漏洞, 讓怪客入侵
特殊權限 設定 UID, S (SUID, Set UID): 設定 GID, S (SGID, Set GID): 可執行的檔案若搭配這個權限, 該檔案便能得到特權, 可以任意存取該檔案擁有者能使用的全部系統資源 設定 GID, S (SGID, Set GID): 套用在檔案上面, 其效果和 SUID 相同, 只不過將範圍由檔案擁有者擴大成群組 擁有此權限的檔案, 可以任意存取整個群組所能使用的系統資源
特殊權限 T (Sticky): 存放於擁有此權限目錄中的檔案, 僅准許其擁有者去刪除與搬移, 可避免其他使用者無故騷擾 例如, /tmp 和 /var/tmp 目錄, 開放供所有使用者暫時存放檔案, 假使碰到某位使用者存心搞鬼, 恣意亂刪其他使用者放置的檔案, 暫存目錄將形同危險地帶, 造成沒有任何使用者能夠安心利用這些目錄 此時, 便可把暫存目錄的 Sticky 權限打開, 則存放在該目錄的檔案, 僅准許其擁有者去刪除與搬移,
特殊權限 Sticky 特殊權限的設定, 僅對目錄有效 若設定某個檔案具有 Sticky 權限, 並不會產生非該檔案擁有無法刪除該檔的作用
特殊權限 特殊權限 SUID、SGID、Sticky 佔用 x 的位置來表示
改變權限 使用檔案管理員更改權限 使用數字法更改權限 使用文字法更改權限
使用檔案管理員更改權限 請點選桌面上 root 的個人目錄圖示:
使用檔案管理員更改權限
蓋個章, 讓您的檔案更易辨識! 在上述設定權限的交談窗中, 還可以為檔案蓋個章, 讓檔案的屬性及特色容易識別:
蓋個章, 讓您的檔案更易辨識! 此功能並不會影響檔案的權限, 作用僅在於方便識別
使用數字法更改權限 檔案或目錄的權限標示, 是用 "rwx" 這 3 個字元重複 3 次形成 9 個字元, 分別代表擁有者、群組和其他使用者的權限設定 以數字來表示權限, 僅需 3 位數字:
使用數字法更改權限 遵循上述法則, "rwx" 合起來就是 4 + 2 + 1 = 7 一個 "rwxrwxrwx" 權限全開的檔案, 用數字來表示就是 "777" 完全不開放權限的檔案 "---------", 它的數字標示則為 "000"
使用數字法更改權限 底下再舉幾個例子說明:
使用數字法更改權限 文字模式下可執行 chmod 指令改變檔案與目錄的權限 先執行 ls -l 指令觀察目錄內的情況:
使用數字法更改權限 執行下列指令更改 nohup.out 檔案的權限:
使用數字法更改特殊權限 假若要加上特殊權限, 則在原來的 3 位數字前加上一碼, 以 4 位數字表示 特殊權限的對應數值為:
使用數字法更改特殊權限 同樣用 chmod 指令更改檔案權限即可:
使用文字法更改權限 除了可用數字表示法更改權限之外, 還能使用文字表示法變更 第 2~10 字元亦以 "rwx" 每 3 個為一組, 分別用 "u"、"g" 與 "o" 來表示:
使用文字法更改權限 用 chmod 指令配合文字參數就能改變權限設定, 下面舉例說明:
使用文字法更改權限
使用文字法更改權限 實際練習一次試試看: 變更目錄權限的方法和變更檔案一樣
使用文字法更改權限 假如想一次更改某個目錄下的所有檔案權限 (包括其子目錄中的檔案), 則請使用 "-R" 參數表示啟動遞迴處理 有無遞迴處理的差別在於:
改變擁有權 檔案與目錄不僅可以改變權限, 也能更改擁有者及所屬群組 和設定權限類似, 可以使用圖形介面的檔案管理程式, 或執行 chown 指令, 修改檔案或目錄的擁有者及所屬群組 請注意!只有 root 管理者帳號, 可將檔案的擁有者移轉給其他人, 一般使用者不能用 chown 指令
改變擁有權 請先執行 ls -l 指令看看目前的狀況:
改變擁有權 執行下面的指令可以把 nohup.out 檔案的所有權轉移給 lambert:
改變擁有權 再執行 ls -l 指令觀看修改後的結果:
改變擁有權 若只要變更擁有者, 請執行 chown lambert nohup.out 指令 更改目錄的辦法和檔案一樣 想一次更改整個目錄下的所有檔案權限, 則請使用參數 "-R" 啟用遞迴處理
使用者與群組的權限關係 若使用者 lambert 屬於 cassia 群組, 其使用者家目錄 (/home/lambert) 的權限設為 "rwxr-x--x" 表示同屬 cassia 群組的使用者, 可以讀取和進入這個目錄, 其他使用者則只能進入該目錄, 但完全看不到任何內容 因而屬於其他群組的使用者 saber, 就無法讀取 lambert 目錄中的檔案
使用者與群組的權限關係 若將 /etc 目錄下的 group 檔案內容做些修改, 情況就不一樣了: 這樣一來, 使用者 saber 便同時屬於 saber 和 cassia 兩個群組, 而能讀取同屬 於 cassia 群組的 lambert 家目錄下的檔 案了
連結與符號連結 在 Linux 的檔案系統中, 有許多連結 (link) 的檔案 簡單來說, 連結就是替同一個檔案建立第二、第三...個名字, 如同在 Windows 下, 建立檔案的捷徑
連結與符號連結 執行 ls -l 指令列出檔案資訊時, 會看到類似下面這些內容:
連結與符號連結 建立連結 檢查 inode 編號 建立符號連結 硬連結與符號連結比較 使用檔案管理員建立符號連結
建立連結 單純的檔案複製方式, 會佔用磁碟空間 例如使用者 cassia 在 /var/tmp 目錄中, 存放一個大小為 1502892 bytes 的檔案 ForEveryOne, 其權限設定是 "rw-r--r--" 若使用者 lambert 也要用這個檔案, 他可以將 ForEveryOne 複製到自己的目錄中 如此一來, ForEveryOne 就分處兩地, 整整佔用 3005784 bytes 的磁碟空間
建立連結 使用者 lambert 複製 ForEveryOne 到自己的目錄中:
建立連結 另一種達成檔案分享的方法是採用連結, 或稱為硬連結 (hard link) lambert 並不需要複製一份 ForEveryOne 到自己的目錄下浪費磁碟空間, 只需建立連結到 /var/tmp/ForEveryOne 即可:
建立連結 接著執行 ls -l 指令, 看看複製的 LambertFile 與連結的 LambertLink 有甚麼不同: 由於連結的方式不會改變檔案的擁有者, 因此採用此法之前, 必須確定自己對該檔案的存取權限
建立連結 檔案的連結數是 2, 表示目前這個檔案除了本身以外, 還有另一個分身 假使再對該檔案建立連結, 其連結數就會再增加 刪除時, 連結數則逐次遞減, 直到數目降為 0 的時候, 該檔案才會真正從磁碟上被移除
檢查 inode 編號 連結的檔案實際上都是指向磁碟中相同的資料, 所以它們的 inode 編號應該一樣 請執行 ls -i 指令來查看檔案的 inode 編號:
檢查 inode 編號 從上面的結果可看出連結檔案的 inode 編號是一樣的
建立符號連結 符號連結建立的方法類似連結, 但意義不相同 請用 ln -s 指令建立符號連結:
建立符號連結 接著執行 ls -l 指令觀看 lambert 目錄的情形:
建立符號連結 檔案 LambertFile 和 SymLink 的連結數都沒有改變 SymLink 檔案權限最前面的第 1 個字元出現 " l ", 表示這是一個符號連結的檔案 SymLink 檔案的權限為 "rwxrwxrwx" 全部開放, 代表真正的權限要以所指的檔案 (LambertFile) 為準, 符號連結本身不做任何限制
建立符號連結 符號連結並不保存檔案的資料, 其真正內容一個字串, 指向原來的檔案, 類似 Windows 系統中的 "捷徑" 若把其指向的檔案刪除或更改檔名, 則 SymLink 就會指向一個不存在的檔案, 其內容會變成空白
建立符號連結 請特別注意, 符號連結本身也會佔用一個 inode
硬連結與符號連結比較 由於連結的方式不同, 硬連結與符號連結有著以下的差異: 當原檔刪除後, 符號連結將會失效, 硬連結則仍然可以繼續使用 硬連結只能連結同一個分割區內的檔案, 而符號連結則因為只是一個指向檔案的字串, 所以可以跨越不同分割區, 甚至連結到掛載 NFS 與 SAMBA 的目錄內
硬連結與符號連結比較 硬連結與符號連結各有其限制, 所以必須依時機與用途, 選擇適合的方式使用。 硬連結不能連結目錄, 因為目錄的 inode 中, 計算連結數的欄位已經有其他的用途, 所以無法讓硬連結使用 符號連結可以指向任何目錄, 並可如同真的目錄一樣地使用 硬連結與符號連結各有其限制, 所以必須依時機與用途, 選擇適合的方式使用。
使用檔案管理員建立符號連結 在 X Window 環境下, 可以使用檔案管理員來建立符號連結 若要在 /var/tmp 目錄下, 建立 /root/anaconda-ks.cfg 檔的符號連結 請先點選桌面上的 root 的個人目錄圖示兩次, 分別切換到 /root 及 /var/tmp 目錄:
使用檔案管理員建立符號連結
使用檔案管理員建立符號連結 接著便可以在 /var/tmp 目錄中, 找到建立好的符號連結檔案 爾後如果符號連結所指向的檔案搬家了, 則應刪掉舊的符號連結另建新的, 否則將無法開啟該連結