апдейт скрипта установки для void

This commit is contained in:
2026-08-17 19:47:49 +06:00
parent 408f76299e
commit 3d28888e1f
2 changed files with 545 additions and 148 deletions
+541 -144
View File
@@ -1,183 +1,580 @@
#!/bin/sh #!/bin/sh
# ============================================================================= # =============================================================================
# Void Linux Labwc Stack Installer # Void Linux + Labwc + SDDM installer
# Запуск: sudo sh void-labwc-install.sh #
# Запуск:
# sudo sh void-labwc-install.sh
#
# Цель:
# - Wayland
# - Labwc
# - SDDM
# - seatd
# - elogind
# - D-Bus
# - PipeWire/WirePlumber в пользовательской сессии
#
# ВАЖНО:
# Скрипт НЕ устанавливает NVIDIA-драйвер автоматически.
# Драйвер GPU лучше определить отдельно.
# ============================================================================= # =============================================================================
set -e # Остановка при ошибке set -eu
RED='\033[0;31m' RED='\033[0;31m'
GREEN='\033[0;32m' GREEN='\033[0;32m'
YELLOW='\033[1;33m' YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' NC='\033[0m'
log() { printf "${GREEN}[✓]${NC} %s\n" "$1"; } log() {
warn() { printf "${YELLOW}[!]${NC} %s\n" "$1"; } printf "${GREEN}[✓]${NC} %s\n" "$1"
error() { printf "${RED}[✗]${NC} %s\n" "$1"; exit 1; }
# Проверка root
if [ "$(id -u)" -ne 0 ]; then
error "Скрипт нужно запускать от root: sudo sh $0"
fi
# Определение текущего пользователя (не root)
REAL_USER="${SUDO_USER:-$USER}"
if [ "$REAL_USER" = "root" ]; then
error "Нельзя запускать от root напрямую. Используйте: sudo -u ваш_пользователь sh $0\nИли запустите от обычного пользователя через sudo."
fi
echo ""
echo "========================================="
echo " Void Linux Labwc Stack Installer"
echo " Пользователь: $REAL_USER"
echo "========================================="
echo ""
# ===========================================================================
# ЭТАП 1: Репозитории и базовое обновление
# ===========================================================================
log "Этап 1/4: Обновление репозиториев..."
xbps-install -Sy void-repo-nonfree || error "Не удалось добавить nonfree репозиторий"
xbps-install -Syu base-system || error "Не удалось обновить base-system"
# ===========================================================================
# ЭТАП 2: Установка пакетов
# ===========================================================================
log "Этап 2/4: Установка пакетов..."
PACKAGES="
curl wget tar unar nodejs npm
labwc waybar swaylock swayidle polkit-gnome
dolphin kate firefox pipewire kitty
v2ray v2rayA telegram htop gparted pavucontrol qdirstat
easyeffects lsp-plugins-lv2 obsidian ristretto mpv
wofi cliphist sddm pango xorg-server-xwayland
mesa-dri nvidia-open-dkms wl-clipboard gtk-layer-shell
grim slurp swaybg mako seatd dbus polkit
fontconfig noto-fonts-ttf ttf-dejavu ttf-jetbrains-mono ttf-font-awesome
alsa-pipewire wireplumber
xdg-desktop-portal-wlr xdg-desktop-portal-gtk
qt6-wayland qt5-wayland qt5ct qt6ct
fuse fuse-common ca-certificates xdg-utils
dhcpcd sudo acpid breeze-icons adwaita-icon-theme
ffmpeg libnotify unzip zip p7zip linux-firmware
"
# Убираем пустые строки и устанавливаем
echo "$PACKAGES" | tr '\n' ' ' | xargs xbps-install -Sy || {
warn "Некоторые пакеты не найдены. Попытка установки по одному..."
for pkg in $PACKAGES; do
if ! xbps-install -Sy "$pkg" 2>/dev/null; then
warn "Пропущен пакет: $pkg (не найден в репозитории)"
fi
done
} }
log "Все доступные пакеты установлены." info() {
printf "${BLUE}[i]${NC} %s\n" "$1"
}
# =========================================================================== warn() {
# ЭТАП 3: Настройка сервисов runit printf "${YELLOW}[!]${NC} %s\n" "$1"
# =========================================================================== }
log "Этап 3/4: Настройка сервисов runit..."
error() {
printf "${RED}[✗]${NC} %s\n" "$1"
exit 1
}
run() {
"$@" || error "Команда завершилась с ошибкой: $*"
}
# =============================================================================
# Проверка root
# =============================================================================
if [ "$(id -u)" -ne 0 ]; then
error "Запусти скрипт через sudo:
sudo sh $0"
fi
# =============================================================================
# Определение пользователя
# =============================================================================
REAL_USER="${SUDO_USER:-}"
if [ -z "$REAL_USER" ] || [ "$REAL_USER" = "root" ]; then
error "Не удалось определить обычного пользователя.
Запусти так:
sudo sh $0
а не через обычный root shell."
fi
if ! id "$REAL_USER" >/dev/null 2>&1; then
error "Пользователь $REAL_USER не существует."
fi
USER_HOME="$(getent passwd "$REAL_USER" | cut -d: -f6)"
if [ -z "$USER_HOME" ] || [ ! -d "$USER_HOME" ]; then
error "Не удалось определить HOME пользователя $REAL_USER."
fi
echo ""
echo "============================================================"
echo " Void Linux + Labwc + SDDM installer"
echo "============================================================"
echo ""
echo "Пользователь: $REAL_USER"
echo "HOME: $USER_HOME"
echo ""
# =============================================================================
# ЭТАП 1. Репозитории
# =============================================================================
log "Этап 1/7: настройка репозиториев..."
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 уже доступен."
fi
# =============================================================================
# ЭТАП 2. Обновление системы
# =============================================================================
log "Этап 2/7: обновление системы..."
run xbps-install -Syu
# =============================================================================
# ЭТАП 3. Основные пакеты
# =============================================================================
log "Этап 3/7: установка графического стека..."
PACKAGES="
labwc
sddm
seatd
elogind
dbus
xorg-minimal
xorg-server-xwayland
mesa-dri
waybar
swaylock
swayidle
swaybg
mako
wofi
wl-clipboard
cliphist
grim
slurp
xdg-desktop-portal
xdg-desktop-portal-wlr
xdg-desktop-portal-gtk
pipewire
wireplumber
alsa-pipewire
polkit
polkit-gnome
qt5-wayland
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
fontconfig
noto-fonts-ttf
ttf-dejavu
ttf-jetbrains-mono
ttf-font-awesome
breeze-icons
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
done
# =============================================================================
# ЭТАП 4. Пользователь и группы
# =============================================================================
log "Этап 4/7: настройка пользователя..."
# 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"
fi
# =============================================================================
# ЭТАП 5. Системные сервисы
# =============================================================================
log "Этап 5/7: настройка runit..."
enable_service() { enable_service() {
svc="$1" svc="$1"
if [ -d "/etc/sv/$svc" ]; then
if [ ! -L "/var/service/$svc" ]; then if [ ! -d "/etc/sv/$svc" ]; then
ln -s "/etc/sv/$svc" "/var/service/$svc" warn "Сервис отсутствует: /etc/sv/$svc"
log "Сервис включён: $svc" return 0
else
log "Сервис уже включён: $svc"
fi fi
if [ -L "/var/service/$svc" ]; then
log "Сервис уже включён: $svc"
return 0
fi
ln -s "/etc/sv/$svc" "/var/service/$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
# =============================================================================
log "Этап 6/7: настройка Labwc + SDDM..."
mkdir -p /usr/share/wayland-sessions
SESSION_FILE="/usr/share/wayland-sessions/labwc.desktop"
cat > "$SESSION_FILE" << 'EOF'
[Desktop Entry]
Name=Labwc
Comment=Wayland window-stacking compositor
Exec=labwc
Type=Application
DesktopNames=labwc
EOF
chmod 644 "$SESSION_FILE"
log "Создана SDDM-сессия: $SESSION_FILE"
# =============================================================================
# SDDM configuration
# =============================================================================
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."
# =============================================================================
# PipeWire ALSA
# =============================================================================
if [ -d /usr/share/alsa/alsa.conf.d ]; then
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 настроен."
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"
if [ ! -f "$AUTOSTART" ]; then
cat > "$AUTOSTART" << 'EOF'
#!/bin/sh
# Waybar
waybar &
# Notification daemon
mako &
# PolicyKit authentication agent
if command -v /usr/libexec/polkit-gnome-authentication-agent-1 >/dev/null 2>&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."
else
log "Существующий autostart не изменён."
fi
# =============================================================================
# Права на конфигурацию
# =============================================================================
chown -R "$REAL_USER":"$(id -gn "$REAL_USER")" \
"$USER_HOME/.config"
# =============================================================================
# НЕ устанавливаем NVIDIA автоматически
# =============================================================================
echo ""
info "Проверяем GPU..."
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
else else
warn "Сервис не найден: /etc/sv/$svc (пропустим)" warn "GPU через lspci определить не удалось."
fi
else
warn "lspci отсутствует."
fi
# =============================================================================
# Проверка сервисов
# =============================================================================
log "Этап 7/7: проверка сервисов..."
sleep 2
check_service() {
svc="$1"
if [ ! -L "/var/service/$svc" ]; then
warn "$svc: НЕ ВКЛЮЧЁН"
return 0
fi
if sv status "$svc" 2>/dev/null | grep -q "run:"; then
log "$svc: RUNNING"
else
warn "$svc: включён, но НЕ RUNNING"
sv status "$svc" 2>&1 || true
fi fi
} }
enable_service dbus check_service dbus
enable_service seatd check_service seatd
enable_service sddm check_service elogind
enable_service pipewire check_service sddm
enable_service wireplumber
enable_service dhcpcd
enable_service acpid
# Добавление пользователя в необходимые группы # =============================================================================
log "Настройка групп пользователя $REAL_USER..." # Проверка Labwc
usermod -aG _seatd,audio,video,wheel "$REAL_USER" # =============================================================================
log "Пользователь добавлен в группы: _seatd, audio, video, wheel"
# =========================================================================== echo ""
# ЭТАП 4: Пост-установочная настройка info "Проверка установки Labwc..."
# ===========================================================================
log "Этап 4/4: Пост-установочная настройка..."
# ALSA → PipeWire конфиг if command -v labwc >/dev/null 2>&1; then
mkdir -p /etc/alsa/conf.d log "labwc найден: $(command -v labwc)"
ln -sf /usr/share/alsa/alsa.conf.d/50-pipewire.conf /etc/alsa/conf.d/
ln -sf /usr/share/alsa/alsa.conf.d/99-pipewire-default.conf /etc/alsa/conf.d/
log "ALSA настроен на использование PipeWire"
# SDDM Wayland сессия для Labwc
SESSION_FILE="/usr/share/wayland-sessions/labwc.desktop"
if [ ! -f "$SESSION_FILE" ]; then
mkdir -p /usr/share/wayland-sessions
cat > "$SESSION_FILE" << 'EOF'
[Desktop Entry]
Name=Labwc
Comment=A wlroots-based windowing compositor
Exec=labwc
Type=Application
DesktopNames=wlroots
EOF
log "Создана сессия Labwc для SDDM"
else else
log "Сессия Labwc для SDDM уже существует" warn "Команда labwc не найдена."
fi fi
# NVIDIA DRM modeset (необходимо для Wayland + NVIDIA) if command -v sddm >/dev/null 2>&1; then
GRUB_CMDLINE="nvidia_drm.modeset=1" log "sddm найден: $(command -v sddm)"
if grep -q "$GRUB_CMDLINE" /etc/default/grub 2>/dev/null; then
log "nvidia_drm.modeset=1 уже прописан в GRUB"
else else
sed -i "s/GRUB_CMDLINE_LINUX=\"/&$GRUB_CMDLINE /" /etc/default/grub warn "Команда sddm не найдена."
update-grub 2>/dev/null || grub-mkconfig -o /boot/grub/grub.cfg 2>/dev/null || \
warn "Не удалось обновить GRUB автоматически. Добавьте '$GRUB_CMDLINE' в GRUB_CMDLINE_LINUX вручную!"
log "Добавлен nvidia_drm.modeset=1 в GRUB"
fi fi
# Переменные окружения для NVIDIA + Wayland # =============================================================================
ENV_FILE="/etc/environment" # Проверка Wayland session
NVIDIA_VARS='WLR_NO_HARDWARE_CURSORS=1 # =============================================================================
__GLX_VENDOR_LIBRARY_NAME=nvidia
GBM_BACKEND=nvidia-drm'
if ! grep -q "WLR_NO_HARDWARE_CURSORS" "$ENV_FILE" 2>/dev/null; then if [ -f "$SESSION_FILE" ]; then
echo "$NVIDIA_VARS" >> "$ENV_FILE" log "Wayland session существует: $SESSION_FILE"
log "Переменные NVIDIA добавлены в $ENV_FILE"
else else
log "Переменные NVIDIA уже настроены" warn "Wayland session НЕ найдена."
fi fi
# =========================================================================== # =============================================================================
# ГОТОВО # Финальная информация
# =========================================================================== # =============================================================================
echo "" echo ""
echo "=========================================" echo "============================================================"
printf "${GREEN}✓ Установка завершена!${NC}\n" printf "${GREEN}Установка завершена.${NC}\n"
echo "=========================================" echo "============================================================"
echo "" echo ""
echo "⚡ СЛЕДУЮЩИЕ ШАГИ:"
echo " 1. Перезагрузите систему: reboot" echo "Сервисы:"
echo " 2. В SDDM выберите сессию 'Labwc'" echo " dbus: /var/service/dbus"
echo " 3. Скопируйте dotfiles в ~/.config/labwc/" echo " seatd: /var/service/seatd"
echo " 4. Для v2rayA: запустите 'v2rayA' от пользователя" echo " elogind: /var/service/elogind"
echo " sddm: /var/service/sddm"
echo "" echo ""
echo "📁 Конфиги Labwc: ~/.config/labwc/"
echo "📁 Конфиги Waybar: ~/.config/waybar/" echo "Labwc session:"
echo "📁 Конфиги Wofi: ~/.config/wofi/" echo " $SESSION_FILE"
echo "" echo ""
echo "⚠️ Если нет звука после перезагрузки:"
echo " systemctl --user enable pipewire wireplumber" echo "Конфигурация:"
echo " (или добавьте в ~/.xinitrc / autostart)" echo " $USER_CONFIG"
echo "" echo ""
echo "============================================================"
echo " ВАЖНО"
echo "============================================================"
echo ""
echo "1. Перезагрузите компьютер:"
echo ""
echo " reboot"
echo ""
echo "2. После перезагрузки должен появиться SDDM."
echo ""
echo "3. В SDDM выберите:"
echo ""
echo " Labwc"
echo ""
echo "4. Если SDDM НЕ появился, войдите в 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 ""
echo " sudo sv status sddm"
echo " sudo tail -100 /var/log/sddm/current"
echo ""
echo "6. Проверка GPU:"
echo ""
echo " lspci -k -d ::03xx"
echo ""
echo "============================================================"
+2 -2
View File
@@ -52,7 +52,6 @@ sddm
sddm-kcm sddm-kcm
slurp slurp
smartmontools smartmontools
steam
sudo sudo
swappy swappy
swaybg swaybg
@@ -61,6 +60,7 @@ ttf-dejavu
ttf-jetbrains-mono-nerd ttf-jetbrains-mono-nerd
ttf-liberation ttf-liberation
ufw ufw
uwsm
v2ray v2ray
waybar waybar
wdisplays wdisplays
@@ -68,7 +68,7 @@ wev
wget wget
wireplumber wireplumber
wl-clipboard wl-clipboard
wlopms wlopm
wlr-randr wlr-randr
woff2-font-awesome woff2-font-awesome
wofi wofi