From aa76dfcde09d9712f7aa4751b6bf92d112f201c9 Mon Sep 17 00:00:00 2001 From: s13bby Date: Sun, 6 Sep 2026 21:24:33 +0600 Subject: [PATCH] fix --- fix.sh | 333 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 333 insertions(+) create mode 100644 fix.sh diff --git a/fix.sh b/fix.sh new file mode 100644 index 0000000..ff31279 --- /dev/null +++ b/fix.sh @@ -0,0 +1,333 @@ +#!/bin/sh +# +# fix-sddm.sh +# Восстановление SDDM + LabWC на Alpine Linux/OpenRC. +# +# Запуск от root: +# ./fix-sddm.sh ivan +# + +set -u + +USER_NAME="${1:-ivan}" +HOME_DIR="/home/$USER_NAME" + +if [ "$(id -u)" -ne 0 ]; then + echo "[!] Запусти скрипт от root:" + echo " su -" + echo " ./fix-sddm.sh $USER_NAME" + exit 1 +fi + +if ! id "$USER_NAME" >/dev/null 2>&1; then + echo "[!] Пользователь не найден: $USER_NAME" + exit 1 +fi + +if [ ! -f /etc/alpine-release ]; then + echo "[!] Этот скрипт предназначен для Alpine Linux." + exit 1 +fi + +echo +echo "==================================================" +echo " SDDM + LabWC recovery for Alpine Linux" +echo "==================================================" +echo +echo "[*] User: $USER_NAME" +echo "[*] Home: $HOME_DIR" +echo + +echo "[*] Проверка пакетов SDDM/OpenRC..." +apk update +apk add sddm sddm-openrc + +echo +echo "[*] Удаление старого неправильного конфига SDDM..." +rm -f /etc/sddm.conf.d/wayland.conf +rm -f /etc/sddm.conf.d/labwc.conf + +mkdir -p /etc/sddm.conf.d + +cat > /etc/sddm.conf.d/00-general.conf << 'EOF' +[General] +DisplayServer=x11 + +[Autologin] +Relogin=false +EOF + +chmod 644 /etc/sddm.conf.d/00-general.conf + +echo "[+] Создан базовый конфиг SDDM." +echo "[+] Автологин выключен." + +echo +echo "[*] Удаление старого autologin-wrapper..." +rm -f /usr/local/sbin/autologin-login + +echo +echo "[*] Восстановление tty1 в /etc/inittab..." + +if [ -f /etc/inittab ]; then + + if [ ! -f /etc/inittab.before-sddm-fix.bak ]; then + cp /etc/inittab /etc/inittab.before-sddm-fix.bak + echo "[+] Создана резервная копия: /etc/inittab.before-sddm-fix.bak" + fi + + # Удаляем строку, созданную старым скриптом. + sed -i '\|/usr/local/sbin/autologin-login|d' /etc/inittab + + # Для SDDM tty1 лучше не занимать agetty. + # Оставляем tty2+ как аварийные консоли. + sed -i 's|^tty1::respawn:|#tty1::respawn:|' /etc/inittab + + kill -HUP 1 2>/dev/null || true + + echo "[+] Старый getty-autologin удалён." + echo "[+] tty1 освобождён для display manager." +else + echo "[!] /etc/inittab отсутствует; пропускаю." +fi + +echo +echo "[*] Удаление автозапуска LabWC из .profile..." + +PROFILE="$HOME_DIR/.profile" + +if [ -f "$PROFILE" ]; then + + if grep -qF '# LABWC-AUTOSTART' "$PROFILE"; then + + if [ ! -f "$PROFILE.before-sddm-fix.bak" ]; then + cp "$PROFILE" "$PROFILE.before-sddm-fix.bak" + fi + + # Удаляет блок до конца файла. + # Это безопасно, если LABWC-AUTOSTART является последним блоком, + # как в исходном setup-скрипте. + sed -i '/^# LABWC-AUTOSTART$/,$d' "$PROFILE" + + echo "[+] Блок LABWC-AUTOSTART удалён из $PROFILE." + else + echo "[+] В $PROFILE нет старого блока LABWC-AUTOSTART." + fi + +else + echo "[!] $PROFILE отсутствует; пропускаю." +fi + +echo +echo "[*] Удаление ручного XDG_RUNTIME_DIR из .profile..." + +if [ -f "$PROFILE" ] && grep -qF '# XDG-RUNTIME-DIR' "$PROFILE"; then + + if [ ! -f "$PROFILE.before-runtime-fix.bak" ]; then + cp "$PROFILE" "$PROFILE.before-runtime-fix.bak" + fi + + sed -i '/^# XDG-RUNTIME-DIR$/,/^fi$/d' "$PROFILE" + + echo "[+] Старый блок XDG-RUNTIME-DIR удалён." +fi + +echo +echo "[*] Настройка групп пользователя..." + +for GROUP_NAME in wheel seat video input; do + + if ! getent group "$GROUP_NAME" >/dev/null 2>&1; then + echo "[*] Создаю группу: $GROUP_NAME" + addgroup "$GROUP_NAME" + fi + + if id -nG "$USER_NAME" | tr ' ' '\n' | grep -qx "$GROUP_NAME"; then + echo "[+] $USER_NAME уже состоит в группе $GROUP_NAME." + else + echo "[*] Добавляю $USER_NAME в группу $GROUP_NAME..." + addgroup "$USER_NAME" "$GROUP_NAME" + fi + +done + +echo +echo "[*] Создание desktop-файла LabWC..." + +mkdir -p /usr/share/wayland-sessions + +cat > /usr/share/wayland-sessions/labwc.desktop << 'EOF' +[Desktop Entry] +Name=LabWC +Comment=LabWC Wayland compositor +Exec=labwc +TryExec=labwc +Type=Application +DesktopNames=labwc +EOF + +chmod 644 /usr/share/wayland-sessions/labwc.desktop + +echo "[+] Создан: /usr/share/wayland-sessions/labwc.desktop" + +echo +echo "[*] Исправление LabWC environment..." + +mkdir -p "$HOME_DIR/.config/labwc" + +cat > "$HOME_DIR/.config/labwc/environment" << 'EOF' +XDG_CURRENT_DESKTOP=labwc +XDG_SESSION_DESKTOP=labwc +XDG_SESSION_TYPE=wayland + +MOZ_ENABLE_WAYLAND=1 +QT_QPA_PLATFORM=wayland +SDL_VIDEODRIVER=wayland + +LIBSEAT_BACKEND=seatd +EOF + +echo "[+] environment создан." + +echo +echo "[*] Исправление LabWC autostart..." + +cat > "$HOME_DIR/.config/labwc/autostart" << 'EOF' +#!/bin/sh + +if command -v nm-applet >/dev/null 2>&1; then + nm-applet & +fi + +if command -v waybar >/dev/null 2>&1; then + waybar & +fi + +if command -v mako >/dev/null 2>&1; then + mako & +fi + +if command -v pipewire >/dev/null 2>&1 && + ! pgrep -x pipewire >/dev/null 2>&1 +then + pipewire & +fi + +if command -v wireplumber >/dev/null 2>&1 && + ! pgrep -x wireplumber >/dev/null 2>&1 +then + wireplumber & +fi +EOF + +chmod 755 "$HOME_DIR/.config/labwc/autostart" + +chown -R "$USER_NAME:$USER_NAME" "$HOME_DIR/.config" + +echo "[+] autostart создан." +echo "[+] Ручное создание XDG_RUNTIME_DIR в autostart удалено." + +echo +echo "[*] Остановка старых процессов SDDM..." + +rc-service sddm stop 2>/dev/null || true +sleep 2 + +echo "[*] Найденные процессы до очистки:" +ps -eo pid,ppid,user,stat,comm,args | + grep -E '[s]ddm|[s]upervise-daemon' || true + +# Останавливаем сам SDDM и supervisor, если тот был запущен +# специально для SDDM. +pkill -TERM -f '/usr/bin/sddm' 2>/dev/null || true +pkill -TERM -f 'supervise-daemon.*sddm' 2>/dev/null || true +sleep 3 + +pkill -KILL -f '/usr/bin/sddm' 2>/dev/null || true +pkill -KILL -f 'supervise-daemon.*sddm' 2>/dev/null || true +sleep 2 + +echo "[*] Проверка процессов после очистки:" +ps -eo pid,ppid,user,stat,comm,args | + grep -E '[s]ddm|[s]upervise-daemon' || true + +echo +echo "[*] Очистка stale PID-файлов SDDM..." + +rm -f /run/sddm.pid +rm -f /run/sddm/sddm.pid +rm -f /run/openrc/started/sddm +rm -f /run/openrc/daemons/sddm + +echo +echo "[*] Включение служб OpenRC..." + +rc-update add dbus default 2>/dev/null || true +rc-update add seatd default 2>/dev/null || true +rc-update add sddm default 2>/dev/null || true + +echo +echo "[*] Запуск dbus..." +rc-service dbus start 2>/dev/null || true + +echo "[*] Запуск seatd..." +rc-service seatd start 2>/dev/null || true + +echo +echo "==================================================" +echo " Проверка перед запуском SDDM" +echo "==================================================" + +echo +echo "[*] DRM:" +ls -la /dev/dri 2>&1 || true + +echo +echo "[*] SDDM init script:" +ls -l /etc/init.d/sddm 2>&1 || true + +echo +echo "[*] Пакеты:" +apk info -e sddm sddm-openrc 2>&1 || true + +echo +echo "[*] Группы пользователя:" +id "$USER_NAME" + +echo +echo "==================================================" +echo " Попытка запуска SDDM" +echo "==================================================" + +rc-service sddm start || true + +echo +echo "[*] Статус SDDM:" +rc-service sddm status || true + +echo +echo "[*] Процессы SDDM:" +ps -eo pid,ppid,user,stat,comm,args | + grep -E '[s]ddm|[s]upervise-daemon' || true + +echo +echo "==================================================" +echo " Готово" +echo "==================================================" +echo +echo "[*] Перезагрузи виртуальную машину:" +echo +echo " reboot" +echo +echo "[*] После перезагрузки:" +echo " 1. Должен появиться экран SDDM." +echo " 2. Войди как: $USER_NAME" +echo " 3. В меню сессий выбери LabWC." +echo +echo "[!] Если SDDM снова не покажет графический экран," +echo "[!] скопируй вывод этого скрипта и результат:" +echo +echo " ls -la /dev/dri" +echo " lspci -nn | grep -Ei 'vga|3d|display'" +echo " logread | tail -150" +echo