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