Google Drive से Linux बूट करना
(ersei.net)- यह एक प्रयोग है जिसमें local disk या NFS की जगह Google Drive को root filesystem बनाकर Arch Linux बूट किया गया
- initramfs चरण में FUSE filesystem माउंट किया गया, और Dracut से network तथा ज़रूरी binaries शामिल करने वाली custom EFI image बनाई गई
- पहले S3 और
s3fsसे concept verify किया गया, फिरswitch_rootऔरpivot_rootकी विफलता को PID 1 परchrootचलाकर bypass किया गया - Google Drive लागू करते समय
google-drive-ocamlfuseका उपयोग किया गया, लेकिन symbolic link, hard link, permissions, speed की सीमाओं के कारण manual correction और timeout tuning की ज़रूरत पड़ी - अंत में storage-रहित laptop पर भी USB की integrated EFI file और wired network driver से बूट किया गया, और भले इसकी practical usefulness कम हो, इसने SSHFS या Git-आधारित root जैसी variants की संभावना दिखाई
Google Drive को root filesystem की तरह इस्तेमाल करना
- NFS से Linux बूट करने का एक उदाहरण देखकर, उससे भी ज़्यादा कठिन लक्ष्य के रूप में Google Drive root boot का प्रयास किया गया
- अलग helper machine के बिना self-contained संरचना चाहिए थी, इसलिए user space में filesystem driver की तरह काम करने वाले FUSE को चुना गया
- मुख्य शर्त यह थी कि initramfs के अंदर FUSE program और network configuration डाली जाए, remote root filesystem को माउंट किया जाए, और फिर normal boot आगे बढ़े
Linux बूट प्रक्रिया में हस्तक्षेप करने की जगह
- Linux boot flow मोटे तौर पर इन चरणों में बंटा होता है
- BIOS/UEFI firmware bootloader शुरू करता है
- bootloader kernel को load करता है
- kernel RAM में temporary filesystem initramfs को unpack करता है और real filesystem माउंट करने वाले tools का उपयोग करता है
- kernel real filesystem पर switch करता है और नए filesystem का init system चलाता है
- अगर तीसरे चरण में FUSE filesystem माउंट कर दिया जाए, तो remote storage को root की तरह इस्तेमाल करते हुए boot जारी रखा जा सकता है
Dracut से बना S3 proof of concept
- custom initramfs बनाने के लिए Dracut का उपयोग किया गया
- base distribution के रूप में अपेक्षाकृत हल्का और परिचित Arch Linux चुना गया
- Dracut module में
fusermount,fuseiso,mkisofsजैसे FUSE-संबंधित binaries शामिल किए गए dracut.shसे EFI image बनाई गई और उसे QEMU में चलाया गया;root=argument न होने की warning के बाद debug shell में प्रवेश हुआ- debug shell में boot के लिए ज़रूरी काम सीधे किए गए
modprobe fuse,modprobe e1000से drivers लोड किए गएdhclient eth0और routing settings से network configure किया गयाs3fsसे local S3 bucket को/sysrootपर माउंट किया गया
switch_root की विफलता और chroot workaround
/sysrootमें Arch Linux root दिख रहा था, लेकिनswitch_root /sysroot /sbin/initInput/output errorके साथ विफल हुआpivot_rootभी initramfs के rootfs पर इस्तेमाल नहीं हो सकता था, इसलिएInvalid argumentमिला- संदर्भ के लिए देखे गए Stack Exchange उत्तर के अनुसार initramfs rootfs पर
pivot_rootया unmount संभव नहीं है, इसलिए नए root को overmount करकेchrootके बाद init चलाना पड़ता है - shell में सिर्फ
chroot /sysroot /sbin/initचलाने पर systemd ठीक से शुरू नहीं हो पाया क्योंकि वह PID 1 नहीं था - Dracut के
init.shमें network setup,s3fsmount,/sys,/dev,/procbind mount जोड़े गए, और अंत मेंexec chroot /sysroot /sbin/initचलाने के लिए बदलकर S3 root boot सफल किया गया
S3 root पर सामने आई DNS समस्या
- boot के बाद
mountके परिणाम में पुष्टि हुई कि/कोs3fstype के रूप में माउंट किया गया है pacman -Sy fastfetchचलाते समयgeo.mirror.pkgbuild.comजैसे package mirror host resolve न होने से विफलता हुई- क्योंकि root filesystem S3 पर था, दूसरी machine से उस root को माउंट करके
chrootके जरिए tools install किए जा सके systemd-resolvedjournal socket stdout connection permission समस्या के कारण नहीं चला, इसलिए/etc/resolv.confमेंnameserver 1.1.1.1डालकर DNS workaround किया गया
Google Drive पर ले जाना
- Google Drive के लिए FUSE implementation के रूप में google-drive-ocamlfuse का इस्तेमाल किया गया
- Google account में OAuth2 secret बनाया गया, API enable की गई, और Arch Linux VM पर AUR package install किया गया
- Google Drive को माउंट करने के बाद लंबे
rsyncकाम से Arch Linux files Drive पर कॉपी की गईं - Google Drive-आधारित root में filesystem behavior का अंतर लगातार समस्या बना रहा
- symbolic link की ओर इशारा करने वाला symbolic link काम नहीं करता था, जिससे
/usr/libसे जुड़ी items में समस्या आई - hard link काम नहीं करते थे
- relative symbolic link काम नहीं करते थे
- broken symbolic link की अनुमति नहीं थी
- Google Drive के बाहर इशारा करने वाले symbolic link काम नहीं करते थे
- permissions और attributes काम नहीं करते थे
- speed बहुत धीमी थी
- symbolic link की ओर इशारा करने वाला symbolic link काम नहीं करता था, जिससे
- FUSE driver या kernel को modify न करने की शर्त बनाए रखने के लिए, विफल
rsynclog के आधार पर manual symbolic links बनाकर स्थिति संभाली गई
Google Drive के लिए initramfs में बदलाव
- initramfs में laptop पर बना token file, Google Drive FUSE binary, और SSL certificates शामिल किए गए
/.gdfuse/default/config,/.gdfuse/default/state,/etc/ssl,/etc/ca-certificatesसे संबंधित files Dracut image में जोड़ी गईं- Google Drive root से boot करते समय
chroot: /sbin/init: File not foundत्रुटि आई - वास्तविक file मौजूद होने पर भी, अगर dependent libraries या dynamic linker path न हों, तो Linux
File not foundलौटा सकता है - relative symbolic link समस्या के कारण kernel
/sysrootके अंदर फिर से/sysroot/sysrootखोजने लगा, इसलिए/sysroot/sysrootबनाया गया और उसके अंदर/sysrootको bind mount करके समस्या हल की गई - इसके बाद भी boot बहुत धीमा रहा
- dynamic linker cache दोबारा बनाने में लगभग 5 मिनट लगे
- हर systemd unit में लगभग 1 मिनट लगा
/dev/ttyS0wait timeout की वजह से boot रुक जाता था
/etc/systemd/system/dev-ttyS0.deviceमेंJobTimeoutSec=infinityसेट किया गया, और/etc/login.defsमेंLOGIN_TIMEOUTको0किया गया ताकि login timeout से बचा जा सके- cache भर जाने के बाद file read शुरुआत की तुलना में कम धीमे हुए
बिना storage वाले laptop पर चलाना
- बिना storage वाले spare laptop पर real hardware boot का प्रयास किया गया
- QEMU configuration से hardware के अनुरूप कुछ चीजें बदली गईं
- default
e1000की जगह laptop ethernet port के लिएr8169driver इस्तेमाल किया गया - serial display का उपयोग नहीं किया गया
- घर के network topology के हिसाब से network settings बदली गईं
- default
- लंबे ethernet cable की जगह Powerline का उपयोग किया गया
- integrated EFI file build करके उसे USB drive के EFI boot path में रखा गया और laptop पर boot किया गया
- built-in keyboard के लिए
modprobedirective नहीं मिल पाया, इसलिएhid_usbलोड किया गया और external keyboard से network configure किया गया - अंतिम परिणाम storage के बिना Google Drive-आधारित root पर चलने वाला एक “Cloud Native Computer” था
अभी कोई टिप्पणी नहीं है.