跳转至

磁盘和分区管理

1.磁盘类型

在 Linux 系统中,磁盘都以块设备文件的形式出现在 /dev 目录下,根据磁盘接口类型的不同,磁盘块设备文件名称也不同,形式如下:

磁盘接口类型 磁盘块设备文件名 说明 例子
SCSI/SATA/SAS /dev/sdX X 表示字母 a-z,依次对应存储设备。当该类型的磁盘数量超过 26 个时,使用两个字母,如 /dev/sdaa。 /dev/sda
virtioblk /dev/vdX X 表示字母 a-z,依次对应存储设备。 /dev/vda
NVMe /dev/nvmeXnY X 表示 NVMe 控制器编号(从 0 开始),Y 表示 NVMe 命名空间编号(从 1 开始)。命名空间通常与存储设备相对应。 /dev/nvme0n1
IDE /dev/hdX X 表示字母 a-z,依次对应存储设备。 /dev/hda

2.磁盘分区

通常在使用磁盘前,会将其分成一个或者多个逻辑区域,即磁盘分区。

划分好的磁盘分区会以块设备文件的形式出现在 /dev 目录下,形式如下:

磁盘块设备文件名 磁盘分区块设备文件名 说明 例子
/dev/sdX /dev/sdXN N 表示分区编号(从 1 开始)。 /dev/sda1
/dev/vdX /dev/vdXN N 表示分区编号(从 1 开始)。 /dev/vda1
/dev/nvmeXnY /dev/nvmeXnYpN N 表示分区编号(从 1 开始)。 /dev/nvme0n1p1
/dev/hdX /dev/hdXN N 表示分区编号(从 1 开始)。 /dev/hda1

2.1.磁盘分区表

在对磁盘分区前需要创建磁盘分区表,分区表保存了磁盘分区信息。OpenCloudOS 主要使用 MSDOS(MBR) 和 GPT(GUID Partition Table)两种类型的分区表。

分区表 最多分区数 最大分区大小
MSDOS(MBR) 4 个主分区或 3 个主分区和 1 个扩展分区(可以划分成多个逻辑分区) 2TiB(扇区大小为 512B)16TiB(扇区大小为 4KB)
GPT 128 8ZiB(扇区大小为 512B)64ZiB(扇区大小为 4KB)

2.2.MSDOS 分区表

MSDOS分区表存在在磁盘的第一个扇区,通常是 512B 大小,主要包含如下数据:

  • 主引导记录(Master Boot Record, MBR):可以安装 bootloader 程序,大小为 446B
  • 分区表(Partition Table):记录磁盘分区信息,大小为 64B ,每个分区信息占用 16B,最多包含四个分区信息
  • MBR 标记:内容是 55AA,大小为 2B

通常 legacy 引导下,使用 msdos 分区表,示例如下:

$ lsblk 
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS 
sda           8:0    0   50G  0 disk  
├─sda1        8:1    0    1G  0 part /boot 
└─sda2        8:2    0   49G  0 part  
  ├─os-root 253:0    0   30G  0 lvm  / 
  └─os-home 253:1    0   19G  0 lvm  /home 

$ parted /dev/sda print 
Model: ATA QEMU HARDDISK (scsi) 
Disk /dev/sda: 53.7GB 
Sector size (logical/physical): 512B/512B 
Partition Table: msdos 
Disk Flags:  

Number  Start   End     Size    Type     File system  Flags 
 1      1049kB  1075MB  1074MB  primary  ext4         boot 
 2      1075MB  53.7GB  52.6GB  primary               lvm

示例中的系统盘使用了 msdos 分区表,总共有两个分区,一个 boot 分区,另一个分区作为逻辑卷的物理卷使用。

2.3.GPT 分区表

GPT 分区表使用 LBA 对磁盘进行编址,每个 LBA 512B。GPT 分区结构如下:

  • LBA0:MBR 兼容区块,前 446B 存放 bootloader(UEFI 引导下,bootloader 不存放在此处),后 66B 为特殊标记,表明此磁盘为 GPT 分区
  • LBA1:GPT 表头记录,记录分区表本身的位置和大小,备份分区放置的位置以及 CRC32 校验码
  • LBA(2~33):分区表,记录分区信息,每个 LBA 可以记录 4 个分区信息。
  • LBA(-1):GPT 表头记录的备份
  • LBA(-33~-2):分区表的备份

UEFI 引导下,使用 GPT 分区表,示例如下:

$ lsblk 
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS 
sda           8:0    0   64G  0 disk  
├─sda1        8:1    0   50M  0 part /boot/efi 
├─sda2        8:2    0  512M  0 part /boot 
└─sda3        8:3    0 63.4G  0 part  
  ├─os-root 253:0    0   30G  0 lvm  / 
  └─os-home 253:1    0 33.4G  0 lvm  /home 

$ parted /dev/sda print 
Model: ATA Fedora Linux-0 S (scsi) 
Disk /dev/sda: 68.7GB 
Sector size (logical/physical): 512B/4096B 
Partition Table: gpt 
Disk Flags:  

Number  Start   End     Size    File system  Name                  Flags 
 1      1049kB  53.5MB  52.4MB  fat16        EFI System Partition  boot, esp 
 2      53.5MB  590MB   537MB   ext4 
 3      590MB   68.7GB  68.1GB                                     lvm

示例中的系统盘使用了 GPT 分区表,总共有三个分区,一个 EFI 分区,一个 boot 分区,另一个分区作为逻辑卷的物理卷使用。

3.磁盘及分区管理工具

3.1.使用 lsblk 查看块设备信息

lsblk 可以列出块设备信息,如下所示:

[root@localhost ~]# lsblk 
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS 
sda           8:0    0   60G  0 disk  
├─sda1        8:1    0    1M  0 part  
├─sda2        8:2    0    1G  0 part /boot 
└─sda3        8:3    0   59G  0 part  
  ├─os-root 253:0    0 39.6G  0 lvm  / 
  └─os-home 253:1    0 19.4G  0 lvm  /home 
sdb           8:16   0   30G  0 disk  
├─sdb1        8:17   0    1G  0 part  
├─sdb2        8:18   0    1G  0 part  
├─sdb3        8:19   0    1K  0 part  
├─sdb4        8:20   0   26G  0 part  
└─sdb5        8:21   0    1G  0 part  
sr0          11:0    1 13.8G  0 rom
  • NAME:磁盘或分区设备名
  • MAJ:MIN:磁盘或分区主次设备号
  • RM:是否为可移除设备,0 表示不可移除,1 表示可移除
  • SIZE:磁盘或分区容量
  • RO:是否为只读设备,0 表示只读,1 表示非只读
  • TYPE:设备类型,disk 表示磁盘,part 表示分区,lvm 表示逻辑卷
  • MOUNTPOINTS:挂载点

另外,从 lsblk 的输出中还可以看出磁盘分区之间的从属关系。

更详细命令选项,可以参考 man 手册。

3.2.使用 blkid 查看块设备信息

blkid 可以打印出设备属性,如下所示:

[root@localhost ~]# blkid 
/dev/mapper/os-home: UUID="f30c7d4a-c97d-427e-ba4e-24e28ffdebf5" BLOCK_SIZE="4096" TYPE="ext4" 
/dev/sr0: BLOCK_SIZE="2048" UUID="2023-05-08-12-35-52-00" LABEL="OpenCloudOS" TYPE="iso9660" PTTYPE="PMBR" 
/dev/mapper/os-root: UUID="2985bd9c-facc-49eb-8752-6c41915e65db" BLOCK_SIZE="4096" TYPE="ext4" 
/dev/sda2: UUID="57139a63-0e14-410b-ae05-c395732c206b" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="846b8e84-0d7e-484f-9cb" 
/dev/sda3: UUID="q6Vgxu-Wvpn-d3M9-c8Hk-dMT0-YXuM-Dccaml" TYPE="LVM2_member" PARTUUID="5d88c31f-ab83-46bd-b74e-bc507cc" 
/dev/sdb4: PARTUUID="1144bcd9-04" 
/dev/sdb2: PARTUUID="1144bcd9-02" 
/dev/sdb5: PARTUUID="1144bcd9-05" 
/dev/sdb1: PARTUUID="1144bcd9-01" 
/dev/sda1: PARTUUID="603c9161-aa71-4196-bbb8-e138dd0421b5"

冒号前面的部分表示设备,后面的部分表示设备或文件系统属性。

更详细命令选项,可以参考 man 手册。

3.3.使用 parted 操作磁盘分区

3.3.1.parted 概述

parted 命令支持 MSDOS 和 GPT 两种分区表,可以执行查看分区信息、创建分区表、创建分区、修改分区和删除分区等磁盘操作。

parted 命令支持交互式和命令行两种形式,直接执行 parted block-device 可以进入交互式界面,如下:

$ parted block-device 
(parted)

在交换界面可以直接使用子命令。输入 help,可以查看支持的所有子命令,如下:

(parted) help                                                           

输入 help COMMAND,可以查看子命令 COMMAND 的用法,如下:

(parted) help COMMAND

输入 quit 可以退出交互界面。

(parted) quit

示例如下:

下面的示例进入交互界面,使用的磁盘是 /dev/sdb,执行了 help,然后退出交互界面。

[root@localhost ~]# parted /dev/sdb 
GNU Parted 3.5 
Using /dev/sdb 
Welcome to GNU Parted! Type 'help' to view a list of commands. 
(parted) help 
align-check TYPE N                       check partition N for TYPE(min|opt) alignment
  help [COMMAND]                           print general help, or help on COMMAND 
  mklabel,mktable LABEL-TYPE               create a new disklabel (partition table) 
  mkpart PART-TYPE [FS-TYPE] START END     make a partition 
  name NUMBER NAME                         name partition NUMBER as NAME 
  print [devices|free|list,all]            display the partition table, or available devices, or free space, 
        or all found partitions 
  quit                                     exit program 
  rescue START END                         rescue a lost partition near START and END 
  resizepart NUMBER END                    resize partition NUMBER 
  rm NUMBER                                delete partition NUMBER 
  select DEVICE                            choose the device to edit 
  disk_set FLAG STATE                      change the FLAG on selected device 
  disk_toggle [FLAG]                       toggle the state of FLAG on selected device 
  set NUMBER FLAG STATE                    change the FLAG on partition NUMBER 
  toggle [NUMBER [FLAG]]                   toggle the state of FLAG on partition NUMBER 
  unit UNIT                                set the default unit to UNIT 
  version                                  display the version number and copyright information of GNU Parted 
(parted) quit

注意:如果不指定 block-device,会默认使用第一块磁盘,通常为 /dev/sda,可以通过命令的输出信息确认。

3.3.2.使用 parted 查看分区

可以使用子命令 print 查看分区。

3.3.2.1.使用 parted 交互界面查看分区

流程如下:

进入交互式界面。

$ parted block-device

使用子命令 print 显示当前磁盘分区信息或者所有磁盘分区信息。

(parted) print [devices|free|list,all]

参数为可选项,不加参数显示当前设备的分区信息。各参数含义如下:

devices:显示所有激活的磁盘。

free:查看当前磁盘的剩余容量。

list,all:查看所有磁盘的分区信息。

示例如下:

下面的示例打印块设备 /dev/sda 的分区信息:

[root@localhost ~]# parted /dev/sda 
GNU Parted 3.5 
Using /dev/sda 
Welcome to GNU Parted! Type 'help' to view a list of commands. 
(parted) print                                                             
Model: ATA QEMU HARDDISK (scsi) 
Disk /dev/sda: 64.4GB 
Sector size (logical/physical): 512B/512B 
Partition Table: gpt 
Disk Flags: pmbr_boot 

Number  Start   End     Size    File system  Name  Flags 
 1      1049kB  2097kB  1049kB                     bios_grub 
 2      2097kB  1076MB  1074MB  ext4 
 3      1076MB  64.4GB  63.3GB                     lvm
  • print 子命令列出的信息含义

Model: ATA QEMU HARDDISK (scsi):磁盘类型、制造商、型号和接口。

Disk /dev/sda: 64.4GB :磁盘对应的块设备文件和容量。

Sector size (logical/physical): 512B/512B:扇区大小。

Partition Table: gpt:分区表类型。

Disk Flags: pmbr_boot:磁盘标记,仅出现在 GPT 分区表的磁盘上,表示磁盘上存在特殊属性。示例中的 pmbr_boot 表示磁盘上存在保护性 MBR(PMBR),支持 BIOS 引导方式 。

Number:分区编号。

Start/End:分区起始和结束位置。

Size:分区容量。

File system:分区上文件系统类型。

Name:分区名称,仅出现在 GPT 分区表的磁盘上,可重复。

Flags:分区标记,示例中的 bios_grub 表示 BIOS boot 分区,BIOS 引导下,系统盘为 GPT 分区表时,必须存 BIOS boot 分区。

Type:分区类型,仅出现 MSDOS 分区表的磁盘上,取值为 primary/extended/logical,分别对应主分区、扩展分区和逻辑分区。

3.3.2.2.使用 parted 命令行查看分区

命令如下:

# parted block-device print

示例如下:

下面的示例打印块设备 /dev/sda 的分区信息:

[root@localhost ~]# parted /dev/sda print 
Model: ATA QEMU HARDDISK (scsi) 
Disk /dev/sda: 64.4GB 
Sector size (logical/physical): 512B/512B 
Partition Table: gpt 
Disk Flags: pmbr_boot 

Number  Start   End     Size    File system  Name  Flags 
 1      1049kB  2097kB  1049kB                     bios_grub 
 2      2097kB  1076MB  1074MB  ext4 
 3      1076MB  64.4GB  63.3GB                     lvm
3.3.2.3.更改显示单位

print 显示的位置和容量,默认单位为 compat,输入为 MB,输出为人类易读的形式,如 kB,MB,GB 等。这些数据不够精确,且以10进制为单位。当需要更精确的容量数据时,可以使用子命令 unit 修改显示单位。

(parted) unit UNIT

UNIT 为单位,支持的单位包括 s, B, kB, MB, GB, TB, compact, cyl, chs, %, kiB, MiB, GiB, TiB。

s 表示扇区。

kB, MB, GB, TB 基于十进制,后一个单位是前一个单位的 1000 倍。

compat 输入默认单位为 MB,输出单位则为人类易读的形式。

cyl 柱面。

chs 这是一个三元组 (cylinders, heads, sectors) 表示的位置,分别对应柱面,磁头,扇区。1 个柱面包含 255 个磁头,1 个磁头包含 2 个扇区。sectors 取值范围为 0 和 1,heads 的取值范围为 0~254。

当单位设置为 chs 时,磁盘容量显示的最后一个扇区的三元组(cylinders, heads, sectors) 位置,sectors 通常为 1,磁盘总扇区数量为 (cylinders * 255 * 2 + heads * 2 + sectors + 1) 。

% 百分比。

kiB, MiB, GiB, TiB 基于二进制,后一个单位是前一个单位的 1024 倍。

3.3.3.使用 parted 创建分区表

可以使用子命令 mklabel 或 mktable 创建分区表。

3.3.3.1.使用 parted 交互界面创建分区表

流程如下:

进入交互式界面。

$ parted block-device

创建分区表。如果磁盘上已经存在分区表,会打印告警信息,并需要人工确认是否继续。

(parted) mklabel LABEL-TYPE

确认分区表是否创建成功。

(parted) print

示例如下:

下面的示例在块设备 /dev/sdb 上创建 gpt 分区表。

[root@localhost ~]# parted /dev/sdb 
GNU Parted 3.5 
Using /dev/sdb 
Welcome to GNU Parted! Type 'help' to view a list of commands. 
(parted) mklabel gpt 
(parted) quit                                                              
Information: You may need to update /etc/fstab.
3.3.3.2.使用 parted 命令行创建分区表

命令如下:

# parted block-device mklabel LABEL-TYPE

示例如下:

下面的示例在块设备 /dev/sdb 上创建 gpt 分区表。

[root@localhost ~]# parted /dev/sdb mklabel gpt 2Information: You may need to update /etc/fstab.

3.3.4.使用 parted 创建分区

可以使用子命令 mkpart 创建分区。

3.3.4.1.使用 parted 交互界面创建分区

流程如下:

进入交互式界面。

$ parted block-device

根据实际需求,修改显示单位。

(parted) unit UNIT

查看剩余空间信息是否满足需求,不满足则需要调整分区。

(parted) print free

创建分区。

(parted) mkpart PART-TYPE [FS-TYPE] START END

PART-TYPE:当分区表为 MSDOS 时,可用值为 primary/extend/logical,分别对应主分区,扩展分区和逻辑分区,当扩展分区已存在时,才可以设置逻辑分区。当分区表为 GPT 时,该选项被设置为分区名称,可以为任意字符串。

FS-TYPE:可选项,设置分区的文件系统,仅设置分区文件系统字段元数据的值,不会实际创建文件系统。

START/END:分区起始和结束位置,支持的单位包括 s, B, kB, MB, GB, TB, compact, cyl, chs, %, kiB, MiB, GiB, TiB,不指定单位时使用当前 UNIT 下的默认单位。

分区创建完成后执行命令 partprobe,有些环境创建分区后,操作系统可能没有及时更新,内存中保留着旧的分区信息,使用 partprobe 命令通知操作系统重新扫描磁盘分区表,载入新的分区信息。

$ partprobe block-device

示例如下:

下面的示例在 /dev/sdb 上创建名为 test-part 的分区,分区起始位置为 1MiB,结束位置为 1GiB。

[root@localhost home]# parted /dev/sdb 
GNU Parted 3.5 
Using /dev/sdb 
Welcome to GNU Parted! Type 'help' to view a list of commands. 
(parted) unit kiB                                                          
(parted) print free                                                        
Model: ATA QEMU HARDDISK (scsi) 
Disk /dev/sdb: 31457280kiB 9Sector size (logical/physical): 512B/512B 
Partition Table: gpt 
Disk Flags:  

Number  Start    End          Size         File system  Name  Flags 
        17.0kiB  31457263kiB  31457247kiB  Free Space 

(parted) mkpart test-part 1MiB 1GiB                                      
(parted) print free                                                        
Model: ATA QEMU HARDDISK (scsi) 
Disk /dev/sdb: 31457280kiB 
Sector size (logical/physical): 512B/512B 
Partition Table: gpt 
Disk Flags:  

Number  Start       End          Size         File system  Name       Flags 
        17.0kiB     1024kiB      1007kiB      Free Space 
 1      1024kiB     1048576kiB   1047552kiB                test-part 
        1048576kiB  31457263kiB  30408688kiB  Free Space 

(parted) quit 
[root@localhost ~]# partprobe /dev/sdb
3.3.4.2.使用 parted 命令行创建分区

命令如下:

$ parted block-device mkpart PART-TYPE [FS-TYPE] START END

示例如下:

[root@localhost home]# parted /dev/sdb unit MiB print free 
Model: ATA QEMU HARDDISK (scsi) 
Disk /dev/sdb: 30720MiB 
Sector size (logical/physical): 512B/512B 
Partition Table: gpt 
Disk Flags:  

Number  Start    End       Size      File system  Name       Flags 
        0.02MiB  1.00MiB   0.98MiB   Free Space 
 1      1.00MiB  1024MiB   1023MiB                test-part 
        1024MiB  30720MiB  29696MiB  Free Space 

[root@localhost home]# parted /dev/sdb mkpart test-part2 1024MiB 2048MiB 
Information: You may need to update /etc/fstab. 

[root@localhost home]# partprobe /dev/sdb 

[root@localhost home]# parted /dev/sdb unit MiB print free 
Model: ATA QEMU HARDDISK (scsi) 
Disk /dev/sdb: 30720MiB 
Sector size (logical/physical): 512B/512B 
Partition Table: gpt 
Disk Flags:  

Number  Start    End       Size      File system  Name        Flags 
        0.02MiB  1.00MiB   0.98MiB   Free Space 
 1      1.00MiB  1024MiB   1023MiB                test-part 
 2      1024MiB  2048MiB   1024MiB                test-part2 
        2048MiB  30720MiB  28672MiB  Free Space

3.3.5.使用 parted 调整分区

3.3.5.1.使用 parted 交互界面调整分区

流程如下:

进入交互式界面。

$ parted block-device

根据实际需求,修改显示单位。

(parted) unit UNIT

查看分区信息。

(parted) print free

调整分区大小。

(parted) resizepart NUMBER END

NUMBER:待调整分区的编号。

END:调整后分区的结束位置,END 不能小于分区的起始大小。

重新扫描分区表。

$ partprobe block-device

示例如下:

[root@localhost home]# parted /dev/sdb 
GNU Parted 3.5 
Using /dev/sdb 
Welcome to GNU Parted! Type 'help' to view a list of commands. 
(parted) unit MiB 
(parted) print free                                                        
Model: ATA QEMU HARDDISK (scsi) 
Disk /dev/sdb: 30720MiB 
Sector size (logical/physical): 512B/512B 
Partition Table: gpt 
Disk Flags:  

Number  Start    End       Size      File system  Name        Flags 
        0.02MiB  1.00MiB   0.98MiB   Free Space 
 1      1.00MiB  1024MiB   1023MiB                test-part 
 2      1024MiB  2048MiB   1024MiB                test-part2 
        2048MiB  30720MiB  28672MiB  Free Space 

(parted) resizepart 2 4096MiB                                          
(parted) print free                                                        
Model: ATA QEMU HARDDISK (scsi) 
Disk /dev/sdb: 30720MiB 
Sector size (logical/physical): 512B/512B 
Partition Table: gpt 
Disk Flags: 

Number  Start    End       Size      File system  Name        Flags 
        0.02MiB  1.00MiB   0.98MiB   Free Space 
 1      1.00MiB  1024MiB   1023MiB                test-part 
 2      1024MiB  4096MiB   3072MiB                test-part2 
        4096MiB  30720MiB  26624MiB  Free Space 

(parted) quit 
[root@localhost ~]# partprobe /dev/sdb   
3.3.5.2.使用 parted 命令行调整分区

命令如下:

$ parted block-device resizepart NUMBER END

示例如下:

[root@localhost home]# parted /dev/sdb unit MiB print free 
Model: ATA QEMU HARDDISK (scsi) 
Disk /dev/sdb: 30720MiB 
Sector size (logical/physical): 512B/512B 
Partition Table: gpt 
Disk Flags:  

Number  Start    End       Size      File system  Name        Flags 
        0.02MiB  1.00MiB   0.98MiB   Free Space 
 1      1.00MiB  1024MiB   1023MiB                test-part 
 2      1024MiB  2048MiB   1024MiB                test-part2 
        2048MiB  30720MiB  28672MiB  Free Space 

[root@localhost home]# parted resizepart 2 4096MiB 

[root@localhost home]# parted /dev/sdb resizepart 2 4096MiB 
Information: You may need to update /etc/fstab. 

[root@localhost home]# partprobe /dev/sdb 

[root@localhost home]# parted /dev/sdb unit MiB print free 
Model: ATA QEMU HARDDISK (scsi) 
Disk /dev/sdb: 30720MiB 
Sector size (logical/physical): 512B/512B 
Partition Table: gpt 
Disk Flags:  

Number  Start    End       Size      File system  Name        Flags 
        0.02MiB  1.00MiB   0.98MiB   Free Space 
 1      1.00MiB  1024MiB   1023MiB                test-part 
 2      1024MiB  4096MiB   3072MiB                test-part2 
        4096MiB  30720MiB  26624MiB  Free Space

注意:缩小分区可能会导致数据丢失甚至文件系统损坏。

3.3.6.使用 parted 删除分区

3.3.6.1.使用 parted 交互界面删除分区

流程如下:

进入交互式界面。

$ parted block-device

查看分区信息。

(parted) print

删除分区。

(parted) rm NUMBER

重新扫描分区表。

$ partprobe block-device

注意:如果删除的分区存在文件系统,且已经写入到 /etc/fstab 文件内,需要从 /etc/fstab 中移除相关配置,否则,可能会导致操作系统启动失败。

示例如下:

[root@localhost home]# parted /dev/sdb 
GNU Parted 3.5 
Using /dev/sdb 
Welcome to GNU Parted! Type 'help' to view a list of commands. 
(parted) print 
Model: ATA QEMU HARDDISK (scsi) 
Disk /dev/sdb: 32.2GB 
Sector size (logical/physical): 512B/512B 
Partition Table: gpt 
Disk Flags:  

Number  Start   End     Size    File system  Name        Flags 
 1      1049kB  1074MB  1073MB  ext4         test-part 
 2      1074MB  2147MB  1074MB  ext4         test-part2 

(parted) rm 2 
(parted) print                                                             
Model: ATA QEMU HARDDISK (scsi) 
Disk /dev/sdb: 32.2GB 
Sector size (logical/physical): 512B/512B 
Partition Table: gpt 
Disk Flags:  

Number  Start   End     Size    File system  Name       Flags 
 1      1049kB  1074MB  1073MB  ext4         test-part 

(parted) quit                                                              
Information: You may need to update /etc/fstab. 

[root@localhost home]# partprobe /dev/sdb
3.3.6.2.使用 parted 命令行删除分区

命令如下:

$ parted block-device rm NUMBER

示例如下:

[root@localhost home]# parted /dev/sdb print 
Model: ATA QEMU HARDDISK (scsi) 
Disk /dev/sdb: 32.2GB 
Sector size (logical/physical): 512B/512B 
Partition Table: gpt 
Disk Flags:  

Number  Start   End     Size    File system  Name        Flags 
 1      1049kB  1074MB  1073MB  ext4         test-part 
 2      1074MB  2147MB  1074MB  ext4         test-part2 

[root@localhost home]# parted /dev/sdb rm 2 
Information: You may need to update /etc/fstab. 

[root@localhost home]# parted /dev/sdb print                               
Model: ATA QEMU HARDDISK (scsi) 
Disk /dev/sdb: 32.2GB 
Sector size (logical/physical): 512B/512B 
Partition Table: gpt 
Disk Flags:  

Number  Start   End     Size    File system  Name       Flags 
 1      1049kB  1074MB  1073MB  ext4         test-part

更多命令选项,请参考 man 手册。

3.4.使用 fdisk/gdisk 操作磁盘分区

3.4.1.fdisk 概述

fdisk 支持 MSDOS 和 GPT 两种分区表,可以执行查看分区信息、创建分区表、创建分区、修改分区和删除分区等磁盘操作。

fdisk 大部分操作需要在交互界面执行,直接执行 fdisk block-device 可以进入交互式界面,如下:

$ fdisk block-device 2Command (m for help): 

使用 m 查看帮助信息:

Command (m for help): m

使用 q 退出交互界面:

Command (m for help): q

3.4.2.使用 fdisk 查看分区

可以使用自命令 p 查看分区。

流程如下:

进入交互界面。

$ fdisk block-device

查看分区。

Command (m for help): p

示例如下:

下面的示例查看磁盘 /dev/sda 的分区。

[root@localhost home]# fdisk /dev/sda 

Welcome to fdisk (util-linux 2.37.4). 
Changes will remain in memory only, until you decide to write them. 
Be careful before using the write command. 

This disk is currently in use - repartitioning is probably a bad idea. 
It's recommended to umount all file systems, and swapoff all swap 
partitions on this disk. 


Command (m for help): print 

Disk /dev/sda: 60 GiB, 64424509440 bytes, 125829120 sectors 
Disk model: QEMU HARDDISK    
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: gpt 
Disk identifier: 3C81803B-8934-47FF-BE0B-37AE73EC68C0 

Device       Start       End   Sectors Size Type 
/dev/sda1     2048      4095      2048   1M BIOS boot 
/dev/sda2     4096   2101247   2097152   1G Linux filesystem 
/dev/sda3  2101248 125827071 123725824  59G Linux LVM

Disk /dev/sda :磁盘容量,分别以 GiB,bytes,sectors 三种单位显示。

Disk model:磁盘型号。

Units:显示单位。

Sector size:扇区大小。

Disklabel type:分区表类型,fdisk 下 MSDOS 分区表显示为 dos。

Disk identifier:磁盘标识符。

Device:分区块设备文件名。

Start/End:起始和结束扇区。

Sectors:分区总扇区数。

Size:分区大小。

Type:分区类型,对应 parted 的分区标记。

也可以使用 fdisk 命令行查看分区,命令如下:

fdisk -l [block-device]

不指定 block-device,则显示所有磁盘分区信息。

3.4.3.使用 fdisk 创建分区表

可以使用子命令 g 创建 GPT 分区表或者使用子命令 o 创建 MSDOS 分区表。流程如下:

进入交互界面。

$ fdisk block-device

创建分区表。

Command (m for help): g

保存修改并退出交互界面。

Command (m for help): w

示例如下:

下面的示例在块设备 /dev/sdb 上创建 gpt 分区表。

[root@localhost home]# fdisk /dev/sdb 

Welcome to fdisk (util-linux 2.37.4). 
Changes will remain in memory only, until you decide to write them. 
Be careful before using the write command. 


Command (m for help): g 
Created a new GPT disklabel (GUID: AC247B3E-7137-6B42-8F85-7D570A41D7FE). 
The device contains 'dos' signature and it will be removed by a write command. See fdisk(8) man page and --wipe option for more details. 

Command (m for help): w 

The partition table has been altered. 
Calling ioctl() to re-read partition table. 
Syncing disks.

3.4.4.使用 fdisk 创建分区

可以使用子命令 n 创建分区。流程如下:

进入交互界面。

$ fdisk block-device

使用子命令 n,然后按照提示创建分区。

Command (m for help): n

保存修改并退出交互界面。

Command (m for help): w

重新扫描分区表。

$ partprobe block-device

示例如下:

  • 示例一:在 MSDOS 分区表的磁盘上创建分区

下面的示例在 /dev/sdb 上创建了一个主分区,一个扩展分区和一个逻辑分区。

[root@localhost home]# fdisk /dev/sdb 

Welcome to fdisk (util-linux 2.37.4). 
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): p 
Partition number (1-4, default 1):  
First sector (2048-62914559, default 2048):  
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-62914559, default 62914559): +1G 

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

Command (m for help): n 
Partition type 
   p   primary (1 primary, 0 extended, 3 free) 
   e   extended (container for logical partitions) 
Select (default p): e 
Partition number (2-4, default 2):  
First sector (2099200-62914559, default 2099200):  
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2099200-62914559, default 62914559):  

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

Command (m for help): n 
All space for primary partitions is in use. 
Adding logical partition 5 
First sector (2101248-62914559, default 2101248):  
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2101248-62914559, default 62914559): +1G 

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


Command (m for help): w 
The partition table has been altered. 
Calling ioctl() to re-read partition table. 
Syncing disks. 

[root@localhost home]# partprobe /dev/sdb
  • 示例二:在 GPT 分区表的磁盘上创建分区

下面的示例在 /dev/sdb 上创建了一个 1G 大小的分区。

[root@localhost home]# fdisk /dev/sdb 

Welcome to fdisk (util-linux 2.37.4). 
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 number (1-128, default 1):  
First sector (2048-62914526, default 2048):  
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-62914526, default 62914526): +1G 

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

Command (m for help): w 
The partition table has been altered. 
Calling ioctl() to re-read partition table. 
Syncing disks. 

[root@localhost home]# partprobe /dev/sdb

3.4.5.使用 fdisk 删除分区

可以使用子命令 d 删除分区。流程如下:

进入交互界面。

$ fdisk block-device

使用子命令 p,查看分区信息。

Command (m for help): p

使用子命令 d,然后按照提示删除分区。

Command (m for help): d

保存修改并退出交互界面。

Command (m for help): w

重新扫描分区表。

$ partprobe block-device

注意:如果删除的分区存在文件系统,且已经写入到 /etc/fstab 文件内,需要从 /etc/fstab 中移除相关配置,否则,可能会导致操作系统启动失败。

示例如下:

[root@localhost home]# fdisk /dev/sdb 

Welcome to fdisk (util-linux 2.37.4). 
Changes will remain in memory only, until you decide to write them. 
Be careful before using the write command. 


Command (m for help): p 
Disk /dev/sdb: 30 GiB, 32212254720 bytes, 62914560 sectors 
Disk model: QEMU HARDDISK    
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: 0xe7cfb001 

Device     Boot   Start      End  Sectors Size Id Type 
/dev/sdb1          2048  2099199  2097152   1G 83 Linux 
/dev/sdb2       2099200  4196351  2097152   1G 83 Linux 
/dev/sdb3       4196352  8390655  4194304   2G 83 Linux 
/dev/sdb4       8390656 62914559 54523904  26G  5 Extended 
/dev/sdb5       8392704 10489855  2097152   1G 83 Linux 

Command (m for help): d 
Partition number (1-5, default 5): 2 

Partition 2 has been deleted. 

Command (m for help): w 
The partition table has been altered. 
Calling ioctl() to re-read partition table. 
Syncing disks. 

[root@localhost home]# partprobe /dev/sdb

更多命令选项,请参考 man 手册。

3.4.6使用 gdisk 操作磁盘分区

gdisk 为 GPT 版本 fdisk,只支持 GPT分区表磁盘操作,在 MSDOS 分区表磁盘上操作会将分区表转换成 GPT 分区表。

gdisk 功能与操作方式与 fdisk 类似,可参考 fdisk 操作指

3.5.parted 和 fdisk 工具比较

  • parted 和 fdisk 均支持 msdos 和 GPT 两种分区表。
  • parted 提供了了交互模式和单行命令模式两种交互方式,而 fdisk 仅支持交互模式。
  • parted 支持的单位较多,可以通过扇区,柱面,磁柱,百分比,尺寸等进行分区,而 fdisk 仅支持扇区和尺寸。
  • parted 功能丰富、子命令多、参数多,而 fdisk 相对简洁。

4.swap 空间

4.1.swap 空间概述

当系统物理内存占满时,操作系统将启用 swap 空间(如果存在的情况下),内核将内存中不活跃的页面交换到 swap 空间。

swap 空间可以是专门的 swap 分区,也可以是 swap 文件。推荐的系统 swap 空间如下:

物理内存(RAM) 推荐的 swap 空间大小(不需要休眠) 推荐的 swap 空间大小(需要休眠)
小于 2G RAM 的 2 倍 RAM 的 3 倍
2G ~ 8G 与 RAM 相等 RAM 的 2 倍
8G ~ 16G 至少 4G RAM 的 1.5 倍
大于 64G 至少 4G 不推荐休眠

4.2.添加 swap 空间

4.2.1.添加 swap 分区

首先需要使用 parted 或者 fdisk 命令创建一个分区,如 /dev/sdb1:

sdb           8:16   0   64G  0 disk  
└─sdb1        8:17   0    8G  0 part

格式化 swap 空间:

$ mkswap /dev/sdb1

在 /etc/fstab 中添加挂载条目:

/dev/sdb1               swap                    swap    defaults        0 0

执行下面的命令生成挂载单元:

$ systemd daemon-reload

激活 swap:

$ swapon -v /dev/sdb1

查看 swap 是否生效:

$ cat /proc/swaps 
Filename                                Type            Size            Used            Priority 
/dev/sdb1                               partition       8388604         0               -2 

$ free -h 
               total        used        free      shared  buff/cache   available 
Mem:           7.3Gi       404Mi       6.5Gi        33Mi       444Mi       6.7Gi 
Swap:          8.0Gi          0B       8.0Gi

从显示结果可以看到 swap 信息,说明已经生效。

也可以使用逻辑卷创建 swap 空间,操作方法相似。

4.2.2.添加 swap 文件

首先创建一个空文件:

$ dd if=/dev/zero of=/data/swapfile bs=1M count=8192

格式化 swap 空间:

mkswap /data/swapfile

在 /etc/fstab 中添加挂载条目:

/data/swapfile               swap                    swap    defaults        0 0

执行下面的命令生成挂载单元:

systemd daemon-reload

激活 swap:

swapon -v /data/swapfile

查看 swap 是否生效:

$ cat /proc/swaps  
Filename                                Type            Size            Used            Priority 
/data/swapfile                          file            8388604         0               -2 

$ free -h 
               total        used        free      shared  buff/cache   available 
Mem:           7.3Gi       432Mi        75Mi        33Mi       6.8Gi       6.7Gi 
Swap:          8.0Gi          0B       8.0Gi

从显示结果可以看到 swap 信息,说明已经生效。

4.3.删除 swap 空间

4.3.1删除 swap 空间说明

可以使用 swapoff 命令关闭 swap 空间。关闭 swap 空间前需要关注系统内存使用情况,swapoff 命令会通过申请内存将 swap 空间中的内存移会物理内存,如果系统内存不足,会导致 oom。当 oom 系统处理策略为杀进程时,swapoff 命令将会被 kill;当 oom 系统处理策略为 panic 时,系统将重启。

4.3.2.删除 swap 分区

关闭 swap:

swapoff -v /dev/sdb1

删除 sdb1 分区。

parted /dev/sdb rm 1

删除 /etc/fstab 中对应条目。

重新生成挂载单元:

systemctl daemon-reload

查看是否生效:

$ cat /proc/swaps  
Filename                                Type            Size            Used            Priority 

$ free -h 
               total        used        free      shared  buff/cache   available 
Mem:           7.3Gi       421Mi        92Mi        33Mi       6.8Gi       6.7Gi 
Swap:             0B          0B          0B

从显示结果可以看到 swap 已经关闭。

4.3.3.删除 swap 文件

关闭 swap:

swapoff -v /data/swapfile

删除 swap 文件。

rm /data/swapfile

删除 /etc/fstab 中对应条目。

重新生成挂载单元:

systemctl daemon-reload

查看是否生效:

$ cat /proc/swaps  
Filename                                Type            Size            Used            Priority 

$ free -h 
               total        used        free      shared  buff/cache   available 
Mem:           7.3Gi       421Mi        92Mi        33Mi       6.8Gi       6.7Gi 
Swap:             0B          0B          0B

从显示结果可以看到 swap 已经关闭。