- SteamOS 3 “Holo” Steam Deck के लिए Arch-आधारित distribution है, लेकिन लिविंग रूम PC में suspend से resume की समस्या ठीक करने के लिए kernel commit को revert करना पड़ा और rootfs image तक खुद fork करनी पड़ी
- update संरचना A/B तरीके पर आधारित है, जिसमें निष्क्रिय partition पर नया read-only rootfs install किया जाता है और फिर reboot किया जाता है;
/etcoverlayfs के ज़रिए बदलाव सुरक्षित रखता है - Valve kernel patches के लिए pacman source mirror के
linux-neptune-61-6.1.52.valve9-1.src.tar.gzजैसे source tarball से bare Git repository clone की जाती है, फिर अपने tags और PKGBUILD से package build किया जाता है - rootfs repack करने में SteamOS RAUC bundle से
rootfs.img.caibxनिकालना, उसे image में बदलना, Btrfs UUID बदलना, package बदलना,buildidबदलना, update URL और RAUC certificate बदलना, फिर दोबारा RAUC bundle बनाना शामिल है - अगर अपना web server
live.jsonserve करे औरsteamos-atomupdकेQueryUrl,ImagesUrl,MetaUrlबदल दिए जाएं, तो मौजूदा SteamOS install को भी अपनी image से update किया जा सकता है
SteamOS को लिविंग रूम PC के लिए fork करने की वजह
- SteamOS 3 “Holo”, Valve Software के handheld PC gaming device Steam Deck के लिए Arch-आधारित Linux distribution है
- इसका update तरीका A/B atomic update संरचना पर आधारित है, जिसमें नया read-only rootfs निष्क्रिय partition पर डाउनलोड होता है और फिर उसी partition में reboot किया जाता है
- user
steamos-devmodeचलाकर rootfs lock हटा सकता है और pacman database को सामान्य कर सकता है, जिससे इसे एक सामान्य Linux distribution की तरह इस्तेमाल किया जा सकता है - लक्ष्य यह था कि
steamos-devmodeसे आसान bypass करने के बजाय, rootfs image को सीधे modify करने वाला एक proper fork बनाया जाए - लिविंग रूम PC पर SteamOS लगभग सही चल रहा था, लेकिन सिर्फ suspend से resume विफल हो रहा था
- उसी कंप्यूटर पर mainline या stable kernel इस्तेमाल करने वाले दूसरे distribution में suspend-resume काम कर रहा था
- Valve kernel source ढूंढकर
git bisectचलाने पर पता चला कि एक commit, जो शायद Steam Deck hardware पर suspend-resume ठीक करने के लिए था, इस PC पर समस्या पैदा कर रहा था - उसी commit को revert करके खुद kernel build करना इस पूरे काम का सीधा कारण था
- Arch आदि सीधे इस्तेमाल करने का विकल्प था, लेकिन अगर gaming Linux distribution को modify करना ही है, तो Valve द्वारा test किए गए package set पर निर्भर रहना बेहतर लगा
SteamOS की partition और update संरचना
- SteamOS system 8 partitions का इस्तेमाल करता है
- EFI system partition में stage 1 bootloader और A/B partition set selection metadata होता है
- हर A/B set में stage 2 bootloader के रूप में GRUB, root filesystem, और
/varpartition होता है - बाकी disk space एक single
homepartition भरता है
- boot के समय कई pseudo-filesystem अतिरिक्त रूप से mount होते हैं
/var/log,/root,/nixसमेत लगभग 12 directories को/home/.steamos/offloadसे bind mount करके data persist किया जाता है
/etcको overlayfs से संभाला जाता है- बदलाव
/var/lib/overlays/etc/upperमें store होते हैं machine-id, NetworkManager connections जैसी चीजें, जो सामान्यतः/etcमें रहनी चाहिए, बनी रहती हैं- जिन config files को नहीं छुआ गया, वे update हो सकती हैं
- यह तरीका package manager logic के बिना भी A/B partition संरचना में config preservation और updates दोनों को संभालता है
- बदलाव
- system update Steam client या terminal user द्वारा
steamos-updateचलाने पर शुरू होता है- यह command Python program
steamos-atomupd-clientचलाती है - client वर्तमान OS जानकारी और user के update channel settings को
/etc/steamos-atomupd/client.confमें दिए गए URL पर भेजकर जांचता है कि नया update है या नहीं
- यह command Python program
- नया update होने पर server RAUC bundle का path लौटाता है
- client bundle download करता है और
rauc installचलाता है - RAUC bundle signature verify करता है और
rootfs.img.caibxढूंढता है casync extractसे नई image chunks डाउनलोड करके निष्क्रिय rootfs partition पर लिखी जाती हैं- post-install script सक्रिय
/varसे निष्क्रिय/varमें चुनिंदा data sync करती है और EFI system partition के stage 1 bootloader config को बदलकर नए partition set से boot कराती है
- client bundle download करता है और
Valve kernel source से package बनाना
- Valve, SteamOS में काफी modified Linux kernel का इस्तेमाल करता है, और उसका source download किया जा सकता है
- वर्तमान SteamOS image के source Valve के pacman mirror के
sources/holo-3.5औरsources/jupiter-3.5में मिलते हैं - लेखन के समय stable image kernel
6.1.52-valve9-1-neptune-61था, और उसका source tarball 2.9GiB का था - tarball बड़ा होने की वजह यह है कि उसमें पूरा Linux Git tree शामिल है
- tarball के अंदर
PKGBUILD,config,config-neptune,archlinux-linux-neptune/आदि शामिल हैं archlinux-linux-neptune/कोई सामान्य working tree नहीं बल्कि एक bare repository है
- tarball के अंदर
- PKGBUILD source के रूप में
git+ssh://git@gitlab.steamos.cloud/jupiter/linux-integration.git#tag=$_tagजैसी private GitLab repository को point करता है- इसे सीधे clone नहीं किया जा सकता और न ही commit links खोले जा सकते हैं
makepkgsource से हर tag का पूरा commit history वाला snapshot मिल सकता है- इसी संरचना की वजह से लिविंग रूम PC का suspend तोड़ने वाले commit का bisect संभव हुआ
- काम का तरीका यह है कि bare repository को एक सामान्य working tree के रूप में clone किया जाए और अपने branch व tag बनाए रखें
- उदाहरण में
6.1.52-valve9tag सेmy-branchबनाया गया - अपने बदलाव किसी अलग Git host पर push किए जाते हैं और PKGBUILD के source को उस repository और custom tag की तरफ बदला जाता है
- उदाहरण repository के रूप में linux दिया गया है
- उदाहरण में
makepkgसे kernel package बनाया जा सकता हैmakepkg MAKEFLAGS=-j$(nproc)या/etc/makepkg.confupdate करना, अगर मशीन छोटी VM नहीं है, तो उपयोगी है- देखे गए दायरे में SteamOS-specific packages भी पहले source के रूप में Git repository इस्तेमाल करने वाली समान संरचना अपनाते थे
- आगे के steps आसान बनाने के लिए अपना pacman repo सेट किया गया
- packages को directory में रखकर
repo-add $REPO_NAME.db.tar.zst [PACKAGES...]चलाया जाता है और फिर web host पर upload किया जाता है - यह repo बाद में
steamos-devmodeचलाने पर भी tools को सही तरह काम करने में मदद करता है
- packages को directory में रखकर
root filesystem लाना और mount करना
- release engineering scripts नहीं मिलीं, इसलिए मौजूदा root filesystem को जरूरत के मुताबिक repack करने का तरीका चुना गया
- बिना description और comments वाली scripts fauxlo में हैं
- SteamOS rootfs image पाने का सामान्य तरीका Steam Deck खरीदना या Steam Deck recovery image download करना है, लेकिन दोनों के लिए Steam End User License Agreement से सहमत होना पड़ता है
- वर्तमान release version update system के fallback URL जैसे दिखने वाले snapshot JSON से पता की जा सकती है
- लेखन के समय stable version
20231122.1था - preview channel के लिए अलग snapshot JSON भी है
- लेखन के समय stable version
- rootfs download करने की प्रक्रिया
steamos-atomupd-clientजैसी ही है.raucbfile के रूप में RAUC bundle download किया जाता है- bundle, जो एक SquashFS filesystem है, उससे
rootfs.img.caibxनिकाला जाता है casync extract.castrstore से chunks लेकरrootfs.imgबनाता है.castrstore का URL, RAUC bundle URL में.raucbको.castrसे बदलकर बनता है- यह behavior
steamos-atomupdमें hardcode है - automation script fetch-current.sh में है
- पास में दिखने वाली
.img.zipऔर.img.zstfiles rootfs नहीं बल्कि अलग bootable recovery images हैं- recovery image से rootfs partition निकालकर आगे इस्तेमाल किया जा सकता है
- लेकिन वह RAUC और casync से मिली image के bit-for-bit समान नहीं था, और update bundle दोबारा बनाने के लिए वैसे भी उन tools की जरूरत पड़ती है
- rootfs modify करने से पहले filesystem UUID बदलना जरूरी है
- अगर मूल SteamOS image से custom image पर update करते समय UUID नहीं बदला गया, तो दो अलग filesystems का UUID एक ही हो जाएगा
- यह समस्या पैदा कर सकता है
- उदाहरण:
btrfstune -fu rootfs.img
- Valve zstd compression वाली Btrfs image इस्तेमाल करता है
- बदलाव करते समय compression बनाए रखने के लिए
mount -o compress=zstd rootfs.img rootfsसे mount किया जाता है - SteamOS, Btrfs के
readonlysubvolume property का इस्तेमाल करता है, इसलिएbtrfs property set -ts rootfs ro falseसे इसे हटाया जाता है
- बदलाव करते समय compression बनाए रखने के लिए
- Linux kernel जैसे packages modify करने पर
/devऔर/procमांगने वाली scripts trigger हो सकती हैंdevtmpfsऔरprocको rootfs के नीचे mount किया जाता है- जिन directories पर booted system में mount होना है, उनमें write न हो, इसलिए
/tmp,/run,/var,/homeपर tmpfs mount किया जाता है - chroot के अंदर name resolution काम करे, इसके लिए host का
/etc/resolv.confbind mount किया जाता है
package बदलना और image metadata modify करना
- अपना repository
/etc/pacman.confमें पहले repo entry के रूप में जोड़ा जाता है- इससे Valve repo में newer version होने पर भी अपने packages को प्राथमिकता मिलती है
- बाद में
steamos-devmodeचलने पर भी अपने packages दोबारा install किए जा सकते हैं
- उदाहरण repo stanza में
[fauxlo],Server = https://fauxlo.ili.fyi/pacman/$arch,SigLevel = Neverइस्तेमाल होता हैSigLevel = Neverका मतलब है package signatures न होने पर भी उन्हें स्वीकार करना- GPG-signed packages install करने के लिए pacman keyring भरना पड़ेगा
/etc/pacman.d/gnupgके खाली keyring को छेड़ने के बजाय tmpfs पर नया keyring भरने का तरीका इस्तेमाल किया गया
- package install
pacman --sysroot rootfs --noconfirm -Sy linux-neptune-61जैसे किया जाता है- वास्तविक script में
-yसे बचा गया और केवल अपने repo database को pacman के पीछे sync किया गया - इससे दूसरी repositories की state उस समय पर freeze रखी जा सकती है जब मूल image build हुई थी
- यह image diff में दिखने वाले बदलाव कम करने के लिए चुना गया
- वास्तविक script में
steamos-atomupdवर्तमान image version और build ID को/lib/steamos-atomupd/manifest.jsonसे पढ़ता है, और अगर वह न हो तो/etc/os-releaseका इस्तेमाल करता है- अगर server द्वारा दी गई update का build ID वर्तमान image जैसा ही हो, तो update अस्वीकार कर दिया जाता है
- यह यह पहचानने में भी उपयोगी है कि कौन सी image चल रही है
- build ID का format अनिवार्य रूप से
YYYYMMDD.Nहोना चाहिए- format गलत होने पर
steamos-atomupdPython traceback के साथ बंद हो जाता है - manual increment से बचने के लिए
NमेंHHMMSSया Unix timestamp रखा जा सकता है manifest.jsonकेbuildidऔरos-releaseकेBUILD_IDदोनों बदले जाते हैं- इसके लिए Bash script snippet repack.sh में है
- format गलत होने पर
- RAUC trust configuration के लिए X.509 certificate इस्तेमाल करता है
- trusted certificate
/etc/rauc/keyring.pemमें होता है - एक साधारण self-signed certificate पर्याप्त है
- नया certificate
rootfs/etc/rauc/keyring.pemमें install किया जाता है
- trusted certificate
rootfs/etc/steamos-atomupd/client.confके URLs भी अपने server पर बदले जाते हैंQueryUrlImagesUrlMetaUrl
- 5GiB Btrfs image space के भीतर रहते हुए दूसरे बदलाव भी किए जा सकते हैं
- उदाहरण के लिए, अगर network पर
hostname.localसे SteamOS device ढूंढना हो, तोrootfs/usr/lib/systemd/resolved.conf.d/00-disable-mdns.confहटाया जा सकता है /etcoverlay config से इसे override भी किया जा सकता है, लेकिन इसे झंझट वाला माना गया
- उदाहरण के लिए, अगर network पर
- जो बदलाव image के बिना आसानी से किए जा सकते हों, उन्हें rootfs में न डालना बेहतर है
- उदाहरण के लिए Firefox को rootfs में install किया जा सकता है
- लेकिन हर Firefox security update पर image फिर से repack करनी पड़ेगी
rootfs unmount करना और RAUC bundle बनाना
- बदलाव पूरे होने के बाद filesystem को फिर से read-only के रूप में mark किया जाता है
btrfs property set -ts rootfs ro true
- unused blocks को
fstrim -v rootfsसे discard किया जाता है - unmount के लिए
umount --recursive rootfsउपयोगी है- इससे पहले mount किए गए pseudo-filesystem भी साथ में हट जाते हैं
- RAUC bundle बनाने से पहले casync store और blob index बनाया जाता है
- उदाहरण:
casync make --store=rootfs.img.castr bundle/rootfs.img.caibx rootfs.img
- उदाहरण:
- RAUC bundle के लिए तीन files चाहिए
manifest.raucmrootfs.img.caibx- filesystem UUID वाली
UUID
manifest.raucmमें update जानकारी और rootfs image की जानकारी होती हैcompatible=steamos-amd64version=$versionsha256sizefilename=rootfs.img.caibx
UUIDfileblkid -s UUID -o value rootfs.img >bundle/UUIDसे बनाई जाती है- तीनों files तैयार होने के बाद
rauc bundleचलाया जाता है--signing-keyring,--cert,--keyमें certificate और key दिए जाते हैं- आउटपुट
rootfs.img.raucbहोता है
rootfs.img.raucbऔरrootfs.img.caibxको उस web server पर upload किया जाता है, जिसकी तरफclient.confकाImagesUrlpoint करता है- दोनों files एक ही directory में होनी चाहिए
अपना update server और उसका उपयोग
QueryUrlऔरMetaUrlके लिए इस्तेमाल होने वाला web server JSON files serve करना चाहिए- सरल setup में सिर्फ एक
live.jsonकाफी है.minor.candidates[0].imageobject image के अंदर मौजूद/lib/steamos-atomupd/manifest.jsonजैसा होना चाहिएupdate_pathवह path है जिसे update clientImagesUrlके बाद जोड़कर bundle download करता है
- उदाहरण Caddy configuration में
steamos-atomupdकेQueryUrlऔरMetaUrlrequests कोlive.jsonपर rewrite किया जाता है/updatesको/live.jsonपर rewrite किया जाता है/meta/*/*/*/*.jsonऔर/meta/*/*/*/*/*.jsonको/live.jsonपर rewrite किया जाता हैfile_server browseइस्तेमाल किया जाता है
- असली SteamOS में
QueryUrlऔरMetaUrlके पीछे शायद और ज्यादा logic है, लेकिन इस setup से भीsteamos-atomupdनया update ढूंढ सकता है - अगर जो image पहले से advertise की जा रही है वही वर्तमान में चल रही हो, तो update से बचने का logic मौजूद है
- मौजूदा SteamOS install को अपनी image पर update करने के लिए
/etc/rauc/keyring.pemऔर/etc/steamos-atomupd/client.confबदलना काफी हैsteamos-readonly disableकी जरूरत नहीं है- बदलाव
/etcoverlay में चले जाते हैं steamos-updateचलाने के बाद/var/lib/overlays/etc/upperसे इन बदलावों को साफ करने पर विचार किया जा सकता है
- Valve recovery images में से किसी एक को modify करके rootfs को अपनी image से बदलने पर बदला हुआ SteamOS install करना भी संभव लग सकता है, लेकिन इस तरीके का परीक्षण नहीं किया गया
1 टिप्पणियां
Hacker News की राय
मुझे ऐसे लेख पसंद हैं जिनमें अपने डिवाइस के software/OS को गहराई से customize किया जाता है। यह भी अच्छी बात है कि Steam Deck पर Tivoization की चिंता नहीं करनी पड़ती
लेख में मेरे लिए सबसे दिलचस्प हिस्सा
/nixpartition था। मुझे नहीं पता था कि Steam Deck nixpkgs को support करता है, लेकिन और खोजने पर पता चला कि भले ही यह default install न हो, फिर भी पूरे OS को fork किए बिना इसे डिवाइस पर डाला जा सकता हैNix repository को किसी भी writable location पर रखा जा सकता है, और
$PATHको symbolic link directory की ओर point करने के लिए बदलना होता हैवाकई बहुत बारीक और दिलचस्प लेख है। निजी तौर पर मैं शायद कभी इतना आगे नहीं जाऊँगा
Linux से मेरा पाला भी बस Raspberry Pi इस्तेमाल करने के दिनों में पड़ा था, और वह भी शायद 1% ही, इसलिए लेखक कमाल के लगते हैं
https://github.com/kiler129/relax-intel-rmrr जैसा, लेकिन मेरा repository नहीं
मूल कारण सिर्फ manufacturer के ROM update से ही ठीक हो सकता है, लेकिन मेरा पुराना DL360 HPE support से बाहर हो चुका है
patch खुद तो एक line का बदलाव है, लेकिन kernel update करना झंझट भरा है। SRPM लेना पड़ता है, Git repository नहीं है, इसलिए SRPM को unpack करके patch apply करना, फिर दुबारा build और install करना पड़ता है
पहले से ही SteamOS components पर आधारित ऐसी distributions हैं जो PC और controller use के लिए tuned हैं। ChimeraOS तो Steam Deck के add-on tool EmuDeck तक शामिल करता है और मेरे setup में काफी बिना दिक्कत चलता है
मैंने unRaid NAS server पर Steam Headless को एक बढ़िया Docker image के रूप में चलाने और Windows laptop से Moonlight जैसे client के जरिए connect करने के लिए GPU order किया है
अगर यह ठीक चला, तो ज्यादातर idle पड़े NAS के बावजूद gaming desktop hardware फिर से खरीदने से कहीं बेहतर होगा। बस इस्तेमाल न होने पर Nvidia card की power setting को idle state में रखना होगा। उम्मीद है
nvidia-persistencedcall से यह हो जाए1: 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...
declarative cloud-native game execution!
kubectl apply -f crysis.yamlआज RAUC(https://rauc.io/) के बारे में पता चला। सोच रहा था Valve ने A/B update तरीका कैसे implement किया होगा
Netscape का meteor shower favicon थोड़ा याद नहीं आता?
दिलचस्प लेख है। A/B upgrades थोड़े overkill लगते हैं। समस्या हो तो live distribution boot कर सकते हैं, या पुराने version का recovery system अलग partition में install कर सकते हैं
पिछले कुछ साल NixOS इस्तेमाल करने के बाद मैं Arch पर वापस आया हूँ; उससे पहले भी लंबे समय तक Arch इस्तेमाल किया था, और मुझे लगता है लेखक की चिंता गलत दिशा में है
Arch निश्चित रूप से बहुत serious और mature distribution है, और Valve से ज्यादा भरोसेमंद है
Arch पर जाने की वजह package quality थी। main repository सचमुच तेजी से update होती है और AUR में बहुत सारे useful packages हैं
upgrade fail होने के बाद system का अपने-आप recover होना आज के low-maintenance OS में लगभग जरूरी है
मुझे आम तौर पर NixOS packages की quality ऊँची लगती है
हाल ही में गेमिंग हैंडहेल्ड Legion Go मिला है और Linux को और ज्यादा आज़मा रहा/रही हूँ। पहले यह अंतहीन छेड़छाड़ में समय बर्बाद करने जैसा लगता था, और जिन चीज़ों को सच में इस्तेमाल करना चाहता/चाहती था/थी उनके साथ compatibility भी सीमित थी, इसलिए दूर रहा/रही
immutable filesystem और पारंपरिक Linux में हर तरह के मनमाने software को root permission आसानी से दे देने वाली बात पढ़कर जिज्ञासा हुई
अभी NixOS इस्तेमाल कर रहा/रही हूँ; यह सच में tinkering में समय खपा सकता है, लेकिन exploration के लिए अच्छा है। अलग-अलग components को आसानी से आज़माया जा सकता है, और अगर उन्हें बनाए नहीं रखना है तो
~/.configमें थोड़ी गंदगी छोड़ने के अलावा पूरी तरह हटाया जा सकता है। install से पहले patch करना भी मामूली काम है, इसलिए gaming handheld जैसे अजीब hardware पर Linux चलाने लायक kernel patches भी आसानी से जोड़े जा सकते हैंJovian नाम की NixOS community Valve के मनमाने SteamOS tarballs को GitHub पर tagged commits के रूप में फिर से तैयार कर रही है, इसलिए source को Valve employee की तरह देखा जा सकता है। Nix configuration में बस कुछ lines जोड़कर NixOS के ऊपर अपना SteamOS copy install करने की सुविधा दी गई है
ये लोग साफ तौर पर Linux experts हैं, और source देखने पर पता चलता है कि power button location को hardcode न करके जांचने जैसे simple tweaks को छोड़कर वे Valve packages को untouched रूप में लेते हैं
अगर आप pure SteamOS experience चाहते हैं लेकिन Valve update system का mirror खुद नहीं चलाना चाहते, या 3GB tarball लिए बिना Valve source explore करना चाहते हैं, तो Jovian आज़माने लायक है
installation guide: https://jovian-experiments.github.io/Jovian-NixOS/getting-st...
Valve source mirror: https://github.com/orgs/Jovian-Experiments/repositories?type...
bazzite.gg भी यह काम बहुत अच्छे से करता है। AMD hardware पर 120Hz VRR तुरंत चल पड़ा, और HDR support भी alpha testing में आज़माया जा सकता है
“Bazzite एक OCI image है जिसे Steam Deck के alternative operating system के रूप में इस्तेमाल किया जा सकता है, और यह desktop computers, living room home theater PCs, और कई handheld PCs के लिए game-ready SteamOS जैसा environment है”
https://github.com/ublue-os/bazzite/
रुचि न भी हो, तो भी README देखने लायक है। इसमें शामिल चीज़ों की list बहुत लंबी है, और खासकर gamers या streamers के लिए कई चीज़ें काफी cool और useful लगती हैं
इतना गहराई में नहीं गया/गई कि इसे HN comment में संक्षेप में और पूरी तरह समझा सकूँ, लेकिन मूल बात यह है कि root पर read-only, verified Linux distro रहता है और उसके ऊपर packages layers के रूप में चढ़ाए जाते हैं। इसका design server-side containers से काफी प्रेरित है
इसका लक्ष्य traditional Linux से ज्यादा secure, ज्यादा reliable, reproducible और customize करने में आसान होना है। आप जिन packages को चाहते हैं उन्हें container manifest में लिख देते हैं; upgrade आने पर upgrade चलाया जाता है और फिर उसके ऊपर packages दोबारा install किए जाते हैं
https://universal-blue.org/guide/fork-your-own/
और क्योंकि यह immutable OS है, अगर कोई समस्या आए तो पिछली image पर rollback भी किया जा सकता है
ज्यादातर मैंने Steam Deck पर या GPU passthrough वाले virtual machine में Bazzite चलाकर खेले, और यह वाकई बहुत अच्छी तरह बनाया गया है
living room PC—क्या अब HTPC या “media center” जैसे शब्द ज्यादा इस्तेमाल नहीं होते?