home products tech support contact us

 Linux 技術支援    ⇒   基礎篇    進階篇    補腦篇    指令索引    中⇒ENG
版權所有, 引用請註明出處

 硬碟操作

1.0 Linux 下的硬碟和檔案系統目錄結構
       Linux filesystem 檔案系統
           ext2 檔案系統
           ext3/ext4 檔案系統
       Unix 目錄結構
       Linux 下的硬碟和設備檔案
1.1 顯示硬碟資訊
       df 顯示硬碟使用量
       du 顯示目錄使用量
       blkid 顯示硬碟資訊
1.2 硬碟分割(Disk partitioning)
       傳統 MBR 的硬碟分割
           primary partition
           extended partition
                logical partition
           fdisk 分割硬碟
       新型 GPT 磁碟分割
           parted 分割硬碟
       partprobe 重讀分割區
1.3 格式化檔案系統
       mkfs 格式化 filesystem
       tune2fs 調整 ext 檔案系統
       e2label 設定 filesystem 標籤
       fsck 檢查和嘗試修復檔案系統
1.4 mount 掛載 filesystem
       mount 基本用法
         /etc/mtab 掛載情形
       標籤掛載
        UUID/PARTUUID 掛載
       掛載 USB 隨身碟/軟碟
       掛載 CD-ROM
       /etc/fstab 設定開機自動掛載
       umount 卸載
       掛載虛擬裝置


 

硬碟操作


1.0 Linux 下的硬碟和檔案系統目錄結構


Linux filesystem 檔案系統

當我們讀寫一個檔案到,不用去管檔案到底是存在硬碟的那個磁區(sector)和磁軌(track)或磁柱(cylinder),也不用管檔案存取在何種媒體如硬碟/USB Flash drive/CD-ROM 等,因檔案系統(filesystem)幫我們在背後處理好了。

檔案系統規劃如何管理儲存媒體,所以不同的作業系統支援的 filesystem 不盡相同,且不同的檔案系統也都有其優缺點,以 Windows 7/Windows 10 為例,如格式化 USB flash drive 的檔案系統,選項可能有下圖中的 FAT、FAT32、NTFS、exFAT 等選項。

format option
如果把 SD 卡格式化成 Widnows 原生的〝NTFS〞部分的數位相機或手機可能無法讀取,如格式化成〝FAT〞單一檔案不能大於 2G 而如為〝FAT32〞單一檔案不能大於 4G。所以檔案系統攸關檔案的處理能力,例如把 Linux 檔案系統內的檔案複製到 USB 隨身碟 (預設為 FAT32 檔案系統)會流失權限等資訊。

Windows 只能安裝在 ntfs 的檔系統別無選擇,而 Linux 可玩性大多了可安裝在原生的 ext2/ext3/ex4 或其他廠商貢獻的 ReiserFS/xfs/Btrfs 等;某些 filesystem 擅長處理大檔案,某些對小檔案效率較高,或者有的特別適合資料庫,使用者可根據需求來選擇(選擇性多,煩惱也多),。

檔案系統也是 PC 的作業系統必備的元素之一,例如微軟剛出道時的作業系統最主要的功能就是提供檔案系統.故取名〝磁碟作業系統〞DOS(Disk Operating System)。 Linux 原生的檔案系統為 ext2ext3/ext4。

^ back on top ^

Unix 目錄結構
說明 Unix/Linux 目錄結構之前先對比一下大家熟悉的 Windows,在命令模式下輸入 START C: 會執行Windows 檔案總管(Windows Explorer),可能有如下目錄 :
windows c driver
因被 Windows 洗腦慣了,我第一次玩 Linux 時一直找不到〝C 碟〞或〝C:\〞而大傷腦筋,因 Linux 中可沒有如 Windows 的〝本機磁碟(C:)〞這概念, Unix/Linux 叫〝檔案系統目錄結構〞或叫〝檔案系統階層標準〞(Filesystem Hierarchy Standard,FHS),如下圖。

linux Filesystem Hierarchy Standard

Linux 的 FHS 可由一顆或好幾顆硬碟所組成,最上層由根目錄〝/〞開始。其下的目錄如下(但為了區別,上圖故意上了不同的顏色)。

不管那套 Linux 發行版,檔案系統目錄結構應都大同小異,因大都會遵循〝檔案系統結構標準〞(Filesystem Hierarchy Standard,FHS)。FHS 中定義了 Linux 檔案系統結構應有那些的目錄和目錄內容,其內容大致如下:

^ back on top ^

Linux 下的硬碟和設備檔案
UNIX-like 的設計哲學之一是〝Everything is a File〞(一切都是檔案),所以硬碟也被 Linux 當成〝檔案〞,例如 Windows 下的〝C 碟〞在 Linux 可能被視為檔案〝/dev/sda〞,下表為部分周邊裝置和 Linux 設備檔案(Device file)對照表。
周邊裝置和 Linux 設備檔案對照表
周邊裝置 Linux 設備檔案
IDE (ATAPI)硬碟 /dev/sdX 或 /dev/hdX 設備檔案為 〝/dev/sdX〞還是〝/dev/hdX〞視Linux 發行版而定[]。(X 為小寫字母 a,b,c,d....)
SATA 硬碟 /dev/sdX  
NVMe 硬碟 /dev/nvme#n1 #為數字 0,1,2,3...
SCSI 裝置
SCSI 硬碟 /dev/sdX  
SCSI 磁帶機 /dev/st0
SCSI 通用設備 /dev/sg
串列埠(Serial port) /dev/ttyS#  
USB 裝置  
USB 轉串列埠裝置 /dev/ttyUSB  
USB Flash Disk /dev/sdX 命名方式同 SCSI/SATA硬碟
USB 印表機 /dev/usb/lp#
其他
並列埠印表機 /dev/lp#
PS/2 /dev/psaux
光碟 /dev/fd# 通常為〝dev/cdrom〞的連結檔
軟碟 /dev/sr# #為數字,通常為〝dev/floopy〞連結檔

Linux 設備檔案對照表把重點放在硬碟在 Linux 下的設備檔案(上表黃底部分),因後續的操作範例會用到 。

^ back on top ^

1.1 顯示硬碟資訊
df 顯示硬碟使用量
了解硬碟的使用量最簡單的就是 df(disk free),df 可顯示每一掛載partition 使用量。

例:
$  df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda5             13172924   3837376   8655600  31% /
/dev/sda2              4956316    154760   4545724   4% /home
/dev/sda1               194442     12060    172343   7% /boot
tmpfs                   514304        12    514292   1% /dev/shm
/dev/sdb1             31210416     88736  31121680   1% /media/disk

上例的 filesystem 欄中出現兩個裝置〝dev/sda#〞(# 為數字)和 〝dev/sdb#〞可知目前有兩個硬碟,以硬碟〝dev/sda〞為例共分割了〝dev/sda5〞、〝dev/sda2〞和〝dev/sda1〞 四個 partition 而掛載點各為〝/〞、〝/home〞和〝/boot〞。

而〝tmpfs〞(/dev/shm)並不是真正的硬碟,而是有點類似 RAM Disk(用記憶體虛擬的硬碟),大部份的Linux 發行版皆會預設有一〝tmpfs〞。由於是 RAM 模擬的故速度快如電,如果有某個檔案很大讀寫很慢時可複製到〝/dev/shm〞下來操作。但記得處理完要複製到實體的硬碟因〝/dev/shm〞內的檔案如露亦如電,重開機後就會揮發掉。

主要的選項 df -h 為把大小單位用比較親民的 KB, MB, 或 GB 來顯示。df -i 顯示使用了多少的 inode 空間(以百分比顯示) ,而 df -T 為顯示為何種 filesystem df -t 只顯示指定的 filesystem。

例:
$ df -T ←顯示各 partition 的 filesystem 種類
Filesystem    Type   1K-blocks      Used Available Use% Mounted on
/dev/sda5     ext3    13172924   3876612   8616364  32% /
/dev/sda2     ext3     4956316    154656   4545828   4% /home
/dev/sda1     ext3      194442     12060    172343   7% /boot
tmpfs        tmpfs      514304        12    514292   1% /dev/shm
/dev/sdb1     ext2    20635700     44992  19542472   1% /media/DB
/dev/sdc1     vfat    31195120        16  31195104   1% /media/disk
$ df -t ext3 -t vfat ←只列出 ext2 和 vfat
Filesystem    Type   1K-blocks      Used Available Use% Mounted on
/dev/sdb1     ext2    20635700     44992  19542472   1% /media/DB
/dev/sdc1     vfat    31195120        16  31195104   1% /media/disk


df 後面接目錄或檔案會顯示該檔在那個硬碟的那個 partition 。

例:
$ df -h /bin/bash ←查看檔案〝/bin/bash〞存放的位置
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda5             3.9G  3.6G  173M  96% /

^ back on top ^

du 顯示目錄使用量
du (disk usage)和指令 tree 很像但多了顯示目錄的大小。

例:
$ du /etc ←顯示目錄〝/etc〞下各子目錄的大小
40      /etc/redhat-lsb
8       /etc/yum/pluginconf.d
24      /etc/yum
du: `/etc/audisp': Permission denied
32      /etc/samba
8       /etc/sysconfig/modules
388     /etc/sysconfig/network-scripts
以下略
$ du /etc | sort -n ←依目錄大小排序

預設顯示的單位是 1024 bytes,選項 du -h 為把大小單位用 KB, MB, 或 GB 來顯示。

其他常用的選項有 du -a 顯示目錄內各別檔案的大小。du -s 僅顯示指定目錄的總和大小 。

例:
$ du -sh ~/ ←顯示家目錄的總大小
16M      /home/aaa/

如果以一般帳號登入,有些目錄或檔案因有權限問題而不能讀取會影響統計, 大部份和硬碟操作有關的指令除了 dudf 外都需 Superuser才能操作。

更多 du 操作說明可參考連結

^ back on top ^

blkid 顯示硬碟資訊
Unix/Linux 對硬碟等儲存媒體裝置叫〝block devices〞,故工具 blkid 是顯示 block devices id。(一般要用 root 登入才能正確的執行和顯示且沒掛載的 filesystem 也會顯示。)

blkid 是了解硬碟資訊的好工具用法也不難如下例。

例:
# blkid ←顯示硬碟資訊
/dev/sda5: LABEL="/" UUID="24328158-f8c3-4c5e-9be0-cbd1ceee581f" SEC_TYPE="ext2" TYPE="ext3"
/dev/sda1: LABEL="/boot" UUID="8ab1dede-36dd-4469-a174-ffb04f9ee6df" SEC_TYPE="ext2" TYPE="ext3"
以下略

主要的資訊有設備檔案, 標籤名稱 UUID 和何種檔案系統。其中的 UUID (Universally Unique Identifier,通用唯一識別碼)為格式化產生的一組唯一號碼,可用於 mount,或 LVMRAID 識別硬碟或 partition,不會因升級 Linux Kernel 或變更 BIOS 設定或用了不同的Linux 發行版而改變了硬碟的設備檔案(如〝/dev/hda〞變〝/dev/sda〞)。
如只想顯示指定資訊選項為〝-s〞,用法為 blkid -s [LABEL][UUID][TYPE]

例:
# blkid -s TYPE ←顯示各 partiton 為何種 filesystem
/dev/sda5: TYPE="ext3"
/dev/sda1: TYPE="ext3"
/dev/sda2: TYPE="ext3"
/dev/sda3: TYPE="swap"
/dev/sdb1: TYPE="ext3"
/dev/sdc1: TYPE="vfat"
# blkid -s LABEL ←顯示各 filesystem 的標籤名稱(有取 LABEL 名稱才會顯示)
/dev/sda5: LABEL="/"
/dev/sda1: LABEL="/boot"
/dev/sda2: LABEL="/home"
/dev/sda3: LABEL="SWAP-sda3"
/dev/sdb1: LABEL="data"
/dev/sdc1: LABEL="PEN_FLASH"
# blkid -s UUID ←顯示各 partition 的 UUID
/dev/sda1: UUID="9da5bd9a-300f-42f8-8d32-49af244a4c4f"
/dev/sda2: UUID="374b2969-3c63-438f-8762-3db53f96f409"
/dev/sda3: UUID="a2e9407d-8a07-4d68-8a4a-ebd712280f10"

輸出和裝備有關的資訊選項為〝-o〞,用法為 blkid -o [device][full][value]

例:
# blkid -o device ←顯示各設備檔案
/dev/sda5
/dev/sda1
/dev/sda2
/dev/sda3
/dev/sdb1
/dev/sdc1

^ back on top ^

1.2 硬碟分割 (Disk partitioning)
一個房子如很大,可能會隔間為許多房間,同樣的硬碟也可以適當的分割為幾個較小的空間,分割硬碟的動作叫〝硬碟分割〞(Disk partitioning)。而 partition 分割出來的磁碟就好像真的擁用那麼多的硬碟,以熟悉的 Windows/DOS 來舉例雖只有一顆硬碟,經硬碟分割後就有本機磁碟C:/D:/E:等,好像真的有好幾顆硬碟。

不管什麼作業系統,硬碟至少要分割一個以上的 partition 才可工作。把一顆硬碟分割成多個磁碟的好處有: 至於硬碟分割多個 partition 的缺點為如果此顆硬碟真的掛了,覆巢之下無完卵,此顆硬碟所分割出來的 partition 也隨之同年同月同日死。故可考慮把不同的 partition 放在不同的實體硬碟來分散風險,以免雞蛋都放在同一籃子裡。

硬碟分割的慨念無關作業系統,差別可能是名詞用語沒統一和不同的作業系統所支援的硬碟分割表不一樣,故貫通原理可套用到 Winodws/Mac OS/Linux。

PC 上常見的硬碟分割表有分傳統的 MBR 硬碟分割和新型式的 GPT 硬碟分割,這兩種 Linux 都有良好的支援。

硬碟分割好 partition 後並不能馬上使用,還要經如下步驟:
This information was last updated on : Oct 23 2021
目前,較新版本的作業系統,如Windows 10及以上版本,或主機板 BIOS 不再支援MBR,建議使用GPT(GUID Partition Table)進行分割GPT

^ back on top ^

你提供的HTML代码看起来已经相当完整和规范,不过还有一些细微的调整可以提高可读性和结构。以下是修正后的版本: html Copy code 傳統 MBR 的硬碟分割
MBR〝主引導磁區紀錄〞(Master Boot Record, MBR) 是傳統 PC 的硬碟分割和開機的方式,在 1983 年隨 PC-DOS 2.0 一直延用至今。優點是幾乎所有 PC 都支援,相對的缺點是 MBR 只用 32-bit 的 LBA 定址,故只能支援 232 x 512 byte,約 2.19TB 以下容量的硬碟。(當時作夢也沒想到硬碟會超過 2TB)。MBR 方式是 PC 剛開機時 BIOS 會先讀取硬碟的最開頭(Cylinder 0、Head 0、Sector 1)大小 512 Byte 的地方稱〝MBR〞(主引導磁區紀錄)。
如有點頭暈看下表可能會比較清楚,一顆硬碟的 MBR partition table 直接記錄的 partition 最多只有 4 個,而直接記錄的 partition 稱 Primay partition。
硬碟 Partition (Max 4 個 Primary Partition)
Primary 1 Primary 2 Primary 3 Primary 4

如要分割超過 4 個 partition,要把某 partition 改記錄指標叫 Extended Partition。
硬碟 Partition (3 個 Primary+1個 Extended )
Primary 1 Primary 2 Primary 3 Extended

再根據 Extended 上的指標(住址)上的記錄去找額外規劃的硬碟分割表叫 Logical Partition。
Primary
Partition 1
Primary
Partition 2
Primary
Partition3
Extended Logical
Partition 1
Logical
Partition 2
Logical
Partition 3
Logical
Partition 4
....... Logica
Partition n

而如要分割超過 4 個 partition, Primary Partition 不一定要用那麼多個,也可如下分割一個 Primary,其餘皆 Extended 所分割的 Logical Partition。
Primary
Partition
Extended Logical
Partition1
Logical
Partition 2
Logical
Partition 3
Logical
Partition 4
....... Logical
Partition n

以 Windows 來說,開機的 Primary Partition 多為 C 碟,其餘的 partition 依序為 D 碟 E 碟等,但 Linux 可不是這樣分,Linux 對 partition 的命名法如下:
例如一顆 SATA 硬碟分割 4 個 Primary Partition, 硬碟各 partition 的裝置名稱如下(綠字部分):
SATA 硬碟
SATA 硬碟 @port 1 /dev/sda1 /dev/sda2 /dev/sda3 /dev/sda4
SATA 硬碟 @port 2 /dev/sdb1 /dev/sdb2 /dev/sdb3 /dev/sdb4

再強調一次,無論如何 Primary Partition 數字部份小於等於 4。

再舉例,一顆 SATA 硬碟@poart1 分割 2 個 Primary Partition 和一個 Extended Partition, 而 Extended Partition 又分割 3 個 Logical Partition,此時硬碟各 partition 的裝置名稱如下:
Partitioning of the Hard Disk:2 Primary Partitions+3 Logical Partitions
Primary
Partition 1
Primary
Partition 2
Extended Logical
Partition 1
Logical
Partition 2
Logical
Partition 3
/dev/sda1 /dev/sda2 Extended /dev/sda5 /dev/sda6 /dev/sda7

延伸分割(Extended Partition)因只是指標不能直接拿來用,要再分割為 Logical Partition 才能使用,而所分割的 Logical Partition 數字是由 5 開始。

如下例以 df 列出硬碟資訊 ,其中的〝/dev/sda5〞(根目錄的 partition)就是 logical partition。
$  df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda5             13172924   3837376   8655600  31% / ←logical partition
/dev/sda2              4956316    154760   4545724   4% /home
/dev/sda1               194442     12060    172343   7% /boot
tmpfs                   514304        12    514292   1% /dev/shm
/dev/sdb1             31210416     88736  31121680   1% /media/disk

如果硬碟分割多個 partition 到底用那一個 partition 開機呢?不管硬碟分割幾個 partition,只有 Primary Partition 可設為可開機的〝啟動分割區〞(Active partition);Logical Partition 不可設為啟動分割區。

^ back on top ^

fdisk 分割硬碟
傳統 MBR 硬碟分割工具是 fdisk,由於 fdisk 是一個互動程式操作起來不複雜也不用去背命令,但一定要了解其背景知識如 primary partition & extended partitionlogical partition 的常識和了解硬碟在 Linux 下的設備檔案。因一時操作的錯誤要救回資料幾近零。


一般使用者是不能操作危險的 fdisk ,故要用 Superuser(root) 登入來操作。如沒拆機器或看 BIOS 的資訊,有時根本不知道 PC 內有幾顆硬碟,此時可用選項 fdisk -l (小寫的 L)來列出硬碟資訊。

例:(以 root 登入操作)
# fdisk -l ←列出硬碟資訊

Disk /dev/sda: 21.4 GB, 21474836480 bytes ←第一顆硬碟〝/dev/sda〞
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000243c8

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          25      200781   83  Linux ←〝*〞boot partiton
/dev/sda2              26         662     5116702+  83  Linux
/dev/sda3             663         789     1020127+  82  Linux swap / Solaris
/dev/sda4             790        2610    14627182+   5  Extended
/dev/sda5             790        2610    14627151   83  Linux

Disk /dev/sdb: 21.4 GB, 21474836480 bytes ←第二顆硬碟〝/dev/sdb〞
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000

Disk /dev/sdb doesn't contain a valid partition table ←〝/dev/sdb〞此為新的硬碟還沒 分割過 partition

fdisk 可列出一顆硬碟分割了多少 partition,上例〝/dev/sda〞,分割出〝/dev/sda1~5〞共五個 partition,但 fdisk 無法透露 partition 名稱,要知道〝/dev/sda1~5〞各掛載 的 partition名稱要交叉參考指令 df 所指供的資訊。

如為新的硬碟如上例中的第二顆〝/dev/sdb〞,因沒分割過故沒有數字部分(如〝/dev/sdb1〞 );接下來就用這顆硬碟來示範如何分割 partition。

fdisk 後面加硬碟設備檔案就可對那顆硬碟操作,如不確定 Linux 的設備檔案是〝/dev/sda〞或〝/dev/hda〞用 fdisk -l ls /dev/[sh]d* 來確認一下[]。

例:
# ls /dev/[sh]d* ←列出有那些硬碟或 partition
/dev/sda /dev/sda1 /dev/sda2 /dev/sda3 /dev/sda4 /dev/sda5 /dev/sdb

上例中〝/dev/sdb〞 後面沒接數字(如〝/dev/sdb1〞)故 partition 還沒規劃過,接下來實際操作來分割此硬碟。

例:(以 root 登入操作)
# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x9939c1b3.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.


The number of cylinders for this disk is set to 2610.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): ←如忘那有那些命令可用,可按 <m>

因操作 fdisk 極度的危險,故任何時可按 m (m for manual)列出命令的簡單說明,且操作過程中都只在 RAM 中進行,只要不按 w 寫入 partition table 隨時按 q 退出 fdisk 都是安全的,按 m 後的命令說明如下。

例:(進入 fdisk 後按 m )(不同版本的 fisk 操作畫面略異)
Command (m for help): m
Command action
   a   toggle a bootable flag ←設定開機的旗標
   b   edit bsd disklabel ←編輯 BSD 作業系統的硬碟標籤
   c   toggle the dos compatibility flag ←設定 dos 相容的旗標(如dos/win95/98)
   d   delete a partition ←刪除 partition
   l   list known partition types ←列出支援的 partition 種類和 id
   m   print this menu ←fdisk 命令的簡單說明
   n   add a new partition ←建立新的 partition
   o   create a new empty DOS partition table ←建立空的 DOS partition table(如想清除硬碟現存任何 partition 也可選此)
   p   print the partition table ←顯示目前操作所規劃的 partition table
   q   quit without saving changes ←放棄並退出 fdisk
   s   create a new empty Sun disklabel ←建立空的 SUN 作業系統的硬碟標籤
   t   change a partition's system id ←變更 partition 的 id
   u   change display/entry units ←切換顯示分區起始位置單位(磁柱和磁區來回切換)
   v   verify the partition table ←驗證 partition table
   w   write table to disk and exit ←寫入 partition 並退出
   x   extra functionality (experts only) ←進入專家模式的額外操作 (按<r>又回到一般模式)

如果想清除硬碟現存任何 partition 可用 o 建立空的 DOS partition 會清空任何 partition 重新開始規劃,我們先來示範建立一新的 Linux partition 。

(fdisk 操作)
Command (m for help): n ←建立新的 partition
Command action
   e   extended ←建立 extended partition
   p   primary partition (1-4) ←建立 primary partition
p ←按 <p> 建立 primary partition
Partition number (1-4): 1 ←輸入要建立的 parimary partition
First cylinder (1-2610, default 1):↵ Enter ←輸入起始磁柱(一般按<ENTER>用預設值即可)
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-2610, default 2610): +10000M ←輸入此 partition 截止磁柱或大小(建議用大小,輸入〝+xxxG〞或〝+xxxM〞)或最大的容量按<Enter>

Command (m for help): p ←顯示目前操作所規劃的 partition table 來確認一下

Disk /dev/sdb: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x378a1ba0

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1217     9775521   83  Linux

Command (m for help): w ←寫入 partition 並退出
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
You have new mail in /var/spool/mail/root

硬碟的 partition 大小=磁柱(cylinder) x 磁頭(head) x 磁區(sector) x 512 Byte,但不用煩惱分割時要去計算,交給 fdisk 去轉換就好了,例如按 n 新增 partition 會要求輸入〝起始磁柱〞(First cylinder),按 ↵ Enter 就是此 partition 的起始磁柱,而此 partition 的大小就輸入〝+sizeG 或 +sizeM 或 +sizeK〞或按 ↵ Enter 把剩餘的空間都給此 partition。

如有變更 partition 要重開機,因 Linux kernel 只在開機時載入 partition table, 雖可用指令 partprobe 強迫 Kernel 更新 partition table,但果如此硬碟在還沒變更 partition 時已掛載還是有可能新舊 partition table 不同步,總之 partition 有變更重新開機比較保險。

上例只示範分割一個 primary partition,有興趣的話自行測試刪除 partition 或增加一些 paimary/enxtended partition 玩一玩就會貫通。

上例在分割 partition 的過程中有按 p 來顯示目前的 partition table,如想建立非 Linux partition 可按 t 來改變 partition 的 id,按 l(小寫的 L)會列出所有支援的 partition 種類和 id 。

^ back on top ^

新型 GPT 磁碟分割
GPT(GUID Partition Table)磁碟分割主要為了克服 MBR 硬碟分割 Partition 時不能超過 2.19 TB 的限制,且可支援到天文數字的 18EB(1EB=1024PB)。

傳統的 BIOS 因開機時會先讀取硬碟 MBR 的 parititon 記錄,而受限 MBR 定圵的關係 partition 不能超過 2 TB 而逐漸不符合現代的需求。

因此 Intel 用來取代老舊的 BIOS 而主導的一新界面叫〝EFI 〞(Extensible Firmware Interface,可延伸韌體介面) EFI 對硬碟分割表和開機程序重新定義。

GPT 另一個好處是沒有 MBR Partition 最多四個 primary partition 的限制,所以就沒有所謂的 extended partitionlogical partition,所以論理一顆硬碟可安裝超過四個以上的作業系統(可開機的 partition) & partiton 可超過 2.19 TB。


^ back on top ^

parted 分割硬碟
parted 是 GNU 所釋出的磁碟分割工具,parted 名稱為 partition 和 editor 兩字的縮寫,故望文生義就是用來編輯 partition, parted 同時支援 MBRGPT 和蘋果電腦的 mac patition table。

由於硬碟越來越大, 當分割的 partition > 2T 就需 GPT 來分割加上先進格式化硬碟和固態硬碟(SSD)的竄起是趨勢為不可逆轉的現象,這些 parted 都比 fdisk 提供更多的支援,故建議多用 parted 來取代老舊的 fdisk

parted 的操作可分互動模式(interactive)和命令模式(command line),互動模式比較友善和不易出錯,而命令模式比較快速,適合大量快速的操作。

^ back on top ^

重讀分割區
因 Linux kernel 只在開機時載入disk partition table,如用 fdiskparted 變更過分割區,可不用重開機用工具 partprobe (partition probe)即可重讀 disk partition。
常用的選項有〝-s〞 顯示分割區內容摘要。

例:
# partprobe -s ←印出分割區摘要
/dev/sda: gpt partitions 1 2 3 4 5
/dev/sdb: gpt partitions 1 2 3 5 6 7 8 9 4


^ back on top ^



 1.3 格式化檔案系統
partition 如經 fdiskparted 或其他工具分割完要經格式化後才可正常的使用,且格式化的檔案系統要和 partition 的 filesystem type (id)一致,例如以 partedmkpart 設 filesystem type 為 ext2 則可格式化為 ext2ext3 或 ext4 的 filesystem,但不可格式化為 FAT32 或其他的檔案系統否則可能會發生相容問題。

以 ex2/ext3/ext4 的 filesystem 來說分割完 partiton 要再格式化才能使用的原因為格式化時要分配 inode 和指定 block 的大小,如原 filesystem 內已有資料,格式化完後資料會都不見,所以操作時要很小心,且只有supersuer 才可操作。在 Linux 下常用的格式化工具為 mkfs

mkfs 格式化 filesystem
mkfs 為一〝前端 〞(front-end)程式,所謂前端程式實際上是一個殼主要為讓格式化不同 filesystem 時有一致的操作界面,例如 mkfs -t vfat 為格式化 FAT32 的 filesystem,事實上是執行程式 mkfs.vfat ,同樣的 mkfs -t ext2 為執行 mkfs.ext2。如不知系統支援那幾種檔案系統的格式化可輸入 ls /sbin/mkfs.* 查看一下。

需注意的是如 partition 已掛載是不能操作格式化的。

例:
# ls /sbin/mkfs.* ←查看系統支援那些 filesystem 的格式化
/sbin/mkfs.btrfs /sbin/mkfs.ext3 /sbin/mkfs.minix /sbin/mkfs.xfs
/sbin/mkfs.cramfs /sbin/mkfs.ext4 /sbin/mkfs.msdos
/sbin/mkfs.ext2 /sbin/mkfs.fat /sbin/mkfs.vfat /sbin/mkfs.exfat

mkfs 可格式化大部份主流的 filesystem,用法如下::
語法 mkfs [-otpiton] [fs][-option] device
指令名稱/功能/命令使用者 選項 功能
mkfs/
(mak filesystem)格式化檔案系統/
root
-t 指定格式化的檔案系統, 常用的如下:
ext2, ext3 或 ext4:Linux 原生檔案系統。
ntfs:Windows NT,XP 以上的檔案系統。
vfat: 支援長檔名的 FAT(FAT32)。
exfat: exFAT
xfs: 一種日誌式高效檔案系統
msdos: 只支援 8.3 檔名的 FAT。
-b 指定 block 大小 (不適用 vfat/msdos/ntfs)。
-L 設定 partition 標籤 (不適用 vfat/msdos/ntfs)。
fs fs(filesystem option) 後面可接的選項如下:
-c :檢查看有無壞軌再格式化。
-l:(小寫的 L)讀取 badblocks 所輸出的檔案。
-v:顯示格式化過程。

例:
# mkfs /dev/sdb1 ←如都沒選項,預設格式化的 filesystem 為 ext2
# mkfs -t ext4 /dev/sdb ←格式化為 ext4
# mkfs -t ext3 -b 2048 -L DB /dev/sdb2 ←格式化為 ext3,block=2k,標籤=DB
# mkfs fs -c /dev/sdb1 ←格式化前先檢查有無壞軌
# mkfs -t vfat /dev/sdc1 ←格式化為 FAT32
# mkfd -t msdos /dev/fd0 ←格式化軟碟為 msdos

^ back on top ^

tune2fs 調整 ext 檔案系統
檔案損壞時由於 ext3ext2 有更佳修復的機率,所以建議都升級到 ext3。用 tune2fs -j 就可無縫安全的從 ext2 升級到 ext3。

This information was last updated on : Aug 15 2020
tune2fs 1.41.0 以上版本支援 ext3 升級到 ext4. [註 1.3]



例:
# tune2fs -j /dev/sdb1 ←將 dev/sdb1 由原 ext2 升級到 ext3

tune2fs 不只可用來升級 filesystem ,一般用來設定多久檢查一次 ext2/ext3/ext4 filesystem, 檢查方式有兩種 tune2fs -c 設定 filesystem 掛載幾次後會自動檢查,而 tune2fs -i 設定檢查間隔.詳細用法如下:
語法 tune2fs [-otpiton] device
指令名稱/功能/命令使用者 選項 功能
tune2fs/
(tune to filesystem)教調檔案系統/
root
-l(小寫 L) 列出 filesystem superblock 和其他資訊
-c # 設定filesystem 掛載幾次後會自動檢查 filesystem(# 為數字,如為 0 或 -l 取消掛載都檢查)
-i#[dmw] 設定自動檢查 filesystem 的時間間隔.(# 為數字,如為 0 或 -l 不檢查;d天m月w周)
-m # 保留多少百分比的 block(# 為數字,一般系統預設保留 5% 的 block 給系統)
-r # 設定保留的多少 bock.(# 為數字)
-j ext2 轉 ext3
-L 設定 partition 標籤(同 e2labelmkfs -L 設的標籤名稱)
-o 額外的掛載選項

例:
# tune2fs -L "share" /dev/sdb1 ←將 dev/sdb1 設標籤名為〝share〞
# tune2fs -l /dev/sda2 | grep "Last mount" ←查看最後掛載的時間
# tune2fs -m 10 /dev/sdb1 ←保留 10% 的 block
# tune2fs -i 3m /dev/sdb1 ←三個月後檢查 filesystem
# tune2fs -c 100 /dev/sdb1 ←設定掛載 100 次後自動檢查 filesystem
# tune2fs -c -1 /dev/sdb1 ←取消掛載檢查

^ back on top ^

e2label 設定 filesystem 標籤
一個 filesystem (一般一個 partition 只能規劃一個 filesystem)為了方便識別,可為其 filesystem 設一標籤名稱,如 filessystem 為 ext2/ext3 或 ext4 可用 e2label 設定其標籤名稱,其語法為 e2label device [label_name] 標籤名稱名稱不可以超過 16 個字元,如省略標籤名則顯示既有標籤名。

例:
# e2label /dev/sdc1 ←顯示目前的標籤
lab_data
# e2label /dev/sdc1 "hello world" ←將 /dev/sdc1 設標籤為〝hello world〞

如 filesystem 為 FAT,設定標籤的指令為 dosfslabel mlabel -i

更多操作範例和說明參考連結



^ back on top ^

fsck 檢查和嘗試修復檔案系統
檢查和嘗試修復檔案系統指令為 fsck。 系統可能因突然的斷電或某軟體當掉而自動或被迫重開機,此時因 filesystem 沒經正常的卸載再開機時系統會自動執行 fsck
fsckmkfs 類似為前端程式,實際會根據不同的 filesystem 執行相對應的工具如 fsck.ext2fsck.ext3fsck.ext4fsck.vfate2fsck (可執行 ls /sbin/fsck.* 查看有支援那些檔案系統)。

除了不正常的關機外,開機時也會根據掛載次數或掛載間隔 (Check interval )來判斷是否開機時要自動用 fsck 來檢查和修復檔案系統(可用 tune2fs -l DEVICE 來顯示以上資訊)。
開機時 fsck 檢查 filesystem 是系統還沒掛載時就作動,故開機後如想用fsck 來檢查某檔案系統務必要先卸載,否則該檔案系統可能會毀損 !!!!

fsck 要檢查的 filesystem 可用設備檔案(如 fsck /dev/sda2 )或掛載點(如 fsck /home)。

例:
# df ←用 df 確認一下掛載點或設備檔案
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda5             13172924   3858480   8634496  31% /
tmpfs                   514304        12    514292   1% /dev/shm
/dev/sda2              4956316    154676   4545808   4% /home
/dev/sda1               194442     12060    172343   7% /boot
# umount /home ←卸載〝/home〞
# fsck /home ←檢查 〝/home〞
fsck 1.40.2 (12-Jul-2007)
e2fsck 1.40.2 (12-Jul-2007)
/home: clean, 569/1280000 files, 78765/1279175 blocks

fsck -A 為根據〝/etc/fstab〞要自動掛載的 partition 才會檢查,而 fsck -AR fsck -A 但略過根目錄,常用來檢查除根目錄外的所有 partition。(最好用 init 1 令系統進入單用戶模式〝Single-user Mode〞後卸載除根目錄的 partition 後再執行)。

例:
# init 1 ←進入 sigle user mode (維護模式)
# umount -a ←卸載所有開機自動掛載的 partition
umount: /:device is busy ←根目錄使用中,一般不可卸載
# fsck -AR ←檢查除根目錄外開機掛載的所有 partition
fsck 1.40.2 (12-Jul-2007)
e2fsck 1.40.2 (12-Jul-2007)
e2fsck: need terminal for interactive repairs
e2fsck 1.40.2 (12-Jul-2007)
e2fsck: need terminal for interactive repairs

觀察 UNIX 目錄結構會發現 〝/bin〞,〝/dev〞等 Linux 運行必要的目錄和根目錄是同一 partition, 所以就算進入 runlevel = 1 的單用戶模式也無法卸載根目錄,但根目錄很重要卻因無法卸載而沒辦法用 fsck 來檢查和修復怎麼可以? 故一般在〝/etc/fstab〞會把根目錄所在的 partition 其第六欄的 pass number 設為 1 的最高優先檢查。如還是不放心用 shutdown -rF now 重開機後就會用強迫啟用 fsck 檢查。

比較常用的用法還有 fsck -a 為如檢查有錯誤則自動修復,相關的還有 fsck -f 沒問題也強迫修復; fsck -y 為則在偵測到錯誤時一律以 yes 回答(用於遇到進行修復時有 Yes/No 要使用者輸入)相反的用法 fsck -n 一律以 no 回答用於找出問題但不修復。

^ back on top ^

1.4 mount 掛載 filesystem
操作 Windows 時如接上已知 filesystem 的硬碟/光碟/軟碟/USB 隨身碟等媒體會自動的〝掛載〞馬上就可使用該媒體好像是很自然和理所當然。但在 UNIX 世界可不是這樣,新增加的儲存媒體要經系統管理員操作 mount (掛載)才可存取。(如授權一般的使用者也可操作 mount / umount 要在〝/etc/fstab〞內的 options 欄設定〝user〞)。

目前主流的 Linux 發行版(以 Fedora /CentOS 為例)對於儲存媒體的掛載是介於 Windows 和 UNIX 之間,如跑圖形界面(例如 GNOME 桌面環境)會自動的掛載 CD-ROM ,USB-flash-drive 或硬碟上已知的 filesystem。但以文字界面登入則保有 UNIX 傳統不會自動的掛載新增的 filesystem 。

但太自動的掛載儲存媒體有好有壞,好處是方便但伴隨的缺點是資安的危險,例如某硬碟有機密的資料如自動的掛載大家都可存取其內容實在沒什安全性。所以 Linux 的 server 大多會預設 init =3 的文字界面來開機運作,不但負載較輕且 filesystem 要經系統管理員手動的〝掛載〞才可存取其內容。

由於 Fedora /CentOS GNOME 桌面環境的〝 gnome-volume-manager〞會自動的掛載新增的儲存媒體會對操作 mount 造成干擾,故後續的說明和操作是反璞歸真的用文字面來開機和運作(編輯〝/etc/inittab〞中找到如下文字〝id:5:initdefault:〞,改為〝id:3:initdefault:〞重開機就會以 runlevel =3 的文字界面登入),盡量的接近原始的 UNIX 操作來示範。

This information was last updated on : June 17 2019
較新版的 Fedora /CentOS (如 CentOS 7 或更新版本)不再用設定檔〝/etc/inittab〞來設定開機時的 runlevel, 引入了 target 的概念,可以設定很多種開機模式 (target)。

例:(以 CentOS 7/CentOS8為例)
# systemctl set-default graphical.target  ←設圖形模式開機(預設 runlevel=5 )
# systemctl set-default multi-user.target ←用文字面開機 (runlevel=3 要重新開機才生效)
#
# systemctl get-default ←查看目前的模式
# systemctl list-units --type=target ←查看可設定的 target

要掛載 filesystem 時要指定一個目錄當掛載點 (mount point),當掛載成功後如該目錄內如原有資料會暫時隱形來呈現掛載的內容直到卸載才會再度現行。傳統上目錄〝/mnt〞為暫時的掛載點,而〝/media〞為移動儲存裝(removable media)的掛載點。

^ back on top ^



^ back on top ^





 
[註]傳統的 IDE 硬碟設備檔案為〝/dev/hd[a~d]〞,但 Linux Kernel 版本從 2.6.19 開始,統一了 IDE(PATA) 和 SATA 硬碟的裝置名稱,一律用 〝/dev/sd[a~p]〞



[註1.3] 將 Linux 的 ext3 檔案系統升級至 ext4 可以提供更好的性能和功能。以下是進行此升級的基本步驟:

請確保您在執行這些步驟之前備份了重要的數據,因為升級過程中有潛在的風險。

  1. 檢查舊檔案系統的一致性:在開始之前,使用 e2fsck 工具檢查 ext3 檔案系統的一致性。這將有助於確保檔案系統沒有錯誤。
    # umount /dev/sdXY ← 取代 XY 為您的 ext3 分區
    # e2fsck -f /dev/sdXY
  2. 執行升級:使用 tune2fs 工具將 ext3 partition 升級至 ext4。
    # sudo tune2fs -O extents,uninit_bg,dir_index /dev/sdXY
  3. 執行檔案系統檢查:再次執行 e2fsck 來確保升級過程沒有引入任何錯誤。
    # e2fsck -f /dev/sdXY
  4. 調整檔案系統屬性:使用 tune2fs 進一步調整新的 ext4 檔案系統屬性。
    #sudo tune2fs -O has_journal /dev/sdXY ← 添加日誌功能
  5. 掛載檔案系統:重新掛載您的分區。
    # mount /dev/sdXY /mnt ← 將 XY 替換為您的分區和掛載
  6. 更新 /etc/fstab:如果您計劃在每次開機時自動掛載此分區,請更新〝/etc/fstab〞檔案以反映您的更改。

  7. 備份重要數據:確保您的數據已經備份,然後重新啟動您的系統,以確保新的 ext4 檔案系統正確運行並無誤。