uvol: improve autopart and lvm scripts, fix F2FS volumes

Use sfdisk to get GPT partition by name as partition names are not
known by the kernel if added via partx.
Make sure physical volume names are unique, if possible correlate
with the disks serial number and/or card's cid.
mkf2fs apparently returns 134 even in case format succeeded, so don't
fail in that case (this fixes rw volumes large enough for F2FS to be
selected by the lvm scripts of uvol).

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
This commit is contained in:
Daniel Golle 2021-04-21 17:08:17 +01:00
parent f6feb1508c
commit 1b570f7aad
No known key found for this signature in database
GPG Key ID: 5A8F39C31C3217CA
2 changed files with 31 additions and 7 deletions

View File

@ -2,9 +2,29 @@
. /lib/functions.sh . /lib/functions.sh
. /lib/upgrade/common.sh . /lib/upgrade/common.sh
. /usr/share/libubox/jshn.sh
OWRT_VOLUMES=owrt-volumes OWRT_VOLUMES=owrt-volumes
get_partition_by_name_gpt() {
local dev="$1"
local part parts node name
json_load "$(sfdisk -J "/dev/$dev" 2>/dev/null)"
json_select "partitiontable" || return
json_select "partitions" || return
json_get_keys parts
for part in $parts; do
json_select "$part"
json_get_vars node name
if [ "$2" = "$name" ]; then
echo "$node"
break
fi
json_select ..
done
}
part_fixup() { part_fixup() {
echo "write" | sfdisk --force -q -w never $1 echo "write" | sfdisk --force -q -w never $1
} }
@ -57,20 +77,22 @@ lvm_init() {
autopart_init() { autopart_init() {
local diskdev local diskdev
local lvmpart local lvmpart
local diskserial local diskserial diskhash
export_bootdevice && export_partdevice diskdev 0 export_bootdevice && export_partdevice diskdev 0
[ "$diskdev" ] || return [ "$diskdev" ] || return
[ -e "/sys/class/block/$diskdev/device/serial" ] && diskserial=$(cat /sys/class/block/$diskdev/device/serial) [ -e "/sys/class/block/$diskdev/device/serial" ] && diskserial="$(cat /sys/class/block/$diskdev/device/serial)"
[ -e "/sys/class/block/$diskdev/device/cid" ] && diskserial="$diskserial$(cat /sys/class/block/$diskdev/device/cid)"
[ "$diskserial" ] || diskserial="$(cat /proc/sys/kernel/random/uuid)"
diskhash="$(echo $diskserial | sha256sum | cut -d' ' -f1)"
part_fixup /dev/$diskdev part_fixup /dev/$diskdev
create_lvm_part /dev/$diskdev || return create_lvm_part /dev/$diskdev || return
lvmpart=$(get_partition_by_name $diskdev $OWRT_VOLUMES) lvmpart=$(get_partition_by_name_gpt $diskdev $OWRT_VOLUMES)
[ "$lvmpart" ] || return [ "$lvmpart" ] || return
lvm_init /dev/$lvmpart "${OWRT_VOLUMES}${diskserial:+-${diskserial:2}}" lvm_init $lvmpart "${OWRT_VOLUMES}-${diskhash:0:16}"
} }
autopart_init autopart_init

View File

@ -231,7 +231,9 @@ createvol() {
[ "$lv_full_name" ] || return 22 [ "$lv_full_name" ] || return 22
lvm_cmd lvchange -a y "$lv_full_name" || return 1 lvm_cmd lvchange -a y "$lv_full_name" || return 1
if [ $lv_size -gt $(( 100 * 1024 * 1024 )) ]; then if [ $lv_size -gt $(( 100 * 1024 * 1024 )) ]; then
mkfs.f2fs -f -l "$1" "$lv_path" || return 1 mkfs.f2fs -f -l "$1" "$lv_path"
ret=$?
[ $ret != 0 ] && [ $ret != 134 ] && return 1
else else
mke2fs -F -L "$1" "$lv_path" || return 1 mke2fs -F -L "$1" "$lv_path" || return 1
fi fi
@ -271,7 +273,7 @@ listvols() {
local reports rep lv lvs lv_name lv_size lv_mode volname local reports rep lv lvs lv_name lv_size lv_mode volname
volname=${1:-.*} volname=${1:-.*}
json_init json_init
json_load "$(lvs -o lv_name,lv_size -S "lv_name=~^[rw][ow]_$volname\$ && vg_name=$vg_name")" json_load "$(lvs -o lv_name,lv_size -S "lv_name=~^[rw][owp]_$volname\$ && vg_name=$vg_name")"
json_select report json_select report
json_get_keys reports json_get_keys reports
for rep in $reports; do for rep in $reports; do