fdisk:Linux 下管理磁盤分區的利器

Linux BSD 設計 Linux中國 2019-04-06
fdisk:Linux 下管理磁盤分區的利器

人人都喜歡用 fdisk,它是 Linux 下管理磁盤分區的最佳利器之一。它可以操作最大 2TB 的分區。

-- Magesh Maruthamuthu

一塊硬盤可以被劃分成一個或多個邏輯磁盤,我們將其稱作分區。我們對硬盤進行的劃分信息被儲存於建立在扇區 0 的分區表(MBR 或 GPT)中。

Linux 需要至少一個分區來當作根文件系統,所以我們不能在沒有分區的情況下安裝 Linux 系統。當我們創建一個分區時,我們必須將它格式化為一個適合的文件系統,否則我們就沒辦法往裡面儲存文件了。

要在 Linux 中完成分區的相關工作,我們需要一些工具。Linux 下有很多可用的相關工具,我們曾介紹過 Parted 命令 。不過,今天我們的主角是 fdisk。

人人都喜歡用 fdisk,它是 Linux 下管理磁盤分區的最佳利器之一。它可以操作最大 2TB 的分區。大量 Linux 管理員都喜歡使用這個工具,因為當下 LVM 和 SAN 的原因,並沒有多少人會用到 2TB 以上的分區。並且這個工具被世界上許多的基礎設施所使用。如果你還是想創建比 2TB 更大的分區,請使用 parted 命令 或 cfdisk 命令。

對磁盤進行分區和創建文件系統是 Linux 管理員的日常。如果你在許多不同的環境中工作,你一定每天都會重複幾次這項操作。

Linux 內核是如何理解硬盤的?

作為人類,我們可以很輕鬆地理解一些事情;但是電腦就不是這樣了,它們需要合適的命名才能理解這些。

在 Linux 中,外圍設備都位於 /dev 掛載點,內核通過以下的方式理解硬盤:

  • /dev/hdX[a-z]: IDE 硬盤被命名為 hdX
  • /dev/sdX[a-z]: SCSI 硬盤被命名為 sdX
  • /dev/xdX[a-z]: XT 硬盤被命名為 xdX
  • /dev/vdX[a-z]: 虛擬硬盤被命名為 vdX
  • /dev/fdN: 軟盤被命名為 fdN
  • /dev/scdN or /dev/srN: CD-ROM 被命名為 /dev/scdN 或 /dev/srN

什麼是 fdisk 命令?

fdisk 的意思是 固定磁盤(Fixed Disk) 或 格式化磁盤(Format Disk),它是命令行下允許用戶對分區進行查看、創建、調整大小、刪除、移動和複製的工具。它支持 MBR、Sun、SGI、BSD 分區表,但是它不支持 GUID 分區表(GPT)。它不是為操作大分區設計的。

fdisk 允許我們在每塊硬盤上創建最多四個主分區。它們中的其中一個可以作為擴展分區,並下設多個邏輯分區。1-4 扇區作為主分區被保留,邏輯分區從扇區 5 開始。


fdisk:Linux 下管理磁盤分區的利器


如何在 Linux 下安裝 fdisk?

fdisk 作為核心組件內置於 Linux 中,所以你不必手動安裝它。

如何用 fdisk 列出可用磁盤?

在執行操作之前,我們必須知道的是哪些磁盤被加入了系統。要想列出所有可用的磁盤,請執行下文的命令。這個命令將會列出磁盤名稱、分區數量、分區表類型、磁盤識別代號、分區 ID 和分區類型。

$ sudo fdisk -l

Disk /dev/sda: 30 GiB, 32212254720 bytes, 62914560 sectors

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disklabel type: dos

Disk identifier: 0xeab59449

Device Boot Start End Sectors Size Id Type

/dev/sda1 * 20973568 62914559 41940992 20G 83 Linux

Disk /dev/sdb: 10 GiB, 10737418240 bytes, 20971520 sectors

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/sdc: 10 GiB, 10737418240 bytes, 20971520 sectors

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/sdd: 10 GiB, 10737418240 bytes, 20971520 sectors

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/sde: 10 GiB, 10737418240 bytes, 20971520 sectors

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

如何使用 fdisk 列出特定分區信息?

如果你希望查看指定分區的信息,請使用以下命令:

$ sudo fdisk -l /dev/sda

Disk /dev/sda: 30 GiB, 32212254720 bytes, 62914560 sectors

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disklabel type: dos

Disk identifier: 0xeab59449

Device Boot Start End Sectors Size Id Type

/dev/sda1 * 20973568 62914559 41940992 20G 83 Linux

如何列出 fdisk 所有的可用操作?

在 fdisk 中敲擊 m,它便會列出所有可用操作:

$ sudo fdisk /dev/sdc

Welcome to fdisk (util-linux 2.30.1).

Changes will remain in memory only, until you decide to write them.

Be careful before using the write command.

Device does not contain a recognized partition table.

Created a new DOS disklabel with disk identifier 0xe944b373.

Command (m for help): m

Help:

DOS (MBR)

a toggle a bootable flag

b edit nested BSD disklabel

c toggle the dos compatibility flag

Generic

d delete a partition

F list free unpartitioned space

l list known partition types

n add a new partition

p print the partition table

t change a partition type

v verify the partition table

i print information about a partition

Misc

m print this menu

u change display/entry units

x extra functionality (experts only)

Script

I load disk layout from sfdisk script file

O dump disk layout to sfdisk script file

Save & Exit

w write table to disk and exit

q quit without saving changes

Create a new label

g create a new empty GPT partition table

G create a new empty SGI (IRIX) partition table

o create a new empty DOS partition table

s create a new empty Sun partition table

如何使用 fdisk 列出分區類型?

在 fdisk 中敲擊 l,它便會列出所有可用分區的類型:

$ sudo fdisk /dev/sdc

Welcome to fdisk (util-linux 2.30.1).

Changes will remain in memory only, until you decide to write them.

Be careful before using the write command.

Device does not contain a recognized partition table.

Created a new DOS disklabel with disk identifier 0x9ffd00db.

Command (m for help): l

0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris

1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT-

2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT-

3 XENIX usr 3c PartitionMagic 84 OS/2 hidden or c6 DRDOS/sec (FAT-

4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx

5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data

6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / .

7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility

8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt

9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access

a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O

b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor

c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi ea Rufus alignment

e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD eb BeOS fs

f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ee GPT

10 OPUS 55 EZ-Drive a7 NeXTSTEP ef EFI (FAT-12/16/

11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f0 Linux/PA-RISC b

12 Compaq diagnost 5c Priam Edisk a9 NetBSD f1 SpeedStor

14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f4 SpeedStor

16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ f2 DOS secondary

17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fb VMware VMFS

18 AST SmartSleep 65 Novell Netware b8 BSDI swap fc VMware VMKCORE

1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fd Linux raid auto

1c Hidden W95 FAT3 75 PC/IX bc Acronis FAT32 L fe LANstep

1e Hidden W95 FAT1 80 Old Minix be Solaris boot ff BBT

如何使用 fdisk 創建一個磁盤分區?

如果你希望新建磁盤分區,請參考下面的步驟。比如我希望在 /dev/sdc 中新建四個分區(三個主分區和一個擴展分區),只需要執行下文的命令。

首先,請在操作 “First sector” 的時候先按下回車,然後在 “Last sector” 中輸入你希望創建分區的大小(可以在數字後面加 KB、MB、G 和 TB)。例如,你希望為這個分區擴容 1GB,就應該在 “Last sector” 中輸入 +1G。當你創建三個分區之後,fdisk 默認會將分區類型設為擴展分區,如果你希望創建第四個主分區,請輸入 p 來替代它的默認值 e。

$ sudo fdisk /dev/sdc

Welcome to fdisk (util-linux 2.30.1).

Changes will remain in memory only, until you decide to write them.

Be careful before using the write command.

Command (m for help): n

Partition type

p primary (0 primary, 0 extended, 4 free)

e extended (container for logical partitions)

Select (default p): Enter

Using default response p.

Partition number (1-4, default 1): Enter

First sector (2048-20971519, default 2048): Enter

Last sector, +sectors or +size{K,M,G,T,P} (2048-20971519, default 20971519): +1G

Created a new partition 1 of type 'Linux' and of size 1 GiB.

Command (m for help): p

Disk /dev/sdc: 10 GiB, 10737418240 bytes, 20971520 sectors

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disklabel type: dos

Disk identifier: 0x8cc8f9e5

Device Boot Start End Sectors Size Id Type

/dev/sdc1 2048 2099199 2097152 1G 83 Linux

Command (m for help): w

The partition table has been altered.

Calling ioctl() to re-read partition table.

Syncing disks.

如何使用 fdisk 創建擴展分區?

請注意,創建擴展分區時,你應該使用剩下的所有空間,以便之後在擴展分區下創建邏輯分區。

$ sudo fdisk /dev/sdc

Welcome to fdisk (util-linux 2.30.1).

Changes will remain in memory only, until you decide to write them.

Be careful before using the write command.

Command (m for help): n

Partition type

p primary (3 primary, 0 extended, 1 free)

e extended (container for logical partitions)

Select (default e): Enter

Using default response e.

Selected partition 4

First sector (6293504-20971519, default 6293504): Enter

Last sector, +sectors or +size{K,M,G,T,P} (6293504-20971519, default 20971519): Enter

Created a new partition 4 of type 'Extended' and of size 7 GiB.

Command (m for help): p

Disk /dev/sdc: 10 GiB, 10737418240 bytes, 20971520 sectors

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disklabel type: dos

Disk identifier: 0x8cc8f9e5

Device Boot Start End Sectors Size Id Type

/dev/sdc1 2048 2099199 2097152 1G 83 Linux

/dev/sdc2 2099200 4196351 2097152 1G 83 Linux

/dev/sdc3 4196352 6293503 2097152 1G 83 Linux

/dev/sdc4 6293504 20971519 14678016 7G 5 Extended

Command (m for help): w

The partition table has been altered.

Calling ioctl() to re-read partition table.

Syncing disks.

如何用 fdisk 查看未分配空間?

上文中,我們總共創建了四個分區(三個主分區和一個擴展分區)。在創建邏輯分區之前,擴展分區的容量將會以未分配空間顯示。

使用以下命令來顯示磁盤上的未分配空間,下面的示例中顯示的是 7GB:

$ sudo fdisk /dev/sdc

Welcome to fdisk (util-linux 2.30.1).

Changes will remain in memory only, until you decide to write them.

Be careful before using the write command.

Command (m for help): F

Unpartitioned space /dev/sdc: 7 GiB, 7515144192 bytes, 14678016 sectors

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

Start End Sectors Size

6293504 20971519 14678016 7G

Command (m for help): q

如何使用 fdisk 創建邏輯分區?

創建擴展分區後,請按照之前的步驟創建邏輯分區。在這裡,我創建了位於 /dev/sdc5 的 1GB 邏輯分區。你可以查看分區表值來確認這點。

$ sudo fdisk /dev/sdc

Welcome to fdisk (util-linux 2.30.1).

Changes will remain in memory only, until you decide to write them.

Be careful before using the write command.

Command (m for help): n

All primary partitions are in use.

Adding logical partition 5

First sector (6295552-20971519, default 6295552): Enter

Last sector, +sectors or +size{K,M,G,T,P} (6295552-20971519, default 20971519): +1G

Created a new partition 5 of type 'Linux' and of size 1 GiB.

Command (m for help): p

Disk /dev/sdc: 10 GiB, 10737418240 bytes, 20971520 sectors

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disklabel type: dos

Disk identifier: 0x8cc8f9e5

Device Boot Start End Sectors Size Id Type

/dev/sdc1 2048 2099199 2097152 1G 83 Linux

/dev/sdc2 2099200 4196351 2097152 1G 83 Linux

/dev/sdc3 4196352 6293503 2097152 1G 83 Linux

/dev/sdc4 6293504 20971519 14678016 7G 5 Extended

/dev/sdc5 6295552 8392703 2097152 1G 83 Linux

Command (m for help): w

The partition table has been altered.

Calling ioctl() to re-read partition table.

Syncing disks.

如何使用 fdisk 命令刪除分區?

如果我們不再使用某個分區,請按照下面的步驟刪除它。

請確保你輸入了正確的分區號。在這裡,我準備刪除 /dev/sdc2 分區:

$ sudo fdisk /dev/sdc

Welcome to fdisk (util-linux 2.30.1).

Changes will remain in memory only, until you decide to write them.

Be careful before using the write command.

Command (m for help): d

Partition number (1-5, default 5): 2

Partition 2 has been deleted.

Command (m for help): p

Disk /dev/sdc: 10 GiB, 10737418240 bytes, 20971520 sectors

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disklabel type: dos

Disk identifier: 0x8cc8f9e5

Device Boot Start End Sectors Size Id Type

/dev/sdc1 2048 2099199 2097152 1G 83 Linux

/dev/sdc3 4196352 6293503 2097152 1G 83 Linux

/dev/sdc4 6293504 20971519 14678016 7G 5 Extended

/dev/sdc5 6295552 8392703 2097152 1G 83 Linux

Command (m for help): w

The partition table has been altered.

Calling ioctl() to re-read partition table.

Syncing disks.

如何在 Linux 下格式化分區或建立文件系統?

在計算時,文件系統控制了數據的儲存方式,並通過 索引節點(Inode Tables) 來檢索數據。如果沒有文件系統,操作系統是無法找到信息儲存的位置的。

在此,我準備在 /dev/sdc1 上創建分區。有三種方式創建文件系統:

$ sudo mkfs.ext4 /dev/sdc1

$ sudo mkfs -t ext4 /dev/sdc1

$ sudo mke2fs /dev/sdc1

mke2fs 1.43.5 (04-Aug-2017)

Creating filesystem with 262144 4k blocks and 65536 inodes

Filesystem UUID: c0a99b51-2b61-4f6a-b960-eb60915faab0

Superblock backups stored on blocks:

32768, 98304, 163840, 229376

Allocating group tables: done

Writing inode tables: done

Creating journal (8192 blocks): done

Writing superblocks and filesystem accounting information: done

當你在分區上建立文件系統時,以下重要信息會同時被創建:

  • Filesystem UUID: UUID 代表了通用且獨一無二的識別符,UUID 在 Linux 中通常用來識別設備。它 128 位長的數字代表了 32 個十六進制數。
  • Superblock: 超級塊儲存了文件系統的元數據。如果某個文件系統的超級塊被破壞,我們就無法掛載它了(也就是說無法訪問其中的文件了)。
  • Inode: Inode 是類 Unix 系統中文件系統的數據結構,它儲存了所有除名稱以外的文件信息和數據。
  • Journal: 日誌式文件系統包含了用來修復電腦意外關機產生下錯誤信息的日誌。

如何在 Linux 中掛載分區?

在你創建完分區和文件系統之後,我們需要掛載它們以便使用。我們需要創建一個掛載點來掛載分區,使用 mkdir 來創建一個掛載點。

$ sudo mkdir -p /mnt/2g-new

如果你希望進行臨時掛載,請使用下面的命令。在計算機重啟之後,你會丟失這個掛載點。

$ sudo mount /dev/sdc1 /mnt/2g-new

如果你希望永久掛載某個分區,請將分區詳情加入 fstab 文件。我們既可以輸入設備名稱,也可以輸入 UUID。

使用設備名稱來進行永久掛載:

# vi /etc/fstab

/dev/sdc1 /mnt/2g-new ext4 defaults 0 0

使用 UUID 來進行永久掛載(請使用 blkid 來獲取 UUID):

$ sudo blkid

/dev/sdc1: UUID="d17e3c31-e2c9-4f11-809c-94a549bc43b7" TYPE="ext2" PARTUUID="8cc8f9e5-01"

/dev/sda1: UUID="d92fa769-e00f-4fd7-b6ed-ecf7224af7fa" TYPE="ext4" PARTUUID="eab59449-01"

/dev/sdc3: UUID="ca307aa4-0866-49b1-8184-004025789e63" TYPE="ext4" PARTUUID="8cc8f9e5-03"

/dev/sdc5: PARTUUID="8cc8f9e5-05"

# vi /etc/fstab

UUID=d17e3c31-e2c9-4f11-809c-94a549bc43b7 /mnt/2g-new ext4 defaults 0 0

使用 df 命令亦可:

$ df -h

Filesystem Size Used Avail Use% Mounted on

udev 969M 0 969M 0% /dev

tmpfs 200M 7.0M 193M 4% /run

/dev/sda1 20G 16G 3.0G 85% /

tmpfs 997M 0 997M 0% /dev/shm

tmpfs 5.0M 4.0K 5.0M 1% /run/lock

tmpfs 997M 0 997M 0% /sys/fs/cgroup

tmpfs 200M 28K 200M 1% /run/user/121

tmpfs 200M 25M 176M 13% /run/user/1000

/dev/sdc1 1008M 1.3M 956M 1% /mnt/2g-new


via: https://www.2daygeek.com/linux-fdisk-command-to-manage-disk-partitions/

作者: Magesh Maruthamuthu 選題: lujun9972 譯者: zhs852 校對: wxy

本文由 LCTT 原創編譯, Linux中國 榮譽推出

點擊“瞭解更多”可訪問文內鏈接

相關推薦

推薦中...