еще один апдейт для void

This commit is contained in:
2026-08-17 20:26:07 +06:00
parent 3d28888e1f
commit b206449ebd
+439 -284
View File
@@ -1,26 +1,52 @@
#!/bin/sh
# =============================================================================
# Void Linux + Labwc + SDDM installer
# Void Linux + SDDM + Labwc
# =============================================================================
#
# Целевая схема:
#
# BIOS/UEFI
# |
# v
# runit
# |
# +---- dbus
# |
# +---- seatd
# |
# +---- elogind
# |
# +---- sddm
# |
# +---- Xorg
# |
# v
# SDDM
# |
# v
# Labwc (Wayland)
#
# Подходит для:
# - чистой установки Void Linux
# - KVM/QEMU + QXL
# - KVM/QEMU + VirtIO GPU
# - Intel
# - AMD
#
# NVIDIA намеренно НЕ настраивается автоматически.
#
# Запуск:
# sudo sh void-labwc-install.sh
#
# Цель:
# - Wayland
# - Labwc
# - SDDM
# - seatd
# - elogind
# - D-Bus
# - PipeWire/WirePlumber в пользовательской сессии
# sudo sh void-labwc-install.sh
#
# ВАЖНО:
# Скрипт НЕ устанавливает NVIDIA-драйвер автоматически.
# Драйвер GPU лучше определить отдельно.
# =============================================================================
set -eu
# =============================================================================
# Цвета / вывод
# =============================================================================
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
@@ -44,21 +70,18 @@ error() {
exit 1
}
run() {
"$@" || error "Команда завершилась с ошибкой: $*"
}
# =============================================================================
# Проверка root
# =============================================================================
if [ "$(id -u)" -ne 0 ]; then
error "Запусти скрипт через sudo:
error "Скрипт необходимо запускать через sudo:
sudo sh $0"
fi
# =============================================================================
# Определение пользователя
# Определение обычного пользователя
# =============================================================================
REAL_USER="${SUDO_USER:-}"
@@ -66,77 +89,122 @@ REAL_USER="${SUDO_USER:-}"
if [ -z "$REAL_USER" ] || [ "$REAL_USER" = "root" ]; then
error "Не удалось определить обычного пользователя.
Запусти так:
Запусти скрипт так:
sudo sh $0
а не через обычный root shell."
а не из root shell."
fi
if ! id "$REAL_USER" >/dev/null 2>&1; then
error "Пользователь $REAL_USER не существует."
error "Пользователь '$REAL_USER' не существует."
fi
USER_UID="$(id -u "$REAL_USER")"
USER_GID="$(id -g "$REAL_USER")"
USER_GROUP="$(id -gn "$REAL_USER")"
USER_HOME="$(getent passwd "$REAL_USER" | cut -d: -f6)"
if [ -z "$USER_HOME" ] || [ ! -d "$USER_HOME" ]; then
error "Не удалось определить HOME пользователя $REAL_USER."
error "Не удалось определить HOME пользователя '$REAL_USER'."
fi
echo ""
echo "============================================================"
echo " Void Linux + Labwc + SDDM installer"
echo " Void Linux + SDDM + Labwc installer"
echo "============================================================"
echo ""
echo "Пользователь: $REAL_USER"
echo "HOME: $USER_HOME"
echo "Пользователь : $REAL_USER"
echo "UID : $USER_UID"
echo "HOME : $USER_HOME"
echo ""
# =============================================================================
# ЭТАП 1. Репозитории
# Проверка архитектуры
# =============================================================================
log "Этап 1/7: настройка репозиториев..."
info "Архитектура системы: $(uname -m)"
# =============================================================================
# ЭТАП 1 — Репозитории
# =============================================================================
echo ""
log "Этап 1/8: настройка репозиториев..."
# Nonfree нужен для части firmware/драйверов и некоторых пакетов.
if xbps-query -Rs '^void-repo-nonfree$' 2>/dev/null | \
grep -q 'void-repo-nonfree'; then
log "void-repo-nonfree доступен."
if ! xbps-query -Rs '^void-repo-nonfree$' 2>/dev/null | grep -q void-repo-nonfree; then
xbps-install -Sy void-repo-nonfree || \
warn "Не удалось установить void-repo-nonfree."
else
log "void-repo-nonfree уже доступен."
info "Устанавливаю void-repo-nonfree..."
xbps-install -Sy void-repo-nonfree
fi
# =============================================================================
# ЭТАП 2. Обновление системы
# ЭТАП 2 — Обновление системы
# =============================================================================
log "Этап 2/7: обновление системы..."
echo ""
log "Этап 2/8: обновление системы..."
run xbps-install -Syu
xbps-install -Syu
# =============================================================================
# ЭТАП 3. Основные пакеты
# ЭТАП 3 — Базовые пакеты
# =============================================================================
log "Этап 3/7: установка графического стека..."
echo ""
log "Этап 3/8: установка базовой системы..."
PACKAGES="
labwc
sddm
seatd
elogind
BASE_PACKAGES="
base-system
dbus
elogind
seatd
sudo
ca-certificates
curl
wget
tar
unzip
zip
p7zip
unar
fuse
fuse-common
xdg-utils
"
xorg-minimal
for pkg in $BASE_PACKAGES; do
info "Установка: $pkg"
xbps-install -y "$pkg" || warn "Не удалось установить $pkg"
done
# =============================================================================
# ЭТАП 4 — Графический стек
# =============================================================================
echo ""
log "Этап 4/8: установка графического стека..."
GRAPHICS_PACKAGES="
xorg
xorg-server-xwayland
mesa-dri
sddm
labwc
waybar
wofi
mako
swaylock
swayidle
swaybg
mako
wofi
wl-clipboard
cliphist
grim
@@ -146,10 +214,6 @@ xdg-desktop-portal
xdg-desktop-portal-wlr
xdg-desktop-portal-gtk
pipewire
wireplumber
alsa-pipewire
polkit
polkit-gnome
@@ -158,35 +222,9 @@ qt6-wayland
qt5ct
qt6ct
dolphin
kate
firefox
kitty
mpv
ristretto
pavucontrol
easyeffects
gparted
htop
qdirstat
curl
wget
tar
unar
unzip
zip
p7zip
nodejs
npm
ffmpeg
libnotify
xdg-utils
fuse
fuse-common
ca-certificates
pipewire
wireplumber
alsa-pipewire
fontconfig
noto-fonts-ttf
@@ -200,62 +238,123 @@ adwaita-icon-theme
linux-firmware
"
# Установка по одному.
#
# Это специально сделано вместо одного xargs:
# если один необязательный пакет отсутствует в репозитории,
# это не должно ломать весь графический стек.
for pkg in $PACKAGES; do
if xbps-query -Rs "^${pkg}$" 2>/dev/null | grep -q "$pkg"; then
if xbps-query -p pkgver "$pkg" >/dev/null 2>&1; then
log "Уже установлен: $pkg"
else
info "Устанавливаю: $pkg"
xbps-install -y "$pkg" || warn "Не удалось установить $pkg"
fi
else
warn "Пакет отсутствует в репозиториях: $pkg"
fi
for pkg in $GRAPHICS_PACKAGES; do
info "Установка: $pkg"
xbps-install -y "$pkg" || warn "Не удалось установить $pkg"
done
# =============================================================================
# ЭТАП 4. Пользователь и группы
# QXL / KVM
# =============================================================================
log "Этап 4/7: настройка пользователя..."
echo ""
info "Проверка виртуальной/физической видеокарты..."
if command -v lspci >/dev/null 2>&1; then
GPU_INFO="$(lspci | grep -Ei 'VGA|3D|Display' || true)"
if [ -n "$GPU_INFO" ]; then
echo ""
echo "$GPU_INFO"
echo ""
case "$GPU_INFO" in
*QXL*|*Red\ Hat*QXL*)
info "Обнаружена QXL GPU — устанавливаю Xorg QXL driver."
xbps-install -y xf86-video-qxl || \
warn "xf86-video-qxl недоступен."
;;
*Virtio*)
info "Обнаружена VirtIO GPU."
;;
*AMD*|*ATI*|*Radeon*)
info "Обнаружена AMD/ATI GPU."
;;
*Intel*)
info "Обнаружена Intel GPU."
;;
*NVIDIA*)
warn "Обнаружена NVIDIA GPU."
warn "NVIDIA driver намеренно НЕ устанавливается автоматически."
;;
*)
info "Неизвестный GPU — используются Mesa/Xorg по умолчанию."
;;
esac
else
warn "Не удалось определить GPU через lspci."
fi
# seatd
if getent group _seatd >/dev/null 2>&1; then
usermod -aG _seatd "$REAL_USER"
log "$REAL_USER добавлен в группу _seatd"
else
warn "Группа _seatd не найдена."
fi
# audio
if getent group audio >/dev/null 2>&1; then
usermod -aG audio "$REAL_USER"
log "$REAL_USER добавлен в группу audio"
fi
# video
if getent group video >/dev/null 2>&1; then
usermod -aG video "$REAL_USER"
log "$REAL_USER добавлен в группу video"
fi
# wheel
if getent group wheel >/dev/null 2>&1; then
usermod -aG wheel "$REAL_USER"
log "$REAL_USER добавлен в группу wheel"
warn "lspci не найден."
fi
# =============================================================================
# ЭТАП 5. Системные сервисы
# Дополнительные пользовательские приложения
# =============================================================================
log "Этап 5/7: настройка runit..."
echo ""
log "Установка пользовательских приложений..."
OPTIONAL_PACKAGES="
dolphin
kate
firefox
kitty
mpv
ristretto
pavucontrol
easyeffects
gparted
htop
qdirstat
ffmpeg
libnotify
nodejs
npm
"
for pkg in $OPTIONAL_PACKAGES; do
info "Установка: $pkg"
xbps-install -y "$pkg" || warn "Пропущен пакет: $pkg"
done
# =============================================================================
# ЭТАП 5 — Пользовательские группы
# =============================================================================
echo ""
log "Этап 5/8: настройка групп пользователя..."
add_group() {
group="$1"
if getent group "$group" >/dev/null 2>&1; then
usermod -aG "$group" "$REAL_USER"
log "$REAL_USER -> $group"
else
warn "Группа '$group' отсутствует."
fi
}
add_group "_seatd"
add_group "audio"
add_group "video"
add_group "wheel"
# =============================================================================
# ЭТАП 6 — Runit services
# =============================================================================
echo ""
log "Этап 6/8: настройка системных сервисов runit..."
enable_service() {
svc="$1"
@@ -266,45 +365,92 @@ enable_service() {
fi
if [ -L "/var/service/$svc" ]; then
log "Сервис уже включён: $svc"
log "Уже включён: $svc"
return 0
fi
ln -s "/etc/sv/$svc" "/var/service/$svc"
log "Включён сервис: $svc"
log "Включён: $svc"
}
# Системный D-Bus
enable_service dbus
# Seat management для wlroots/Labwc
enable_service seatd
# Session management / XDG_RUNTIME_DIR
enable_service elogind
# Display manager
enable_service sddm
# =============================================================================
# ВАЖНО:
#
# НЕ включаем:
#
# pipewire
# wireplumber
#
# Они должны работать в пользовательской графической сессии,
# а не как обычные system-wide runit services.
# =============================================================================
# ЭТАП 6. Wayland session для SDDM
# как system-wide runit services.
#
# Они должны работать в пользовательской сессии.
# =============================================================================
log "Этап 6/7: настройка Labwc + SDDM..."
if [ -L "/var/service/pipewire" ]; then
warn "Обнаружен system-wide pipewire service."
warn "Отключаю его — PipeWire будет работать в user session."
rm -f /var/service/pipewire
fi
if [ -L "/var/service/wireplumber" ]; then
warn "Обнаружен system-wide wireplumber service."
warn "Отключаю его — WirePlumber будет работать в user session."
rm -f /var/service/wireplumber
fi
# =============================================================================
# elogind vs acpid
# =============================================================================
#
# elogind сам занимается session/power management.
# Поэтому не включаем acpid.
# =============================================================================
if [ -L "/var/service/acpid" ]; then
warn "Отключаю acpid, поскольку используется elogind."
rm -f /var/service/acpid
fi
# =============================================================================
# ЭТАП 7 — SDDM
# =============================================================================
echo ""
log "Этап 7/8: настройка SDDM..."
mkdir -p /etc/sddm.conf.d
# -------------------------------------------------------------------------
# ВАЖНО:
#
# НЕ заставляем SDDM работать как Wayland compositor.
#
# SDDM использует Xorg для своего login screen.
#
# После авторизации SDDM запускает Labwc как Wayland session.
# -------------------------------------------------------------------------
rm -f /etc/sddm.conf.d/10-wayland.conf
cat > /etc/sddm.conf.d/10-display.conf << 'EOF'
[General]
DisplayServer=x11
EOF
log "SDDM настроен на X11/Xorg."
# =============================================================================
# Labwc Wayland session
# =============================================================================
mkdir -p /usr/share/wayland-sessions
SESSION_FILE="/usr/share/wayland-sessions/labwc.desktop"
cat > "$SESSION_FILE" << 'EOF'
cat > /usr/share/wayland-sessions/labwc.desktop << 'EOF'
[Desktop Entry]
Name=Labwc
Comment=Wayland window-stacking compositor
@@ -313,161 +459,144 @@ Type=Application
DesktopNames=labwc
EOF
chmod 644 "$SESSION_FILE"
chmod 644 /usr/share/wayland-sessions/labwc.desktop
log "Создана SDDM-сессия: $SESSION_FILE"
log "Создана Wayland-сессия Labwc."
# =============================================================================
# SDDM configuration
# SDDM autologin НЕ включаем.
# =============================================================================
mkdir -p /etc/sddm.conf.d
cat > /etc/sddm.conf.d/10-wayland.conf << 'EOF'
[General]
DisplayServer=wayland
[Wayland]
SessionDir=/usr/share/wayland-sessions
EOF
log "SDDM настроен на Wayland."
# Пользователь сам выбирает Labwc на экране SDDM.
# =============================================================================
# PipeWire ALSA
# ЭТАП 8 — Labwc config
# =============================================================================
if [ -d /usr/share/alsa/alsa.conf.d ]; then
echo ""
log "Этап 8/8: создание базовой конфигурации Labwc..."
mkdir -p /etc/alsa/conf.d
LABWC_DIR="$USER_HOME/.config/labwc"
if [ -f /usr/share/alsa/alsa.conf.d/50-pipewire.conf ]; then
ln -sf \
/usr/share/alsa/alsa.conf.d/50-pipewire.conf \
/etc/alsa/conf.d/50-pipewire.conf
fi
mkdir -p "$LABWC_DIR"
if [ -f /usr/share/alsa/alsa.conf.d/99-pipewire-default.conf ]; then
ln -sf \
/usr/share/alsa/alsa.conf.d/99-pipewire-default.conf \
/etc/alsa/conf.d/99-pipewire-default.conf
fi
# -------------------------------------------------------------------------
# autostart
# -------------------------------------------------------------------------
log "ALSA/PipeWire настроен."
fi
# =============================================================================
# Пользовательский Labwc config
# =============================================================================
USER_CONFIG="$USER_HOME/.config/labwc"
if [ ! -d "$USER_CONFIG" ]; then
mkdir -p "$USER_CONFIG"
chown -R "$REAL_USER":"$(id -gn "$REAL_USER")" \
"$USER_HOME/.config"
log "Создан $USER_CONFIG"
else
log "$USER_CONFIG уже существует."
fi
# =============================================================================
# Минимальный autostart
# =============================================================================
AUTOSTART="$USER_CONFIG/autostart"
AUTOSTART="$LABWC_DIR/autostart"
if [ ! -f "$AUTOSTART" ]; then
cat > "$AUTOSTART" << 'EOF'
#!/bin/sh
# ---------------------------------------------------------
# Labwc autostart
# ---------------------------------------------------------
# Waybar
waybar &
if command -v waybar >/dev/null 2>&1; then
waybar &
fi
# Notification daemon
mako &
if command -v mako >/dev/null 2>&1; then
mako &
fi
# PolicyKit authentication agent
if command -v /usr/libexec/polkit-gnome-authentication-agent-1 >/dev/null 2>&1; then
if [ -x /usr/libexec/polkit-gnome-authentication-agent-1 ]; then
/usr/libexec/polkit-gnome-authentication-agent-1 &
elif command -v polkit-gnome-authentication-agent-1 >/dev/null 2>&1; then
polkit-gnome-authentication-agent-1 &
fi
# PipeWire / WirePlumber
# Они обычно активируются через user/session environment.
EOF
chmod +x "$AUTOSTART"
chown "$REAL_USER":"$(id -gn "$REAL_USER")" "$AUTOSTART"
log "Создан Labwc autostart."
log "Создан минимальный Labwc autostart."
else
log "Существующий autostart не изменён."
info "Существующий Labwc autostart не изменён."
fi
# =============================================================================
# Права на конфигурацию
# ALSA / PipeWire
# =============================================================================
chown -R "$REAL_USER":"$(id -gn "$REAL_USER")" \
info "Настройка ALSA → PipeWire..."
mkdir -p /etc/alsa/conf.d
if [ -f /usr/share/alsa/alsa.conf.d/50-pipewire.conf ]; then
ln -sf \
/usr/share/alsa/alsa.conf.d/50-pipewire.conf \
/etc/alsa/conf.d/50-pipewire.conf
fi
if [ -f /usr/share/alsa/alsa.conf.d/99-pipewire-default.conf ]; then
ln -sf \
/usr/share/alsa/alsa.conf.d/99-pipewire-default.conf \
/etc/alsa/conf.d/99-pipewire-default.conf
fi
log "ALSA/PipeWire настроен."
# =============================================================================
# Права пользователя
# =============================================================================
chown -R "$REAL_USER":"$USER_GROUP" \
"$USER_HOME/.config"
# =============================================================================
# НЕ устанавливаем NVIDIA автоматически
# Проверка установки
# =============================================================================
echo ""
info "Проверяем GPU..."
log "Проверка установленного ПО..."
if command -v lspci >/dev/null 2>&1; then
GPU="$(lspci | grep -Ei 'VGA|3D|Display' || true)"
if [ -n "$GPU" ]; then
echo "$GPU"
echo ""
case "$GPU" in
*NVIDIA*)
warn "Обнаружена NVIDIA."
warn "NVIDIA-драйвер НЕ устанавливался автоматически."
warn "Сначала определите поколение GPU."
;;
*AMD*)
log "Обнаружена AMD GPU."
;;
*Intel*)
log "Обнаружена Intel GPU."
;;
*)
info "GPU не удалось определить автоматически."
;;
esac
check_command() {
cmd="$1"
if command -v "$cmd" >/dev/null 2>&1; then
log "$cmd: $(command -v "$cmd")"
else
warn "GPU через lspci определить не удалось."
warn "$cmd: НЕ НАЙДЕН"
fi
}
check_command labwc
check_command sddm
check_command Xorg
check_command dbus-run-session
check_command pipewire
check_command wireplumber
# =============================================================================
# Проверка session file
# =============================================================================
if [ -f /usr/share/wayland-sessions/labwc.desktop ]; then
log "Labwc session file: OK"
else
warn "lspci отсутствует."
warn "Labwc session file отсутствует!"
fi
# =============================================================================
# Ожидание запуска runit services
# =============================================================================
echo ""
info "Ожидание запуска сервисов..."
sleep 3
# =============================================================================
# Проверка сервисов
# =============================================================================
log "Этап 7/7: проверка сервисов..."
sleep 2
check_service() {
svc="$1"
@@ -476,46 +605,33 @@ check_service() {
return 0
fi
if sv status "$svc" 2>/dev/null | grep -q "run:"; then
if sv status "$svc" 2>/dev/null | grep -q '^run:'; then
log "$svc: RUNNING"
else
warn "$svc: включён, но НЕ RUNNING"
warn "$svc: НЕ ЗАПУЩЕН"
sv status "$svc" 2>&1 || true
fi
}
echo ""
info "Статус системных сервисов:"
check_service dbus
check_service seatd
check_service elogind
check_service sddm
# =============================================================================
# Проверка Labwc
# Проверка Xorg
# =============================================================================
echo ""
info "Проверка установки Labwc..."
info "Проверка Xorg..."
if command -v labwc >/dev/null 2>&1; then
log "labwc найден: $(command -v labwc)"
if [ -x /usr/bin/X ]; then
log "Xorg найден: /usr/bin/X"
else
warn "Команда labwc не найдена."
fi
if command -v sddm >/dev/null 2>&1; then
log "sddm найден: $(command -v sddm)"
else
warn "Команда sddm не найдена."
fi
# =============================================================================
# Проверка Wayland session
# =============================================================================
if [ -f "$SESSION_FILE" ]; then
log "Wayland session существует: $SESSION_FILE"
else
warn "Wayland session НЕ найдена."
warn "Xorg /usr/bin/X не найден!"
fi
# =============================================================================
@@ -524,57 +640,96 @@ fi
echo ""
echo "============================================================"
printf "${GREEN}Установка завершена.${NC}\n"
printf "${GREEN}✓ УСТАНОВКА ЗАВЕРШЕНА${NC}\n"
echo "============================================================"
echo ""
echo "Архитектура:"
echo " SDDM -> Xorg"
echo " SDDM -> Labwc"
echo " Labwc -> Wayland"
echo ""
echo "Сервисы:"
echo " dbus: /var/service/dbus"
echo " seatd: /var/service/seatd"
echo " elogind: /var/service/elogind"
echo " sddm: /var/service/sddm"
echo " dbus"
echo " seatd"
echo " elogind"
echo " sddm"
echo ""
echo "Labwc session:"
echo " $SESSION_FILE"
echo "Labwc:"
echo " $LABWC_DIR"
echo ""
echo "Конфигурация:"
echo " $USER_CONFIG"
echo "SDDM session:"
echo " /usr/share/wayland-sessions/labwc.desktop"
echo ""
echo "============================================================"
echo " ВАЖНО"
echo " ЧТО ДЕЛАТЬ ДАЛЬШЕ"
echo "============================================================"
echo ""
echo "1. Перезагрузите компьютер:"
echo "1. Перезагрузиться:"
echo ""
echo " reboot"
echo " sudo reboot"
echo ""
echo "2. После перезагрузки должен появиться SDDM."
echo "2. Дождаться экрана SDDM."
echo ""
echo "3. В SDDM выберите:"
echo "3. Выбрать сессию:"
echo ""
echo " Labwc"
echo ""
echo "4. Если SDDM НЕ появился, войдите в TTY:"
echo "4. Войти под пользователем:"
echo ""
echo " Ctrl+Alt+F2"
echo " $REAL_USER"
echo ""
echo " и выполните:"
echo "============================================================"
echo " ЕСЛИ ЧТО-ТО НЕ ЗАПУСТИЛОСЬ"
echo "============================================================"
echo ""
echo "Перейти в TTY:"
echo ""
echo " Ctrl + Alt + F2"
echo ""
echo "Проверить сервисы:"
echo ""
echo " sudo sv status dbus"
echo " sudo sv status seatd"
echo " sudo sv status elogind"
echo " sudo sv status sddm"
echo ""
echo "5. Логи SDDM:"
echo "Проверить SDDM:"
echo ""
echo " sudo sv status sddm"
echo " sudo tail -100 /var/log/sddm/current"
echo " ps aux | grep -E 'sddm|Xorg' | grep -v grep"
echo ""
echo "6. Проверка GPU:"
echo "Проверить Xorg:"
echo ""
echo " sudo tail -100 /var/log/Xorg.0.log"
echo ""
echo "Проверить GPU:"
echo ""
echo " lspci -k -d ::03xx"
echo ""
echo "============================================================"
echo "Проверить XDG_RUNTIME_DIR после входа:"
echo ""
echo " echo \"\$XDG_RUNTIME_DIR\""
echo ""
echo "============================================================"
echo ""
warn "После добавления пользователя в группы требуется новая"
warn "login-сессия. Поэтому после установки ОБЯЗАТЕЛЬНО reboot."
echo ""