You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

77 lines
1.4 KiB

#!/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