Linux

在非互動模式下使用 parted 將分區大小調整為最大

  • October 29, 2020

由於在這種情況下使用 fdisk 是相當複雜的,因為非互動式使用可能是不可能的,或者至少非常複雜(使用 printf),我想使用parted resizepart它來調整分區的最大大小。

這可以在虛擬機管理程序/雲中的實際磁碟大小調整等場景中使用,然後您需要將邏輯卷/ pv 調整為新大小(LVM 情況),或者您希望將普通分區的分區大小調整為最大值.

假設我想將明顯磁碟 /dev/sda1 上的分區 /dev/sda1 調整為其最大可能大小 - 我將如何在不被問到任何問題的情況下做到這一點。

即使parted /dev/sda resizepart 1存在,它也需要我計算並輸入最大磁碟大小 - 這就是我在這里工作的實際線索

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

讓我們把它放到一個腳本中,acualy 命令是一個線上命令,我們只需添加更多內容以確保設置前 2 個參數:

#!/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

a)因此獲取printf %s\\n 'unit MB print list' | parted | grep "Disk /dev/sda我們用於printf %s\\n 'unit MB print list'確保單位顯示為 MB 的設備的磁碟資訊,因為否則它會因磁碟大小(MB,G,T)而異,並且沒有更好的方法來使用 parted 3個或4個

b)然後使用輸出的第三列(磁碟大小)cut -d' ' -f3(除以空間)

c)最後用 blanc 切斷單位’MB’tr -d MB

跟進

我在https://github.com/EugenMayer/parted-auto-resize上發布了腳本,所以如果有什麼要改進的功能,請在此處使用拉取請求(任何不在此問題範圍內的內容)

引用自:https://serverfault.com/questions/870594