web-dev-qa-db-ja.com

非インタラクティブモードでpartedを使用してパーティションを最大サイズに変更します

この場合のfdiskの使用は、非インタラクティブな使用がおそらく不可能であるか、または(printfを使用して)少なくとも非常に複雑であるためにかなり複雑であるため、parted resizepartパーティションを最大サイズにサイズ変更します。

これは、ハイパーバイザー/クラウドでの実際のディスクサイズ変更などのシナリオで利用でき、論理ボリューム/ pvを新しいサイズ(LVMの場合)に調整する必要があるか、通常のパーティションのパーティションサイズを最大に調整したい。

障害のあるディスク/ dev/sda1のパーティション/ dev/sda1を可能な最大サイズにサイズ変更したいとしましょう-何も質問されずにこれを行うにはどうすればよいでしょうか。

たとえ parted /dev/sda resizepart 1が存在します。最大ディスクサイズを計算して入力する必要があります。これが、ここで作業する実際の手掛かりです

1
Eugen Mayer

ヒント:このスクリプトは、parted v3 + OOTBと互換性があります。parted2を使用している場合は、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)次に、出力の3列目(ディスクサイズ)cut -d' ' -f3(スペースで除算)を使用します。

c)最後に、tr -d MBを使用してblancでユニット「MB」を切り取ります

フォローアップ

私はスクリプトを https://github.com/EugenMayer/parted-auto-resize に公開したので、機能に関して改善すべき点がある場合は、プルリクエストを使用します(この質問の範囲外のもの)

3
Eugen Mayer