Browse Source

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>
lilik-openwrt-22.03
Daniel Golle 3 years ago
parent
commit
1b570f7aad
No known key found for this signature in database GPG Key ID: 5A8F39C31C3217CA
2 changed files with 31 additions and 7 deletions
  1. +27
    -5
      utils/uvol/files/autopart.defaults
  2. +4
    -2
      utils/uvol/files/lvm.sh

+ 27
- 5
utils/uvol/files/autopart.defaults View File

@ -2,9 +2,29 @@
. /lib/functions.sh
. /lib/upgrade/common.sh
. /usr/share/libubox/jshn.sh
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() {
echo "write" | sfdisk --force -q -w never $1
}
@ -57,20 +77,22 @@ lvm_init() {
autopart_init() {
local diskdev
local lvmpart
local diskserial
local diskserial diskhash
export_bootdevice && export_partdevice diskdev 0
[ "$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
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
lvm_init /dev/$lvmpart "${OWRT_VOLUMES}${diskserial:+-${diskserial:2}}"
lvm_init $lvmpart "${OWRT_VOLUMES}-${diskhash:0:16}"
}
autopart_init


+ 4
- 2
utils/uvol/files/lvm.sh View File

@ -231,7 +231,9 @@ createvol() {
[ "$lv_full_name" ] || return 22
lvm_cmd lvchange -a y "$lv_full_name" || return 1
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
mke2fs -F -L "$1" "$lv_path" || return 1
fi
@ -271,7 +273,7 @@ listvols() {
local reports rep lv lvs lv_name lv_size lv_mode volname
volname=${1:-.*}
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_get_keys reports
for rep in $reports; do


Loading…
Cancel
Save