Linux中强大的分区工具parted,磁盘分区格式化

parted 是 Linux 中一个功能强大的磁盘分区工具,相对于传统的 fdisk,它提供了更多的功能,非常适合对现代大容量磁盘和 GPT 分区表的管理。

parted的基本用法如下:

1.进入 parted 交互模式,如:
parted /dev/sda
2.显示当前磁盘的分区表信息
(parted) print
3.创建分区表(例如:GPT)
(parted) mklabel gpt
4.创建分区
(parted) mkpart primary ext4 1MiB 10GiB
5.设置分区为启动分区
(parted) set 1 boot on
6.退出
(parted) quit

下面看看具体的实例,让我们详细了解 parted 的用法,顺便分享挂载分区的操作。

执行lsblk查看磁盘和分区,如下图这里有一个sda的磁盘是还没有分区的。
6b0a95abcdb56c7ce998475bf8388d28.png

使用 parted 交互式命令行,操作 /dev/sda 磁盘进行分区:
parted /dev/sda
给磁盘创建 GPT(GUID Partition Table)分区表类型
mklabel gpt
这时会警告 清空磁盘所有数据,需确认磁盘无重要数据!输入“y” 回车
创建一个主分区,容量占用磁盘的全部空间
mkpart primary 0% 100%
打印列出当前磁盘的分区表信息
print
退出 parted 分区交互模式
quit
退出后,所有更改会立即生效,无需额外保存(不需要像 fdisk 那样输入 w 写入)
以上步骤就完成了分区操作
773e8aace551ae249137480ebb61a8c5.png

可以使用 lsblk 查看刚才创建的分区
f86c86565c082567c231d67af73a69d8.png

这里还需要看看分区是否有4K对齐,当使用 mkpart primary 0% 100% 进行分区,一般是默认4K对齐的,可以执行下面这条命令验证:

parted /dev/sda align-check optimal 1

758258a31e012cea976eba2b0c59efd7.png
如果返回 1 aligned,表示分区是4K对齐的。如果返回 1 not aligned,则没有4K对齐,则需要删除分区(下面会讲到),然后在重新创建分区时:

mkpart primary 0% 100%  
改成
parted /dev/sda mkpart primary 1MiB 100%

1MiB(2048 × 512B = 1MiB) 是标准的 4K 对齐方式,适用于几乎所有现代存储设备。

删除分区的操作如下:
如果已经挂载了分区,则先解除挂载,比如
umount /dev/sda1
如果没有挂载过这个分区,则直接执行如下命令来直接删除分区:
parted /dev/sda
输入 print 确认分区序号(这里是 1)
输入 rm 1 删除第1号分区
输入 quit 退出
删除分区的操作会立即生效
f8e112327b0716c2bbf0fde32145458b.png
也可以使用如下命令直接删除分区:
parted /dev/sda rm 1
数字1表示这个磁盘中的分区的序号,如果有多个分区,需要输入相应的分区序号

虽然分区已创建完成,但要使用这个分区,还需对分区进行格式化和挂载操作:
1.如果直接作为普通分区:
格式化文件系统(例如 ext4):
mkfs.ext4 /dev/sda1
(过程中如有交互选项,使用默认直接按回即可)
挂载使用,如:
mount /dev/sda1 /mnt
查看sda1分区的文件系统和挂载的目录:
df -Th | grep sda1
32a3cecae7d7535e668b69e1940ad271.png

如果需要设置开机自动挂载,就需要编辑 /etc/fstab文件:
nano /etc/fstab
添加一行内容:

/dev/sda1    /mnt    ext4    defaults    0 0

dfe24f933f8b6647f84236a1dd749d4f.png 文件系统的类型要对应上面格式化分区的相对应,这里是ext4。blkid /dev/sda1命令可以查看sda1这个普通分区的格式。

推荐使用 UUID 挂载,避免设备名有变化时引起的挂载错误:
先执行blkid /dev/sda1命令查看 /dev/sda1这个磁盘设备分区的UUID号
0e724c7db065c12e40daec9bec59db00.png
然后写入 /etc/fstab:
nano /etc/fstab
加入一行:

UUID=CTUD3R-DfZh-VZMG-LXuA-UVXf-tCdL-rCXfCT  /mnt/data  ext4  defaults,nofail  0 0

这里加入nofail参数,是防止某个分区可能出现问题,比如是移动硬盘、U盘、网络存储等,在挂载出现错误时不会阻止系统启动。
然后检查挂载是否有错误:
执行mount -a,这个命令会尝试挂载 /etc/fstab 中所有当前尚未挂载的项,如果没有任何输出,说明配置没有问题

2.如果把分区用于 LVM 分区,则执行如下操作:
创建物理卷(PV)
pvcreate /dev/sda1
创建一个名称为 data_vg 的卷组(VG),并加入 /dev/sda1 物理卷:
vgcreate data_vg /dev/sda1
创建逻辑卷,占用全部的磁盘空间,它类似于传统分区,但可以动态调整大小 
创建占满整个分区空间的逻辑卷 “data_lv”

lvcreate -n data_lv -l 100%FREE data_vg

格式化并挂载:
格式化为 ext4 文件系统

mkfs.ext4 /dev/data_vg/data_lv

挂载到 /mnt

mount /dev/mapper/data_vg-data_lv /mnt  
或者  
mount /dev/data_vg/data_lv /mnt

affe57038d0d7485a710ce4186b05254.png
写入到 /etc/fstab 以开机自动挂载
nano /etc/fstab
加入一行:

mount /dev/mapper/data_vg-data_lv /mnt  ext4  defaults  0 0

或者

/dev/data_vg/data_lv  /mnt  ext4  defaults  0 0

更推荐的使用UUID的方式写入 /etc/fstab 以开机自动挂载:
先查看设备分区的UUID:

blkid /dev/mapper/data_vg-data_lv  
或者  
blkid /dev/data_vg/data_lv

26efd4c0afcc0542790193d76516decc.png
nano /etc/fstab
加入一行:

UUID=58144a65-700a-4b4a-b40c-9fd1dd84896f  /mnt  ext4  defaults  0 0

修改分区的名称(即LABEL标签)
对于ext2/ext3/ext4文件系统:
e2label /dev/sda1 data1
对于xfs文件系统:
xfs_admin -L data1 /dev/sda1
lsblk -f 或者 blkid

以上内容是分区的基本操作。如果你想更想更深入一点了解分区的其它场景,请继续往下看。


下面来看看怎样查看磁盘中剩余没分配的空闲空间,并对剩余空间进行分区处理。

这里假设sda磁盘只分配了一部分空间给sda1分区了,还有部分空间分配的,要把剩余没分配的空闲空间创建划分给一个sda2的新分区。

先查看磁盘未分配空间

parted /dev/sda print free  
或 fdisk -l /dev/sda

7c0a54b2de52d5b5bffb67f7a06857e7.png
从上图可以看出sda这个磁盘出未分配空间是从53.2GB开始,往后面还有65GB的剩余空间。执行如下命令把剩余空间创建为sda2的新分区:

parted /dev/sda mkpart primary 53.2GB 100%

上面命令就完成了sda2新分区的创建。

执行 lsblk 可查看到 sda2 的分区,从下图中可见,sda磁盘有两个分区,sda1(LVM)分区和sda2分区
df16ac1fda7cef06b0e10acf4092554c.png
还需要格式化才能使用分区,如果要直接格式化作为普通分区,执行:
mkfs.ext4 /dev/sda2
然后挂载,即可。

或者把 /dev/sda2 用作新的 LVM 物理卷,创建一个新的逻辑卷来使用:
1.将 /dev/sda2 创建为新的卷组和逻辑卷(不影响原来sda1的 data_vg卷组
创建物理卷
pvcreate /dev/sda2
创建新的卷组

vgcreate vg_data2 /dev/sda2

创建逻辑卷,例如叫 lv_data2,使用全部空间

lvcreate -l 100%FREE -n lv_data2 vg_data2

格式化为文件系统(如 ext4):

mkfs.ext4 /dev/vg_data2/lv_data2

4c9da24c8afca4898ba4a51181fbbe8b.png
f5212a0f025730c5968858b3c9dea45c.png
然后挂载,即可。

如果要删除这个作为LVM的sda2分区,执行如下命令:

pvs # 查看物理卷信息  
vgs # 查看卷组信息  
lvs # 查看逻辑卷信息  
lvremove /dev/vg_data2/lv_data2 # 删除 LVM 逻辑卷(LV)  
vgremove vg_data2 # 删除卷组(VG)  
pvremove /dev/sda2 # 删除物理卷(PV)  
parted /dev/sda rm 2 # 删除 /dev/sda2 分区

上面最后的删除分区这一步,也可以使用parted交互式操作来删除分区,避免删错分区:
parted /dev/sda
输入 print 确认分区号(这里是 2)
输入 rm 2 删除第2号分区
输入 quit 退出

a662bc7e7378c302e4bf3f9af7a2080f.png

2.将 /dev/sda2 加入现有卷组 data_vg
创建物理卷(PV):
pvcreate /dev/sda2
加入现有卷组 data_vg:
vgextend data_vg /dev/sda2
创建一个新的逻辑卷来单独使用:

lvcreate -l 100%FREE -n data2_lv data_vg

a9a8c0927a138dc4f98fd6e327ff508c.png
然后挂载,即可。

当把 /dev/sda2 加入现有卷组 data_vg后,如果要删除这个sda2,可以这样操作:
如果你已经挂载了它(如 /data),先卸载:

umount /dev/data_vg/data2_lv

删除逻辑卷 data2_lv:

lvremove /dev/data_vg/data2_lv

从卷组中移除物理卷 /dev/sda2:

vgreduce data_vg /dev/sda2

删除物理卷标签:
pvremove /dev/sda2
删除 /dev/sda2 分区本身:
parted /dev/sda rm 2
f129307ed39069f7fc41f5f18b0e096f.png
d9e56d69489d7ea8bfe9c84d2b2c074b.png

如果在加入到原有的卷组 data_vg后不创建新的逻辑卷,则可以扩展到当前现有逻辑卷(data_lv)来使用:

lvextend -l +100%FREE /dev/data_vg/data_lv

93835528df5869aa3c3165474ee64094.png
如果data_lv这个逻辑卷未格式化的,就要格式化它(如 ext4):

mkfs.ext4 /dev/data_vg/data_lv

然后挂载即可

mount /dev/data_vg/data_lv /mnt

如果data_lv这个逻辑卷已经格式化的,则不需再格式化,而是要扩展文件系统:

扩展文件系统(假设是 ext4):  
resize2fs /dev/data_vg/data_lv  
扩展文件系统(假设是 xfs):  
xfs_growfs /mnt 如果是挂载在 /mnt

35439b4a4bc878a6153d4c7fdf22eb76.png

查看LVM 逻辑卷data_lv  的挂载信息

df -Th | grep -i data_lv

eaa50a5d5da27fe82470aa76417d1577.png

以上就是 parted 命令的基本用法和一些实际的使用场景。如果我们使用的系统是 EFI 启动模式的,或者是NVMe SSD、大容量磁盘,分区时强烈推荐使用 parted,而不是 fdisk