Add new option - select kernel boot

master
Dmitry Razumov 2 years ago
parent 9238353b5b
commit 7a23de4ff3
Signed by: asmeron
GPG Key ID: 50BC1DB583B79706

@ -1437,6 +1437,10 @@ ubconfig_exec_system(){
GRUB_TERMINAL_OUTPUT) ${ROOTFS}/usr/lib/ublinux/rc.halt.pre/20-grub exec_grub_terminal_output ;;
GRUB_PLAY) ${ROOTFS}/usr/lib/ublinux/rc.halt.pre/20-grub exec_grub_play ;;
GRUB_CMDLINE_LINUX) ${ROOTFS}/usr/lib/ublinux/rc.halt.pre/20-grub exec_grub_cmdline_linux ;;
GRUB_VMLINUZ_FILES) ${ROOTFS}/usr/lib/ublinux/rc.halt.pre/20-grub exec_grub_vmlinuz_file ;;
GRUB_UBLINUX_FILES) ${ROOTFS}/usr/lib/ublinux/rc.halt.pre/20-grub exec_grub_ublinux_file ;;
GRUB_ADDON_FILES) ${ROOTFS}/usr/lib/ublinux/rc.halt.pre/20-grub exec_grub_addon_file ;;
KERNEL_BOOT) ${ROOTFS}/usr/lib/ublinux/rc.halt.pre/20-grub exec_grub_kernel_boot ;;
*) NO_FIND_EXCUTE=1 ;;
esac
;;

@ -155,7 +155,46 @@ exec_grub_cmdline_linux(){
STR_EXPORT="export CMDLINE_LINUX"
control_grub_var_cfg
}
exec_grub_vmlinuz_file(){
[[ -z ${KERNEL_BOOT} ]] || return 0
[[ -n $@ ]] && STR_SET_VALUE="$@" || STR_SET_VALUE="${GRUB_VMLINUZ_FILE}"
STR_SET="set VMLINUZ_FILE="
STR_EXPORT="export VMLINUZ_FILE"
control_grub_var_cfg
}
exec_grub_ublinux_file(){
[[ -z ${KERNEL_BOOT} ]] || return 0
[[ -n $@ ]] && STR_SET_VALUE="$@" || STR_SET_VALUE="${GRUB_UBLINUX_FILE}"
STR_SET="set UBLINUX_FILE="
STR_EXPORT="export UBLINUX_FILE"
control_grub_var_cfg
}
exec_grub_addon_file(){
[[ -z ${KERNEL_BOOT} ]] || return 0
[[ -n $@ ]] && STR_SET_VALUE="$@" || STR_SET_VALUE="${GRUB_ADDON_FILE}"
STR_SET="set ADDON_FILE="
STR_EXPORT="export ADDON_FILE"
control_grub_var_cfg
}
exec_grub_kernel_boot(){
# По указанному имени пакета в параметре KERNEL_BOOT= находим каталог с ядром и устаналиваем переменные в GRUB
[[ -n $@ ]] && PKG_KERNEL_NAME="$@" || PKG_KERNEL_NAME="${KERNEL_BOOT}"
PATH_KERNEL="/usr/lib/modules"
PKG_KERNEL_PATH=$(grep -Rlx ${PATH_KERNEL}/*/pkgbase -e "${PKG_KERNEL_NAME}")
if [[ -n ${PKG_KERNEL_PATH} ]]; then
PKG_KERNEL_PATH=${PKG_KERNEL_PATH%/*}
STR_SET_VALUE_VMLINUZ=$(find ${PKG_KERNEL_PATH} -maxdepth 1 -name "vmlinuz-*.*.*-*" -printf "%f\n")
STR_SET_VALUE_UBLINUX=$(find ${PKG_KERNEL_PATH} -maxdepth 1 -name "ublinux-*.*.*-*" -printf "%f\n")
STR_SET_VALUE_ADDOD=$(find ${PKG_KERNEL_PATH} -maxdepth 1 -name "addon-*.*.*-*" -printf "%f\n")
else
STR_SET_VALUE_VMLINUZ=""
STR_SET_VALUE_UBLINUX=""
STR_SET_VALUE_ADDOD=""
fi
STR_SET_VALUE="${STR_SET_VALUE_VMLINUZ}"; STR_SET="set VMLINUZ_FILE="; STR_EXPORT="export VMLINUZ_FILE"; control_grub_var_cfg
STR_SET_VALUE="${STR_SET_VALUE_UBLINUX}"; STR_SET="set UBLINUX_FILE="; STR_EXPORT="export UBLINUX_FILE"; control_grub_var_cfg
STR_SET_VALUE="${STR_SET_VALUE_ADDOD}"; STR_SET="set ADDON_FILE="; STR_EXPORT="export ADDON_FILE"; control_grub_var_cfg
}
################
##### MAIN #####

@ -0,0 +1,67 @@
#!/usr/bin/env bash
ENABLED=yes
[[ ${ENABLED} == "yes" ]] || exit 0
PATH_BOOT="/memory/layer-base/0"
PATH_KERNEL="/usr/lib/modules"
copy_newkernel_to_boot(){
# Найти все файлы ядра и initramfs и которые отсутствуют
find ${PATH_KERNEL} -maxdepth 2 -name "vmlinuz-*.*.*-*" -exec bash -c "[[ -f ${PATH_BOOT}/\${1##*/} ]] || install -CDm400 -o root -g root \$(readlink -e \${1}) ${PATH_BOOT}/\${1##*/}" bash {} \;
find ${PATH_KERNEL} -maxdepth 2 -name "ublinux-*.*.*-*" -exec bash -c "[[ -f ${PATH_BOOT}/\${1##*/} ]] || install -CDm400 -o root -g root \$(readlink -e \${1}) ${PATH_BOOT}/\${1##*/}" bash {} \;
find ${PATH_KERNEL} -maxdepth 2 -name "addon-*.*.*-*" -exec bash -c "[[ -f ${PATH_BOOT}/\${1##*/} ]] || install -CDm400 -o root -g root \$(readlink -e \${1}) ${PATH_BOOT}/\${1##*/}" bash {} \;
}
remove_oldkernel_from_boot(){
# Найти все файлы ядра "vmlinuz-*.*.*-*" и initramfs "ublinux-*.*.*-*" в ${PATH_BOOT}/boot и которые отсутствуют в /usr/modules/*/ удалить
find ${PATH_BOOT} -maxdepth 1 -name "vmlinuz-*.*.*-*" -exec bash -c "find ${PATH_KERNEL} -maxdepth 2 -name \${1##*/} -exec false \{\} + && rm -f \$1" bash {} \;
find ${PATH_BOOT} -maxdepth 1 -name "ublinux-*.*.*-*" -exec bash -c "find ${PATH_KERNEL} -maxdepth 2 -name \${1##*/} -exec false \{\} + && rm -f \$1" bash {} \;
find ${PATH_BOOT} -maxdepth 1 -name "addon-*.*.*-*" -exec bash -c "find ${PATH_KERNEL} -maxdepth 2 -name \${1##*/} -exec false \{\} + && rm -f \$1" bash {} \;
}
exec_prepare_menu_kernel(){
# Сформировать меню выбора версии ядра
FILE_LANG=${LANG%_*}
FILE_BOOTMENU_KERNEL="/memory/data/from/0/boot/grub/ublinux/grub_${FILE_LANG}_settings_kernel.cfg"
PATH_BOOT_KERNEL="/memory/layer-base/0"
TXT_RETURN="Return"; TXT_SELECTKERNEL="Select kernel version"
TXT_RU_RETURN="Возврат"; TXT_RU_SELECTKERNEL="Выбрать версию ядра"
[[ ${FILE_LANG} == "ru" ]] && TXT_RETURN=${TXT_RU_RETURN} && TXT_SELECTKERNEL=${TXT_RU_SELECTKERNEL}
[[ -d ${PATH_BOOT_KERNEL} ]] || return 0
[[ -f ${FILE_BOOTMENU_KERNEL} ]] && rm -f ${FILE_BOOTMENU_KERNEL}
for VMLINUZ_FILES in ${PATH_BOOT_KERNEL}/vmlinuz-*; do
[[ -f "${VMLINUZ_FILES}" ]] || continue
[[ ${VMLINUZ_FILES} =~ .*\/vmlinuz\-([0-9]+\.[0-9]+\.[a-z0-9_]+\-[0-9]+)$ ]]
VMLINUZ_VER=${BASH_REMATCH[1]}
if [[ -n ${VMLINUZ_VER} && -f ${PATH_BOOT_KERNEL}/ublinux-${VMLINUZ_VER} ]]; then
VMLINUZ_FILE="vmlinuz-\${VMLINUZ_VER}"
UBLINUX_FILE="ublinux-\${VMLINUZ_VER}"
[[ -f ${PATH_BOOT_KERNEL}/addon-${VMLINUZ_VER} ]] && ADDON_FILE="addon-\${VMLINUZ_VER}" || ADDON_FILE=""
cat << EOF >> "${FILE_BOOTMENU_KERNEL}"
menuentry "${TXT_SELECTKERNEL}: ${VMLINUZ_VER}" --unrestricted {
VMLINUZ_VER="${VMLINUZ_VER}"
VMLINUZ_FILE="${VMLINUZ_FILE}"
UBLINUX_FILE="${UBLINUX_FILE}"
ADDON_FILE="${ADDON_FILE}"
export VMLINUZ_VER
export VMLINUZ_FILE
export UBLINUX_FILE
export ADDON_FILE
configfile \${prefix}/ublinux/grub_${FILE_LANG}.cfg
}
EOF
fi
done
cat << EOF >> "${FILE_BOOTMENU_KERNEL}"
if [ -f \${prefix}/ublinux/grub_${FILE_LANG}.cfg ]; then
menuentry "${TXT_RETURN}" --unrestricted {
configfile \${prefix}/ublinux/grub_${FILE_LANG}.cfg
}
fi
EOF
}
copy_newkernel_to_boot
remove_oldkernel_from_boot
exec_prepare_menu_kernel

@ -125,7 +125,7 @@ exec_autoupdate(){
exec_remove_duplicated_pacman(){
PATH_PACMAN_DB="/var/lib/pacman/local/"
# Из всех дубликатов приложений в базе pacman удалить старые версии
cd ${PATH_PACMAN_DB}; rm -rdfv $(ls -1vr ${PATH_PACMAN_DB} | sed -En 's/((.*)-([^-]+)-([^-]+))/\2|\1/p' | awk -F '|' 'prefixes[$1]++ {print $2}') #'
cd ${PATH_PACMAN_DB}; rm -rdf $(ls -1vr ${PATH_PACMAN_DB} | sed -En 's/((.*)-([^-]+)-([^-]+))/\2|\1/p' | awk -F '|' 'prefixes[$1]++ {print $2}') #'
# Ситуация для которой нет обработки
# Если в полном сохранении пользователь обновиляет систему и в очередное обновление обновил только модули, то изменения останутся старыми, т.к. /changes/ имеет верхний слой

@ -43,7 +43,7 @@ exec_lightdm_xdmcp(){
fi
FILE_LIGHTDM_CONF="${ROOTFS}/etc/lightdm/lightdm.conf"
FILE_LIGHTDM_XDMCP_CONF="${ROOTFS}/etc/lightdm/lightdm.conf.d/99-xdmcp-ubconfig.conf"
if [[ ${COMMAND} == @("set="|"set+="|"set++=") ]] && ${#LIGHTDM_XDMCP[@]} -ne 0 ]]; then
if [[ ${COMMAND} == @("set="|"set+="|"set++=") ]] && [[ ${#LIGHTDM_XDMCP[@]} -ne 0 ]]; then
if [[ ${LIGHTDM_XDMCP} == @("enable"|"yes") ]]; then
[[ -d ${ROOTFS}/etc/lightdm/${FILE_LIGHTDM_XDMCP_CONF%/*} ]] || mkdir -p ${FILE_LIGHTDM_XDMCP_CONF%/*}
cat <<-EOF | sed 's/^\s*\t*//' > "${FILE_LIGHTDM_XDMCP_CONF}"

@ -636,7 +636,24 @@ GRUB_BOOT_SILENT="splash"
## Если параметр не задан, то загружаемся с самой последней установленной версией
## KERNEL_BOOT=<пакет>
## <пакет> # Имя пакета с требуемой версией ядра, с которого необходимо загрузиться
## # Ищет совпадение в /usr/lib/modules/*/pkgbase и первый найденный применяет
## # Варианты: linux49, linux420, linux54, linux510, linux515, linux517, linux519, linux61, linux66, linux68
## KERNEL_BOOT_FALLBACK=<пакет>
## <пакет> # Имя пакета с требуемой резервной версией ядра, с которогоможно загрузиться в случае аварии
## # Ищет совпадение в /usr/lib/modules/*/pkgbase и первый найденный применяет
## # Варианты: linux49, linux420, linux54, linux510, linux515, linux517, linux519, linux61, linux66, linux68
## Выбор загрузки версии ядра, принудительно указав файл ядра и initrams, если имеется то addon.
## Работает когда не указан KERNEL_BOOT
## Если указать только GRUB_VMLINUZ_FILE который в формате:vmlinuz-5.15.157-1 и не указывать GRUB_UBLINUX_FILE и/или GRUB_ADDON_FILE,
## то версия ядра применяется для файлов GRUB_UBLINUX_FILE и/или GRUB_ADDON_FILE
## GRUB_VMLINUZ_FILE=<file>
## <file> # Файл загрузки vmlinuz
## GRUB_UBLINUX_FILE=<file>
## <file> # Файл загрузки initramfs
## GRUB_ADDON_FILE=<file>
## <file> # Файл загрузки addon
[/etc/ublinux/server]
## Настройка сервера

Loading…
Cancel
Save