Repository navigation
Trwały fsync (rclone mount2 + syncfs w punchfs) i czyste zatrzymanie VM (vm-hold) - #58
Conversation
…ymanie VM Przyczyna uszkodzenia obrazu Time Machine po wyłączeniu Maca: rclone mount ignoruje fsync, a metadane cache (vfsMeta/Rs) są zapisywane bez fsync, więc twarde zabicie VM gubiło zapisy, które APFS uznał za trwałe. - rclone-tm.service: rclone mount -> mount2 (Fsync dociera do Item.Sync) - punchfs: opcja -o syncfs=<katalog>; lo_fsync/lo_fsyncdir wołają syncfs() na katalogu cache rclone, błąd -> errno - vm-hold: job launchd vm-start trzyma się przy życiu i na SIGTERM robi limactl stop (ExitTimeOut 120 s) - testy: VMDurabilityTests, VMHoldTests, rozszerzony test-punchfs.sh Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Po nieudanym limactl start (12.11: "did not receive an event with the running status" po 10 min, a VM wstała) vm-hold dalej pyta Limę o stan, do 60 min, bez zatrzymywania ani restartu maszyny. Błąd kończy dopiero stan Stopped/Broken/brak instancji albo upływ limitu. SIGTERM przerywa czekanie. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Dodano: vm-hold toleruje wolny start (Mac pod obciążeniem). Po nieudanym 🤖 Generated with Claude Code |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ty, limit Limy - punchfs: xattr kluczowane sciezka wzgledem source (mount2 daje inode z licznika procesu); unlink/rmdir kasuja, rename przenosi, stary uklad usuwany przy starcie - punchfs.service: stara binarka bez -o syncfs konczy sie raz kodem 78, bez petli restartow - test-punchfs.sh: wykrywa brak syncfs (ftrace ext4_sync_fs, brudne strony pliku danych), xattr po restarcie rclone/rename/unlink, bez zaleznosci od globalnego Dirty - vm-hold: nieudany start nie konczy joba, SIGTERM anuluje start, budzet czasu w ExitTimeOut, przerywalne czekanie, prawdziwe statusy Limy, quiesce smbd+sync w gosciu, log o poprzednim zamknieciu, prawdziwy handler sygnalu zamiast SIG_IGN, eskalacja do SIGKILL przy anulowaniu - install-launchd nie przeladowuje dzialajacego vm-start - limactl list --json pyta o jedna instancje; zrodla punchfs w jednym archiwum (limit 64 KiB JSON Limy przy dzialajacej maszynie) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Poprawki po ocenie (071f1b5):
swift test 448 zielone, swift-format --strict czysty. Nie scalone, nie wdrozone; petla awaryjna APFS x20 to etap 3. |
… vm/README.md Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Etap 3: dowod twardego zabicia VM (a372047, skrypt vm/tests/crash-loop.sh, wyniki w vm/README.md). Przebieg: sparsebundle APFS (pasma 32 MB) na SMB z jednorazowej VM, zapis z F_FULLFSYNC po kazdej operacji (tworzenie, nadpisanie, kasowanie), kill -9 hostagenta i procesu VZ w losowym momencie (5-40 s), start, ponowne podpiecie, fsck_apfs -n, porownanie kazdego pliku z ksiega zapisana na Macu.
|
…jna iteracja Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Przyczyna
Obraz Time Machine uszkodzony po wyłączeniu Maca (12.11, wcześniej 03.11): VM
cmsmbginie twardo razem z Makiem, a łańcuch fsync TM -> SMB -> Samba -> punchfs -> rclone nigdy nie był trwały:rclone mountignoruje fsync (cmd/mount/file.goFsync=return nil),vfsMeta, w tymRs= zakresy obecne w cache) zapisuje bez fsync, a po restarcie rclone dla pozycji Dirty dociąga brakujące zakresy z Drive i nadpisuje nimi nowe dane.Zmiany
A. Trwały fsync
rclone-tm.service:rclone mount->rclone mount2(wszystkie obecne flagi przyjmowane w v1.75.1, sprawdzone w VM).punchfs: opcja-o syncfs=<katalog>;lo_fsyncilo_fsyncdirpo udanym fsync wołająsyncfs()na katalogu (otwartym raz przy starcie), błąd -> errno. Bez opcji bez zmian.punchfs.service:syncfs=/var/cache/rclone.B. Czyste zatrzymanie VM
driver.Stop(vz) prosi gościa o zatrzymanie (RequestStop), czeka do 30 s, nigdy nie wymusza (źródło: lima-vm/lima v2.3.0,pkg/hostagent/hostagent.go,cmd/limactl/hostagent.go,pkg/driver/vz/vz_driver_darwin.go,pkg/instance/stop.go).limactl stopwysyła SIGINT do hostagenta i czeka do ok. 3 min.ExitTimeOut= czas między SIGTERM a SIGKILL (man launchd.plist), domyślnie zależny od systemu.cloudmachine-agent vm-hold: jobvm-startstartuje maszynę i zostaje przy życiu; na SIGTERM/SIGINT/SIGHUP robilimactl stop(limit 100 s), plist maExitTimeOut120. Bez tego nic nie zatrzymywało VM przy wylogowaniu.Dowód C (jednorazowa VM
cmtest, usunięta)Zapis częściowy (8 MiB od offsetu 8 MiB w istniejącym, niezbuforowanym pliku 64 MiB) przez punchfs + jeden fsync, natychmiast
kill -9hostagenta i procesu VZ, start, rclone ładuje cache, SHA-256 pliku.Rsna dysku po zabiciumount, bez syncfsmount2, bez syncfsmount2+syncfsvm/punchfs/test-punchfs.sh(nowa sekcja): stara konfiguracja = 2 FAIL (Dirty 8152 kB,Rs64 KiB zamiast 8 MiB), nowa = wszystko ok (Dirty 12 kB).Nie zrobiono / uwagi
vm-holdnie był uruchomiony na żywo (logika pokryta testami jednostkowymi ze sztucznymi krokami; żywy test wymagałby zatrzymaniacmsmb). Przy zamykaniu systemu macOS może skrócić czas launchd, więc to obrona w głąb, nie gwarancja; sedno to poprawka A.install-launchd(nowy plist) ivm-update(nowe szablony i przebudowa punchfs, restart punchfs/rclone gdy bezczynne) trzeba wykonać ręcznie, nie zrobiono tu.swift test: 420 testów zielonych.🤖 Generated with Claude Code