1#!/bin/sh 2# 3# $NetBSD: resize_disklabel,v 1.1 2015/04/06 20:19:28 jmcneill Exp $ 4# 5 6# PROVIDE: resize_disklabel 7# REQUIRE: fsck_root 8# BEFORE: resize_root 9 10$_rc_subr_loaded . /etc/rc.subr 11 12name="resize_disklabel" 13rcvar=$name 14start_cmd="resize_disklabel_start" 15stop_cmd=":" 16 17get_rawpart() 18{ 19 partno=$(/sbin/sysctl -n kern.rawpartition) 20 test $partno = 2 && echo c || echo d 21} 22 23get_total_sectors() 24{ 25 disk=$1 26 /sbin/drvctl -p $disk disk-info/geometry/sectors-per-unit 27} 28 29get_rawpart_sectors() 30{ 31 disk=$1 32 rawpart=$2 33 /sbin/disklabel $disk | grep "^ $rawpart:" | awk '{ print $2; }' 34} 35 36grow_disklabel() 37{ 38 disk=$1 39 part=$2 40 rawpart=$(get_rawpart) 41 42 ts=$(get_total_sectors $disk) 43 rs=$(get_rawpart_sectors $disk $rawpart) 44 45 if [ "$ts" = "$rs" ]; then 46 return 47 fi 48 49 oldsize=$(($rs * 512 / 1024 / 1024)) 50 newsize=$(($ts * 512 / 1024 / 1024)) 51 echo "Growing $disk disklabel (${oldsize}MB -> ${newsize}MB)" 52 printf "A\ny\n$part\n\n\n\$\nc\n\n\n\$\nd\n\n\n\$\nW\ny\nQ\n" | \ 53 disklabel -i $disk >/dev/null 54} 55 56resize_disklabel_start() 57{ 58 if [ x"${resize_disklabel_disk}" = "x" ]; then 59 warn "\${resize_disklabel_disk} is not set, not resizing disklabel" 60 return 61 fi 62 if [ x"${resize_disklabel_part}" = "x" ]; then 63 warn "\${resize_disklabel_part} is not set, not resizing disklabel" 64 return 65 fi 66 67 grow_disklabel "${resize_disklabel_disk}" "${resize_disklabel_part}" 68} 69 70load_rc_config $name 71run_rc_command "$1" 72