電腦網路與作業系統 電腦網路與作業系統

電腦網路與作業系統上課教材

電腦網路與作業系統 > 課程內容 > 第 5 堂課 - 磁碟與檔案系統管理

第 5 堂課 - 磁碟與檔案系統管理

上次更新日期 2018/03/26

檔案管理是直接處理檔案資料,但是這些檔案資料總是得要寫入磁碟的,而且檔案寫入時需要考慮到檔案系統,而檔案系統是在磁碟一開始建立資料時, 就需要事先處理妥當,亦即所謂的『格式化』之後,才能夠加以使用。因此,整個作業系統裡面有個非常重要的子系統,就是『檔案系統』的理解就顯的非常的重要。 本章課程會讓讀者們時間操作 windows/linux 的磁碟分割與檔案系統格式化功能,以及理解不同的檔案系統可能造成的差異與作業系統的支援度等。

  • 5.1: 目錄樹系統:檔案與目錄
  • 5.2: 作業系統重要的檔名資訊
  • 5.3: 檔案系統組織配置: linked, indexed
  • 5.4: 磁碟分割
  • 5.5: 檔案系統與格式化
  • 5.6: 課後練習

5.1: 目錄樹系統:檔案與目錄

一般我們使用系統的磁碟裡面的資料通常用的是『檔名』,而一般檔名有多種意義,最常見到的就是目錄檔與一般檔案。而要使用檔名時,得要注意所謂的絕對路徑檔名與相對路徑檔名。

  • 絕對路徑與相對路徑的檔名

你的作業系統上面的檔名都是獨一無二的!絕對不會重複!你可能會有問號?不可能啊!同一個檔名我可以放在不同的目錄下啊!不然怎麼複製同一個檔名到不同的地方去? 事實上,確實是不會重複的!理由是你得要撰寫『絕對路徑』才行。

以 windows 10 系統來說,整部機器最頂層的目錄 (資料夾) 被暱稱為『本機』,那就是最根部的檔名!所以如果有個檔名 test.txt 放置在 C 槽的 game 與 paper 目錄內, 那麼其實他是兩個完全不一樣的檔案,檔名分別是:

  • 本機\C:\game\test.txt
  • 本機\C:\paper\test.txt

上面的檔名就被稱為『絕對路徑』,這個檔名在每一個系統上面都會是獨一無二不會重複的。那麼只寫 test.txt 呢?那個稱為『相對路徑』,反正不是從『本機』開始寫的, 就稱為相對路徑檔名了!亦即『相對於工作目錄的檔名』之意。

那麼 Linux 呢?Linux 最頂層的目錄稱為根目錄,符號代表為 / ,任何檔名從 / 開始寫就稱為絕對路徑的檔名,是獨一無二的檔名!例如 text.txt 放置在 /var/ 底下與 /home 底下,那麼完整的絕對路徑檔名就會變成:

  • /var/test.txt
  • /home/test.txt

另外,對於『相對路徑』的檔名來說,有兩個很重要的目錄要提醒!分別是:

  • . 代表本目錄
  • .. 代表上層目錄
請在 windows 10 底下啟用 cmd 來完成底下的實做
  1. 建立名為『 本機\C:\operating_system\test1\ 』的目錄以及
    『 本機\C:\operating_system\test2\ 』的目錄。
  2. 使用『 echo 123 > file.txt 』的方式,在 test1, test2 底下建立 file.txt 檔案 (請將 123 改成其他文字,讓兩個檔案的內容不同)。
  3. 切換路徑到『 本機\C:\operating_system\test2 』
  4. 如何使用 type 呼叫出兩個檔案的內容?分別使用絕對路徑與相對路徑的方式來處理。
請在 Linux 底下完成底下的實做:
  1. 建立名為 /dev/shm/operating_system 的目錄
  2. 切換到上述的目錄成為工作目錄
  3. 建立兩個目錄,名稱分別為 test1 與 test2
  4. 使用 echo 123 > file.txt 的方式建立 file.txt 檔案,在上述的兩個目錄底下
  5. 切換目錄到 test1 去
  6. 如何使用 cat 呼叫出兩個檔案的內容?分別使用絕對路徑與相對路徑的方式來處理。
  • 檔案與目錄的差異

上面談到的動作中,不論是『目錄』還是『檔案』都需要有一個『檔名 (filename)』,憑借這個檔名我們才能夠使用該檔名的資源。 但是『目錄檔』的建置與操作使用的是 mkdir 以及 cd (Linux 為例),而『檔案』的操作則是建立內容與呼叫出實際檔案資料。 那到底什麼是『目錄檔』什麼是『一般檔案』呢?

先想想,所有的『一般檔案』都是一個一個的資料夾,那麼(1)這些幾百個資料夾全部擺在同一個房間,或者是(2)將資料夾分門別類的放在不同的抽屜內, 上述的方法哪一個會讓你找出檔案比較有效率?在笨也會覺得是 (2) 來的快速。同樣的,檔案系統也差不多!為了分門別類,因此將一般檔案放置在『不同的目錄』底下, 就有其必要性!也就是說,所謂的目錄『其實就是人類放資料夾的抽屜』!抽屜外面總會記錄裡面的資料夾名稱為何, 同理,目錄的功能也只是記錄該目錄底下的檔名而已。這兩個東西是不一樣的!要先理解清楚才行。

由於目錄從最頂層的 / 或『本機』開始向底下分枝散葉,因此就稱這種樹狀結構為『目錄樹』系統囉!

5.2: 作業系統重要的檔名資訊

作業系統裡面有些檔名不可以隨意刪除或修改,否則系統會出大問題!這是因為系統在建立起來之後,某些程式彼此之間是有關連性的! 例如 /adir/apro 程式會用到 /bdir/bpro,因此,當你修改了 /bdir 之後,可能會造成 apro 程式無法執行 (因為實際上找不到 /bdir/bpro 這個絕對路徑檔名了)。 因此,你不能隨意修改某些重要的系統預設檔名呢!

在 windows 裡面的重要檔名包括有:

  • C:\windows\ :window 的主程式
  • C:\windows\system32\ :絕大部分的系統內建指令都在這裡
  • C:\Program Files\ :系統額外安裝的程式
  • C:\Program Files (x86) :32位元的程式
  • C:\Users\ :使用者個人化家目錄

至於 Linux 的重要檔名則有:

  • /etc :系統主要的設定檔
  • /home :系統終端用戶的家目錄
  • /bin, /sbin, /usr/bin, /usr/sbin :主要執行檔放置目錄
  • /usr :主要 Linux 資源,有點類似 C:\windows + C:\program Files\ 兩者的綜合體
  • /tmp :暫存目錄,可以隨意使用的目錄之一,但重要資料不要放裡面
  • /dev/shm :將記憶體模擬成檔案系統的用途,關機後裡面的東西都會不見。
我能不能將 Linux 底下的 /home 修改成為 /home2 ?或能不能將 /usr 修改成 /unixsource/ ?請說明 (1)root 能否進行修改指令? (2)會不會發生問題與發生問題的原因。
  • 關於副檔名的功能

在 windows 作業系統中,以小數點隔開成前半段與後半段的檔名中,後半段的檔名被稱為副檔名。在 windows 環境下,每個副檔名是有其用途的。 常見的副檔名與搭配的軟體之間的關係是這樣的:

  • .doc, docx, .ppt, .pptx, .xls, .xlsx :Microsoft Office 相關軟體的資料檔
  • .odt, .ods, .odg :開放文檔格式 (Open document format, odf),為 libreoffice 常用的文檔格式
  • .rar, .zip, .z7 :windows 底下常見的壓縮檔案
  • .jpg, .bmp, .png, .svg :圖片檔案格式
  • .mp4, .avi, .wmv, .rmvb :多媒體影片格式
  • .htm, .html :網頁檔案格式
  • .exe, .com. .dll, .bat :常見的執行檔

在 windows 底下,一個檔案用滑鼠雙擊之後,他會以什麼軟體打開或是否能夠自行執行都與副檔名有關系!另外,你也可以對檔名額外加上某些權限, 讓該檔案具有比較特別的執行權等。不過,基本上,檔案的使用是以副檔名作為最明顯的判斷。某些副檔名你沒有辦法使用, 最可能的原因就是你的系統並沒有安裝該檔案的執行軟體之故。

與 Windows 不同,Linux (Unix like) 的檔名與能否執行或能不能被某些軟體所啟動是沒有關係的!檔名就只是檔名, 能不能執行完全與檔案的權限有關,跟檔名本身關係不大。不過,為了判斷某些檔案的資料內容,因此副檔名還是有其存在的必要性。 例如某些程式編輯器,主要就是透過副檔名來理解程式的語法!而事實上,Linux 上面的副檔名經常是為了要讓人們知道該檔名內可能含有的資料內容為何而已。 因此,如果需要知道該檔案的詳細資料,最好還是透過『 file 』這個指令來查詢較好。

使用 Linux 系統完成底下的練習:
  1. 使用 ll /etc/passwd /usr/bin/passwd 查看該檔案是否存在。
  2. 使用 file 去看這兩個檔案的詳細屬性資料為何?

所以,雖然在 Linux 底下,一個檔案能不能執行與副檔名沒有絕對的相關性,不過為了擔心使用者自己未來忘記該檔案的內容為何,而導致搜尋的困擾, 建議還是針對該檔案的內容給予正確的副檔名較佳。例如:

  • .html, .php, .css, .js :為網頁常用的網頁檔、PHP程式檔、CSS樣式表、Javascript程式碼等。
  • .sh, .bash, .csh :為常見的腳本語言內容
  • .txt :為常見的純文字檔
  • .tar, .tar.gz, .tar.bz2, .tar.xz, .tgz :為壓縮檔常見的副檔名格式

5.3: 檔案系統組織配置: linked, indexed

目前的作業系統當中,為了多人多工的設計,因此會有所謂的群組、權限、日期參數等相關的屬性產生,並不是只有單純的資料內容而已。 那麼這些資料 (屬性與實際資料內文) 是放哪裡呢?檔案系統通常會將這兩部份的資料分別存放在不同的區塊,權限與屬性放置到 inode 中,至於實際資料則放置到 data block 區塊中。另外,還有一個超級區塊 (superblock) 會記錄整個檔案系統的整體資訊,包括 inode 與 block 的總量、使用量、剩餘量等。

基本上,在檔案系統一開始進行格式化 (format) 的時候,就會規範好每個 inode 與 block 的大小與位置編號,同時將檔案系統的所有總計資訊寫入到 superblock 裡面去, 所以,檔案系統的這三個區塊主要的記錄資料就會是:

  • superblock:記錄此 filesystem 的整體資訊,包括inode/block的總量、使用量、剩餘量,以及檔案系統的格式與相關資訊等;
  • inode:記錄檔案的屬性,一個檔案佔用一個inode,同時記錄此檔案的資料所在的 block 號碼;
  • block:實際記錄檔案的內容,若檔案太大時,會佔用多個 block 。
  • 索引式檔案系統 (indexed allocation)

由於每個 inode 與 block 都有編號,而每個檔案都會佔用一個 inode ,inode 內則有檔案資料放置的 block 號碼。 因此,我們可以知道的是,如果能夠找到檔案的 inode 的話,那麼自然就會知道這個檔案所放置資料的 block 號碼, 當然也就能夠讀出該檔案的實際資料了。這是個比較有效率的作法,因為如此一來我們的磁碟就能夠在短時間內讀取出全部的資料, 讀寫的效能比較好囉。

我們將 inode 與 block 區塊用圖解來說明一下,如下圖所示,檔案系統先格式化出 inode 與 block 的區塊,假設某一個檔案的屬性與權限資料是放置到 inode 4 號(下圖較小方格內),而這個 inode 記錄了檔案資料的實際放置點為 2, 7, 13, 15 這四個 block 號碼,此時我們的作業系統就能夠據此來排列磁碟的讀取順序,可以一口氣將四個 block 內容讀出來! 那麼資料的讀取就如同下圖中的箭頭所指定的模樣了。

索引式檔案系統

這種資料存取的方法我們稱為索引式檔案系統(indexed allocation)。

  • 鍊結式檔案系統 (Linked Allocation)

那有沒有其他的慣用檔案系統可以比較一下啊?有的,那就是我們慣用的隨身碟(快閃記憶體),隨身碟使用的檔案系統一般為 FAT 格式。FAT 這種格式的檔案系統並沒有 inode 存在,所以 FAT 沒有辦法將這個檔案的所有 block 在一開始就讀取出來。每個 block 號碼都記錄在前一個 block 當中,他的讀取方式有點像底下這樣:

鍊結式檔案系統

上圖中我們假設檔案的資料依序寫入1->7->4->15號這四個 block 號碼中, 但這個檔案系統沒有辦法一口氣就知道四個 block 的號碼,他得要一個一個的將 block 讀出後,才會知道下一個 block 在何處。 如果同一個檔案資料寫入的 block 分散的太過厲害時,則我們的磁碟讀取頭將無法在磁碟轉一圈就讀到所有的資料, 因此磁碟就會多轉好幾圈才能完整的讀取到這個檔案的內容!

  • 磁碟重組的功能

常常會聽到所謂的『磁碟重組』吧? 需要磁碟重組的原因就是檔案寫入的 block 太過於離散了,此時檔案讀取的效能將會變的很差所致。 這個時候可以透過磁碟重組將同一個檔案所屬的 blocks 彙整在一起,這樣資料的讀取會比較容易啊! 想當然爾,FAT 的檔案系統需要三不五時的磁碟重組一下。不過,新的檔案系統是否需要磁碟重組呢?老實說,包括 windows 的 NTFS 以及 Linux 的大部分檔案系統, 都不需要磁碟重組。另外, SSD 或 PCI-E 的快閃記憶體格式的硬碟,都不需要磁碟重組喔!

想一想底下的題目:
  1. 一般來說,索引式檔案系統,在格式化時,就將檔案系統主要分成哪三個重要的項目?
  2. 以一般檔案來說,時間、檔案擁有者、檔案權限、檔案容量等屬性,以及檔案的內容文件,分別放置在哪兩個區塊上?
  3. 以目錄檔案來說,目錄檔案的內容文件主要記錄的是什麼呢?
  4. 要找到一個檔案的內容,需要讀到檔案的 inode 號碼,請找出你 Linux 系統中,/etc/hosts 以及 /etc/fstab 的 inode 號碼。

如同之前我們開玩笑的說登入帳號是給人類看的,系統看的其實是 UID/GID 等。在檔案系統也一樣,檔名是給人類看的,事實上基本的檔案放置位置, 就是 inode 與 block 的號碼!檔案系統只是管理什麼資料放置在哪些位置這樣而已。

不過,由於每種檔案系統的讀/寫方式可能都有一些差異,因此除非安裝各自的檔案系統驅動程式,否則可能會無法讀取到其他作業系統所支援的檔案系統喔。 一般來說,Linux 支援的檔案系統主要有 ext2, ext3, ext4, xfs, reiserfs..,而 windows 支援的當然主要就是 NTFS 了。那麼為什麼隨身碟在兩個系統都可以被讀取? 那是因為小拇指碟的主要檔案系統被設計為大家都能接受,且沒有權限保護的 FAT 檔案系統之故。通常,如果你的讀寫效能要好, 可能拇指碟得要重新格式化成為各自作業系統的檔案系統格式較佳。只是,跨平台的支援度就會變得比較不好了。

另外,目錄檔案真的是很特別,目錄的內容其實就是記錄檔名!而這個檔名可以與 inode 進行連結就是了!畫圖表示有點像這樣:

目錄檔 block 內容示意圖
  • 檔案系統與目錄樹的關係:掛載 (mount)

你的資料總是得要寫入檔案系統,但是我們過去操作檔案時,只需要記得目錄與檔名而已,也就是,實際操作系統時,最重要的部份反而是在目錄樹系統中。 那麼如何將目錄樹與檔案系統結合呢?在 Windows 底下,他透過一個很簡單的方式,就是每個檔案系統給予一個分割槽的代號,例如 C, D, E 槽, 然後將資料放進去這樣。不過想一想,如果是隨身碟呢?你的隨身碟放在 windows 底下,可能每台 windows 給予的分割槽名稱會不同喔! 因此你得要知道你的隨身碟在不同系統中的分割槽代號才行。

那 Linux 呢?Linux 只有目錄樹~然後,你進入到某個目錄時,可能就是切換到某個檔案系統囉!將『目錄』與『檔案系統』結合在一起, 這個動作就稱為『掛載 (mount)』了!事實上,windows 現在也有目錄掛載的功能!你的檔案系統無須額外放置在某個分割槽代號底下喔!

觀察 windows 的檔案系統與分割槽代碼之間的關係
  1. 打開檔案總管,在『本機』上面按下『右鍵』,然後點選『管理』的項目
  2. 在出現的新視窗中,點選『磁碟管理』
  3. 中間的部份就會顯示每個實體磁碟、檔案系統格式與對應的分割槽資料了。
觀察 Linux 的檔案系統、磁碟與目錄掛載之間的關係
  1. 在終端機上面輸入『 df 』就可以觀察到目前的磁碟、檔案系統與掛載點之間的關係
  2. 輸入『 lsblk 』就可以知道每個磁碟的分割狀態以及掛載點資訊等
  3. 輸入『 blkid 』就可以知道裝置與檔案系統的關係了。
  4. 直接輸入『 mount 』就能知道系統所有的掛載資訊 (包括記憶體模擬的檔案系統)

我們知道格式化 (其實是建立檔案系統) 會有 superblock, inode, block 區塊,也知道了 inode 在記錄檔案權限與資料所在的區塊號碼, block 則是紀錄實際的資料,且通常一個 block 只能給一個檔案使用。那麼 superblock 的功能是什麼呢?基本上, superblock 是整個檔案系統資料變化最大的地方!因為所有的檔案系統操作時,幾乎都需要讀/寫 supberblock,超級區塊主要在紀錄檔案系統的總結資料,包括剩餘量、使用量、每個 block 的大小等等。

觀察 windows 的檔案系統表頭 (類似 superblock) 資料,以及個別目錄的整體使用量的差別
  1. 打開檔案總管,在 C 槽上,按下右鍵,選內容,看一下檔案系統的使用空間、剩餘容量等資訊。
  2. 在 C 槽的 windows (C:\windows) 按下右鍵,選擇『內容』,看看使用的容量有多少?
  3. 想一想,為什麼比較大容量的 C 槽顯示的速度,要比容量較小的 C:\windows 速度快?
  4. 想一想,為什麼 C:\windows 的顯示中,會有『大小』與『磁碟大小』兩個值?差異的意義是?

5.4: 磁碟分割

眾所皆知,檔案系統是建置在磁碟上面的,而一部簡單的主機當然大多只有一顆硬碟囉。那麼這顆硬碟能不能分成數個分割槽?類似有 C, D, E 槽等等, 然後將系統放在 C 而資料放在 D 槽呢?這樣的好處是,當 C 槽系統死掉時,拿到其他台電腦上,通常還能夠救出 D 槽的資料。另外, 重灌系統時,大部分資料也不需要重新複製!因為系統主要格式化的是系統槽 (C 而已),所以在資料的保障上面會比較好。

將一顆硬碟分成數個分割槽的動作,就是所謂的分割 (partition) 囉!

目前 windows/linux 上面支援的分割表類型主要有 MSDOS (Master Boot Record, MBR) 以及 GPT (GUID Partition Table) 兩種格式,其中 MBR 格式所可以支援的單一檔案系統似乎只能到大約 2TB 的容量,因此目前主流大致都使用 GPT 格式。這兩種格式的主要差別在於, MBR 支援的單一檔案系統容量較小,且分割數量有限制,同時分割表並沒有備份。GPT 則除了單一檔案系統較大,分割數量幾乎沒有限制,且分割表預設有兩份, 其中一份放在磁碟的最後端,因此可作為備份救援之用。

windows 的分割:(針對資傳系上課的磁碟環境,使用 MSDOS 分割的情況)
  1. 透過上一小節的方式,將磁碟管理功能呼喚出來
  2. 檢查是否有剩餘的磁碟。如果沒有剩餘的磁碟,請檢查 D 槽是否有重要資料?若有,請先複製到 C,若無,請刪除 D 槽。(刪除可能會有兩個分割要刪除, 一個是邏輯分割,一個是延伸分割喔!)
  3. 重新建立兩個分割槽,一大一小,小的是要作為測試用,大的請格式化成與之前 D 槽相同,且格式化完畢後,將 C 的資料搬回來。

由於 windows 是圖形化界面,所以我們無須預先知道 MBR 或 GPT 格式。但是 Linux 針對 MBR 與 GPT 提供的分割軟體並不相同, 因此進行分割前,得要知道目前系統的分割表是哪種格式才行。使用的方式為透過『 parted <device_name> print 』去找出來。

[root@localhost ~]# parted /dev/vda print
Model: ATA Hitachi HDS72161 (scsi)
Disk /dev/sda: 165GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name                  Flags
 1      1049kB  211MB   210MB   fat16        EFI System Partition  boot
 2      211MB   1285MB  1074MB  xfs
 3      1285MB  165GB   163GB                                      lvm

當到上面顯示 msdos 時,請用 fdisk ,而看到 gpt 時,就用 gdisk 來進行分割!另外,當然得要知道你的磁碟檔名! 虛擬機通常是 /dev/vda ,而實體的磁碟其實通常是 /dev/sda 喔!這個得要用 lsblk 來查詢才知道。另外,每個系統的分割可能都不太一樣, 記得找你的系統實際查閱才會知道的。

[root@localhost ~]# gdisk /dev/vda
GPT fdisk (gdisk) version 0.8.6

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): ?
b       back up GPT data to a file
c       change a partition's name
d       delete a partition
i       show detailed information on a partition
l       list known partition types
n       add a new partition
o       create a new empty GUID partition table (GPT)
p       print the partition table
q       quit without saving changes
r       recovery and transformation options (experts only)
s       sort partitions
t       change a partition's type code
v       verify disk
w       write table to disk and exit
x       extra functionality (experts only)
?       print this menu

Command (? for help):
Linux 的磁碟分割
  1. 先確認你的磁碟檔名為何?
  2. 再確認你的磁碟分割表格式為何?
  3. 使用正確的分割軟體去分割你的磁碟
  4. 按下『 p 』查閱 (1)磁碟的總磁區數量、 (2)目前用到的磁區數量、 (3)是否有剩餘的磁碟空間可以分割
  5. 若有剩餘的空間,請按下『 n 』新增一個大約 1GB 的磁碟,分割完畢後,按下『 p 』查看分割表是否多一個
  6. 輸入『 w 』確認寫入分割表,然後輸入 lsblk 看看有沒有新的分割出現?
  7. 再次輸入『 partprobe 』強迫核心重讀分割表,再次 lsblk 看看有沒有成功分割

由於 linux 的分割並沒有強制核心一定要讀取新的分割表,因此,最終還是使用 lsblk 確認分割是否完成。在某些 Linux distribution 的設計中, 核心可能無法重新抓到分割表,此時需用 partprobe 讓核心重新抓一次。如果還是無法成功,那很可能是你分割錯誤,或者是某些分割槽正在被使用中的緣故。 此時你得要先將分割表復原,然後將使用中的分割槽卸載,之後才能夠繼續進行分割的任務。

  • MBR (MSDOS) 分割表的限制

GPT 的分割表限制不多,相對 MBR 來說,GPT 分割表幾乎可以說是沒有限制。早期的設計中,分割表只佔一個磁區 (sector) 前面的 446 bytes 容量而已, 因為容量太小,所以只有 4 個分割紀錄可以處理。由於分割需求越來越大,因此這 4 筆分割紀錄又分為主分割 (Primary) 與延伸分割 (Extended) 兩種, 其中主分割是可以被格式化的,延伸分割則只作為一個指向的作用,會指向到後面的磁區做額外的紀錄。而寫入延伸分割區的額外的分割, 就是所謂的邏輯分割 (Logical)。只有主分割與邏輯分割可以被格式化。

  • 主要分割與延伸分割最多可以有四筆(硬碟的限制)
  • 延伸分割最多只能有一個(作業系統的限制)
  • 邏輯分割是由延伸分割持續切割出來的分割槽;
  • 能夠被格式化後,作為資料存取的分割槽為主要分割與邏輯分割。延伸分割無法格式化;
  • 邏輯分割的數量依作業系統而不同,在Linux系統中SATA硬碟已經可以突破63個以上的分割限制;
  • 只要抹除延伸分割,則邏輯分割全部會損毀。

最複雜的大概就是延伸分割這玩意兒,處理起來很多事情需要考慮。其實只要確認你的分割是 MBR 之後,只要記得,將最後面的全部磁碟容量通通交給延伸分割, 這個想法先確認,那大致上就不會有任何問題了。

為什麼 Linux 底下一定要執行 partprobe 才能夠讓分割生效呢?思考看看。

5.5: 檔案系統與格式化

每種檔案系統都有其特色,Linux 當中,每種 distribution 慣用的檔案系統也不相同。最常見於 Linux 的檔案系統其實是 EXT3 這個標準型的檔案系統。後來加上一些額外的功能而有 EXT4 檔案系統。只是這種檔案系統一開始建立之後,就得要將全部的磁碟容量進行格式化 (也就是所有的 inode 與 block 號碼要全部被設定妥當),對於大容量的磁碟來說, 一開始的格式化可能會佔用數分鐘到數十分鐘 (鳥哥曾經等過 30 分鐘的格式化)。為了應付這種大容量的磁碟裝置,因此後來許多的 Linux distribution 都愛用 XFS 或者是 reiserfs 這種用到才開始配置 inode 與 block 的檔案系統,至少格式化速度快非常多。

Linux 的格式化使用 make filesysetm (mkfs) 來處理。不過 mkfs 只是一個綜合的指令,請使用 mkfs.<tab><tab> ,那個 <tab> 指的是鍵盤上面的 [tab] 按鈕 (通常放在大寫燈號的上方),那就會顯示出所有 mkfs 開頭的指令。出現的指令就是你的系統支援的檔案系統囉。

請在 Linux 底下完成新分割槽的檔案系統建置 (俗稱的格式化)
  1. 以 lsblk 找出新的,剛剛前一個步驟建置的分割槽
  2. 使用 mkfs.xfs 格式化上述的分割槽
  3. 使用 blkid 找出上述分割槽的 UUID 磁碟裝置識別碼
  4. 使用『 mount /dev/vdaXXX /mnt 』測試是否能掛載起來
  5. 使用『 df 』確認掛載的情況
  6. 使用『 cd /mnt 』然後『 ll 』查看目前的裝置資料
  7. 使用『 cp -a /etc . 』複製資料
  8. 使用『 umount /mnt 』嘗試卸載 (思考,為何有時 windows 的隨身碟不給你卸載?)
  9. 使用『 cd / 』離開 /mnt 之後,再次使用『 umount /mnt 』嘗試卸載,再用『 df 』確認成功與否
  10. 再次『 ll /mnt 』查閱是否有 etc 的目錄存在

一般來說,我們通常使用裝置名稱就可以掛載。不過因為裝置名稱可能會變動,因此建議使用磁碟裝置識別碼 UUID 來掛載較佳。

  1. 使用『 mount UUID="xxxx" /mnt 』測試掛載
  2. 再次使用『 df 』確認掛載後,使用『 ll /mnt 』確認 etc 有沒有回來
  3. 使用『 umount /mnt 』卸載該裝置
  4. 嘗試使用『 mount UUID="xxxx" /srv/newfs/ 』目錄下,若無法成功,該如何處理?
  • 開機自動掛載的 /etc/fstab 檔案

開機要自動掛載得要修改設定檔 /etc/fstab,這個檔案的內容中,每一行代表一個裝置的掛載,而每一行主要有六個欄位, 每個欄位的意義為:

[裝置/UUID等]  [掛載點]  [檔案系統]  [檔案系統參數]  [dump]  [fsck]
  • 第一欄:磁碟裝置檔名/UUID/LABEL name:

這個欄位可以填寫的資料主要有三個項目:

  • 檔案系統或磁碟的裝置檔名,如 /dev/vda2 等
  • 檔案系統的 UUID 名稱,如 UUID=xxx
  • 檔案系統的 LABEL 名稱,例如 LABEL=xxx

管理員可以依據自己的喜好來填寫適當的裝置名稱,不過如果是實體分割槽的檔案系統,這裡建議使用 Linux 裝置內獨一無二的裝置代號, 亦即是 UUID 這個資料來替代裝置檔名較佳。建議使用 blkid 找到 UUID 之後,透過 UUID="XXX" 的方式來設定。

  • 第二欄:掛載點 (mount point):
  • 第三欄:磁碟分割槽的檔案系統:

在手動掛載時可以讓系統自動測試掛載,但在這個檔案當中我們必須要手動寫入檔案系統才行! 包括 xfs, ext4, vfat, reiserfs, nfs 等等。

  • 第四欄:檔案系統參數:

檔案系統參數有底下幾個常見的設定值,若無需要,先暫時不要更動預設的 defaults 設定值。

參數內容意義
async/sync
非同步/同步
設定磁碟是否以非同步方式運作!預設為 async(效能較佳)
auto/noauto
自動/非自動
當下達 mount -a 時,此檔案系統是否會被主動測試掛載。預設為 auto。
rw/ro
可讀寫/唯讀
讓該分割槽以可讀寫或者是唯讀的型態掛載上來,如果你想要分享的資料是不給使用者隨意變更的, 這裡也能夠設定為唯讀。則不論在此檔案系統的檔案是否設定 w 權限,都無法寫入喔!
exec/noexec
可執行/不可執行
限制在此檔案系統內是否可以進行『執行』的工作?如果是純粹用來儲存資料的目錄, 那麼可以設定為 noexec 會比較安全。不過,這個參數也不能隨便使用,因為你不知道該目錄下是否預設會有執行檔。
舉例來說,如果你將 noexec 設定在 /var ,當某些軟體將一些執行檔放置於 /var 下時,那就會產生很大的問題喔! 因此,建議這個 noexec 最多僅設定於你自訂或分享的一般資料目錄。
user/nouser
允許/不允許使用者掛載
是否允許使用者使用 mount 指令來掛載呢?一般而言,我們當然不希望一般身份的 user 能使用 mount 囉,因為太不安全了,因此這裡應該要設定為 nouser 囉!
suid/nosuid
具有/不具有 suid 權限
該檔案系統是否允許 SUID 的存在?如果不是執行檔放置目錄,也可以設定為 nosuid 來取消這個功能!
defaults 同時具有 rw, suid, dev, exec, auto, nouser, async 等參數。 基本上,預設情況使用 defaults 設定即可!
  • 第五欄:能否被 dump 備份指令作用:

dump 僅支援 EXT 家族,若使用 xfs 檔案系統,則不用考慮 dump 項目。因此直接輸入 0 即可。

  • 第六欄:是否以 fsck 檢驗磁區:

早期開機的流程中,會有一段時間去檢驗本機的檔案系統,看看檔案系統是否完整 (clean)。 不過這個方式使用的主要是透過 fsck 去做的,我們現在用的 xfs 檔案系統就沒有辦法適用,因為 xfs 會自己進行檢驗,不需要額外進行這個動作!所以直接填 0 就好了。

讓你的 Linux 可以在開機之後自動掛載剛剛的檔案系統到 /srv/newdata/ 目錄去
  1. 先修改 /etc/fstab 的內容,增加一行相關的設定
  2. 先使用『 df 』確認預計要使用的裝置與目錄都沒有被使用中。若有被使用,請用 umount 處理。
  3. 使用『 mount -a 』測試是否有成功,然後『 df 』查看,若有問題請自行處理。

要特別注意的是,不要隨意更動系統預設的目錄掛載,否則可能會出現一些比較怪異的情況。包括重複掛載不同的裝置到相同的目錄上, 或者是修改錯了相關的目錄,如果是手動作作,可能還好,如果是修改 /etc/fstab 的話,那很有可能會因為修改錯誤而導致無法開機! 因此,修改完畢 /etc/fstab 之後,都務必使用上述的練習中的第二點與第三點,先卸載後,重新測試一下!有備無患喔!

為什麼要使用 UUID= 或者是 LABEL= 來進行掛載呢?以兩顆同樣的磁碟放在同一個主機的情況來做個簡易的思考。

5.6: 課後練習

請使用 word 檔案 (.doc 或 .docx) 進行下列題目的撰寫(某些題目需要加上圖檔),且檔案容量請不要超過 2MBytes 以上, 以 1Mbytes 為宜,亦即你的圖檔需要限制解析度,並請注意:

  • 首次使用上傳系統時,務必使用 pietty 更改一次密碼,並請將密碼自己記憶下來,未來不能隨時變更密碼的。
  • 檔名請設定為: os_4XXXCYYY_unit05.doc (4XXXCYYY 是你的學號,請填正確,有分大小寫,請確認)
  • 請使用 filezilla 搭配 FTP 協定 (port 21) 上傳
  • 請上傳到你家目錄底下的 os 目錄中 (若不存在,請自行建立該目錄)

開始本章節題目:

  1. 請使用 updatedb 搭配 locate 這個指令,找出系統中名為 gpg-protect-tool 這個檔名的絕對路徑名稱
  2. 承上,如果假設你 pwd 之後,出現的路徑在 /usr/sbin 底下,那麼如何以相對路徑去執行上述的檔名?
  3. 請進行如下的實做練習:
    • 建立名為 /srv/mydata/4XXCXXX 的檔名,其中 4XXCXXX 為你的學號 (例如 4050c001)
    • 切換路徑到該目錄下,然後再建立兩個目錄,分別為 para1 與 para2。
    • 切換路徑到 para1 ,然後執行『 touch {one,two}_{start,end} 』這個指令
    • 切換路徑到 para2 ,然後執行『 pwd; history 10 』
    • 利用相對路徑的方法使用『 ls -l ???? 』那個 ???? 就是相對路徑的寫法,讓畫面顯示出 para1 的檔名列表,然後將該畫面拍下來。
  4. 簡單說明 Linux 系統底下, /etc, /home, /root, /usr, /sbin, /bin, /tmp 等目錄的主要功能。
  5. 簡單說明 Windows/Linux 系統底下,哪些副檔名主要代表的是壓縮檔?
  6. 檔案系統格式化 (format) 完畢後,主要會建置出最重要的三個區塊為何?每個區塊重要的記錄資訊為何?
  7. 鍊結式檔案系統與索引式檔案系統,哪一種比較需要磁碟重組,為什麼?
  8. 找出系統中 /etc/passwd, /etc/shadow 的 inode 號碼,將指令與結果拍下來
  9. 檔案系統的建立與掛載:
    • 將你的系統分割出一個 1.5G 左右的磁碟,並且格式化為 EXT4 檔案系統。
    • 找出該檔案系統的 UUID 號碼
    • 將該裝置掛載到 /srv/newdata2/ 底下。
    • 掛載完畢之後請輸入『 lsblk; cat /etc/fstab; df 』,並將結果拍照