在非互動模式下使用 parted 將分區大小調整為最大
由於在這種情況下使用 fdisk 是相當複雜的,因為非互動式使用可能是不可能的,或者至少非常複雜(使用 printf),我想使用
parted resizepart
它來調整分區的最大大小。這可以在虛擬機管理程序/雲中的實際磁碟大小調整等場景中使用,然後您需要將邏輯卷/ pv 調整為新大小(LVM 情況),或者您希望將普通分區的分區大小調整為最大值.
假設我想將明顯磁碟 /dev/sda1 上的分區 /dev/sda1 調整為其最大可能大小 - 我將如何在不被問到任何問題的情況下做到這一點。
即使
parted /dev/sda resizepart 1
存在,它也需要我計算並輸入最大磁碟大小 - 這就是我在這里工作的實際線索
提示:此腳本兼容 parted v3+ OOTB,如果您有 parted 2,則需要更改
parted resizepart
為parted 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上發布了腳本,所以如果有什麼要改進的功能,請在此處使用拉取請求(任何不在此問題範圍內的內容)