#!/bin/sh MOUNT="" LODEV="" CHS="" TEMP_D="" MP="" cleanup() { [ -n "$MOUNT" ] && umount $MOUNT rm -Rf "$TEMP_D" } getchs() { sfdisk "${rootdisk}" --show-pt-geometry > "${TEMP_D}/chs" 2>${TEMP_D}/chs.err && read _devc cyl _word1 heads _word2 sectors _word3 < "${TEMP_D}/chs" && _RET="-C $cyl -H $heads -S $sectors" || fail "failed to get CHS from ${rootdisk}" } debug() { echo "==== start: ${1} ====" grep " ${rootdisk##*/}" /proc/partitions getchs && echo "CHS: $_RET" echo "==== end: ${1} ====" } fail() { [ $# -eq 0 ] || error "$@"; debug "fail"; exit 1; } error() { echo "$@" 1>&2; } rootdisk=${1} [ -n "$rootdisk" -a -b "$rootdisk" ] || { error "Please give block device (ie /dev/vdb). WARNING! this is destructive!"; exit 1; } TEMP_D=$(mktemp -d "${TMPDIR:-/tmp/${0##*/}.XXXXXX}") trap cleanup EXIT MP="${TEMP_D}/mp" mkdir "$MP" ## set up the disk to have some partition table with space at end tmp="${TEMP_D}/show-part.out" err="$TEMP_D/err" getchs && _RET=$CHS || fail "failed to get CHS from ${rootdisk}" end=$((($cyl*$heads*$sectors)/2)) error "sfdisk'ing to 1 partition, half size. 2048,$end,L" echo "2048,$((($cyl*$heads*$sectors)/2)),L" | sfdisk --force $CHS -uS "$rootdisk" >"${err}" 2>&1|| fail "failed to create sfdisk.\n$(cat ${err})" udevadm settle --timeout 30 #sleep 3 debug "sfdisk'd" partnum=1 part="${rootdisk}${partnum}" error "creating fs on $part" mkfs -q -t ext4 "$part" || fail "failed mkfs $part" udevadm settle --timeout 30 error "mounting $part at $MP" mount -o ro "$part" "$MP" && MOUNT=${part} || fail "failed to mount ${part}" debug "mounted" out=$(growpart --dry-run "${rootdisk}" "${partnum}" 2>"$err") || fail "failed to growpart dry-run: ${out}...\n$(cat ${err})" error "growpart says: ${out}" case "${out}" in CHANGE:*) :;; *) fail "Huh? no resize needed?: ${out}"; esac error "umounting ${part}" out=$(umount "$part" 2>&1) && MOUNT="" || fail "failed to umount $part: ${out}" error "growing part ${rootdisk} 1" ##out=$(growpart "${rootdisk}" "${partnum}" 2>&1) || #out=$(growpart --dry-run "${rootdisk}" "${partnum}" 2>"$err") || # fail "failed to growpart dry-run: ${out}" if out=$(growpart "${rootdisk}" "${partnum}" 2>"${err}"); then case "$out" in CHANGED:*) echo "GROWROOT: $out";; NOCHANGE:*) fail "GROWROOT: WARNING: expected to grow partition, but did not: ${out}\n$(cat ${err})";; *) fail "GROWROOT: unexpected output: ${out}\n$(cat ${err})" esac else #fail "GROWROOT: WARNING: resize failed: $out\n$(cat ${err})" fail "GROWROOT: WARNING: resize failed: $out" fi ## now, it would # udevadm settle --timeout ${ROOTDELAY:-30} # wait-for-root "${ROOT}" ${ROOTDELAY:-30} # mount ${roflag} ${FSTYPE:+-t ${FSTYPE} }${ROOTFLAGS} ${ROOT} ${rootmnt}