uvol is a wrapper-script which allows automated handling of storage volumes. uvol currently comes with backend support for LVM2 and UBI, covering practically all options for storage large enough to be managed (NAND, SPI-NAND, eMMC, SATA, NVME, virtio-blk, ...). Signed-off-by: Daniel Golle <daniel@makrotopia.org>
77 lines
1.4 KiB
Bash
77 lines
1.4 KiB
Bash
#!/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:+-${diskserial:2}}"
|
|
}
|
|
|
|
autopart_init
|
|
exit 0
|