Home | History | Annotate | Line # | Download | only in files
resize_disklabel revision 1.2.12.1
      1       1.1  jmcneill #!/bin/sh
      2       1.1  jmcneill #
      3  1.2.12.1  christos # $NetBSD: resize_disklabel,v 1.2.12.1 2019/06/10 21:42:37 christos Exp $
      4       1.1  jmcneill #
      5       1.1  jmcneill 
      6       1.1  jmcneill # PROVIDE: resize_disklabel
      7       1.1  jmcneill # REQUIRE: fsck_root
      8       1.1  jmcneill # BEFORE: resize_root
      9       1.1  jmcneill 
     10       1.1  jmcneill $_rc_subr_loaded . /etc/rc.subr
     11       1.1  jmcneill 
     12       1.1  jmcneill name="resize_disklabel"
     13       1.1  jmcneill rcvar=$name
     14       1.1  jmcneill start_cmd="resize_disklabel_start"
     15       1.1  jmcneill stop_cmd=":"
     16       1.1  jmcneill 
     17       1.1  jmcneill get_rawpart()
     18       1.1  jmcneill {
     19       1.1  jmcneill 	partno=$(/sbin/sysctl -n kern.rawpartition)
     20       1.1  jmcneill 	test $partno = 2 && echo c || echo d
     21       1.1  jmcneill }
     22       1.1  jmcneill 
     23       1.1  jmcneill get_total_sectors()
     24       1.1  jmcneill {
     25       1.1  jmcneill 	disk=$1
     26       1.1  jmcneill 	/sbin/drvctl -p $disk disk-info/geometry/sectors-per-unit
     27       1.1  jmcneill }
     28       1.1  jmcneill 
     29       1.1  jmcneill get_rawpart_sectors()
     30       1.1  jmcneill {
     31       1.1  jmcneill 	disk=$1
     32       1.1  jmcneill 	rawpart=$2
     33       1.1  jmcneill 	/sbin/disklabel $disk | grep "^ $rawpart:" | awk '{ print $2; }'
     34       1.1  jmcneill }
     35       1.1  jmcneill 
     36       1.2  jmcneill grow_mbrpart()
     37       1.2  jmcneill {
     38       1.2  jmcneill 	disk=$1
     39       1.2  jmcneill 	rawpart=$(get_rawpart)
     40       1.2  jmcneill 
     41       1.2  jmcneill 	eval $(/sbin/fdisk -S $disk)
     42       1.2  jmcneill 	if [ ! "$PART1ID" = "169" ]; then
     43       1.2  jmcneill 		warn "No NetBSD partition found in MBR partition #1"
     44       1.2  jmcneill 		return
     45       1.2  jmcneill 	fi
     46       1.2  jmcneill 
     47       1.2  jmcneill 	ts=$(($(get_total_sectors $disk) - ${PART1START}))
     48       1.2  jmcneill 	rs=${PART1SIZE}
     49       1.2  jmcneill 
     50       1.2  jmcneill 	if [ "$ts" = "$rs" ]; then
     51       1.2  jmcneill 		return
     52       1.2  jmcneill 	fi
     53       1.2  jmcneill 
     54       1.2  jmcneill 	oldsize=$(($rs * 512 / 1024 / 1024))
     55       1.2  jmcneill 	newsize=$(($ts * 512 / 1024 / 1024))
     56       1.2  jmcneill 	echo "Growing $disk MBR partition #1 (${oldsize}MB -> ${newsize}MB)"
     57       1.2  jmcneill 	/sbin/fdisk -f -u -1 -s 169/${PART1START}/${ts} ${disk}
     58       1.2  jmcneill }
     59       1.2  jmcneill 
     60       1.1  jmcneill grow_disklabel()
     61       1.1  jmcneill {
     62       1.1  jmcneill 	disk=$1
     63       1.1  jmcneill 	part=$2
     64       1.1  jmcneill 	rawpart=$(get_rawpart)
     65       1.1  jmcneill 
     66       1.1  jmcneill 	ts=$(get_total_sectors $disk)
     67       1.1  jmcneill 	rs=$(get_rawpart_sectors $disk $rawpart)
     68       1.1  jmcneill 
     69       1.1  jmcneill 	if [ "$ts" = "$rs" ]; then
     70       1.1  jmcneill 		return
     71       1.1  jmcneill 	fi
     72       1.1  jmcneill 
     73       1.1  jmcneill 	oldsize=$(($rs * 512 / 1024 / 1024))
     74       1.1  jmcneill 	newsize=$(($ts * 512 / 1024 / 1024))
     75       1.1  jmcneill 	echo "Growing $disk disklabel (${oldsize}MB -> ${newsize}MB)"
     76       1.1  jmcneill 	printf "A\ny\n$part\n\n\n\$\nc\n\n\n\$\nd\n\n\n\$\nW\ny\nQ\n" | \
     77       1.1  jmcneill 	    disklabel -i $disk >/dev/null
     78       1.1  jmcneill }
     79       1.1  jmcneill 
     80       1.1  jmcneill resize_disklabel_start()
     81       1.1  jmcneill {
     82       1.1  jmcneill 	if [ x"${resize_disklabel_disk}" = "x" ]; then
     83  1.2.12.1  christos 		resize_disklabel_disk="$(/sbin/sysctl -n kern.root_device)"
     84       1.1  jmcneill 	fi
     85       1.1  jmcneill 	if [ x"${resize_disklabel_part}" = "x" ]; then
     86  1.2.12.1  christos 		resize_disklabel_part=$(printf \\$(printf '%03o' $(( 97 + $(sysctl -n kern.root_partition) ))))
     87       1.1  jmcneill 	fi
     88       1.1  jmcneill 
     89       1.2  jmcneill 	grow_mbrpart "${resize_disklabel_disk}"
     90       1.1  jmcneill 	grow_disklabel "${resize_disklabel_disk}" "${resize_disklabel_part}"
     91       1.1  jmcneill }
     92       1.1  jmcneill 
     93       1.1  jmcneill load_rc_config $name
     94       1.1  jmcneill run_rc_command "$1"
     95