在非交互模式下使用 parted 将分区大小调整到最大值

在非交互模式下使用 parted 将分区大小调整到最大值

由于在这种情况下使用 fdisk 相当复杂,因为非交互式使用可能无法实现或者至少非常复杂(使用 printf),所以我想用它将parted resizepart分区调整为最大大小。

这可以在诸如虚拟机管理程序/云中的实际磁盘大小调整等场景中使用,然后您需要将逻辑卷/ pv 调整为新大小(LVM 情况)或者您想要将普通分区的分区大小调整为最大值。

假设我想将磁盘 /dev/sda1 上的分区 /dev/sda1 的大小调整为其最大可能大小 - 我该如何做到这一点而不被问到任何问题。

尽管parted /dev/sda resizepart 1存在,但需要我计算并输入最大磁盘大小 - 这就是我在这里研究的实际线索

答案1

看起来不同版本的parted行为完全不同,所以这适用于parted至少随 CentOS7 和 CentOS8 提供的版本 3.*。

  1. 确保操作系统知道自上次扫描(重新启动)以来磁盘大小的增加:
# echo 1 > /sys/block/sda/device/rescan
  1. 检查最后一个分区后是否有可用空间:
# parted -s -a opt /dev/sda "print free"
Model: VMware Virtual disk (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
        32.3kB  1049kB  1016kB           Free Space
 1      1049kB  1075MB  1074MB  primary  xfs          boot
 2      1075MB  32.2GB  31.1GB  primary               lvm
        32.2GB  53.7GB  21.5GB           Free Space
  1. 将最后一个分区的大小调整为最大可用磁盘空间:
# parted -s -a opt /dev/sda "resizepart 2 100%"
# echo $?
0

除退出代码外,此操作没有任何成功迹象。

  1. 您可以通过重复以下操作来验证分区大小是否增加:
# parted -s -a opt /dev/sda "print free"
Model: VMware Virtual disk (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
        32.3kB  1049kB  1016kB           Free Space
 1      1049kB  1075MB  1074MB  primary  xfs          boot
 2      1075MB  53.7GB  52.6GB  primary               lvm

作为奖励,您可以将所有这些放入一个命令行中(不要错过步骤0):

# parted -s -a opt /dev/sda "print free" "resizepart 2 100%" "print free"
Model: VMware Virtual disk (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
        32.3kB  1049kB  1016kB           Free Space
 1      1049kB  1075MB  1074MB  primary  xfs          boot
 2      1075MB  32.2GB  31.1GB  primary               lvm
        32.2GB  53.7GB  21.5GB           Free Space

Model: VMware Virtual disk (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
        32.3kB  1049kB  1016kB           Free Space
 1      1049kB  1075MB  1074MB  primary  xfs          boot
 2      1075MB  53.7GB  52.6GB  primary               lvm

答案2

提示:此脚本与 parted v3+ OOTB 兼容,如果您有 parted 2,则需要更改parted resizepartparted resize

让我们把它放入脚本中,acualy 命令是一个在线命令,我们只需添加更多内容以确保设置了前两个参数:

#!/bin/bash
set -e

if [[ $# -eq 0 ]] ; then
    echo 'please tell me the device to resize as the first parameter, like /dev/sda'
    exit 1
fi


if [[ $# -eq 1 ]] ; then
    echo 'please tell me the partition number to resize as the second parameter, like 1 in case you mean /dev/sda1 or 4, if you mean /dev/sda2'
    exit 1
fi

DEVICE=$1
PARTNR=$2
APPLY=$3

fdisk -l $DEVICE$PARTNR >> /dev/null 2>&1 || (echo "could not find device $DEVICE$PARTNR - please check the name" && exit 1)

CURRENTSIZEB=`fdisk -l $DEVICE$PARTNR | grep "Disk $DEVICE$PARTNR" | cut -d' ' -f5`
CURRENTSIZE=`expr $CURRENTSIZEB / 1024 / 1024`
# So get the disk-informations of our device in question printf %s\\n 'unit MB print list' | parted | grep "Disk /dev/sda we use printf %s\\n 'unit MB print list' to ensure the units are displayed as MB, since otherwise it will vary by disk size ( MB, G, T ) and there is no better way to do this with parted 3 or 4 yet
# then use the 3rd column of the output (disk size) cut -d' ' -f3 (divided by space)
# and finally cut off the unit 'MB' with blanc using tr -d MB
MAXSIZEMB=`printf %s\\n 'unit MB print list' | parted | grep "Disk ${DEVICE}" | cut -d' ' -f3 | tr -d MB`

echo "[ok] would/will resize to from ${CURRENTSIZE}MB to ${MAXSIZEMB}MB "

if [[ "$APPLY" == "apply" ]] ; then
  echo "[ok] applying resize operation.."
  parted ${DEVICE} resizepart ${PARTNR} ${MAXSIZEMB}
  echo "[done]"
else
  echo "[WARNING]!: Sandbox mode, i did not size!. Use 'apply' as the 3d parameter to apply the changes"
fi

用法

将上述脚本另存为resize.sh并使其可执行

# resize the fourth partition to the maximum size, so /dev/sda4
# this is no the sandbox mode, so no changes are done
./resize.sh /dev/sda 4

# apply those changes
./resize.sh /dev/sda 4 apply

例如,假设您在使用 LVM 时在 /dev/sdb1 上有一个带有 lv“data”的 vg vgdata,则整个过程将如下所示

./resize.sh /dev/sdb 1 apply
pvresize /dev/sdb1
lvextend -r /dev/mapper/vgdata-data -l 100%FREE

就是这样,调整了逻辑卷大小,包括调整了文件系统大小(-r)-全部完成,请检查df -h:)

解释

我们用来查找磁盘大小的是

resizepart ${PARTNR} `parted -l | grep ${DEVICE} | cut -d' ' -f3 | tr -d MB

printf %s\\n 'unit MB print list' | parted | grep "Disk /dev/sdaa) 获取我们相关设备的磁盘信息,printf %s\\n 'unit MB print list'以确保单位显示为 MB,否则它会因磁盘大小(MB、G、T)而异,而且目前还没有更好的方法用 parted 3 或 4 来做到这一点

b)然后使用输出的第 3 列(磁盘大小)cut -d' ' -f3(除以空格)

c) 最后用 blanc 切断单元 'MB',使用tr -d MB

后续行动

我在https://github.com/EugenMayer/parted-auto-resize因此,如果要改进任何功能,请使用拉取请求(任何不属于该问题范围的内容)

相关内容