歡迎光臨
每天分享高質量文章

fdisk:Linux 下管理磁盤分割槽的利器 | Linux 中國

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

— Magesh Maruthamuthu

 

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

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

要在 Linux 中完成分割槽的相關工作,我們需要一些工具。Linux 下有很多可用的相關工具,我們曾介紹過 Parted 命令[1]。不過,今天我們的主角是 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 開始。

如何在 Linux 下安裝 fdisk?

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

如何用 fdisk 列出可用磁盤?

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

  1. $ sudo fdisk -l
  2. Disk /dev/sda: 30 GiB, 32212254720 bytes, 62914560 sectors
  3. Units: sectors of 1 * 512 = 512 bytes
  4. Sector size (logical/physical): 512 bytes / 512 bytes
  5. I/O size (minimum/optimal): 512 bytes / 512 bytes
  6. Disklabel type: dos
  7. Disk identifier: 0xeab59449
  8. Device     Boot    Start      End  Sectors Size Id Type
  9. /dev/sda1  *    20973568 62914559 41940992  20G 83 Linux
  10. Disk /dev/sdb: 10 GiB, 10737418240 bytes, 20971520 sectors
  11. Units: sectors of 1 * 512 = 512 bytes
  12. Sector size (logical/physical): 512 bytes / 512 bytes
  13. I/O size (minimum/optimal): 512 bytes / 512 bytes
  14. Disk /dev/sdc: 10 GiB, 10737418240 bytes, 20971520 sectors
  15. Units: sectors of 1 * 512 = 512 bytes
  16. Sector size (logical/physical): 512 bytes / 512 bytes
  17. I/O size (minimum/optimal): 512 bytes / 512 bytes
  18. Disk /dev/sdd: 10 GiB, 10737418240 bytes, 20971520 sectors
  19. Units: sectors of 1 * 512 = 512 bytes
  20. Sector size (logical/physical): 512 bytes / 512 bytes
  21. I/O size (minimum/optimal): 512 bytes / 512 bytes
  22. Disk /dev/sde: 10 GiB, 10737418240 bytes, 20971520 sectors
  23. Units: sectors of 1 * 512 = 512 bytes
  24. Sector size (logical/physical): 512 bytes / 512 bytes
  25. I/O size (minimum/optimal): 512 bytes / 512 bytes

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

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

  1. $ sudo fdisk -l /dev/sda
  2. Disk /dev/sda: 30 GiB, 32212254720 bytes, 62914560 sectors
  3. Units: sectors of 1 * 512 = 512 bytes
  4. Sector size (logical/physical): 512 bytes / 512 bytes
  5. I/O size (minimum/optimal): 512 bytes / 512 bytes
  6. Disklabel type: dos
  7. Disk identifier: 0xeab59449
  8. Device     Boot    Start      End  Sectors Size Id Type
  9. /dev/sda1  *    20973568 62914559 41940992  20G 83 Linux

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

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

  1. $ sudo fdisk /dev/sdc
  2. Welcome to fdisk (util-linux 2.30.1).
  3. Changes will remain in memory only, until you decide to write them.
  4. Be careful before using the write command.
  5. Device does not contain a recognized partition table.
  6. Created a new DOS disklabel with disk identifier 0xe944b373.
  7. Command (m for help): m
  8. Help:
  9.  DOS (MBR)
  10.   a   toggle a bootable flag
  11.   b   edit nested BSD disklabel
  12.   c   toggle the dos compatibility flag
  13.  Generic
  14.   d   delete a partition
  15.   F   list free unpartitioned space
  16.   l   list known partition types
  17.   n   add a new partition
  18.   p   print the partition table
  19.   t   change a partition type
  20.   v   verify the partition table
  21.   i   print information about a partition
  22.  Misc
  23.   m   print this menu
  24.   u   change display/entry units
  25.   x   extra functionality (experts only)
  26.  Script
  27.   I   load disk layout from sfdisk script file
  28.   O   dump disk layout to sfdisk script file
  29.  Save & Exit
  30.   w   write table to disk and exit
  31.   q   quit without saving changes
  32.  Create a new label
  33.   g   create a new empty GPT partition table
  34.   G   create a new empty SGI (IRIX) partition table
  35.   o   create a new empty DOS partition table
  36.   s   create a new empty Sun partition table

如何使用 fdisk 列出分割槽型別?

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

  1. $ sudo fdisk /dev/sdc
  2. Welcome to fdisk (util-linux 2.30.1).
  3. Changes will remain in memory only, until you decide to write them.
  4. Be careful before using the write command.
  5. Device does not contain a recognized partition table.
  6. Created a new DOS disklabel with disk identifier 0x9ffd00db.
  7. Command (m for help): l
  8. 0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris        
  9. 1  FAT12           27  Hidden NTFS Win 82  Linux swap / So c1  DRDOS/sec (FAT-
  10. 2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
  11. 3  XENIX usr       3c  PartitionMagic  84  OS/2 hidden or  c6  DRDOS/sec (FAT-
  12. 4  FAT16 <32M      40  Venix 80286     85  Linux extended  c7  Syrinx        
  13. 5  Extended        41  PPC PReP Boot   86  NTFS volume set da  Non-FS data    
  14. 6  FAT16           42  SFS             87  NTFS volume set db  CP/M / CTOS / .
  15. 7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux plaintext de  Dell Utility  
  16. 8  AIX             4e  QNX4.x 2nd part 8e  Linux LVM       df  BootIt        
  17. 9  AIX bootable    4f  QNX4.x 3rd part 93  Amoeba          e1  DOS access    
  18. a  OS/2 Boot Manag 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O        
  19. b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor      
  20. c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad hi ea  Rufus alignment
  21. e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         eb  BeOS fs        
  22. f  W95 Ext'd (LBA) 54  OnTrackDM6      a6  OpenBSD         ee  GPT            
  23. 10  OPUS            55  EZ-Drive        a7  NeXTSTEP        ef  EFI (FAT-12/16/
  24. 11  Hidden FAT12    56  Golden Bow      a8  Darwin UFS      f0  Linux/PA-RISC b
  25. 12  Compaq diagnost 5c  Priam Edisk     a9  NetBSD          f1  SpeedStor      
  26. 14  Hidden FAT16 <3 61  SpeedStor       ab  Darwin boot     f4  SpeedStor      
  27. 16  Hidden FAT16    63  GNU HURD or Sys af  HFS / HFS+      f2  DOS secondary  
  28. 17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fb  VMware VMFS    
  29. 18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fc  VMware VMKCORE
  30. 1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid fd  Linux raid auto
  31. 1c  Hidden W95 FAT3 75  PC/IX           bc  Acronis FAT32 L fe  LANstep        
  32. 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

  1. $ sudo fdisk /dev/sdc
  2. Welcome to fdisk (util-linux 2.30.1).
  3. Changes will remain in memory only, until you decide to write them.
  4. Be careful before using the write command.
  5. Command (m for help): n
  6. Partition type
  7.   p   primary (0 primary, 0 extended, 4 free)
  8.   e   extended (container for logical partitions)
  9. Select (default p): Enter
  10. Using default response p.
  11. Partition number (1-4, default 1): Enter
  12. First sector (2048-20971519, default 2048): Enter
  13. Last sector, +sectors or +size{K,M,G,T,P} (2048-20971519, default 20971519): +1G
  14. Created a new partition 1 of type 'Linux' and of size 1 GiB.
  15. Command (m for help): p
  16. Disk /dev/sdc: 10 GiB, 10737418240 bytes, 20971520 sectors
  17. Units: sectors of 1 * 512 = 512 bytes
  18. Sector size (logical/physical): 512 bytes / 512 bytes
  19. I/O size (minimum/optimal): 512 bytes / 512 bytes
  20. Disklabel type: dos
  21. Disk identifier: 0x8cc8f9e5
  22. Device     Boot Start     End Sectors Size Id Type
  23. /dev/sdc1        2048 2099199 2097152   1G 83 Linux
  24. Command (m for help): w
  25. The partition table has been altered.
  26. Calling ioctl() to re-read partition table.
  27. Syncing disks.

如何使用 fdisk 創建擴展分割槽?

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

  1. $ sudo fdisk /dev/sdc
  2. Welcome to fdisk (util-linux 2.30.1).
  3. Changes will remain in memory only, until you decide to write them.
  4. Be careful before using the write command.
  5. Command (m for help): n
  6. Partition type
  7.   p   primary (3 primary, 0 extended, 1 free)
  8.   e   extended (container for logical partitions)
  9. Select (default e): Enter
  10. Using default response e.
  11. Selected partition 4
  12. First sector (6293504-20971519, default 6293504): Enter
  13. Last sector, +sectors or +size{K,M,G,T,P} (6293504-20971519, default 20971519): Enter
  14. Created a new partition 4 of type 'Extended' and of size 7 GiB.
  15. Command (m for help): p
  16. Disk /dev/sdc: 10 GiB, 10737418240 bytes, 20971520 sectors
  17. Units: sectors of 1 * 512 = 512 bytes
  18. Sector size (logical/physical): 512 bytes / 512 bytes
  19. I/O size (minimum/optimal): 512 bytes / 512 bytes
  20. Disklabel type: dos
  21. Disk identifier: 0x8cc8f9e5
  22. Device     Boot   Start      End  Sectors Size Id Type
  23. /dev/sdc1          2048  2099199  2097152   1G 83 Linux
  24. /dev/sdc2       2099200  4196351  2097152   1G 83 Linux
  25. /dev/sdc3       4196352  6293503  2097152   1G 83 Linux
  26. /dev/sdc4       6293504 20971519 14678016   7G  5 Extended
  27. Command (m for help): w
  28. The partition table has been altered.
  29. Calling ioctl() to re-read partition table.
  30. Syncing disks.

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

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

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

  1. $ sudo fdisk /dev/sdc
  2. Welcome to fdisk (util-linux 2.30.1).
  3. Changes will remain in memory only, until you decide to write them.
  4. Be careful before using the write command.
  5. Command (m for help): F
  6. Unpartitioned space /dev/sdc: 7 GiB, 7515144192 bytes, 14678016 sectors
  7. Units: sectors of 1 * 512 = 512 bytes
  8. Sector size (logical/physical): 512 bytes / 512 bytes
  9.  Start      End  Sectors Size
  10. 6293504 20971519 14678016   7G
  11. Command (m for help): q

如何使用 fdisk 創建邏輯分割槽?

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

  1. $ sudo fdisk /dev/sdc
  2. Welcome to fdisk (util-linux 2.30.1).
  3. Changes will remain in memory only, until you decide to write them.
  4. Be careful before using the write command.
  5. Command (m for help): n
  6. All primary partitions are in use.
  7. Adding logical partition 5
  8. First sector (6295552-20971519, default 6295552): Enter
  9. Last sector, +sectors or +size{K,M,G,T,P} (6295552-20971519, default 20971519): +1G
  10. Created a new partition 5 of type 'Linux' and of size 1 GiB.
  11. Command (m for help): p
  12. Disk /dev/sdc: 10 GiB, 10737418240 bytes, 20971520 sectors
  13. Units: sectors of 1 * 512 = 512 bytes
  14. Sector size (logical/physical): 512 bytes / 512 bytes
  15. I/O size (minimum/optimal): 512 bytes / 512 bytes
  16. Disklabel type: dos
  17. Disk identifier: 0x8cc8f9e5
  18. Device     Boot   Start      End  Sectors Size Id Type
  19. /dev/sdc1          2048  2099199  2097152   1G 83 Linux
  20. /dev/sdc2       2099200  4196351  2097152   1G 83 Linux
  21. /dev/sdc3       4196352  6293503  2097152   1G 83 Linux
  22. /dev/sdc4       6293504 20971519 14678016   7G  5 Extended
  23. /dev/sdc5       6295552  8392703  2097152   1G 83 Linux
  24. Command (m for help): w
  25. The partition table has been altered.
  26. Calling ioctl() to re-read partition table.
  27. Syncing disks.

如何使用 fdisk 命令刪除分割槽?

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

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

  1. $ sudo fdisk /dev/sdc
  2. Welcome to fdisk (util-linux 2.30.1).
  3. Changes will remain in memory only, until you decide to write them.
  4. Be careful before using the write command.
  5. Command (m for help): d
  6. Partition number (1-5, default 5): 2
  7. Partition 2 has been deleted.
  8. Command (m for help): p
  9. Disk /dev/sdc: 10 GiB, 10737418240 bytes, 20971520 sectors
  10. Units: sectors of 1 * 512 = 512 bytes
  11. Sector size (logical/physical): 512 bytes / 512 bytes
  12. I/O size (minimum/optimal): 512 bytes / 512 bytes
  13. Disklabel type: dos
  14. Disk identifier: 0x8cc8f9e5
  15. Device     Boot   Start      End  Sectors Size Id Type
  16. /dev/sdc1          2048  2099199  2097152   1G 83 Linux
  17. /dev/sdc3       4196352  6293503  2097152   1G 83 Linux
  18. /dev/sdc4       6293504 20971519 14678016   7G  5 Extended
  19. /dev/sdc5       6295552  8392703  2097152   1G 83 Linux
  20. Command (m for help): w
  21. The partition table has been altered.
  22. Calling ioctl() to re-read partition table.
  23. Syncing disks.

如何在 Linux 下格式化分割槽或建立檔案系統?

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

在此,我準備在 /dev/sdc1 上創建分割槽。有三種方式創建檔案系統:

  1. $ sudo mkfs.ext4 /dev/sdc1
  2. $ sudo mkfs -t ext4 /dev/sdc1
  3. $ sudo mke2fs /dev/sdc1
  4. mke2fs 1.43.5 (04-Aug-2017)
  5. Creating filesystem with 262144 4k blocks and 65536 inodes
  6. Filesystem UUID: c0a99b51-2b61-4f6a-b960-eb60915faab0
  7. Superblock backups stored on blocks:
  8.    32768, 98304, 163840, 229376
  9. Allocating group tables: done                            
  10. Writing inode tables: done                            
  11. Creating journal (8192 blocks): done
  12. Writing superblocks and filesystem accounting information: done

當你在分割槽上建立檔案系統時,以下重要信息會同時被創建:

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

如何在 Linux 中掛載分割槽?

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

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

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

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

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

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

  1. # vi /etc/fstab
  2. /dev/sdc1 /mnt/2g-new ext4 defaults 0 0

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

  1. $ sudo blkid
  2. /dev/sdc1: UUID="d17e3c31-e2c9-4f11-809c-94a549bc43b7" TYPE="ext2" PARTUUID="8cc8f9e5-01"
  3. /dev/sda1: UUID="d92fa769-e00f-4fd7-b6ed-ecf7224af7fa" TYPE="ext4" PARTUUID="eab59449-01"
  4. /dev/sdc3: UUID="ca307aa4-0866-49b1-8184-004025789e63" TYPE="ext4" PARTUUID="8cc8f9e5-03"
  5. /dev/sdc5: PARTUUID="8cc8f9e5-05"
  6. # vi /etc/fstab
  7. UUID=d17e3c31-e2c9-4f11-809c-94a549bc43b7 /mnt/2g-new ext4 defaults 0 0

使用 df 命令亦可:

  1. $ df -h
  2. Filesystem      Size  Used Avail Use% Mounted on
  3. udev            969M     0  969M   0% /dev
  4. tmpfs           200M  7.0M  193M   4% /run
  5. /dev/sda1        20G   16G  3.0G  85% /
  6. tmpfs           997M     0  997M   0% /dev/shm
  7. tmpfs           5.0M  4.0K  5.0M   1% /run/lock
  8. tmpfs           997M     0  997M   0% /sys/fs/cgroup
  9. tmpfs           200M   28K  200M   1% /run/user/121
  10. tmpfs           200M   25M  176M  13% /run/user/1000
  11. /dev/sdc1      1008M  1.3M  956M   1% /mnt/2g-new

赞(0)

分享創造快樂