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