#!/bin/sh . /lib/functions.sh . /lib/upgrade/common.sh OWRT_VOLUMES=owrt-volumes part_fixup() { echo "write" | sfdisk --force -q -w never $1 } get_free_area() { local found= sfdisk -q -F "$1" 2>/dev/null | while read start end sectors size; do case $start in *"Unpartitioned"* | *"Units:"* | *"Sector"* | *"Start"* ) continue ;; [0-9]*) case "$size" in *"M") [ "${size%%M}" -lt 100 ] && continue ;; *"G" | *"T") ;; *"k" | *"b") continue ;; esac [ "$found" ] || echo "start=$start, size=$((end - start))" found=1 ;; esac done } create_lvm_part() { local disk=$1 local freepart freepart="$(get_free_area $disk)" if [ "$freepart" ]; then echo "$freepart, type=lvm, name=$OWRT_VOLUMES" | sfdisk --force -w never -a $disk partx -a $disk 1>/dev/null 2>/dev/null || true return 0 else return 1 fi } lvm_init() { lvm pvcreate -f $1 lvm vgcreate "$2" $1 lvm vgs } autopart_init() { local diskdev local lvmpart local diskserial export_bootdevice && export_partdevice diskdev 0 [ "$diskdev" ] || return [ -e "/sys/class/block/$diskdev/device/serial" ] && diskserial=$(cat /sys/class/block/$diskdev/device/serial) part_fixup /dev/$diskdev create_lvm_part /dev/$diskdev || return lvmpart=$(get_partition_by_name $diskdev $OWRT_VOLUMES) [ "$lvmpart" ] || return lvm_init /dev/$lvmpart "${OWRT_VOLUMES}${diskserial}" } autopart_init exit 0