• यह एक प्रयोग है जिसमें 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/init Input/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, s3fs mount, /sys, /dev, /proc bind mount जोड़े गए, और अंत में exec chroot /sysroot /sbin/init चलाने के लिए बदलकर S3 root boot सफल किया गया

S3 root पर सामने आई DNS समस्या

  • boot के बाद mount के परिणाम में पुष्टि हुई कि / को s3fs type के रूप में माउंट किया गया है
  • pacman -Sy fastfetch चलाते समय geo.mirror.pkgbuild.com जैसे package mirror host resolve न होने से विफलता हुई
  • क्योंकि root filesystem S3 पर था, दूसरी machine से उस root को माउंट करके chroot के जरिए tools install किए जा सके
  • systemd-resolved journal 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 बहुत धीमी थी
  • FUSE driver या kernel को modify न करने की शर्त बनाए रखने के लिए, विफल rsync log के आधार पर 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/ttyS0 wait 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 के लिए r8169 driver इस्तेमाल किया गया
    • serial display का उपयोग नहीं किया गया
    • घर के network topology के हिसाब से network settings बदली गईं
  • लंबे ethernet cable की जगह Powerline का उपयोग किया गया
  • integrated EFI file build करके उसे USB drive के EFI boot path में रखा गया और laptop पर boot किया गया
  • built-in keyboard के लिए modprobe directive नहीं मिल पाया, इसलिए hid_usb लोड किया गया और external keyboard से network configure किया गया
  • अंतिम परिणाम storage के बिना Google Drive-आधारित root पर चलने वाला एक “Cloud Native Computer” था

संभावित variants और सीमाएँ

  • यह project अपने आप में काफी playful है, लेकिन इसी तरीके से SSHFS पर Linux बूट किया जा सकता है
  • gitfs का उपयोग करके Git repository से Linux बूट करना और changes को Git से track करना भी संभव है
  • संभावनाएँ बहुत हैं, लेकिन practical usefulness सीमित है
  • अगले experiment के लिए Nix install करने का विचार है

अभी कोई टिप्पणी नहीं है.

अभी कोई टिप्पणी नहीं है.