Home | History | Annotate | Line # | Download | only in files
resize_disklabel revision 1.1.4.1
      1      1.1  jmcneill #!/bin/sh
      2      1.1  jmcneill #
      3  1.1.4.1  pgoyette # $NetBSD: resize_disklabel,v 1.1.4.1 2017/04/26 02:52:17 pgoyette 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.1.4.1  pgoyette grow_mbrpart()
     37  1.1.4.1  pgoyette {
     38  1.1.4.1  pgoyette 	disk=$1
     39  1.1.4.1  pgoyette 	rawpart=$(get_rawpart)
     40  1.1.4.1  pgoyette 
     41  1.1.4.1  pgoyette 	eval $(/sbin/fdisk -S $disk)
     42  1.1.4.1  pgoyette 	if [ ! "$PART1ID" = "169" ]; then
     43  1.1.4.1  pgoyette 		warn "No NetBSD partition found in MBR partition #1"
     44  1.1.4.1  pgoyette 		return
     45  1.1.4.1  pgoyette 	fi
     46  1.1.4.1  pgoyette 
     47  1.1.4.1  pgoyette 	ts=$(($(get_total_sectors $disk) - ${PART1START}))
     48  1.1.4.1  pgoyette 	rs=${PART1SIZE}
     49  1.1.4.1  pgoyette 
     50  1.1.4.1  pgoyette 	if [ "$ts" = "$rs" ]; then
     51  1.1.4.1  pgoyette 		return
     52  1.1.4.1  pgoyette 	fi
     53  1.1.4.1  pgoyette 
     54  1.1.4.1  pgoyette 	oldsize=$(($rs * 512 / 1024 / 1024))
     55  1.1.4.1  pgoyette 	newsize=$(($ts * 512 / 1024 / 1024))
     56  1.1.4.1  pgoyette 	echo "Growing $disk MBR partition #1 (${oldsize}MB -> ${newsize}MB)"
     57  1.1.4.1  pgoyette 	/sbin/fdisk -f -u -1 -s 169/${PART1START}/${ts} ${disk}
     58  1.1.4.1  pgoyette }
     59  1.1.4.1  pgoyette 
     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.1  jmcneill 		warn "\${resize_disklabel_disk} is not set, not resizing disklabel"
     84      1.1  jmcneill 		return
     85      1.1  jmcneill 	fi
     86      1.1  jmcneill 	if [ x"${resize_disklabel_part}" = "x" ]; then
     87      1.1  jmcneill 		warn "\${resize_disklabel_part} is not set, not resizing disklabel"
     88      1.1  jmcneill 		return
     89      1.1  jmcneill 	fi
     90      1.1  jmcneill 
     91  1.1.4.1  pgoyette 	grow_mbrpart "${resize_disklabel_disk}"
     92      1.1  jmcneill 	grow_disklabel "${resize_disklabel_disk}" "${resize_disklabel_part}"
     93      1.1  jmcneill }
     94      1.1  jmcneill 
     95      1.1  jmcneill load_rc_config $name
     96      1.1  jmcneill run_rc_command "$1"
     97