This commit is contained in:
2026-09-06 21:30:22 +06:00
parent aa76dfcde0
commit edaf7b7b14
+88 -185
View File
@@ -1,54 +1,73 @@
#!/bin/sh
#
# fix-sddm.sh
# Восстановление SDDM + LabWC на Alpine Linux/OpenRC.
# fix-sddm.sh — Alpine: SDDM + LabWC без getty-autologin
#
# Запуск от root:
# Запуск:
# su -
# chmod +x fix-sddm.sh
# ./fix-sddm.sh ivan
#
set -u
set -eu
USER_NAME="${1:-ivan}"
HOME_DIR="/home/$USER_NAME"
PROFILE="$HOME_DIR/.profile"
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"
echo "[!] Запусти скрипт от root."
exit 1
fi
if [ ! -f /etc/alpine-release ]; then
echo "[!] Этот скрипт предназначен для Alpine Linux."
echo "[!] Нужен Alpine Linux."
exit 1
fi
if ! id "$USER_NAME" >/dev/null 2>&1; then
echo "[!] Пользователь не существует: $USER_NAME"
exit 1
fi
echo
echo "=================================================="
echo " SDDM + LabWC recovery for Alpine Linux"
echo " Alpine: настройка SDDM + LabWC"
echo "=================================================="
echo
echo "[*] User: $USER_NAME"
echo "[*] Home: $HOME_DIR"
echo "[*] Пользователь: $USER_NAME"
echo
echo "[*] Проверка пакетов SDDM/OpenRC..."
# ------------------------------------------------------------
# Пакеты
# ------------------------------------------------------------
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
# ------------------------------------------------------------
# Удаление старого getty-autologin
# ------------------------------------------------------------
echo "[*] Удаление старого autologin-wrapper..."
rm -f /usr/local/sbin/autologin-login
# ВАЖНО:
# /etc/inittab намеренно НЕ меняем.
# kill -HUP 1 намеренно НЕ вызываем.
# Текущий tty остаётся доступным до перезагрузки.
# ------------------------------------------------------------
# SDDM config
# ------------------------------------------------------------
echo "[*] Настройка SDDM..."
mkdir -p /etc/sddm.conf.d
# Убираем созданные ранее ошибочные конфиги.
rm -f /etc/sddm.conf.d/wayland.conf
rm -f /etc/sddm.conf.d/labwc.conf
cat > /etc/sddm.conf.d/00-general.conf << 'EOF'
[General]
DisplayServer=x11
@@ -59,100 +78,31 @@ 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 "[*] Настройка групп пользователя..."
echo "[*] Проверка групп пользователя..."
for GROUP_NAME in wheel seat video input; do
if ! getent group "$GROUP_NAME" >/dev/null 2>&1; then
echo "[*] Создаю группу: $GROUP_NAME"
echo "[*] Создание группы: $GROUP_NAME"
addgroup "$GROUP_NAME"
fi
if id -nG "$USER_NAME" | tr ' ' '\n' | grep -qx "$GROUP_NAME"; then
echo "[+] $USER_NAME уже состоит в группе $GROUP_NAME."
echo "[+] $USER_NAME уже в группе $GROUP_NAME."
else
echo "[*] Добавляю $USER_NAME в группу $GROUP_NAME..."
echo "[*] Добавление $USER_NAME в $GROUP_NAME..."
addgroup "$USER_NAME" "$GROUP_NAME"
fi
done
echo
echo "[*] Создание desktop-файла LabWC..."
# ------------------------------------------------------------
# LabWC desktop session
# ------------------------------------------------------------
echo "[*] Создание пункта сессии LabWC для SDDM..."
mkdir -p /usr/share/wayland-sessions
@@ -168,10 +118,11 @@ EOF
chmod 644 /usr/share/wayland-sessions/labwc.desktop
echo "[+] Создан: /usr/share/wayland-sessions/labwc.desktop"
# ------------------------------------------------------------
# LabWC environment
# ------------------------------------------------------------
echo
echo "[*] Исправление LabWC environment..."
echo "[*] Настройка LabWC..."
mkdir -p "$HOME_DIR/.config/labwc"
@@ -187,11 +138,6 @@ SDL_VIDEODRIVER=wayland
LIBSEAT_BACKEND=seatd
EOF
echo "[+] environment создан."
echo
echo "[*] Исправление LabWC autostart..."
cat > "$HOME_DIR/.config/labwc/autostart" << 'EOF'
#!/bin/sh
@@ -221,113 +167,70 @@ 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 удалено."
# ------------------------------------------------------------
# Удаление автозапуска LabWC из профиля
# ------------------------------------------------------------
echo
echo "[*] Остановка старых процессов SDDM..."
echo "[*] Отключение старого запуска LabWC из .profile..."
rc-service sddm stop 2>/dev/null || true
sleep 2
if [ -f "$PROFILE" ] && grep -qF '# LABWC-AUTOSTART' "$PROFILE"; then
cp "$PROFILE" "$PROFILE.before-sddm-fix.bak"
echo "[*] Найденные процессы до очистки:"
ps -eo pid,ppid,user,stat,comm,args |
grep -E '[s]ddm|[s]upervise-daemon' || true
# Удаляет блок, начиная с маркера до конца файла.
# В исходном setup.sh этот блок был последним.
sed -i '/^# LABWC-AUTOSTART$/,$d' "$PROFILE"
# Останавливаем сам 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
chown "$USER_NAME:$USER_NAME" "$PROFILE"
echo "[+] Старый блок LABWC-AUTOSTART удалён."
else
echo "[+] Старого блока LABWC-AUTOSTART нет."
fi
pkill -KILL -f '/usr/bin/sddm' 2>/dev/null || true
pkill -KILL -f 'supervise-daemon.*sddm' 2>/dev/null || true
sleep 2
# ------------------------------------------------------------
# OpenRC autostart
# ------------------------------------------------------------
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..."
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
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
apk info -e sddm sddm-openrc || true
echo
echo "[*] Группы пользователя:"
echo "[*] Пользователь:"
id "$USER_NAME"
echo
echo "=================================================="
echo " Попытка запуска SDDM"
echo "=================================================="
rc-service sddm start || true
echo "[*] LabWC session:"
ls -l /usr/share/wayland-sessions/labwc.desktop
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 "[*] DRM-устройства:"
ls -la /dev/dri 2>&1 || true
echo
echo "=================================================="
echo " Готово"
echo "=================================================="
echo
echo "[*] Перезагрузи виртуальную машину:"
echo "[!] SDDM НЕ запускается в этом скрипте специально."
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 "После перезагрузки SDDM должен показать окно входа."
echo "В меню сессий выбери: LabWC"
echo