硬碟分割的觀念


一、 傳統 MBR 分割表

現在的硬碟那麼大, 卻讓 windows 一個作業系統佔據, 蠻可惜的。 學會分割 (partition) 硬碟, 可以在一顆硬碟上安裝 windows, 許多版本的 linux, *BSD, ... 等等多個作業系統, 一個出問題時, 可以拿其他系統救急。 也可以將作業系統和資料分開, 系統出問題時比較容易分開處理。

硬碟的 MBR 跟分割區 (右圖中, 藍底黃字的部分跟開機流程有關, 與本文無關, 可忽略) 一顆硬碟可以切成四個 主分割區 primary partitions, 代號分別為 1、2、3、4。 如果這還不夠用, 可以將其中一個 primary partition 改成 延伸分割區 extended partition, 再將它切成十來個 邏輯分割區 logical partitions。 當然, extended partition 只是一個空殼子; 真正拿來放作業系統或資料的, 不是 primary partition 就是 logical partition。 一顆硬碟上不論有幾個 primary partitions, 它的 logical partitions 的代號一律從 5,6,7, ... 開始數起。 如果 partition 6 被刪除, 則它後面所有的 partition 代號都會向前遞移。

另外, 每顆硬碟上各有一塊最特別、 最重要的區域稱為 Master Boot Record, 如果 BIOS 把開機主控權交給這一顆硬碟, 那必然是 MBR 最先取得控制權。 它是一段極短(446 bytes)的程式碼, 會再把控制權交給某一個 boot loader, 例如 grub/syslinux/LILO 之類的。 這個 boot loader 會印出一個清單 (也許包含背景圖片), 並且讓使用者用上下箭頭按鍵選擇要進入哪一個作業系統, 甚至可能允許使用者 (通常是按 Tab 鍵) 編輯開機命令列。 開機隨身碟無法直接用檔案總管拷貝, 就是因為檔案總管無法處理這一段流程。

另一方面, 有時候作業系統沒有壞, 卻無法開機 (例如先裝完 linux 之後才安裝 windows, 則 windows 會把 boot loader 蓋掉, 佔著茅坑不拉屎) 可能只是 MBR 裡面的 boot loader 被毀了而已, 也許並不需要重灌作業系統, 只需要重灌 boot loader 就好。

更多關於分割的詳細知識, 請見 spfdisk 計劃的 FAQ, 或是 Linux Partition HOWTO

例: 下完 fdisk -l /dev/sda 指令之後, 看到以下。 請畫出 /dev/sda 這顆硬碟的分割圖。

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048     8390655     4194304   83  Linux
/dev/sda2         8390656    29362175    10485760   83  Linux
/dev/sda3        29362176    50333695    10485760   83  Linux
/dev/sda4        50333696   976773167   463219736    5  Extended
/dev/sda5        50335744   934830129   442247193   83  Linux
/dev/sda6       934834176   955801648    10483736+  83  Linux
/dev/sda7       955805696   976773167    10483736   83  Linux

看完理論, 開始動手吧。 在 Linux 底下, 一般的 SATA 裝置通常會呈現為 /dev/hda /dev/hdb ... 等等 device file 裝置名稱。 例如 cd /dev; ls hd* 若出現 hda hda1 hda2 hda5 hda6 hdb hdc hdc1 那麼可能您有一顆硬碟, 切成一個 primary partition, 一個 extended partition, 其中 extended partition 又切成兩個 logical partitions, 另外有一部不知道是光碟機還是讀卡機 (hdb), 還有一顆隨身碟, 全部就只有一個分割 (hdc1)。 拔出或插入隨身碟之前之後, 下 ls /dev/sd* 指令, 可以查出你的 linux 如何稱呼這顆隨身碟。 (也就是查出它的裝置名稱)。

切割硬碟的工具有很多; 建議學最陽春的, 所有版本 Linux 都提供的工具, 這樣在任何環境下都活得下去。 注意: 一旦用 fdisk 或 cfdisk 切割你的硬碟或隨身碟, 上面所有的資料就全部燒毀! (其實在 「寫入」 之前都還有機會反悔啦。) 使用前請先確認那顆硬碟或隨身碟上所有程式/影片/圖片/資料都不重要。 我自己習慣用命令列模式的 fdisk, 詳見以下教學文:

  1. 規劃您的Linux磁碟空間工具-fdisk
  2. 新增一顆硬碟
  3. 替 Linux 新增硬碟(磁碟分割、格式化與掛載)
  4. Gentoo Linux 文件-- 準備磁碟

新手可以用文字選單模式的 cfdisk。 cfdisk 的操作很簡單: 上下鍵選取一個分割; 左右鍵決定要對它做什麼動作; 按 Enter 執行。 如果後悔, 隨時可以按 q 離開, 不會儲存修改。 但進入 cfdisk 之前, 要記得先把該碟的所有分割卸載下來: umount /dev/sdz* 有時候 cfdisk 無法開啟的硬碟或 usb 碟 (主要是因為 partition table 亂掉了) 就要靠 fdisk 來處理。 或者可以乾脆將 partition table 清空: dd count=1 < /dev/zero > /dev/sdz 再重新進入 cfdisk。 製作分割時, 要記得替每個分割指定一個十六進位代號, 介於 0-FF 之間。 常用的代號有 C (Win95 FAT32 LBA), 83 (Linux), 82 (Linux swap) 等等。 一切動作完成之後, 要記得儲存。 請參考: 12 34 等等文章。

分割完成之後, 必須將這些新的分割 格式化 format, 建立新的 檔案系統 (file system), 這樣作業系統 (Linux 或 Windows 等等) 才能使用。 較常用的指令:

        mkfs -t ext4 /dev/sdz99         # 建立 ext4 給 linux 用
        mkfs -t vfat /dev/sdz97         # 建立 vfat 給 windows 用

在某些版本的 linux (例如 slackware 所衍生的版本) 上, 建立 vfat 的指令是 mkdosfs /dev/sdz97

現在多數版本的 linux 會自動偵測隨身碟/光碟, 只要插入, 即可從檔案總管當中看到上面的檔案。 但有些版本 (例如我所製作的開機光碟/隨身碟) 不會。 這時要手動掛載, 類似這樣: mount /dev/sdz1 /mnt/t1 其中 sdz1 要改成你的裝置名稱; 而 /mnt/t1 則是預先建好的任意空目錄, 稱為 掛載點 mount point -- 你希望從哪個目錄 (資料夾) 看見這顆隨身碟/這張光碟的內容? 用完之後記得卸下來: umount /dev/sdz1umount /mnt/t1 下這些指令之前之後, 可以下 dfmount 注意前後有什麼變化, 會更瞭解這些指令的效果。

二、 GPT 分割表

MBR 分割表只適用於 2TB 以下的硬碟。 超過這個容量的話, 就必須採用較新的分割方式, 稱為 GUID Partition Table (GPT)。 採用這種方式切割的硬碟, 最多可以切成 128 個分割區。 詳見 T 客邦文章

三、 LVM

LVM 新手必備指令集