Distro WSL yang kupakai sehari-hari masih Ubuntu 22.04, dan isinya sudah menumpuk: puluhan proyek, kunci, token, konfigurasi Claude Code, sampai repo yang tidak punya remote sama sekali. Mau pindah ke 24.04 tanpa kehilangan apa pun, dan sekalian merapikan siapa boleh berbuat apa. Catatan singkat ini soal keputusan-keputusan di balik prosesnya, dikerjakan bareng Claude Code.

Bergantian, Bukan Berdampingan

Awalnya terpikir enak juga kalau 22.04 dan 24.04 hidup bersamaan selama masa transisi. Ternyata itu ide buruk: dua distro WSL2 berbagi satu VM, satu IP, dan satu network namespace. Loopback, port, dan iptables-nya sama. Kalau keduanya memegang koneksi SSH ke server, tunnel, mount, atau dockerd, mereka saling merusak.

Jadi aturannya: hanya satu distro Running pada satu waktu. 22.04 jadi cadangan dingin (dihentikan, tidak dihapus) sampai 24.04 terbukti. Sebelum memulai, aku ukur dulu apakah ada layanan produksi yang jalan di WSL. Tidak ada: produksi ada di server, WSL hanya untuk kerja dev. Menghentikan 22.04 tidak mematikan apa pun yang dipakai orang lain.

Dua larangan yang berlaku di setiap langkah: jangan wsl --shutdown (mematikan semua distro), dan jangan wsl --unregister tanpa persetujuan eksplisit di saat itu.

Dua User, Satu Distro

Di 24.04 aku bikin dua user:

  • sindhu: admin, punya sudo, menjalankan skrip sistem.
  • claudeai: menjalankan Claude Code. Tanpa sudo, hanya memegang kunci SSH miliknya sendiri, dan interop Windows serta akses /mnt/c dikunci lewat wsl.conf.

Idenya sederhana: agen yang bekerja di mesin ini cukup punya akses yang dibutuhkan proyek, bukan akses penuh ke semuanya. Satu catatan jujur: claudeai kumasukkan ke grup docker karena memang perlu, dan itu setara akses root di distro ini. Jadi ini pengurangan risiko, bukan batas keamanan mutlak.

Skrip Bertahap dengan Penjaga

Migrasinya bukan satu skrip raksasa, tapi rangkaian skrip kecil bernomor, dan tiap skrip menolak jalan di distro atau user yang salah:

Tahap Di Fungsi
preflight, verify-export 22.04 baca-saja; pemeriksa sebelum jendela, dan GO/NO-GO sebelum 22.04 dihentikan
export-* 22.04 ekspor identitas, proyek, dan item home yang sengaja dibawa
01–03 24.04 paket, user, Docker, impor identitas, wsl.conf
04–07 24.04 Node dan uv, Claude Code, konfigurasi, MCP
import-projects, audit-paths 24.04 pasang proyek, lalu cari path yang tertanam dan sekarang salah

Urutan cutover-nya ditulis di satu runbook, tiap langkah punya pembuktian (“lanjut hanya kalau ✔ ini lulus”), dan langkah yang tidak bisa dibatalkan ditandai ⚠ supaya minta persetujuan dulu. Intinya:

  1. Hentikan yang hidup (sesi lain, layanan, mount) dengan rapi.
  2. Ekspor, lalu verify-export harus GO. NO-GO berarti berhenti dan perbaiki.
  3. Beku: sesudah verifikasi tidak ada lagi perubahan di 22.04.
  4. wsl --terminate, lalu wsl --export untuk backup, lalu pasang 24.04.
  5. Jalankan skrip 24.04 satu per satu, baca keluarannya, uji per proyek.

Hal-hal yang Tidak Kusangka Perlu Diurus

  • Repo tanpa remote. Beberapa repo hanya ada di disk ini. Ekspornya pakai git bundle ditambah perubahan yang belum di-commit, lalu setelah impor dibandingkan HEAD-nya dengan catatan ekspor.
  • Path yang tertanam. Workspace berpindah dari /home/sindhu/... ke /home/claudeai/workspace. Hasil audit: hanya dua skrip yang benar-benar rusak (satu cd di skrip deploy, satu path di skrip sinkronisasi), tapi puluhan dokumen masih menyebut path lama dan menyesatkan.
  • Memory Claude Code terkunci ke path. Memory yang lama tidak otomatis terbaca di path baru. Daripada memuat semuanya mentah-mentah, catatan lamanya kubawa ke satu folder untuk disortir: dibuang, digabung ke memory proyek yang benar, atau dinaikkan jadi aturan di CLAUDE.md.
  • Konfigurasi sistem tidak ikut $HOME. Drop-in sudoers lama sengaja tidak disalin. Itu rancangan lama dengan jalur eskalasi yang sudah kucabut di tempat lain; claudeai mulai tanpa sudo, dan kalau kelak perlu satu perintah root, dibuatkan aturan sempit untuk perintah itu saja.
  • Folder transfer berisi rahasia. Staging di sisi Windows memuat kunci dan token, jadi masuk daftar yang harus dihapus setelah semuanya terbukti, dan backup tidak boleh ditaruh di folder yang disinkronkan.

Status dan Yang Belum Teruji

Per tulisan ini aku sudah bekerja di 24.04 sebagai claudeai, dan 22.04 masih disimpan dalam keadaan Stopped sebagai cadangan 1–2 minggu sebelum dipertimbangkan untuk dihapus. Tapi daftar centang belum bersih semua: serah-terima beberapa layanan dan triase memory lama masih terbuka.

Dan sebagian skrip dulunya hanya diuji di 22.04 dengan HOME palsu: ekspor, impor proyek, verifikasi, dan pemasangan konfigurasi. Yang butuh instalasi dan jaringan sungguhan (paket, Docker, wsl.conf) baru benar-benar teruji saat dijalankan di 24.04, jadi perlakuannya tetap sama: jalankan satu per satu, baca keluarannya.

Pelajaran

  • Dua distro WSL2 bukan dua mesin. Kalau berbagi IP dan network namespace, “jalan berdampingan” itu mitos.
  • Skrip yang menolak jalan di tempat salah lebih murah daripada pemulihan setelah salah jalan.
  • Backup 22.04 sebagai cadangan dingin membuat keputusan lain jadi tenang: rollback cuma terminate satu distro dan nyalakan yang lain.
  • Ukur dulu sebelum memutuskan. Cek “apa yang benar-benar hidup di sini?” mengubah migrasi dari operasi berisiko jadi pindahan biasa.