|
|
@ -0,0 +1,77 @@ |
|
|
|
#!/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 |