diff --git a/VOID/xbps_install.sh b/VOID/xbps_install.sh index c14f5ae..d3deb1c 100644 --- a/VOID/xbps_install.sh +++ b/VOID/xbps_install.sh @@ -1,183 +1,580 @@ #!/bin/sh # ============================================================================= -# Void Linux Labwc Stack Installer -# Запуск: sudo sh void-labwc-install.sh +# Void Linux + Labwc + SDDM installer +# +# Запуск: +# 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' GREEN='\033[0;32m' YELLOW='\033[1;33m' +BLUE='\033[0;34m' NC='\033[0m' -log() { printf "${GREEN}[✓]${NC} %s\n" "$1"; } -warn() { printf "${YELLOW}[!]${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() { + printf "${GREEN}[✓]${NC} %s\n" "$1" } -log "Все доступные пакеты установлены." +info() { + printf "${BLUE}[i]${NC} %s\n" "$1" +} -# =========================================================================== -# ЭТАП 3: Настройка сервисов runit -# =========================================================================== -log "Этап 3/4: Настройка сервисов runit..." +warn() { + printf "${YELLOW}[!]${NC} %s\n" "$1" +} + +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() { svc="$1" - if [ -d "/etc/sv/$svc" ]; then - if [ ! -L "/var/service/$svc" ]; then - ln -s "/etc/sv/$svc" "/var/service/$svc" - log "Сервис включён: $svc" - else - log "Сервис уже включён: $svc" - fi + + if [ ! -d "/etc/sv/$svc" ]; then + warn "Сервис отсутствует: /etc/sv/$svc" + return 0 + 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 - 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 } -enable_service dbus -enable_service seatd -enable_service sddm -enable_service pipewire -enable_service wireplumber -enable_service dhcpcd -enable_service acpid +check_service dbus +check_service seatd +check_service elogind +check_service sddm -# Добавление пользователя в необходимые группы -log "Настройка групп пользователя $REAL_USER..." -usermod -aG _seatd,audio,video,wheel "$REAL_USER" -log "Пользователь добавлен в группы: _seatd, audio, video, wheel" +# ============================================================================= +# Проверка Labwc +# ============================================================================= -# =========================================================================== -# ЭТАП 4: Пост-установочная настройка -# =========================================================================== -log "Этап 4/4: Пост-установочная настройка..." +echo "" +info "Проверка установки Labwc..." -# ALSA → PipeWire конфиг -mkdir -p /etc/alsa/conf.d -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" +if command -v labwc >/dev/null 2>&1; then + log "labwc найден: $(command -v labwc)" else - log "Сессия Labwc для SDDM уже существует" + warn "Команда labwc не найдена." fi -# NVIDIA DRM modeset (необходимо для Wayland + NVIDIA) -GRUB_CMDLINE="nvidia_drm.modeset=1" -if grep -q "$GRUB_CMDLINE" /etc/default/grub 2>/dev/null; then - log "nvidia_drm.modeset=1 уже прописан в GRUB" +if command -v sddm >/dev/null 2>&1; then + log "sddm найден: $(command -v sddm)" else - sed -i "s/GRUB_CMDLINE_LINUX=\"/&$GRUB_CMDLINE /" /etc/default/grub - 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" + warn "Команда sddm не найдена." fi -# Переменные окружения для NVIDIA + Wayland -ENV_FILE="/etc/environment" -NVIDIA_VARS='WLR_NO_HARDWARE_CURSORS=1 -__GLX_VENDOR_LIBRARY_NAME=nvidia -GBM_BACKEND=nvidia-drm' +# ============================================================================= +# Проверка Wayland session +# ============================================================================= -if ! grep -q "WLR_NO_HARDWARE_CURSORS" "$ENV_FILE" 2>/dev/null; then - echo "$NVIDIA_VARS" >> "$ENV_FILE" - log "Переменные NVIDIA добавлены в $ENV_FILE" +if [ -f "$SESSION_FILE" ]; then + log "Wayland session существует: $SESSION_FILE" else - log "Переменные NVIDIA уже настроены" + warn "Wayland session НЕ найдена." fi -# =========================================================================== -# ГОТОВО -# =========================================================================== +# ============================================================================= +# Финальная информация +# ============================================================================= + echo "" -echo "=========================================" -printf "${GREEN}✓ Установка завершена!${NC}\n" -echo "=========================================" +echo "============================================================" +printf "${GREEN}Установка завершена.${NC}\n" +echo "============================================================" echo "" -echo "⚡ СЛЕДУЮЩИЕ ШАГИ:" -echo " 1. Перезагрузите систему: reboot" -echo " 2. В SDDM выберите сессию 'Labwc'" -echo " 3. Скопируйте dotfiles в ~/.config/labwc/" -echo " 4. Для v2rayA: запустите 'v2rayA' от пользователя" + +echo "Сервисы:" +echo " dbus: /var/service/dbus" +echo " seatd: /var/service/seatd" +echo " elogind: /var/service/elogind" +echo " sddm: /var/service/sddm" echo "" -echo "📁 Конфиги Labwc: ~/.config/labwc/" -echo "📁 Конфиги Waybar: ~/.config/waybar/" -echo "📁 Конфиги Wofi: ~/.config/wofi/" + +echo "Labwc session:" +echo " $SESSION_FILE" echo "" -echo "⚠️ Если нет звука после перезагрузки:" -echo " systemctl --user enable pipewire wireplumber" -echo " (или добавьте в ~/.xinitrc / autostart)" -echo "" \ No newline at end of file + +echo "Конфигурация:" +echo " $USER_CONFIG" +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 "============================================================" \ No newline at end of file diff --git a/pkglist-repo.txt b/pkglist-repo.txt index 8ae7afd..896ea97 100644 --- a/pkglist-repo.txt +++ b/pkglist-repo.txt @@ -52,7 +52,6 @@ sddm sddm-kcm slurp smartmontools -steam sudo swappy swaybg @@ -61,6 +60,7 @@ ttf-dejavu ttf-jetbrains-mono-nerd ttf-liberation ufw +uwsm v2ray waybar wdisplays @@ -68,7 +68,7 @@ wev wget wireplumber wl-clipboard -wlopms +wlopm wlr-randr woff2-font-awesome wofi