Optimize udev process

This commit is contained in:
longpanda
2026-10-05 23:28:02 +08:00
parent 029a0a9d16
commit a2f6e4e31f
10 changed files with 367 additions and 11 deletions
@@ -0,0 +1,52 @@
#!/ventoy/busybox/sh
. /ventoy/hook/ventoy-hook-lib.sh
vtlog "####### $0 $* ########"
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
wait_for_usb_disk_ready
vtdiskname=$(get_ventoy_disk_name)
if [ "$vtdiskname" = "unknown" ]; then
vtlog "ventoy disk not found"
PATH=$VTPATH_OLD
exit 0
fi
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2"
mkdir -p /ventoy/mnt/iso /ventoy/mnt/sfs
vtDM=$(dmsetup info ventoy | grep minor | sed 's/.*\([0-9][0-9]*\)/\1/')
vtlog "mount -o ro -t iso9660 /dev/dm-${vtDM} /ventoy/mnt/iso"
mount -o ro -t iso9660 /dev/dm-${vtDM} /ventoy/mnt/iso
mount /ventoy/mnt/iso/casper/minimal.standard.live.squashfs /ventoy/mnt/sfs
mount --bind /ventoy/mnt/sfs/usr/lib/modules /lib/modules
ventoy_load_iso_part_fs_ko
umount /lib/modules
umount /ventoy/mnt/sfs
umount /ventoy/mnt/iso
ventoy_remove_all_dm
if ventoy_mount_iso "${vtdiskname}"; then
vtlog "direcly mount iso partition SUCCESS"
else
vtlog "direcly mount iso partition FAILED, keep use DM"
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2"
fi
if [ -f /ventoy/autoinstall ]; then
sh /ventoy/hook/default/auto_install_varexp.sh /ventoy/autoinstall
fi
set_ventoy_hook_finish
@@ -0,0 +1,35 @@
#!/ventoy/busybox/sh
echo "Here before mountroot ..." >> $VTLOG
$SED "/^mountroot$/i\\$BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/ubuntu-disk.sh" -i /init
$SED "/^mountroot$/i\\maybe_break bottom" -i /init
#workaround for issue #3718
if [ -f $VTOY_PATH/ventoy_persistent_map -a -f /scripts/casper-helpers ]; then
echo 'fix casper cow udev issue' >> $VTLOG
if $GREP -q '^find_cow_device\(\).*{' /scripts/casper-helpers; then
VTINS_LINE=$($GREP -n '^find_cow_device\(\).*{' /scripts/casper-helpers | $AWK -F':' '{print $1}')
$AWK "NR < $VTINS_LINE" /scripts/casper-helpers > /ventoy/casper-helpers-tmp
$CAT $VTOY_PATH/hook/debian/casper-perst-wa.sh >> /ventoy/casper-helpers-tmp
$AWK "NR > $VTINS_LINE" /scripts/casper-helpers >> /ventoy/casper-helpers-tmp
$CAT /ventoy/casper-helpers-tmp > /scripts/casper-helpers
fi
fi
if [ -f $VTOY_PATH/autoinstall ]; then
echo "Do auto install ..." >> $VTLOG
if $GREP -q '^autoinstall:' $VTOY_PATH/autoinstall; then
echo "cloud-init auto install ..." >> $VTLOG
if $GREP -q "maybe_break init" /init; then
$SED "/maybe_break init/i $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/ventoy-cloud-init.sh \$rootmnt" -i /init
fi
else
if $GREP -q "^mount /proc$" /init; then
$SED "/^mount \/proc/a export file=$VTOY_PATH/autoinstall; export auto='true'; export priority='critical'" -i /init
fi
fi
fi
@@ -61,6 +61,15 @@ ventoy_get_debian_distro() {
if $GREP -q 'NAME="Kylin"' /etc/os-release; then
echo 'kylin'; return
fi
if $GREP -q 'ID=ubuntu' /etc/os-release; then
if $GREP -q 'VERSION_ID=\"2[4-9]\.' /etc/os-release; then
echo 'ubuntu'; return
fi
if $GREP -q 'VERSION_ID=\"3[0-9]\.' /etc/os-release; then
echo 'ubuntu'; return
fi
fi
fi
if $GREP -q 'slax/' /proc/cmdline; then
@@ -0,0 +1,25 @@
ACTION=="add", SUBSYSTEM=="block", KERNEL=="dm-*", \
ENV{DM_NAME}=="[vV]entoy*", \
ENV{DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG}="", \
ENV{DM_UDEV_DISABLE_DISK_RULES_FLAG}="", \
ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}=""
ACTION=="add", SUBSYSTEM=="block", KERNEL=="dm-*", \
ENV{DM_NAME}=="vtoy*", \
ENV{DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG}="", \
ENV{DM_UDEV_DISABLE_DISK_RULES_FLAG}="", \
ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}=""
ACTION=="change", SUBSYSTEM=="block", KERNEL=="dm-*", \
ENV{DM_NAME}=="[vV]entoy*", \
ENV{DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG}="", \
ENV{DM_UDEV_DISABLE_DISK_RULES_FLAG}="", \
ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}=""
ACTION=="change", SUBSYSTEM=="block", KERNEL=="dm-*", \
ENV{DM_NAME}=="vtoy*", \
ENV{DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG}="", \
ENV{DM_UDEV_DISABLE_DISK_RULES_FLAG}="", \
ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}=""
@@ -1 +0,0 @@
ACTION=="add|change", KERNEL=="dm-[0-9]*", ENV{DM_NAME}=="ventoy[0-9]*", ENV{DM_UDEV_DISABLE_SYBSYSTEM_RULES_FLAG}="", ENV{DM_UDEV_DISABLE_DISK_RULES_FLAG}="", ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}="", IMPORT{program}="/ventoy/hook/default/ventoy-udev.sh $env{DM_NAME}"
@@ -0,0 +1,5 @@
ACTION=="add|change", KERNEL=="dm-[0-9]*", ENV{DM_NAME}=="ventoy[0-9]*", \
ENV{DM_UDEV_DISABLE_SYBSYSTEM_RULES_FLAG}="", \
ENV{DM_UDEV_DISABLE_DISK_RULES_FLAG}="", \
ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}="", \
IMPORT{program}="/ventoy/hook/default/ventoy-udev.sh $env{DM_NAME}"
@@ -0,0 +1,30 @@
ACTION=="add", SUBSYSTEM=="block", KERNEL=="dm-*", \
ENV{DM_NAME}=="VentoyPart", \
ENV{DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG}="", \
ENV{DM_UDEV_DISABLE_DISK_RULES_FLAG}="", \
ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}="", \
ENV{ID_FS_LABEL}="VentoyPart", \
ENV{ID_FS_LABEL_ENC}="VentoyPart", \
ENV{UDISKS_FILESYSTEM_LABEL}="VentoyPart", \
ENV{UDISKS_PRESENTATION_NAME}="VentoyPart", \
ENV{UDISKS_SYSTEM}="0", \
ENV{UDISKS_REMOVABLE}="1", \
ENV{UDISKS_AUTO}="1", \
ENV{UDISKS_AUTOMOUNTABLE}="1"
ACTION=="change", SUBSYSTEM=="block", KERNEL=="dm-*", \
ENV{DM_NAME}=="VentoyPart", \
ENV{DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG}="", \
ENV{DM_UDEV_DISABLE_DISK_RULES_FLAG}="", \
ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}="", \
ENV{ID_FS_LABEL}="VentoyPart", \
ENV{ID_FS_LABEL_ENC}="VentoyPart", \
ENV{UDISKS_FILESYSTEM_LABEL}="VentoyPart", \
ENV{UDISKS_PRESENTATION_NAME}="VentoyPart", \
ENV{UDISKS_SYSTEM}="0", \
ENV{UDISKS_REMOVABLE}="1", \
ENV{UDISKS_AUTO}="1", \
ENV{UDISKS_AUTOMOUNTABLE}="1"
@@ -0,0 +1,15 @@
#!/bin/sh
for vroot in sysroot newroot; do
if [ -d $vroot/etc ]; then
if [ -d $vroot/etc/udev/rules.d ]; then
:
else
mkdir -p $vroot/etc/udev/rules.d
fi
cp -a /ventoy/hook/default/90-ventoy-auto.rules $vroot/etc/udev/rules.d/
chmod 0644 $vroot/etc/udev/rules.d/90-ventoy-auto.rules
break
fi
done
+178 -10
View File
@@ -273,13 +273,40 @@ create_ventoy_device_mapper() {
else
$VT_DM_BIN "$2" create ventoy $VTOY_PATH/ventoy_dm_table >>$VTLOG 2>&1
fi
RAWDISKNAME=$($HEAD -n1 $VTOY_PATH/ventoy_raw_table | $AWK '{print $4}')
echo "$VT_DM_BIN create ${RAWDISKNAME#/dev/} $VTOY_PATH/ventoy_raw_table" > /ventoy/ventoy_iso_part_dm_cmd
#echo "$VT_DM_BIN mknodes ${RAWDISKNAME#/dev/}" >> /ventoy/ventoy_iso_part_dm_cmd
echo "$VT_DM_BIN create VentoyPart $VTOY_PATH/ventoy_raw_table" > /ventoy/ventoy_iso_part_dm_cmd
#echo "$VT_DM_BIN mknodes VentoyPart" >> /ventoy/ventoy_iso_part_dm_cmd
#echo "$VT_DM_BIN ls" >> /ventoy/ventoy_iso_part_dm_cmd
}
create_ventoy_loop_device_mapper() {
vtLoop1=${1#/dev/}
vtLoop2=${2#/dev/}
vtlog "create_ventoy_loop_device_mapper $*"
VT_DM_BIN=$(ventoy_find_bin_path dmsetup)
if [ -z "$VT_DM_BIN" ]; then
vtlog "no dmsetup avaliable, lastly try inbox dmsetup"
VT_DM_BIN=$VTOY_PATH/tool/dmsetup
fi
vtlog "dmsetup avaliable in system $VT_DM_BIN"
if ventoy_check_dm_module; then
vtlog "device-mapper module check success"
else
vterr "Error: no dm module avaliable"
fi
vtLoop2Size=$(cat /sys/block/$vtLoop2/size)
echo "0 65 linear $1 0" > $VTOY_PATH/ventoy_dm_table
echo "65 $vtLoop2Size linear $2 0" >> $VTOY_PATH/ventoy_dm_table
$VT_DM_BIN "--readonly" create ventoy $VTOY_PATH/ventoy_dm_table >>$VTLOG 2>&1
}
create_ventoy_wrapper_device_mapper() {
vtlog "create_ventoy_wrapper_device_mapper $*"
@@ -621,7 +648,7 @@ ventoy_udev_disk_common_hook() {
else
ventoy_copy_device_mapper "/dev/$1"
fi
if [ -f $VTOY_PATH/ventoy_persistent_map ]; then
create_persistent_device_mapper "/dev/$VTDISK"
ventoy_create_persistent_link
@@ -709,19 +736,28 @@ ventoy_remove_all_dm() {
fi
vtlog "dmsetup remove ventoy"
$VTOY_PATH/tool/dmsetup remove ventoy
$VTOY_PATH/tool/dmsetup remove ventoy >> $VTLOG 2>&1
rm -f /dev/ventoy*
if [ -e $VTOY_PATH/ventoy_raw_table ]; then
RAWDISKNAME=$($HEAD -n1 $VTOY_PATH/ventoy_raw_table | $AWK '{print $4}')
vtlog "dmsetup remove ${RAWDISKNAME#/dev/}"
$VTOY_PATH/tool/dmsetup remove ${RAWDISKNAME#/dev/}
DMRAWDISKNAME=${RAWDISKNAME#/dev/}
if $VTOY_PATH/tool/dmsetup ls | $GREP -qw "$DMRAWDISKNAME"; then
vtlog "dmsetup remove ${DMRAWDISKNAME}"
$VTOY_PATH/tool/dmsetup remove "$DMRAWDISKNAME"
else
vtlog "no need to remove DM ${DMRAWDISKNAME}"
fi
rm -f $VTOY_PATH/ventoy_iso_part_dm_cmd
fi
if [ -e $VTOY_PATH/persistent_dm_table ]; then
vtlog "dmsetup remove vtoy_persistent"
$VTOY_PATH/tool/dmsetup remove vtoy_persistent
if $VTOY_PATH/tool/dmsetup ls | $GREP -qw vtoy_persistent; then
vtlog "dmsetup remove vtoy_persistent"
$VTOY_PATH/tool/dmsetup remove vtoy_persistent
else
vtlog "no need to remove DM vtoy_persistent"
fi
fi
}
@@ -843,3 +879,135 @@ ventoy_wait_dir() {
fi
done
}
ventoy_load_iso_part_fs_ko() {
vtFS=$($VTOY_PATH/tool/vtoydump -s /ventoy/ventoy_os_param)
vtlog "ISO part FS is $vtFS"
for vtModProbe in /usr/sbin/modprobe /sbin/modprobe /bin/modprobe $BUSYBOX_PATH/modprobe; do
if [ -e $vtModProbe ]; then
break
fi
done
vtlog "modprobe is $vtModProbe"
if [ "$vtFS" = "ext" ]; then
vtlog "modprobe ext2/3/4"
$vtModProbe ext2 >> $VTLOG 2>&1
$vtModProbe ext3 >> $VTLOG 2>&1
$vtModProbe ext4 >> $VTLOG 2>&1
elif [ "$vtFS" = "ntfs" ]; then
vtlog "modprobe ntfs3"
$vtModProbe ntfs3 >> $VTLOG 2>&1
elif [ "$vtFS" = "fat" ]; then
vtlog "modprobe vfat"
$vtModProbe vfat >> $VTLOG 2>&1
else
vtlog "modprobe $vtFS"
$vtModProbe $vtFS >> $VTLOG 2>&1
fi
}
ventoy_iso_part_fs_supported() {
vtFS=$($VTOY_PATH/tool/vtoydump -s /ventoy/ventoy_os_param)
if [ "$vtFS" = "ext" ]; then
vtPattern='ext[2-4]'
elif [ "$vtFS" = "fat" ]; then
vtPattern='vfat'
elif [ "$vtFS" = "ntfs" ]; then
vtPattern='ntfs3'
else
vtPattern="$vtFS"
fi
vtlog "vtFS=$vtFS Pattern=$vtPattern"
if $EGREP -q "$vtPattern" /proc/filesystems; then
vtlog "ISO part FS supported OK"
$BUSYBOX_PATH/true
else
vtlog "ISO part FS is NOT supported"
$BUSYBOX_PATH/false
fi
}
ventoy_mount_iso_part() {
vtDisk=$1
vtMnt=$2
vtlog "mount iso partition $vtDisk"
if [ -z "$vtMnt" ]; then
vtMnt=$VTOY_PATH/tmpmnt
fi
mkdir -p $vtMnt
if echo $vtDisk | $EGREP -q "nvme|mmc|nbd"; then
vtpart1=${vtDisk}p1
else
vtpart1=${vtDisk}1
fi
vtFS=$($VTOY_PATH/tool/vtoydump -s /ventoy/ventoy_os_param)
if [ "$vtFS" = "ntfs" ]; then
vtlog "mount -t ntfs3 $vtpart1 $vtMnt"
mount -t ntfs3 $vtpart1 $vtMnt >> $VTLOG 2>&1
elif [ "$vtFS" = "fat" ]; then
vtlog "mount -t vfat $vtpart1 $vtMnt"
mount -t vfat $vtpart1 $vtMnt >> $VTLOG 2>&1
else
vtlog "mount $vtpart1 $vtMnt"
mount $vtpart1 $vtMnt >> $VTLOG 2>&1
fi
}
ventoy_losetup_iso() {
vtMnt=$1
if [ -z "$vtMnt" ]; then
vtMnt=$VTOY_PATH/tmpmnt
fi
for vtLosetup in /usr/sbin/losetup /sbin/losetup /bin/losetup $BUSYBOX_PATH/losetup; do
if [ -e $vtLosetup ]; then
break
fi
done
vtisoname=$(get_ventoy_iso_name)
dd if=/dev/zero of=/ventoy/isoheader.bin bs=512 count=1 >/dev/null 2>&1
dd if="${vtMnt}${vtisoname}" bs=512 skip=1 count=64 >>/ventoy/isoheader.bin 2>>/dev/null
vtfreeloop1=$($vtLosetup -f)
if $vtLosetup -r $vtfreeloop1 /ventoy/isoheader.bin >> $VTLOG 2>&1; then
vtfreeloop2=$($vtLosetup -f)
if $vtLosetup -r --offset=33280 $vtfreeloop2 "${vtMnt}${vtisoname}" >> $VTLOG 2>&1; then
echo -n "$vtfreeloop1 $vtfreeloop2" > /ventoy/vtoy_dm_loop_dev
fi
fi
}
ventoy_mount_iso() {
if [ "$1" = "ko" ]; then
shift
ventoy_load_iso_part_fs_ko
fi
if ventoy_iso_part_fs_supported; then
if ventoy_mount_iso_part $1; then
if ventoy_losetup_iso; then
create_ventoy_loop_device_mapper $($CAT /ventoy/vtoy_dm_loop_dev)
return
else
vtlog "losetup ISO file FAILED"
fi
else
vtlog "mount iso partition FAILED"
fi
fi
$BUSYBOX_PATH/false
}
+18
View File
@@ -63,6 +63,19 @@ ventoy_get_udev_conf_path() {
echo "$VT_RULE_DIR/$VT_UDEV_RULE_FILE_NAME"
}
ventoy_add_udev_auto_rule() {
VT_RULE_DIR=$(ventoy_get_udev_conf_dir)
cp -a $VTOY_PATH/hook/default/90-ventoy-auto.rules $VT_RULE_DIR/11-ventoy-auto.rules
cp -a $VTOY_PATH/hook/default/90-ventoy-auto.rules $VT_RULE_DIR/90-ventoy-auto.rules
chmod 0644 $VT_RULE_DIR/*ventoy*
}
ventoy_dracut_pivot_udev_rule() {
cp -a $VTOY_PATH/hook/default/ventoy-pivot-udev-rule.sh $VT_DRACUT_HOOKS/pre-pivot/99-ventoy-udev-rules.sh
}
ventoy_add_kernel_udev_rule() {
VT_UDEV_RULE_PATH=$(ventoy_get_udev_conf_path)
echo "KERNEL==\"$1\", $VT_UDEV_RULE_PREFIX RUN+=\"$2\"" >> $VT_UDEV_RULE_PATH
@@ -178,3 +191,8 @@ ventoy_iso_scan_check() {
[ $vtCheckOk -eq 1 ]
}
ventoy_wrapper_dracut_hook() {
echo "#/bin/sh" > $2
echo "$BUSYBOX_PATH/sh $1" >> $2
}