- SteamOS 3 “Holo” adalah distribusi berbasis Arch untuk Steam Deck, tetapi untuk memperbaiki masalah resume dari suspend pada PC ruang keluarga, commit kernel harus di-revert dan bahkan image rootfs harus di-fork sendiri
- Struktur update-nya memakai skema A/B: memasang rootfs read-only baru ke partisi tidak aktif lalu reboot;
/etcmempertahankan perubahan melalui overlayfs - Patch kernel Valve menggunakan alur menyalin bare Git repository dari source tarball seperti
linux-neptune-61-6.1.52.valve9-1.src.tar.gzdi mirror source pacman, lalu membangun paket dengan tag dan PKGBUILD sendiri - Repacking rootfs adalah proses mengekstrak
rootfs.img.caibxdari bundle RAUC SteamOS, mengubahnya menjadi image, mengganti UUID Btrfs, mengganti paket, mengubahbuildid, mengganti URL update dan sertifikat RAUC, lalu membungkusnya kembali menjadi RAUC bundle - Dengan menyediakan
live.jsondi web server sendiri dan mengubahQueryUrl,ImagesUrl, sertaMetaUrlmiliksteamos-atomupd, instalasi SteamOS yang sudah ada pun dapat di-update ke image sendiri
Mengapa Mem-fork SteamOS untuk PC Ruang Keluarga
- SteamOS 3 “Holo” adalah distribusi Linux berbasis Arch dari Valve Software untuk Steam Deck, perangkat gaming PC portabel
- Mekanisme update-nya adalah struktur update atomik A/B yang mengunduh rootfs read-only baru ke partisi tidak aktif lalu reboot ke partisi tersebut
- Pengguna dapat menjalankan
steamos-devmodeuntuk membuka kunci rootfs dan menormalkan database pacman, lalu memperlakukannya seperti distribusi Linux biasa - Tujuannya bukan sekadar melakukan bypass mudah dengan
steamos-devmode, melainkan membuat fork yang layak yang bisa memodifikasi image rootfs itu sendiri - Di PC ruang keluarga, SteamOS hampir sepenuhnya berjalan, tetapi hanya resume dari suspend yang gagal
- Pada komputer yang sama, distribusi lain yang menggunakan kernel mainline atau stable dapat resume dari suspend dengan benar
- Setelah menemukan source kernel Valve dan menjalankan
git bisect, sebuah commit yang tampaknya memperbaiki resume dari suspend pada hardware Steam Deck ternyata menyebabkan masalah di PC ini - Kebutuhan untuk me-revert commit tersebut dan membangun kernel sendiri menjadi alasan langsung dari seluruh pekerjaan ini
- Ada opsi memakai Arch secara langsung dan sebagainya, tetapi jika harus mengutak-atik distribusi Linux untuk menjalankan game, lebih disukai bergantung pada kumpulan paket yang sudah diuji Valve
Struktur Partisi dan Update SteamOS
- Sistem SteamOS memakai 8 partisi
- EFI system partition berisi stage 1 bootloader dan metadata pemilihan set partisi A/B
- Tiap set A/B berisi GRUB sebagai stage 2 bootloader, root filesystem, dan partisi
/var - Sisa ruang disk diisi oleh satu partisi
home
- Saat boot, beberapa pseudo-filesystem tambahan ikut di-mount
- Hampir 12 direktori seperti
/var/log,/root,/nixdi-bind mount dari/home/.steamos/offloadagar datanya persisten
- Hampir 12 direktori seperti
/etcditangani dengan overlayfs- Perubahan disimpan di
/var/lib/overlays/etc/upper - Item yang biasanya harus tetap berada di
/etc, sepertimachine-iddan koneksi NetworkManager, dipertahankan - File konfigurasi yang tidak disentuh dapat di-update
- Cara ini menangani preservasi sekaligus update file konfigurasi pada struktur partisi A/B tanpa logika package manager
- Perubahan disimpan di
- Update sistem dimulai saat Steam client atau pengguna terminal menjalankan
steamos-update- Perintah ini menjalankan program Python
steamos-atomupd-client - Client mengirim informasi OS saat ini dan pengaturan channel update pengguna ke URL di
/etc/steamos-atomupd/client.confuntuk memeriksa apakah ada update baru
- Perintah ini menjalankan program Python
- Jika ada update baru, server merespons dengan path RAUC bundle
- Client mengunduh bundle dan menjalankan
rauc install - RAUC memverifikasi tanda tangan bundle dan mencari
rootfs.img.caibx - Dengan
casync extract, potongan image baru diunduh dan ditulis ke partisi rootfs yang tidak aktif - Skrip post-install secara selektif menyinkronkan data dari
/varaktif ke/vartidak aktif, lalu mengubah konfigurasi stage 1 bootloader di EFI system partition agar boot ke set partisi baru
- Client mengunduh bundle dan menjalankan
Membuat Paket dari Source Kernel Valve
- Valve menggunakan kernel Linux yang banyak dimodifikasi di SteamOS, dan source-nya dapat diunduh
- Source untuk image SteamOS saat ini dapat ditemukan di
sources/holo-3.5dansources/jupiter-3.5pada mirror pacman Valve - Saat ditulis, kernel image stable adalah
6.1.52-valve9-1-neptune-61, dan source tarball terkait berukuran 2,9 GiB - Tarball itu besar karena berisi seluruh Linux Git tree
- Di dalam tarball terdapat
PKGBUILD,config,config-neptune,archlinux-linux-neptune/, dan lainnya archlinux-linux-neptune/bukan working tree biasa yang bisa langsung dikerjakan, melainkan bare repository
- Di dalam tarball terdapat
- PKGBUILD menunjuk repository GitLab privat sebagai source dalam bentuk
git+ssh://git@gitlab.steamos.cloud/jupiter/linux-integration.git#tag=$_tag- Tidak bisa di-clone langsung atau ditautkan ke commit
- Dari source
makepkg, snapshot yang berisi seluruh riwayat commit tiap tag dapat diperoleh - Berkat struktur ini, commit yang merusak suspend pada PC ruang keluarga bisa di-bisect
- Alur kerjanya adalah meng-clone bare repository menjadi working tree biasa dan mempertahankan branch serta tag sendiri
- Contohnya membuat
my-branchdari tag6.1.52-valve9 - Perubahan sendiri diunggah ke host Git terpisah, lalu source di PKGBUILD diganti ke repository dan tag sendiri tersebut
- linux adalah contoh repository
- Contohnya membuat
- Paket kernel dapat dibuat dengan
makepkgmakepkg MAKEFLAGS=-j$(nproc)atau update/etc/makepkg.confberguna jika tidak menggunakan VM kecil- Dalam lingkup yang diperiksa, paket khusus SteamOS lain juga memakai struktur serupa yang menggunakan repository Git sebagai source pertama
- Untuk memudahkan tahap berikutnya, repository pacman sendiri disiapkan
- Letakkan paket di sebuah direktori, jalankan
repo-add $REPO_NAME.db.tar.zst [PACKAGES...], lalu unggah ke web host - Repository ini juga membantu tool tetap bekerja normal jika nanti menjalankan
steamos-devmode
- Letakkan paket di sebuah direktori, jalankan
Mengambil dan Me-mount Root Filesystem
- Karena skrip release engineering tidak ditemukan, dipilih pendekatan repacking root filesystem yang sudah ada sesuai kebutuhan
- Skrip tanpa penjelasan dan komentar tersedia di fauxlo
- Cara umum mendapatkan image rootfs SteamOS adalah membeli Steam Deck atau mengunduh image pemulihan Steam Deck, tetapi keduanya membutuhkan persetujuan Steam End User License Agreement
- Versi rilis saat ini dapat dilihat dari snapshot JSON yang tampaknya merupakan fallback URL sistem update
- Saat ditulis, versi stable adalah
20231122.1 - Ada juga snapshot JSON terpisah untuk channel preview
- Saat ditulis, versi stable adalah
- Pengunduhan rootfs mengikuti urutan yang sama seperti
steamos-atomupd-client- Unduh file
.raucb, yaitu RAUC bundle - Ekstrak
rootfs.img.caibxdari bundle yang merupakan filesystem SquashFS - Dengan
casync extract, ambil potongan dari store.castruntuk membuatrootfs.img - URL store
.castradalah URL RAUC bundle dengan.raucbdiganti menjadi.castr - Perilaku ini di-hardcode di
steamos-atomupd - Skrip otomatisasinya ada di fetch-current.sh
- Unduh file
- File
.img.zipdan.img.zstyang berdekatan bukan rootfs, melainkan image pemulihan yang bisa di-boot secara terpisah- Partisi rootfs dari image pemulihan juga dapat diekstrak untuk dipakai pada langkah berikutnya
- Namun hasilnya tidak bit-for-bit identik dengan image yang diterima melalui RAUC dan casync, dan tool tersebut tetap dibutuhkan untuk membuat update bundle lagi
- Sebelum memodifikasi rootfs, UUID filesystem harus diganti
- Jika UUID tidak diganti saat update dari image SteamOS lama ke image kustom, dua filesystem berbeda akan memiliki UUID yang sama
- Kondisi ini dapat menimbulkan masalah
- Contohnya
btrfstune -fu rootfs.img
- Valve menggunakan image Btrfs dengan kompresi zstd
- Untuk mempertahankan kompresi saat melakukan perubahan, mount dengan
mount -o compress=zstd rootfs.img rootfs - SteamOS menggunakan properti subvolume
readonlymilik Btrfs, jadi nonaktifkan denganbtrfs property set -ts rootfs ro false
- Untuk mempertahankan kompresi saat melakukan perubahan, mount dengan
- Modifikasi paket seperti kernel Linux dapat memicu skrip yang membutuhkan
/devdan/proc- Mount
devtmpfsdanprocdi bawah rootfs - Mount tmpfs pada
/tmp,/run,/var, dan/homeagar tidak ada penulisan ke direktori yang akan di-mount pada sistem yang sudah boot - Bind mount
/etc/resolv.confdari host agar resolusi nama bekerja di chroot
- Mount
Mengganti Paket dan Memodifikasi Metadata Image
- Repository sendiri ditambahkan sebagai entri repo pertama di
/etc/pacman.conf- Dengan begitu, meskipun repo Valve memiliki paket versi lebih baru, paket sendiri akan diprioritaskan
- Jika nanti
steamos-devmodedijalankan, paket sendiri juga bisa dipasang ulang
- Contoh stanza repo memakai
[fauxlo],Server = https://fauxlo.ili.fyi/pacman/$arch, danSigLevel = NeverSigLevel = Nevermengizinkan paket tanpa tanda tangan- Untuk memasang paket bertanda tangan GPG, pacman keyring harus diisi
- Alih-alih menyentuh keyring kosong di
/etc/pacman.d/gnupg, digunakan pendekatan mengisi keyring baru di atas tmpfs
- Instalasi paket dilakukan dalam bentuk
pacman --sysroot rootfs --noconfirm -Sy linux-neptune-61- Di skrip sebenarnya,
-ydihindari dan hanya database repo sendiri yang disinkronkan di belakang pacman - Dengan demikian, status repository lain dapat dikunci pada titik waktu saat image asli dibangun
- Ini dipilih untuk mengurangi perubahan yang muncul pada diff image
- Di skrip sebenarnya,
steamos-atomupdmembaca versi image saat ini dan build ID dari/lib/steamos-atomupd/manifest.json, dan jika tidak ada, memakai/etc/os-release- Jika build ID update yang disediakan server sama dengan image saat ini, update akan ditolak
- Ini juga berguna untuk mengidentifikasi image mana yang sedang berjalan
- Build ID harus berformat
YYYYMMDD.N- Jika formatnya tidak sesuai,
steamos-atomupdakan keluar dengan Python traceback - Untuk menghindari increment manual,
HHMMSSatau Unix timestamp dapat dimasukkan keN - Ubah
buildiddimanifest.jsondanBUILD_IDdios-releasesekaligus - Potongan skrip Bash untuk pekerjaan ini ada di repack.sh
- Jika formatnya tidak sesuai,
- RAUC menggunakan sertifikat X.509 untuk konfigurasi trust
- Sertifikat yang dipercaya berada di
/etc/rauc/keyring.pem - Sertifikat self-signed sederhana sudah cukup
- Pasang sertifikat baru ke
rootfs/etc/rauc/keyring.pem
- Sertifikat yang dipercaya berada di
- URL di
rootfs/etc/steamos-atomupd/client.confjuga diubah ke server sendiriQueryUrlImagesUrlMetaUrl
- Perubahan lain juga bisa dilakukan selama tidak melebihi ruang image Btrfs 5 GiB
- Misalnya, jika ingin menemukan perangkat SteamOS di jaringan sebagai
hostname.local, filerootfs/usr/lib/systemd/resolved.conf.d/00-disable-mdns.confdapat dihapus - Bisa juga di-override lewat konfigurasi overlay
/etc, tetapi itu dinilai merepotkan
- Misalnya, jika ingin menemukan perangkat SteamOS di jaringan sebagai
- Prinsipnya, perubahan yang mudah dilakukan tanpa image sebaiknya tidak dimasukkan ke rootfs
- Firefox bisa dipasang ke rootfs
- Namun image harus di-repack lagi setiap kali ada update keamanan Firefox
Unmount Rootfs dan Membuat RAUC Bundle
- Setelah modifikasi selesai, tandai kembali filesystem sebagai read-only
btrfs property set -ts rootfs ro true
- Buang blok yang tidak digunakan dengan
fstrim -v rootfs - Untuk unmount,
umount --recursive rootfsberguna- Pseudo-filesystem yang sebelumnya di-mount juga dapat ditangani sekaligus
- Sebelum membuat RAUC bundle, buat casync store dan blob index
- Contohnya
casync make --store=rootfs.img.castr bundle/rootfs.img.caibx rootfs.img
- Contohnya
- RAUC bundle membutuhkan tiga file
manifest.raucmrootfs.img.caibxUUIDyang berisi UUID filesystem
manifest.raucmberisi informasi update dan informasi image rootfscompatible=steamos-amd64version=$versionsha256sizefilename=rootfs.img.caibx
- File
UUIDdibuat denganblkid -s UUID -o value rootfs.img >bundle/UUID - Setelah tiga file siap, jalankan
rauc bundle- Tentukan sertifikat dan key pada
--signing-keyring,--cert, dan--key - Hasilnya adalah
rootfs.img.raucb
- Tentukan sertifikat dan key pada
rootfs.img.raucbdanrootfs.img.caibxdiunggah ke web server yang ditunjuk olehImagesUrldiclient.conf- Kedua file harus berada di direktori yang sama
Server Update Sendiri dan Penerapannya
- Web server yang dipakai untuk
QueryUrldanMetaUrlharus menyediakan file JSON - Dalam konfigurasi sederhana, satu
live.jsonsudah cukup- Objek
.minor.candidates[0].imageharus sama dengan/lib/steamos-atomupd/manifest.jsondi dalam image update_pathadalah path yang akan ditambahkan update client setelahImagesUrluntuk mengunduh bundle
- Objek
- Contoh konfigurasi Caddy me-rewrite request yang dikirim
steamos-atomupdkeQueryUrldanMetaUrlmenjadilive.json- Rewrite
/updatesmenjadi/live.json - Rewrite
/meta/*/*/*/*.jsondan/meta/*/*/*/*/*.jsonmenjadi/live.json - Menggunakan
file_server browse
- Rewrite
QueryUrldanMetaUrlSteamOS asli tampaknya memiliki logika lebih banyak, tetapi konfigurasi ini saja sudah cukup agarsteamos-atomupddapat menemukan update baru- Ada logika untuk menghindari update jika image yang sudah diiklankan adalah image yang sedang berjalan
- Untuk meng-update instalasi SteamOS yang sudah ada ke image sendiri, ubah
/etc/rauc/keyring.pemdan/etc/steamos-atomupd/client.confsteamos-readonly disabletidak diperlukan- Perubahan masuk ke overlay
/etc - Setelah menjalankan
steamos-update, pertimbangkan untuk membersihkan perubahan tersebut dari/var/lib/overlays/etc/upper
- Jika salah satu image pemulihan Valve dimodifikasi dan rootfs-nya diganti dengan image sendiri, kemungkinan SteamOS varian ini juga dapat diinstal, tetapi metode ini belum diuji
1 komentar
Komentar Hacker News
Saya suka tulisan seperti ini yang benar-benar mengustomisasi software/OS di perangkat yang saya miliki. Menyenangkan juga bahwa di Steam Deck kita tidak perlu khawatir soal Tivoization
Bagian paling menarik dari tulisan ini buat saya adalah partisi
/nix. Saya tidak tahu Steam Deck mendukung nixpkgs, dan setelah saya cari lagi, ternyata meski bukan instalasi bawaan, itu tetap bisa dipasang ke perangkat tanpa harus mem-fork seluruh OSRepositori Nix bisa diletakkan di lokasi mana pun yang bisa ditulisi, lalu cukup ubah
$PATHagar menunjuk ke direktori symbolic linkIni tulisan yang sangat teliti dan menarik. Secara pribadi saya rasa saya tidak akan pernah melangkah sejauh ini
Pengalaman saya menyentuh Linux pun cuma saat memakai Raspberry Pi, dan itu pun mungkin hanya 1%, jadi penulisnya terlihat hebat
Mirip dengan https://github.com/kiler129/relax-intel-rmrr, tapi itu bukan repositori saya
Akar masalahnya hanya bisa diselesaikan lewat pembaruan ROM dari pabrikan, sementara DL360 lama yang saya pakai sudah tidak lagi didukung HPE
Patch-nya sendiri cuma perubahan satu baris, tetapi pembaruan kernel sangat merepotkan. Harus mengambil SRPM, dan karena tidak ada repositori Git, saya harus mengekstrak SRPM, menerapkan patch, lalu membangun dan memasangnya lagi
Sudah ada distro yang dibangun di atas komponen SteamOS dan disesuaikan untuk penggunaan PC dan controller. ChimeraOS bahkan menyertakan EmuDeck, alat tambahan untuk Steam Deck, dan di lingkungan saya berjalan cukup mulus tanpa banyak masalah
Saya memesan GPU untuk menjalankan Steam Headless di server NAS unRaid lewat image Docker yang keren, lalu mengaksesnya dari laptop Windows dengan klien seperti Moonlight
Kalau berhasil, ini jauh lebih baik daripada membiarkan NAS yang sebagian besar menganggur lalu tetap membeli lagi hardware desktop khusus gaming. Hanya saja, kartu Nvidia perlu dijaga agar pengaturan dayanya tetap idle saat tidak dipakai. Semoga bisa lewat pemanggilan
nvidia-persistenced1: https://github.com/Steam-Headless/docker-steam-headless
1: https://github.com/games-on-whales/gow
https://kubevirt.io/user-guide/virtual_machines/host-devices...
Menjalankan game cloud-native secara deklaratif!
kubectl apply -f crysis.yamlHari ini saya baru tahu tentang RAUC(https://rauc.io/). Saya memang penasaran bagaimana Valve mengimplementasikan metode pembaruan A/B
Ada yang juga agak merindukan favicon hujan meteor milik Netscape?
Tulisan yang menarik. Upgrade A/B terasa agak berlebihan. Kalau ada masalah, kita bisa menjalankan distro live, atau memasang sistem pemulihan versi lama di partisi terpisah
Setelah memakai NixOS beberapa tahun terakhir, saya kembali ke Arch, dan sebelumnya pun saya sudah lama memakai Arch, jadi menurut saya kekhawatiran penulis agak meleset
Arch jelas merupakan distro yang sangat serius dan matang, dan lebih bisa dipercaya daripada Valve
Saya pindah ke Arch karena kualitas paketnya. Repositori utama diperbarui sangat cepat dan AUR punya banyak paket yang berguna
Sistem yang otomatis pulih setelah upgrade gagal pada titik ini nyaris merupakan keharusan untuk OS dengan perawatan minimal
Saya umumnya menganggap paket NixOS berkualitas tinggi
Belakangan ini saya membeli perangkat handheld gaming Legion Go dan jadi lebih banyak mencoba Linux. Dulu saya menghindarinya karena terlihat seperti buang-buang waktu untuk utak-atik tanpa habis, dan kompatibilitasnya dengan hal-hal yang benar-benar ingin saya pakai juga terbatas
Setelah melihat pembahasan tentang filesystem immutable dan bagaimana Linux tradisional dengan mudah memberi hak root kepada berbagai perangkat lunak arbitrer, saya jadi penasaran
Sekarang saya memakai NixOS; memang ini bisa jadi buang-buang waktu untuk utak-atik, tetapi bagus untuk eksplorasi. Berbagai komponen bisa diuji dengan mudah, dan kalau memutuskan untuk tidak mempertahankannya, semuanya bisa dihapus sepenuhnya kecuali sedikit polusi
~/.config. Mem-patch sesuatu sebelum instalasi juga hal sepele, jadi patch kernel yang memungkinkan Linux dipakai pada perangkat keras unik seperti handheld gaming pun mudah ditambahkanKomunitas NixOS bernama Jovian sedang merekonstruksi tarball SteamOS ad hoc dari Valve menjadi commit bertag di GitHub, sehingga kita bisa menelusuri source seperti karyawan Valve. Mereka juga memungkinkan pemasangan salinan SteamOS sendiri di atas NixOS hanya dengan menambahkan beberapa baris ke konfigurasi Nix
Jelas mereka ahli Linux, dan dari source-nya bisa dilihat bahwa selain penyesuaian sederhana seperti memeriksa posisi tombol daya alih-alih meng-hardcode-nya, mereka menerima paket Valve dalam keadaan nyaris tak diubah
Jika Anda menginginkan pengalaman SteamOS yang murni tetapi tidak ingin menjalankan mirror sistem pembaruan Valve sendiri, atau ingin menjelajahi source Valve tanpa mengunduh tarball 3GB, Jovian layak dicoba
Panduan instalasi: https://jovian-experiments.github.io/Jovian-NixOS/getting-st...
Mirror source Valve: https://github.com/orgs/Jovian-Experiments/repositories?type...
bazzite.gg juga melakukan ini dengan sangat baik. Di hardware AMD, 120Hz VRR langsung berfungsi, dan dukungan HDR juga bisa diuji dalam alpha
“Bazzite adalah image OCI yang dapat digunakan sebagai sistem operasi pengganti untuk Steam Deck, serta lingkungan mirip SteamOS yang siap dipakai untuk bermain game pada komputer desktop, PC home theater ruang tamu, dan berbagai PC handheld”
https://github.com/ublue-os/bazzite/
Bahkan kalau Anda tidak tertarik, README-nya tetap layak dibaca. Daftar hal yang disertakan sangat panjang, dan ada banyak item yang tampak keren serta berguna, terutama bagi gamer atau streamer
Saya belum mendalaminya sampai bisa menjelaskannya secara ringkas dan sempurna dalam satu komentar HN, tetapi intinya adalah menaruh distribusi Linux tervalidasi yang read-only di root, lalu menumpuk paket sebagai layer di atasnya. Strukturnya banyak terinspirasi dari container di sisi server
Tujuannya adalah menjadi lebih aman, lebih andal, lebih reproducible, dan lebih mudah dikustomisasi daripada Linux tradisional. Anda cukup menuliskan paket yang diinginkan di manifest container, lalu saat ada upgrade, jalankan upgrade dan paket-paket itu akan dipasang ulang di atasnya
https://universal-blue.org/guide/fork-your-own/
Dan karena ini OS immutable, kalau ada masalah Anda juga bisa rollback ke image sebelumnya
Sebagian besar saya mainkan di Steam Deck atau dengan menjalankan Bazzite di mesin virtual yang memakai GPU passthrough, dan hasilnya benar-benar bagus
PC ruang tamu ya, sekarang orang sudah jarang memakai istilah HTPC atau “media center”?