#!/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