From 3341211024e29034f882a926ce517b88504a2490 Mon Sep 17 00:00:00 2001 From: asmeron Date: Wed, 9 Jul 2025 13:29:48 +0600 Subject: [PATCH] Fix nvidia load --- ublinux/functions | 18 +++ ublinux/rc.pamsession.d/03-certmonger-cepces | 112 +++++++++++++++++++ ublinux/rc.post.d/10-brand-backgrounds | 2 +- ublinux/rc.post.d/11-xorg | 86 ++++++++++---- ublinux/rc.preinit.d/57-access-denied-vtx11 | 8 +- ublinux/rc.preinit.d/60-lightdm-settings | 2 +- ublinux/templates/ublinux-data.ini | 26 +++++ 7 files changed, 229 insertions(+), 25 deletions(-) create mode 100755 ublinux/rc.pamsession.d/03-certmonger-cepces diff --git a/ublinux/functions b/ublinux/functions index f819ed8..834dfa6 100755 --- a/ublinux/functions +++ b/ublinux/functions @@ -1530,6 +1530,13 @@ ubconfig_exec_system(){ *) NO_FIND_EXCUTE=1 ;; esac ;; + "[${SYSCONF}/mount]"|"[mount]") + case "${NAME_VAR}" in + AUTOMOUNT_SHARE\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.post.d/09-automount exec_mount_direct ;; + PUBLICDIR) ${ROOTFS}/usr/lib/ublinux/rc.post.d/23-publicdir ;; + *) NO_FIND_EXCUTE=1 ;; + esac + ;; "[${SYSCONF}/boot]"|"[boot]") case "${NAME_VAR}" in GRUB_TIMEOUT) ${ROOTFS}/usr/lib/ublinux/rc.halt.pre/20-grub exec_grub_timeout ;; @@ -1598,6 +1605,17 @@ ubconfig_exec_system(){ *) NO_FIND_EXCUTE=1 ;; esac ;; + "[${SYSCONF}/video]"|"[video]") + case "${NAME_VAR}" in + VGADRV_AUTO) ${ROOTFS}/usr/lib/ublinux/rc.post.d/11-xorg exec_vgadrv_auto ;; + VGADRV_NOFREE) ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/50-xorg ;; + XORG_MONITOR\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.post.d/11-xorg exec_xorg_monitor ;; + XORG_EXT) ${ROOTFS}/usr/lib/ublinux/rc.post.d/11-xorg exec_xorg_ext;; + XORG_DPI) ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/63-xorg-dpi + ${ROOTFS}/usr/lib/ublinux/rc.xorg/20-video-xorg-dpi ;; + *) NO_FIND_EXCUTE=1 ;; + esac + ;; "[${SYSCONF}/save]"|"[save]") case "${NAME_VAR}" in SAVE_ALL_CACHE) ${ROOTFS}/usr/lib/ublinux/rc.halt.pre/85-save-cache ;; diff --git a/ublinux/rc.pamsession.d/03-certmonger-cepces b/ublinux/rc.pamsession.d/03-certmonger-cepces new file mode 100755 index 0000000..bc34a10 --- /dev/null +++ b/ublinux/rc.pamsession.d/03-certmonger-cepces @@ -0,0 +1,112 @@ +#!/usr/bin/env bash +# +# Author: Dmitry Razumov +# Copyright (c) 2021-2025 UBLinux +# +# Extended pattern matching: https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html#Pattern-Matching +shopt -s extglob + +ENABLED=yes +[[ ${ENABLED} == yes ]] || exit 0 + +SOURCE=/usr/lib/ublinux/functions; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null +SOURCE=/usr/lib/ublinux/default; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null + +SOURCE=${SYSCONF}/config; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null +SOURCE=${SYSCONF}/logging; [ -f ${SOURCE} ] && . ${SOURCE} 2>/dev/null +SOURCE=${SYSCONF}/network; [ -f ${SOURCE} ] && . ${SOURCE} 2>/dev/null + +# https://github.com/openSUSE/cepces + +# TODO: +# Не сделано +# Делаем настройку cepces и запрос сертификата машины после авторизации в домене с действительным ключом Kerberos +# Заполнение конфигурационного файла параметрами в файл: /etc/cepces/conf.d/ubconfig.conf +# При disable удаление файла /etc/cepces/conf.d/ubconfig.conf +# Проверить нужен ли запуск от root или достаточно под правами пользователя +# Выполнять после авторизации, т.к. клиент должен быть членом домена Windows с действительным ключом Kerberos +# Разобраться с созданием: +# /etc/pki/tls/private/machine.key +# /etc/pki/tls/certs/machine.crt +# Что-то похожее https://wiki.archlinux.org/title/Easy-RSA +# Скорее всего выполнять один раз добавлении CA в certmonger после ввода в домен: +# getcert add-ca -c CA-name -e '/usr/libexec/certmonger/cepces-submit --server=ca-dns-name.suse.de --keytab=/etc/krb5.keytab --principals=MY-HOST$@SUSE.DE' +# Настройки CA: +# getcert list-cas +# Выпуска и отслеживания нового сертификата: +# getcert request -c cepces -T Machine -I MachineCertificate -k /etc/pki/tls/private/machine.key -f /etc/pki/tls/certs/machine.crt +# Проверить ход выполнения: +# getcert list + + +## Регистрации сертификатов через CEP и CES c службами сертификатов Microsoft Active Directory +## Клиент должен быть членом домена Windows с действительным ключом Kerberos +## CERTMONGER_CEPCES=enable|disable +## CERTMONGER_CEPCES[]= +## +## global:server # Hostname of the issuing certification authority +## global:type +## global:auth=Anonymous|Kerberos|UsernamePassword|Certificate +## # Authentication mechanism used for connecting to the service, default=Kerberos +## global:endpoint # Default: https://%s/ADPolicyProvider_CEP_%s/service.svc/CEP +## global:cas +## global:poll_interval # Time in seconds before re-checking if the certificate has been issued +## global:openssl_seclevel # The openssl security level +## kerberos:keytab # Use the specified keytab +## kerberos:realm +## kerberos:ccache +## kerberos:principals # A list of principals to try when requesting a ticket +## kerberos:enctypes +## kerberos:delegate +## certificate:certfile +## certificate:keyfile +## CERTMONGER_CEPCES[global:server]=ca-dns-server.win.com +## CERTMONGER_CEPCES[kerberos:keytab]=/etc/krb5.keytab +## CERTMONGER_CEPCES[kerberos:principals]=MYHOST$@WIN.COM +## CERTMONGER_CEPCES=enable +exec_01_certmonger_cepces(){ + [[ $1 == @("set="|"set+="|"set++="|"set-="|"set--="|"remove") ]] && local COMMAND=$1 && shift + [[ -n ${COMMAND} ]] || local COMMAND="set=" + [[ $(declare -p CERTMONGER_CEPCES 2>/dev/null) =~ ^"declare -A" ]] || declare -gA CERTMONGER_CEPCES + local PARAM="$@" + if [[ -n ${PARAM} ]]; then + local CERTMONGER_CEPCES= + declare -A CERTMONGER_CEPCES=() + [[ ${PARAM} =~ ^[[:alnum:]_]+("="|"[".*"]=") ]] && eval "${PARAM%%=*}=\${PARAM#*=}" + fi + if [[ ${COMMAND} == @("set="|"set+="|"set++=") ]] && [[ ${#CERTMONGER_CEPCES[@]} -ne 0 ]]; then + true + elif [[ ${COMMAND} == @("set-="|"set--="|"remove") ]]; then + if [[ ${PARAM%%=*} =~ ^.*'['(.*)']' && ${BASH_REMATCH[1]} == @("*"|"**"|"/"|"//") ]]; then + PARAM_VALUE="${PARAM#*=}" + CERTMONGER_CEPCES+="${PARAM_VALUE// /,}" + fi + true + fi +} + +ubconfig_certmonger_cepces_live(){ + true +} + +################ +##### MAIN ##### +################ + + # Если файл подключен как ресурс с функциями, то выйти + return 0 2>/dev/null && return 0 + if [[ -z $@ ]]; then + while read -r FUNCTION; do + $"${FUNCTION##* }" + done < <(declare -F | grep "declare -f exec_") + else + FUNCTION= + while [[ $# -gt 0 ]]; do + #[[ -z ${1} ]] || { declare -f "${1}" &>/dev/null && FUNCTION+="; ${1}" || FUNCTION+=" '${1}'"; } + # Что-бы передавать пустые параметры как аргументы, нужно для соблюдения очередности и кол-ва, отключил [[ -z ${1} ]] || + declare -f "${1}" &>/dev/null && FUNCTION+="; ${1}" || FUNCTION+=" '${1}'" + shift + done + eval ${FUNCTION#*; } + fi + true diff --git a/ublinux/rc.post.d/10-brand-backgrounds b/ublinux/rc.post.d/10-brand-backgrounds index 0b96159..2d05bf7 100755 --- a/ublinux/rc.post.d/10-brand-backgrounds +++ b/ublinux/rc.post.d/10-brand-backgrounds @@ -135,7 +135,7 @@ get_max_resolution(){ done 3< <(find /sys/class/drm/*/ -type f -name status -print0 2>/dev/null) # Метод определения разрешения №2 # из конфига /etc/ublinux/video по статическим заданным разрешениям - [[ -n "${XORG_MONITOR[@]}" ]] && declare -n MONITOR=XORG_MONITOR + [[ -n "${XORG_MONITOR[@]}" ]] && declare -n MONITOR=XORG_MONITOR [[ -n "${XRANDR_MONITOR[@]}" ]] && declare -n MONITOR=XRANDR_MONITOR if [[ ${#MONITOR[@]} -ne 0 ]]; then local VIDEO_PORT= VIDEO_PORT_PARAM= pixel_line_mode= pixel_max_mode= RESOLUTION_MAX= diff --git a/ublinux/rc.post.d/11-xorg b/ublinux/rc.post.d/11-xorg index e20e7d6..1297bc0 100755 --- a/ublinux/rc.post.d/11-xorg +++ b/ublinux/rc.post.d/11-xorg @@ -19,40 +19,58 @@ SOURCE=${SYSCONF}/keyboard; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null [[ ${DISPLAYMANAGER} == "none" ]] && exit - [[ -n ${VGADRV_AUTO} || -n ${XORG_EXT} || -n ${XORG_MONITOR[@]} ]] && mkdir -p /etc/X11/xorg.conf.d - rm -f /etc/X11/xorg.conf.d/*-*-ubconfig.conf + #[ ! -z "$VGAID" ] && grep -q $VGAID /usr/share/ublinux/hwdata/deleteconf && rm -f /etc/X11/xorg.conf + [[ -n "${DELETE_XORG_CONF}" ]] && rm -f /etc/X11/xorg.conf +exec_vgadrv_auto(){ # Auto VGA driver loader + FILE_LIGHTDM_CONF="/etc/lightdm/lightdm.conf.d/01-vgadrv-auto-ubconfig.conf" + FILE_SRC_NVIDIA_CONF="/usr/lib/ublinux/xorg.conf.d/20-nvidia-ubconfig.conf" + FILE_TARG_NVIDIA_CONF="/etc/X11/xorg.conf.d/20-vgadrv-auto-ubconfig.conf" + + FILE_SRC_NVIDIA_RULES="/usr/lib/ublinux/udev/70-nvidia-ubconfig.rules" + FILE_TARG_NVIDIA_RULES="/etc/udev/rules.d/70-vgadrv-auto-ubconfig.rules" if [[ -n ${VGADRV_AUTO} ]]; then + [[ -d /etc/X11/xorg.conf.d ]] || install -Dm755 /etc/X11/xorg.conf.d while read LSPCI_DEVICE; do while read KERNEL_MODULE; do [[ ${KERNEL_MODULE} != "nouveau" ]] && modprobe ${KERNEL_MODULE} 2>/dev/null && break done < <(lspci -ks ${LSPCI_DEVICE%% *} | grep 'Kernel modules:' | cut -d: -f2 | tr ',' '\n' | tac) done < <(lspci | grep -Ei 'vga|3d') if lsmod | grep nvidia &>/dev/null; then - #[[ -f /usr/bin/nvidia-xconfig ]] && nvidia-xconfig -s --no-logo --no-composite --no-dynamic-twinview --force-generate --output-xconfig=/etc/X11/xorg.conf - [[ -e /etc/X11/xorg.conf.d/20-nvidia-ubconfig.conf ]] || ln -sf /usr/lib/ublinux/xorg.conf.d/20-nvidia-ubconfig.conf /etc/X11/xorg.conf.d/ - #[[ -e /etc/udev/rules.d/70-nvidia-ubconfig.rules ]] || ln -sf /usr/lib/ublinux/udev/70-nvidia-ubconfig.rules /etc/udev/rules.d/ + #[[ -f /usr/bin/nvidia-xconfig ]] && nvidia-xconfig -s --no-logo --no-composite --no-dynamic-twinview --force-generate --output-xconfig=${FILE_TARG_NVIDIA_CONF} + [[ -e ${FILE_TARG_NVIDIA_CONF} ]] || ln -sf "${FILE_SRC_NVIDIA_CONF}" "${FILE_TARG_NVIDIA_CONF}" + #[[ -e ${FILE_TARG_NVIDIA_RULES} ]] || ln -sf "${FILE_SRC_NVIDIA_RULES}" "${FILE_TARG_NVIDIA_RULES}" /usr/bin/nvidia-modprobe -c0 -umsl - modprobe nvidia_drm - modprobe nvidia_uvm - modprobe nvidia_modeset - #modprobe drm_kms_helper - #modprobe drm + modprobe -q --show nvidia_drm && modprobe nvidia_drm + modprobe -q --show nvidia_uvm && modprobe nvidia_uvm + modprobe -q --show nvidia_modeset && modprobe nvidia_modeset + #modprobe -q --show drm_kms_helper && modprobe drm_kms_helper + #modprobe -q --show modprobe drm && modprobe drm #echo -e nvidia_drm\\nvidia_uvm\\nnvidia_modeset > usr/lib/modules-load.d/nvidia-dkms.conf fi -# else - #rm -f /etc/udev/rules.d/70-nvidia-ubconfig.rules + if [[ -d /etc/lightdm ]]; then + install -Dm644 /dev/stdin ${FILE_LIGHTDM_CONF} <<-EOF +[LightDM] +logind-check-graphical=false +EOF + fi + else + #rm -f "${FILE_TARG_NVIDIA_RULES}" + rm -f "${FILE_TARG_NVIDIA_CONF}" + rm -f "${FILE_LIGHTDM_CONF}" fi +} - +exec_xorg_ext(){ #[ ! -z "$VGAID" ] && grep -q $VGAID /usr/share/ublinux/hwdata/deleteconf && rm -f /etc/X11/xorg.conf [[ -n "${DELETE_XORG_CONF}" ]] && rm -f /etc/X11/xorg.conf - + rm -f /etc/X11/xorg.conf.d/110-xorg-ext-*-ubconfig.conf ## Управление дополнительными возможностями XORG if [[ -n ${XORG_EXT} ]]; then + [[ -d /etc/X11/xorg.conf.d ]] || install -Dm755 /etc/X11/xorg.conf.d while read I_EXT; do - XORG_FILE_EXT="/etc/X11/xorg.conf.d/110-${I_EXT}-ubconfig.conf" + XORG_FILE_EXT="/etc/X11/xorg.conf.d/110-xorg-ext-${I_EXT}-ubconfig.conf" if grep -Eiq "^nodpms$" <<< "${I_EXT}"; then cat > ${XORG_FILE_EXT} < "${XORG_FILE_MONITOR}" fi +} - +exec_mkkbdfxorg(){ + XORG_FILE_KEYBOARD="/etc/X11/xorg.conf.d/130-mkkbdfxorg-ubconfig.conf" + rm -f "${XORG_FILE_KEYBOARD}" if [[ ${MKKBDFXORG} != "no" ]] ;then - XORG_FILE_KEYBOARD="/etc/X11/xorg.conf.d/130-keyboard-ubconfig.conf" + [[ -d /etc/X11/xorg.conf.d ]] || install -Dm755 /etc/X11/xorg.conf.d if ! grep -sqi XkbOptions /etc/X11/xorg.conf; then cat > ${XORG_FILE_KEYBOARD} </dev/null && return 0 + if [[ -z $@ ]]; then + while read -r FUNCTION; do + $"${FUNCTION##* }" + done < <(declare -F | grep "declare -f exec_") + else + FUNCTION= + while [[ $# -gt 0 ]]; do + #[[ -z ${1} ]] || { declare -f "${1}" &>/dev/null && FUNCTION+="; ${1}" || FUNCTION+=" '${1}'"; } + # Что-бы передавать пустые параметры как аргументы, нужно для соблюдения очередности и кол-ва, отключил [[ -z ${1} ]] || + declare -f "${1}" &>/dev/null && FUNCTION+="; ${1}" || FUNCTION+=" '${1}'" + shift + done + eval ${FUNCTION#*; } + fi + true diff --git a/ublinux/rc.preinit.d/57-access-denied-vtx11 b/ublinux/rc.preinit.d/57-access-denied-vtx11 index 2d654a4..6ee0ba5 100755 --- a/ublinux/rc.preinit.d/57-access-denied-vtx11 +++ b/ublinux/rc.preinit.d/57-access-denied-vtx11 @@ -25,9 +25,9 @@ SOURCE=${SYSCONF}/security; [ -f ${SOURCE} ] && . ${SOURCE} 2>/dev/null exec_access_denied_vtx11(){ ## Отключить виртуальные терминалы и запретить переключение на них из X11 - FILE_XORGDONTVTSWITCH_CONF="${ROOTFS}/etc/X11/xorg.conf.d/disable-vt-ubconfig.conf" - FILE_SYSTEMDLOGIND_CONF="${ROOTFS}/etc/systemd/logind.conf.d/disable-vt-ubconfig.conf" - FILE_LIGHTDM_CONF="${ROOTFS}/etc/lightdm/lightdm.conf.d/disable-vt-ubconfig.conf" + FILE_XORGDONTVTSWITCH_CONF="${ROOTFS}/etc/X11/xorg.conf.d/access-denied-vtx11-ubconfig.conf" + FILE_SYSTEMDLOGIND_CONF="${ROOTFS}/etc/systemd/logind.conf.d/access-denied-vtx11-ubconfig.conf" + FILE_LIGHTDM_CONF="${ROOTFS}/etc/lightdm/lightdm.conf.d/access-denied-vtx11-ubconfig.conf" if [[ ${ACCESS_DENIED_VTX11,,} == @(y|yes|enable) ]]; then mkdir -p ${FILE_XORGDONTVTSWITCH_CONF%/*} cat <<-EOF | sed 's/^\s*\t*//' > "${FILE_XORGDONTVTSWITCH_CONF}" @@ -50,7 +50,7 @@ EOF logind-check-graphical=true EOF fi - elif [[ ${ACCESS_DENIED_VTX11,,} == @(n|no|disable) ]]; then + else rm -f "${FILE_SYSTEMDLOGIND_CONF}" "${FILE_XORGDONTVTSWITCH_CONF}" "${FILE_LIGHTDM_CONF}" fi } diff --git a/ublinux/rc.preinit.d/60-lightdm-settings b/ublinux/rc.preinit.d/60-lightdm-settings index 11b1811..4198314 100755 --- a/ublinux/rc.preinit.d/60-lightdm-settings +++ b/ublinux/rc.preinit.d/60-lightdm-settings @@ -88,7 +88,7 @@ exec_lightdm_greeter(){ [[ ${PARAM} =~ ^[[:alnum:]_]+("="|"[".*"]=") ]] && eval "${PARAM%%=*}=\${PARAM#*=}" fi FILE_LIGHTDM_CONF="${ROOTFS}/etc/lightdm/lightdm.conf" - FILE_LIGHTDM_GREETER_CONF="${ROOTFS}/etc/lightdm/lightdm.conf.d/99-greeter-ubconfig.conf" + FILE_LIGHTDM_GREETER_CONF="${ROOTFS}/etc/lightdm/lightdm.conf.d/99-lightdm-greeter-ubconfig.conf" if [[ ${COMMAND} == @("set="|"set+="|"set++=") ]] && [[ ${#LIGHTDM_GREETER[@]} -ne 0 ]]; then [[ -d ${ROOTFS}/etc/lightdm/${FILE_LIGHTDM_GREETER_CONF%/*} ]] || mkdir -p ${FILE_LIGHTDM_GREETER_CONF%/*} cat <<-EOF | sed 's/^\s*\t*//' > "${FILE_LIGHTDM_GREETER_CONF}" diff --git a/ublinux/templates/ublinux-data.ini b/ublinux/templates/ublinux-data.ini index 5bae448..cd853b9 100644 --- a/ublinux/templates/ublinux-data.ini +++ b/ublinux/templates/ublinux-data.ini @@ -1225,6 +1225,32 @@ VERSION= ## Включить поддержку OpenSSL алгоритмов ГОСТ GOST2012-GOST8912-GOST8912 GOST2001-GOST89-GOST89 ## OPENSSL_ENGINE=gost +## Регистрации сертификатов через CEP и CES c службами сертификатов Microsoft Active Directory +## Клиент должен быть членом домена Windows с действительным ключом Kerberos +## CERTMONGER_CEPCES=enable|disable +## CERTMONGER_CEPCES[]= +## +## global:server # Hostname of the issuing certification authority +## global:type +## global:auth=Anonymous|Kerberos|UsernamePassword|Certificate +## # Authentication mechanism used for connecting to the service, default=Kerberos +## global:endpoint # Default: https://%s/ADPolicyProvider_CEP_%s/service.svc/CEP +## global:cas +## global:poll_interval # Time in seconds before re-checking if the certificate has been issued +## global:openssl_seclevel # The openssl security level +## kerberos:keytab # Use the specified keytab +## kerberos:realm +## kerberos:ccache +## kerberos:principals # A list of principals to try when requesting a ticket +## kerberos:enctypes +## kerberos:delegate +## certificate:certfile +## certificate:keyfile +## CERTMONGER_CEPCES[global:server]=ca-dns-server.win.com +## CERTMONGER_CEPCES[kerberos:keytab]=/etc/krb5.keytab +## CERTMONGER_CEPCES[kerberos:principals]=MYHOST$@WIN.COM +## CERTMONGER_CEPCES=enable + ## Отключить виртуальные терминалы и запретить переключение на них из X11 ## ACCESS_DENIED_VTX11=yes|no*|enable|disable|y|n ## ACCESS_DENIED_VTX11=yes