← recipes

Commit 939ce0a5

3
files
+321
added
-1
deleted
@@ -17,7 +17,7 @@
17 17 # weryfikacji obrazu, jeśli pkgver tutaj się rozjedzie. Trzymaj je razem.
18 18 pkgname: pagan-release
19 19 pkgver: '0.5.4'
20 -pkgrel: 2
20 +pkgrel: 3
21 21 pkgdesc: 'Pagan Linux – pakiet wydania: wersja systemu (/etc/os-release) i zależności wydania.'
22 22 url: https://paganlinux.eu
23 23 arch: x86_64
@@ -43,6 +43,7 @@ depends:
43 43 - gnupg
44 44 - cpio
45 45 - dracut
46 +- pagan-fixes
46 47 makedepends: []
47 48
48 49 # Zależność wirtualna: inne pakiety mogą wymagać „pagan-system” w dowolnej wersji
49 50 new file mode 100644
@@ -0,0 +1,23 @@
1 +pkgname: pagan-fixes
2 +pkgver: '1.0'
3 +pkgrel: '1'
4 +pkgdesc: 'PaganOS – narzedzia naprawcze (bug-fix helpery). Obecnie nvfix: diagnoza i naprawa Vulkan/NVIDIA (brakujacy nvidia_icd.json, zbedny plik w implicit_layer.d, rozjazd wersji modul/userspace).'
5 +url: 'https://paganlinux.eu'
6 +arch: x86_64
7 +license:
8 +- MIT
9 +# Zestaw narzędzi naprawczych wydania – świadomie bez zależności, żeby dało się
10 +# go zainstalować także na zepsutym systemie (helpery używają tylko coreutils/awk).
11 +depends: []
12 +makedepends: []
13 +# Zależność wirtualna: `pag install nvfix` trafi w ten pakiet.
14 +provides:
15 +- nvfix
16 +source:
17 +- 'nvfix'
18 +sha256sums:
19 +- SKIP
20 +build: |
21 + install -Dm755 nvfix ${PKGDIR}/usr/bin/nvfix
22 +package: |
23 + true
0 24 new file mode 100755
@@ -0,0 +1,296 @@
1 +#!/usr/bin/env bash
2 +# nvfix – diagnoza i naprawa problemów z Vulkan/NVIDIA na PaganLinux
3 +#
4 +# Użycie:
5 +# nvfix # interaktywna diagnoza + naprawa
6 +# nvfix --dry-run # tylko diagnoza, bez zmian
7 +# nvfix --yes # napraw wszystko bez pytania
8 +# nvfix --help # pomoc
9 +
10 +set -uo pipefail
11 +
12 +# ---------- kolory ----------
13 +if [[ -t 1 ]]; then
14 + RED=$'\033[91m'; GREEN=$'\033[92m'; YELLOW=$'\033[93m'
15 + BLUE=$'\033[94m'; BOLD=$'\033[1m'; END=$'\033[0m'
16 +else
17 + RED=""; GREEN=""; YELLOW=""; BLUE=""; BOLD=""; END=""
18 +fi
19 +
20 +ok() { printf '%s✅ %s%s\n' "$GREEN" "$*" "$END"; }
21 +err() { printf '%s❌ %s%s\n' "$RED" "$*" "$END"; }
22 +warn() { printf '%s⚠️ %s%s\n' "$YELLOW" "$*" "$END"; }
23 +info() { printf '%sℹ️ %s%s\n' "$BLUE" "$*" "$END"; }
24 +hdr() { printf '\n%s%s%s\n' "$BOLD" "$*" "$END"; }
25 +
26 +# ---------- flagi ----------
27 +DRY_RUN=0
28 +ASSUME_YES=0
29 +for arg in "$@"; do
30 + case "$arg" in
31 + --dry-run) DRY_RUN=1 ;;
32 + --yes|-y) ASSUME_YES=1 ;;
33 + --help|-h)
34 + sed -n '2,12p' "$0" | sed 's/^# \{0,1\}//'
35 + exit 0
36 + ;;
37 + *) err "Nieznana opcja: $arg"; exit 2 ;;
38 + esac
39 +done
40 +
41 +if [[ $DRY_RUN -eq 0 && $EUID -ne 0 ]]; then
42 + warn "Uruchom jako root, aby móc naprawiać (np. sudo $0)"
43 +fi
44 +
45 +# ---------- ścieżki ----------
46 +ICD_DIR="/usr/share/vulkan/icd.d"
47 +IMPLICIT_DIR="/usr/share/vulkan/implicit_layer.d"
48 +ICD_FILE="$ICD_DIR/nvidia_icd.json"
49 +STRAY_ICD="$IMPLICIT_DIR/nvidia_icd.json"
50 +LIBGLX="/usr/lib/libGLX_nvidia.so.0"
51 +
52 +# ---------- pomocnicze ----------
53 +confirm() {
54 + local prompt="$1"
55 + if [[ $ASSUME_YES -eq 1 ]]; then return 0; fi
56 + if [[ $DRY_RUN -eq 1 ]]; then
57 + info "[DRY-RUN] Pominąłbym: $prompt"
58 + return 1
59 + fi
60 + local ans
61 + read -r -p "${YELLOW}Wykonać: $prompt? [T/n] ${END}" ans
62 + [[ -z "$ans" || "$ans" =~ ^[TtYy] ]]
63 +}
64 +
65 +have() { command -v "$1" >/dev/null 2>&1; }
66 +
67 +# ============================================================
68 +# DIAGNOSTYKA
69 +# ============================================================
70 +
71 +check_nvidia_smi() {
72 + hdr "1. nvidia-smi (sterownik jądra + userspace)"
73 + if ! have nvidia-smi; then
74 + err "Brak nvidia-smi – zainstaluj pakiet nvidia (warstwa użytkownika)"
75 + return 1
76 + fi
77 + local out
78 + if ! out=$(nvidia-smi --query-gpu=driver_version,name --format=csv,noheader 2>/dev/null); then
79 + err "nvidia-smi nie odpowiada – moduły jądra prawdopodobnie niezaładowane"
80 + return 1
81 + fi
82 + ok "Wersja sterownika: $out"
83 + return 0
84 +}
85 +
86 +check_kernel_modules() {
87 + hdr "2. Załadowane moduły jądra"
88 + local mods
89 + mods=$(lsmod 2>/dev/null | awk '/^nvidia/ {print $1}')
90 + if [[ -z "$mods" ]]; then
91 + err "Moduły jądra NVIDIA nie są załadowane"
92 + info "Spróbuj: sudo modprobe nvidia-drm modeset=1"
93 + return 1
94 + fi
95 + ok "Załadowane: $(echo "$mods" | tr '\n' ' ')"
96 + return 0
97 +}
98 +
99 +check_libglx() {
100 + hdr "3. Biblioteka GLX (userspace)"
101 + if [[ ! -e "$LIBGLX" ]]; then
102 + err "Brak $LIBGLX – zainstaluj pakiet nvidia"
103 + return 1
104 + fi
105 + if [[ -L "$LIBGLX" ]]; then
106 + ok "$LIBGLX -> $(readlink "$LIBGLX")"
107 + else
108 + ok "$LIBGLX (zwykły plik, nie symlink)"
109 + fi
110 + return 0
111 +}
112 +
113 +check_versions_match() {
114 + hdr "4. Zgodność wersji modułów jądra i userspace"
115 + local drv_ver lib_ver
116 + drv_ver=$(nvidia-smi --query-gpu=driver_version --format=csv,noheader 2>/dev/null | tr -d ' ')
117 + lib_ver=$(basename "$(readlink -f "$LIBGLX" 2>/dev/null)" 2>/dev/null | sed 's/.*\.so\.//')
118 +
119 + if [[ -z "$drv_ver" || -z "$lib_ver" ]]; then
120 + warn "Nie udało się ustalić obu wersji (drv=$drv_ver, lib=$lib_ver)"
121 + return 0
122 + fi
123 +
124 + if [[ "$drv_ver" == "$lib_ver" ]]; then
125 + ok "Wersje zgodne: $drv_ver"
126 + return 0
127 + else
128 + err "ROZJAZD WERSJI: moduły=$drv_ver, userspace=$lib_ver"
129 + info "Zainstaluj ponownie pakiet nvidia w wersji $drv_ver"
130 + return 1
131 + fi
132 +}
133 +
134 +check_conflicting_pkgs() {
135 + hdr "5. Konflikt nvidia-kernel / nvidia-dkms"
136 + if ! have pag; then
137 + info "Brak polecenia 'pag' – pomijam"
138 + return 0
139 + fi
140 + local installed
141 + installed=$(pag list-installed 2>/dev/null || true)
142 + local has_kernel=0 has_dkms=0
143 + grep -q '^nvidia-kernel' <<<"$installed" && has_kernel=1
144 + grep -q '^nvidia-dkms' <<<"$installed" && has_dkms=1
145 +
146 + if [[ $has_kernel -eq 1 && $has_dkms -eq 1 ]]; then
147 + warn "Zainstalowane JEDNOCZEŚNIE nvidia-kernel i nvidia-dkms"
148 + info "Zalecane: zostaw jeden, usuń drugi"
149 + return 1
150 + elif [[ $has_kernel -eq 1 ]]; then
151 + ok "Zainstalowany: nvidia-kernel (prekompilowany)"
152 + elif [[ $has_dkms -eq 1 ]]; then
153 + ok "Zainstalowany: nvidia-dkms (DKMS)"
154 + else
155 + warn "Brak obu pakietów – czy na pewno sterownik jądra jest zainstalowany?"
156 + return 1
157 + fi
158 + return 0
159 +}
160 +
161 +check_icd_files() {
162 + hdr "6. Pliki Vulkan ICD"
163 + local found=0
164 + if [[ -f "$ICD_FILE" ]]; then
165 + ok "Poprawny plik: $ICD_FILE"
166 + found=1
167 + fi
168 + if [[ -f "$STRAY_ICD" ]]; then
169 + warn "Zbędny plik w złym katalogu: $STRAY_ICD"
170 + fi
171 + if [[ $found -eq 0 ]]; then
172 + err "Brak $ICD_FILE – Vulkan nie znajdzie sterownika"
173 + return 1
174 + fi
175 + return 0
176 +}
177 +
178 +check_vulkan_runtime() {
179 + hdr "7. Test Vulkana (vulkaninfo)"
180 + if ! have vulkaninfo; then
181 + warn "Brak vulkaninfo – zainstaluj: sudo pag install vulkan-tools"
182 + return 0
183 + fi
184 + local out
185 + if ! out=$(vulkaninfo --summary 2>&1); then
186 + err "vulkaninfo zwrócił błąd"
187 + echo "$out" | head -20
188 + return 1
189 + fi
190 + if grep -qi 'deviceName.*NVIDIA' <<<"$out"; then
191 + local dev
192 + dev=$(grep -i 'deviceName' <<<"$out" | head -1 | sed 's/.*= *//')
193 + ok "Vulkan widzi: $dev"
194 + return 0
195 + fi
196 + err "Vulkan nie widzi karty NVIDIA"
197 + return 1
198 +}
199 +
200 +# ============================================================
201 +# NAPRAWY
202 +# ============================================================
203 +
204 +fix_icd_file() {
205 + if [[ -f "$ICD_FILE" ]]; then
206 + ok "Plik ICD już istnieje: $ICD_FILE"
207 + return 0
208 + fi
209 + if ! confirm "utworzyć $ICD_FILE"; then return 1; fi
210 +
211 + mkdir -p "$ICD_DIR"
212 + if [[ -f "$STRAY_ICD" ]]; then
213 + cp "$STRAY_ICD" "$ICD_FILE"
214 + ok "Skopiowano z $STRAY_ICD"
215 + else
216 + cat > "$ICD_FILE" <<'EOF'
217 +{
218 + "file_format_version": "1.0.0",
219 + "ICD": {
220 + "library_path": "libGLX_nvidia.so.0",
221 + "api_version": "1.3"
222 + }
223 +}
224 +EOF
225 + ok "Utworzono $ICD_FILE"
226 + fi
227 +}
228 +
229 +fix_stray_icd() {
230 + [[ -f "$STRAY_ICD" ]] || return 0
231 +
232 + local others
233 + others=$(find "$IMPLICIT_DIR" -maxdepth 1 -type f ! -name 'nvidia_icd.json' 2>/dev/null | wc -l)
234 + if [[ "$others" -gt 0 ]]; then
235 + warn "$IMPLICIT_DIR zawiera $others innych plików – zostawiam"
236 + return 0
237 + fi
238 +
239 + if ! confirm "usunąć zbędny plik $STRAY_ICD"; then return 1; fi
240 + rm -f "$STRAY_ICD"
241 + ok "Usunięto $STRAY_ICD"
242 +}
243 +
244 +fix_reload() {
245 + confirm "przeładować udev i ldconfig" || return 0
246 + have udevadm && udevadm control --reload-rules 2>/dev/null
247 + have udevadm && udevadm trigger 2>/dev/null
248 + ldconfig 2>/dev/null
249 + ok "Przeładowano reguły udev i cache bibliotek"
250 +}
251 +
252 +# ============================================================
253 +# MAIN
254 +# ============================================================
255 +
256 +main() {
257 + [[ $DRY_RUN -eq 1 ]] && info "TRYB DRY-RUN: żadne zmiany nie zostaną wprowadzone"
258 +
259 + local rc=0
260 + check_nvidia_smi || rc=1
261 + check_kernel_modules || rc=1
262 + check_libglx || rc=1
263 + check_versions_match || rc=1
264 + check_conflicting_pkgs
265 + check_icd_files || rc=1
266 + check_vulkan_runtime || rc=1
267 +
268 + hdr "PODSUMOWANIE"
269 + if [[ $rc -eq 0 ]]; then
270 + ok "Wszystko wygląda dobrze."
271 + else
272 + warn "Wykryto problemy – próbuję naprawić."
273 + fi
274 +
275 + hdr "NAPRAWA"
276 + fix_icd_file
277 + fix_stray_icd
278 + fix_reload
279 +
280 + hdr "TEST KOŃCOWY"
281 + if [[ $DRY_RUN -eq 1 ]]; then
282 + info "Pominięto (--dry-run)"
283 + return 0
284 + fi
285 + if check_vulkan_runtime; then
286 + ok "Vulkan działa poprawnie."
287 + return 0
288 + else
289 + err "Vulkan nadal nie działa. Sprawdź logi:"
290 + info " journalctl -b -p err | grep -i nvidia"
291 + info " cat /var/log/Xorg.0.log | grep -iEE 'nvidia|EE'"
292 + return 1
293 + fi
294 +}
295 +
296 +main