diff --git a/ublinux/functions b/ublinux/functions index e36e710..c99adf9 100755 --- a/ublinux/functions +++ b/ublinux/functions @@ -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 ;; diff --git a/ublinux/rc.halt.pre/20-grub b/ublinux/rc.halt.pre/20-grub index 75cfcc7..ccfce4f 100755 --- a/ublinux/rc.halt.pre/20-grub +++ b/ublinux/rc.halt.pre/20-grub @@ -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 ##### diff --git a/ublinux/rc.halt.pre/81-kernel b/ublinux/rc.halt.pre/81-kernel new file mode 100755 index 0000000..1ed6579 --- /dev/null +++ b/ublinux/rc.halt.pre/81-kernel @@ -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 diff --git a/ublinux/rc.local.d/43-repository b/ublinux/rc.local.d/43-repository index 0e3db3a..92baebd 100755 --- a/ublinux/rc.local.d/43-repository +++ b/ublinux/rc.local.d/43-repository @@ -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/ имеет верхний слой diff --git a/ublinux/rc.preinit.d/60-lightdm-settings b/ublinux/rc.preinit.d/60-lightdm-settings index abe2f1d..4a938db 100755 --- a/ublinux/rc.preinit.d/60-lightdm-settings +++ b/ublinux/rc.preinit.d/60-lightdm-settings @@ -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}" diff --git a/ublinux/templates/ublinux-data.ini b/ublinux/templates/ublinux-data.ini index ce9d3e5..3a705df 100644 --- a/ublinux/templates/ublinux-data.ini +++ b/ublinux/templates/ublinux-data.ini @@ -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= +## # Файл загрузки vmlinuz +## GRUB_UBLINUX_FILE= +## # Файл загрузки initramfs +## GRUB_ADDON_FILE= +## # Файл загрузки addon + [/etc/ublinux/server] ## Настройка сервера