2015年9月22日

Raspberry Pi 新增硬碟->磁碟分割->格式化

這篇談的是在Linux電腦裝上新硬碟,大概需要做哪些事,算是玩Raspberry Pi的心得筆記。於是我又把塵封的指令書拿來翻,將用到指令 lsblk、fdisk、gdisk、mkfs.ext4。這篇文就是我沉迷Raspberry Pi才催生,所有示範都在Raspberry Pi。希望各位能跟迷你企鵝相處愉快~‵(*∩_∩*)′

首先,將(外接)硬碟接上...

注意:Raspberry Pi 連接USB外接硬碟要有外接電源,不可以依賴Raspberry Pi USB上的電源。

Raspbian 或其他Linux 電腦裝上未分割硬碟大概會分以下5個流程:
 

 

這篇文的目錄:

1. Linux 磁碟分割概念

1-1. MBR和GPT分割表
1-2. 介紹lsblk指令

2. fidsk指令

2-1. fdisk查詢用途
2-2. 創建分割區

3.gdisk的用法

4. mkfs.ext4指令(格式化)

附錄:4K對齊問題(講古)

 

1. Linux 磁碟分割概念


如果你之前用過 Windows,一定有C槽、D槽...等觀念。但Linux下觀念不同,「根」目錄(就是符號「/」)是起點,像樹幹上長樹枝一樣,所有目錄都得從根開始掛載,儲存裝置也不例外。

若我在Raspberry Pi的USB插上一顆硬碟,該裝置會有目錄/dev/sda,再插第二個硬碟/dev/sdb,以此類推。第一顆硬碟的第一個分割區(類似Windows「槽」的觀念),目錄定為/dev/sda1;第二個分割區/dev/sda2…等,看看下面那張圖,比較容易理解。當然,如果沒有分割區的空白磁碟不會出現。 


▼ Linux 檔案目錄與裝置、分割區示意圖

 

 

1-1. MBR和GPT分割表

MBR(Master Boot Record)分割表

MBR分割表可切成4個主分割區(primary partition), 裝置名稱末碼由1~4,可用來開機或放資料。如果還需更多分割區,可以將一個主分割區改成延伸分割區(extended partition),把延伸分割區想成空盒子,也占用主分割區的一個號碼。然後將可以切成很多(我也不記得上限)個邏輯分割區(logical partition),邏輯分割區從5開始跳, 5、6、7 ... 開始數起,邏輯分區只能放資料,不能開機。要注意一點,只能定址到2TiB,之後的容量無法使用,也就是說你買3TB以上的硬碟,就必須改用GPT分割表。

GPT(GUID Partition Table, GPT)分割表

改用GPT分割表,會建立分割表副本來防止損壞,能建128個主分割區,定址能力達到 8 ZiB,如果想看更多規格經,詳見:GUID磁碟分割表。當然,GPT在未來鐵定是主流。

而我們下面一張要題的fdisk只支援MBR分割表,就是只支援到2TiB;3TB以上的硬碟,就得出動gdisk來處理,你可以先跳下一章《3. gdisk工具》,也不用太擔心,gdisk用法和fidsk差不多。

 

寫這麼多,我在使用方法上只有個小結論:3TB以下用MBR分割表,工具用fidsk;3TB以上用GPT分割表,工具用gdisk

 

1-2. 介紹lsblk指令

順到介紹一個指令lsblk, list block device,列出所有儲存裝置,以樹狀圖顯示。我的Raspberry Pi上面有一張8 GB micro SD ×1、320GB外接硬碟(切成2個分割區)、32GB隨身碟。

$ lsblk
#列出所有儲存裝置

▼結果展示如下

pi@raspberrypi ~ $ lsblk
NAME        MAJ:MIN        RM   SIZE    RO  TYPE MOUNTPOINT
sda               8:0               0    298.1G   0    disk
├─sda1        8:1              0    150G       0    part  /media/data1
└─sda2        8:2              0   148.1G     0    part  /media/data2
sdb               8:16            1    29.9G      0    disk
└─sdb1        8:17            1    29.9G      0    part  /media/
mmcblk0     179:0           0    7.4G        0    disk
├─mmcblk0p1 179:1     0     56M        0     part  /boot
└─mmcblk0p2 179:2     0    7.4G        0     part 

▲大概說明:
MAJ:MIN:核心裝置代碼,主裝置:次裝置。
RM:是否為可卸除裝置
RO:是否唯讀
TYPE:是儲存裝置顯示disk,分割區顯示part
MOUNTPOINT:掛載路徑

也可以只列單一裝置,把sda換成你的裝置名稱,接下來我們會常常用到喔!

$ lsblk /dev/sda
#只列出sda裝置的訊息

 

#其他資訊:如果碰到早期的IDE硬碟,命名方法可能是hda、hdb、hdc…以此類推;SATA 和 SCSI 硬碟,都還是和本文一樣 sda、sdb、sdc...等。

如果你的硬碟數量多,碰到多顆同一容量,有混淆的問題,或需要專業化的管理,要使用UUID全域單一識別碼 (universally unique identifier)要參考 blkid指令,可以參考鳥哥的:第七章、Linux 磁碟與檔案系統管理

 

2. fdisk工具


fdisk用來搞定MBR分割表;或查詢分割區大小、容量、磁區(Sector)...等。

你想查fdisk詳細用法,可以加上用-h參數
$ sudo fdisk –h

 

2-1. fdisk查詢用途

$ sudo fdisk –l
#不指定路徑,將所有儲存裝置參數和分割區列出

$ sudo fdisk –l /dev/sda
#將該裝置的分割區和參數

 

個人感覺下面-s的用法沒那麼重要,我覺得看看就算了~

$ sudo fdisk –s /dev/sda
#查詢硬碟容量,說明文件談到數字代表邏輯區塊( Block ),實際上的意義是KiB

$ sudo fdisk –s /dev/sda2
#這用法跟上面差不多,但指定分割區

大多只用$ sudo fidisk –l,當然是儲存裝置並不多,雖然參數-s可以查詢硬碟容量,但會被參數-l大幅取代。 

 

2-2. 創建分割區

如果硬碟裡面有要的資料,請記得備份,變更分割區會造成資料遺失!

*如過之前有用Windosws規劃過分割表,請先跳到下面< fdisk示範四>,將分割區刪除,變成空白磁區,以便接下來的練習。

 

我找了一顆標示320GB的硬碟示範,實際可用容量大概 298.1GB。如下圖▼,磁碟分割把它假想成從Star Sector到End Sector那條線要分成幾段。

 

 

fdisk示範一將整顆硬碟劃成一個分區,如下圖▼

$ sudo fdisk /dev/sda

如果你了解更多參數細節,可以按下m,如果只想試著操作或操作失誤,可以按下q不變更離開

按n創建新的分區,接下來敲四下Enter鍵,確認以下四個項目維持預設值,多按了也不用擔心。最後輸入w寫入並離開。

 

 

fdisk示範二:規劃2個主分割區,如下圖▼

pi@raspberrypi ~ $ sudo fdisk /dev/sda Command (m for help): n    #創建一個分割區
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p    #Enter=預設 建立第一個主要分割區
Partition number (1-4, default 1): 1    #Enter=預設 設定分割區的編號為1
First sector (2048-625140334, default 2048):    #Enter=預設  起始磁區2048
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-625140334, default 625140334): +100G    #要求100GiB空間

Command (m for help): n    #創建一個分割區
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p    #
Enter=預設  建立第二個主要分割區
Partition number (1-4, default 2): 2    #Enter=預設 設定分割區的編號為2
First sector (209717248-625140334, default 209717248):    #Enter=預設 接續用第一分割區後的磁區
Using default value 209717248
Last sector, +sectors or +size{K,M,G} (209717248-625140334, default 625140334):    #Enter=預設 到最後一個磁區結束,就是使用完整容量
Using default value 625140334

Command (m for help): w    #寫入
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

驗證:

pi@raspberrypi ~ $ lsblk /dev/sda
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda           8:0       0     298.1G 0    disk
├─sda1   8:1       0     100G     0    part
└─sda2   8:2       0     198.1G  0    part

 

 

fdisk示範三:規劃1個主分割區2個邏輯分割區,如下圖▼

#不過各位知道我愛摸魚,如果要切100、99、99 GiB,我會切出三個都是主分割區,這題當然是為了讓各位了解特別設計的。

pi@raspberrypi ~ $ sudo fdisk /dev/sda

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-625140334, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-625140334, default 625140334): +100G
#前面的部分我就不註解了

Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): e   #先建立延伸分割區
Partition number (1-4, default 2): 2
First sector (209717248-625140334, default 209717248):   #Enter=預設 要求延伸分割區的起始磁區,也是接續第一分割區
Using default value 209717248
Last sector, +sectors or +size{K,M,G} (209717248-625140334, default 625140334):    #Enter=預設 到硬碟最後一個磁區
Using default value 625140334

Command (m for help): n
Partition type:
   p   primary (1 primary, 1 extended, 2 free)
   l   logical (numbered from 5)
Select (default p): l    #輸入l 建立第一個邏輯分割區
Adding logical partition 5
First sector (209719296-625140334, default 209719296):
Using default value 209719296
Last sector, +sectors or +size{K,M,G} (209719296-625140334, default 625140334): +99G   
#要求99GiB的容量

Command (m for help): n
Partition type:
   p   primary (1 primary, 1 extended, 2 free)
   l   logical (numbered from 5)
Select (default p):l     
#輸入l 建立第二個邏輯分割區
Adding logical partition 6
First sector (417339392-625140334, default 417339392):
Using default value 417339392    #
Last sector, +sectors or +size{K,M,G} (417339392-625140334, default 625140334):
Using default value 625140334

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.


驗證:

pi@raspberrypi ~ $ lsblk /dev/sda
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 298.1G  0 disk
├─sda1   8:1    0   100G  0 part
├─sda2   8:2    0     1K  0 part
├─sda5   8:5    0    99G  0 part
└─sda6   8:6    0  99.1G  0 part

 

 

fdisk示範四:打掉所有的分割區

pi@raspberrypi ~ $ sudo fdisk /dev/sda

Command (m for help): d    #刪除延伸分割區
Partition number (1-6): 2

Command (m for help): d    #刪除主要分割區
Selected partition 1

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.


pi@raspberrypi ~ $ lsblk /dev/sda
NAME MAJ:MIN RM   SIZE   RO TYPE MOUNTPOINT
sda          8:0      0     298.1G  0   disk

 

 

3. gdisk工具


這套工具就是為了GPT分割表的,Raspberry Pi沒有內建,必須另外安裝。操作方式和fdisk差不多。

$ sudo apt-get install gdisk
#安裝gdisk

 

gdisk示範一:規劃2個主分割區,100GiB和198GiB,硬碟總容量298GiB

pi@raspberrypi ~ $ sudo gdisk /dev/sda
GPT fdisk (gdisk) version 0.8.5

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


***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format.
THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by typing 'q' if
you don't want to convert your MBR partitions to GPT format!
***************************************************************


Command (? for help): n    #創建第一個分區
Partition number (1-128, default 1):    #Enter 預設1
First sector (34-625140301, default = 2048) or {+-}size{KMGTP}:    #Enter 預設2048
Last sector (2048-625140301, default = 625140301) or {+-}size{KMGTP}: +100G    #要求100GiB的空間
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'

Command (? for help): n    #創建第二個分區
Partition number (2-128, default 2):    #Enter 預設2
First sector (34-625140301, default = 209717248) or {+-}size{KMGTP}:
    #Enter 預設接續之前的分區
Last sector (209717248-625140301, default = 625140301) or {+-}size{KMGTP}:    #Enter 預設到結束磁區

Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'

Command (? for help): w    #寫入

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!   
#警告標語

Do you want to proceed? (Y/N): y    #再次確認,輸入y執行
OK; writing new GUID partition table (GPT) to /dev/sda.
The operation has completed successfully.

 

gdisk查詢

pi@raspberrypi ~ $  sudo gdisk /dev/sda
GPT fdisk (gdisk) version 0.8.5

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

Found valid GPT with protective MBR; using GPT.

Command (? for help): i     #輸入i查詢分區
Partition number (1-2): 1    #輸入1分區代碼
Partition GUID code: 0FC63DAF-8483-4772-8E79-3D69D8477DE4 (Linux filesystem)
Partition unique GUID: 30AFE8B9-1F84-4326-BC55-ECBC9E97EA79
First sector: 2048 (at 1024.0 KiB)    #分區的起始磁區
Last sector: 209717247 (at 100.0 GiB)    #分區的結束磁區(在100GiB位置)
Partition size: 209715200 sectors (100.0 GiB)
Attribute flags: 0000000000000000
Partition name: 'Linux filesystem'

Command (? for help): i
Partition number (1-2): 2
Partition GUID code: 0FC63DAF-8483-4772-8E79-3D69D8477DE4 (Linux filesystem)
Partition unique GUID: A4ACCF3E-0F98-4B90-942D-37E69B11E494
First sector: 209717248 (at 100.0 GiB)   
#分區的起始磁區(從100GiB的位置)
Last sector: 625140301 (at 298.1 GiB)    #分區的結束磁區(在298GiB的位置)
Partition size: 415423054 sectors (198.1 GiB)    #分區容量
Attribute flags: 0000000000000000
Partition name: 'Linux filesystem'

Command (? for help): q    #結束

 

 

4. mkfs.ext4指令(格式化)


mkfs是建置檔案系統 (make filesystem)的縮寫,就是俗稱的格式化,後面接ext4是代表要使用的格式。

$ sudo mkfs.ext4 -L Data /dev/sda1

mkfs.ext4 [-b size] [-L label] 分割區目錄

參數說明:

-L:後面接這個裝置的目錄名稱。
-b:設定區塊 block 單位是byte,是檔案系統內容最小的單位,可以用1024、2048、4096,如果不使用該參數,代表預設是4096至於這參數,

如果設定數值大:降低讀寫的頻率,加快大檔讀寫。缺點:浪費較多空間。如果設定較小,優缺點都會反過來。做個比喻,如果有個檔案佔1KiB,放入區塊4KiB的分割區內,就是占用4KiB,造成3KiB的空間浪費。不過,我通常還是維持預設,除非有該分區預計要存入大量小檔案。若之後要重設,就得重新格式化。

如果您有進階需求,比如說:要格式化成ext3、ext2、xfs...等,或是有志之士想研究Inode數目、大小...等設定,請參考:

格式化存儲裝置成為 Ext2/Ext3/Ext4 檔案系統
鳥哥的 Linux 私房菜:第七章、Linux 磁碟與檔案系統管理
在U盘上安装 Arch Linux (2013-07)

 

 

附錄 4K對齊的問題(講古)


傳統硬碟採的磁區(Sector)是512 Byte,這是該裝置最小的儲存單位,但2010年之後先進格式化( Advanced Format)的硬碟和固態硬碟(Solid State Disk、Solid State Drive, SSD)採用4KiB磁區。因傳統硬碟分割邏輯,設定第63個磁軌(track)或稱磁柱(cylinder)開始,而4K設備的起始磁區需被8整除<5>(512 Byte × 8 = 4KiB),63不是8的倍數,如果舊的作業系統(例:Windows XP)例如或磁碟分割工具認不得4K的設備,舊的邏輯套用在4KiB磁區的設備上,會造成檔案系統(file system)的叢集(cluster)跨區,聽不懂可以參考:SSD 新手使用須知:4K 對齊調教實戰,提昇 SSD 效能。於是有了轟轟烈烈的「4K對齊」問題,將導致硬碟或SSD效能較差。

後來查完資料[4],發現對4K對齊的擔憂沒有意義,因為新版本的分割工具fdisk、gdisk已經放棄用磁軌的定義,自動將所有分區對到2048、1024 KiB磁區,使用上不必再去條一堆參數,保持預設就不會有4K對齊的問題。

如果你用$ sudo fdisk -h去查更多參數的用法,你能找到fdisk的3個參數如下:

-C <number>           specify the number of cylinders(磁柱)
-H <number>           specify the number of heads(磁頭)
-S <number>           specify the number of sectors (磁區) per track(磁軌)

很多年前,那個SSD剛出的年代,高手Jeffrey B. Layton 靠條-H和-S,達到分割區的4K對齊,詳細請看:Aligning SSD Partitions。不過,這已經是過去式,如今不需要再用這些參數了

 

如何驗證4K對齊[10, 11, 12, 13]

只要注意起始磁區可以被8整除即可。首先看你用MBR或GPT,決定你用fdisk或gdisk執行查詢,拿起計算機將First sector的數值除以8,可以整除代表4K對齊完成。如果你忘了怎麼查詢,馬上Ctrl+F搜尋本文:「fdisk查詢」或「gdisk查詢」,多多練習喔!

▼以gdisk為例 

 

呼!為了心中的4K疑惑,爬了N篇文,整理成寫長篇大論,希望能做更清楚的描述,暫時告一段落,真的設定適一下就完成了。不過別忘記,Linux下還有掛載點(Raspbain會自動掛載到 /Media 目錄下)給權限兩個重點要注意,可以回到本文的開頭目錄看看,沒給權限還是不能用,但算是相對簡單滴,當然你可以去看神人鳥哥,去天龍書局買本好書,大多Linux入門書都會講解,不然先問google大神呦~

 
 

參考資料


  1. Globally unique identifier, Wikipedia
  2. GUID磁碟分割表, Wikipedia
  3. 鳥哥的 Linux 私房菜:第七章、Linux 磁碟與檔案系統管理
  4. Advanced Format, Wikipedia
  5. 人生第一顆固態硬碟-Intel 530 240GB SATA3
  6. File system, Wikipedia
  7. SSD 新手使用須知:4K 對齊調教實戰,提昇 SSD 效能
  8. Difference between revisions of "Fdisk"
  9. Aligning SSD Partitions
  10. MAKE SURE 4K ALIGNMENT ON SSD(英文)
  11. Ubuntu 固态硬盘 4K 对齐及启用 Trim(中文)
  12. Linux下检查硬盘是否4K对齐
  13. 在U盘上安装 Arch Linux (2013-07)(4K問題和格式化)

沒有留言:

張貼留言