1 poin oleh GN⁺ 2024-07-03 | Belum ada komentar. | Bagikan ke WhatsApp
  • Ini adalah eksperimen untuk mem-boot Arch Linux dengan Google Drive sebagai filesystem root, alih-alih disk lokal atau NFS
  • Pada tahap initramfs, penulis me-mount filesystem FUSE dan membuat image EFI kustom dengan Dracut yang menyertakan jaringan serta binary yang diperlukan
  • Setelah terlebih dahulu memvalidasi konsep dengan S3 dan s3fs, kegagalan switch_root dan pivot_root diakali dengan menjalankan chroot sebagai PID 1
  • Dalam proses penerapan ke Google Drive, digunakan google-drive-ocamlfuse, tetapi karena keterbatasan symbolic link, hardlink, permission, atribut, dan kecepatan, diperlukan koreksi manual serta penyesuaian timeout
  • Pada akhirnya, laptop tanpa media penyimpanan pun berhasil boot menggunakan file EFI terpadu di USB dan driver jaringan kabel; meski kurang praktis, eksperimen ini menunjukkan kemungkinan variasi seperti root berbasis SSHFS atau Git

Menggunakan Google Drive sebagai filesystem root

  • Setelah melihat contoh boot Linux dari NFS, penulis mencoba target yang lebih sulit: boot root dari Google Drive
  • Karena menginginkan struktur yang mandiri tanpa mesin helper terpisah, penulis memilih FUSE, yang bekerja seperti driver filesystem di ruang pengguna
  • Syarat utamanya adalah memasukkan program FUSE dan konfigurasi jaringan ke dalam initramfs, me-mount filesystem root jarak jauh, lalu melanjutkan ke proses boot normal

Titik intervensi dalam proses boot Linux

  • Alur boot Linux secara garis besar terbagi ke tahap berikut
    • Firmware BIOS/UEFI memulai bootloader
    • Bootloader memuat kernel
    • Kernel mengekstrak initramfs, filesystem sementara di RAM, lalu menggunakan alat untuk me-mount filesystem sesungguhnya
    • Kernel beralih ke filesystem sesungguhnya dan menjalankan sistem init dari filesystem baru tersebut
  • Jika filesystem FUSE di-mount pada tahap ketiga, proses boot dapat dilanjutkan sambil memakai storage jarak jauh seolah-olah sebagai root

Proof of concept S3 yang dibuat dengan Dracut

  • Untuk membuat initramfs kustom, digunakan Dracut
  • Distro dasar yang dipilih adalah Arch Linux, karena relatif ringan dan familier
  • Modul Dracut menyertakan binary terkait FUSE seperti fusermount, fuseiso, dan mkisofs
  • Image EFI dibuat dengan dracut.sh dan dijalankan di QEMU; setelah peringatan bahwa argumen root= tidak ada, sistem masuk ke shell debug
  • Di shell debug, penulis menjalankan sendiri pekerjaan yang diperlukan untuk boot
    • Memuat driver dengan modprobe fuse dan modprobe e1000
    • Mengonfigurasi jaringan dengan dhclient eth0 dan pengaturan routing
    • Me-mount bucket S3 lokal ke /sysroot dengan s3fs

Kegagalan switch_root dan workaround chroot

  • Root Arch Linux terlihat di /sysroot, tetapi switch_root /sysroot /sbin/init gagal dengan Input/output error
  • pivot_root juga tidak dapat digunakan pada rootfs initramfs, sehingga memunculkan Invalid argument
  • Menurut jawaban Stack Exchange yang dirujuk, pada rootfs initramfs, pivot_root maupun unmount tidak memungkinkan; karena itu root baru harus di-mount menimpa root lama, lalu init dijalankan setelah chroot
  • Jika hanya menjalankan chroot /sysroot /sbin/init dari shell, systemd tidak menjadi PID 1 sehingga tidak dapat mulai dengan normal
  • Penulis mengubah init.sh milik Dracut agar memasukkan konfigurasi jaringan, mount s3fs, bind mount /sys, /dev, dan /proc, lalu pada akhirnya menjalankan exec chroot /sysroot /sbin/init, sehingga boot root S3 berhasil

Masalah DNS yang muncul pada root S3

  • Setelah boot, hasil mount menunjukkan bahwa / di-mount sebagai tipe s3fs
  • Saat menjalankan pacman -Sy fastfetch, proses gagal karena tidak dapat me-resolve host mirror paket seperti geo.mirror.pkgbuild.com
  • Karena filesystem root berada di S3, root tersebut bisa di-mount dari mesin lain dan alat bisa dipasang lewat chroot
  • systemd-resolved tidak berjalan karena masalah permission koneksi stdout ke socket journal, sehingga DNS diakali dengan memasukkan nameserver 1.1.1.1 ke /etc/resolv.conf

Memindahkannya ke Google Drive

  • Untuk implementasi FUSE bagi Google Drive, digunakan google-drive-ocamlfuse
  • Setelah membuat secret OAuth2 di akun Google dan mengaktifkan API, paket AUR dipasang di VM Arch Linux
  • Setelah Google Drive di-mount, file-file Arch Linux disalin ke Drive melalui proses rsync yang panjang
  • Pada root berbasis Google Drive, perbedaan perilaku filesystem terus menjadi masalah
    • Symbolic link yang menunjuk ke symbolic link tidak bekerja, sehingga menimbulkan masalah pada item terkait /usr/lib
    • Hardlink tidak bekerja
    • Symbolic link relatif tidak bekerja
    • Symbolic link yang putus tidak diizinkan
    • Symbolic link yang menunjuk ke luar Google Drive tidak bekerja
    • Permission dan atribut tidak bekerja
    • Kecepatannya sangat lambat
  • Untuk tetap mempertahankan syarat tidak memodifikasi driver FUSE maupun kernel, penulis menanganinya dengan membuat symbolic link manual berdasarkan log rsync yang gagal

Modifikasi initramfs untuk Google Drive

  • Initramfs menyertakan file token yang dibuat di laptop, binary FUSE Google Drive, dan sertifikat SSL
  • File terkait /.gdfuse/default/config, /.gdfuse/default/state, /etc/ssl, dan /etc/ca-certificates dimasukkan ke image Dracut
  • Saat boot dengan root Google Drive, muncul error chroot: /sbin/init: File not found
  • Di Linux, meski file sebenarnya ada, jika library dependensi atau path dynamic linker tidak ada, sistem dapat mengembalikan File not found
  • Karena masalah symbolic link relatif, kernel mencari kembali /sysroot/sysroot dari dalam /sysroot; ini diselesaikan dengan membuat /sysroot/sysroot lalu melakukan bind mount /sysroot ke dalamnya
  • Setelah itu pun boot masih sangat lambat
    • Regenerasi cache dynamic linker memakan waktu sekitar 5 menit
    • Setiap unit systemd memakan waktu sekitar 1 menit
    • Boot berhenti karena timeout saat menunggu /dev/ttyS0
  • Penulis mengatur JobTimeoutSec=infinity di /etc/systemd/system/dev-ttyS0.device, dan mengubah LOGIN_TIMEOUT menjadi 0 di /etc/login.defs untuk menghindari timeout login
  • Setelah cache terkumpul, pembacaan file menjadi tidak selambat awalnya

Menjalankan di laptop tanpa media penyimpanan

  • Penulis mencoba boot pada hardware sungguhan menggunakan laptop cadangan tanpa media penyimpanan
  • Dari konfigurasi untuk QEMU, beberapa item diubah agar sesuai dengan hardware
    • Menggunakan driver r8169 untuk port Ethernet laptop, bukan default e1000
    • Tidak menggunakan display serial
    • Mengubah konfigurasi jaringan agar sesuai dengan topologi jaringan rumah
  • Powerline digunakan sebagai pengganti kabel Ethernet yang panjang
  • File EFI terpadu dibangun, ditempatkan di path boot EFI pada USB drive, lalu laptop di-boot darinya
  • Penulis tidak menemukan instruksi modprobe untuk keyboard bawaan, sehingga memuat hid_usb dan mengonfigurasi jaringan dengan keyboard eksternal
  • Hasil akhirnya adalah “Cloud Native Computer” yang berjalan dengan root berbasis Google Drive tanpa media penyimpanan

Variasi yang memungkinkan dan batasannya

  • Proyek ini sendiri lebih bersifat main-main, tetapi dengan metode yang sama Linux dapat di-boot di atas SSHFS
  • Jika menggunakan gitfs, juga memungkinkan untuk mem-boot Linux dari repository Git dan melacak perubahan melalui Git
  • Kemungkinannya banyak, tetapi kepraktisannya terbatas
  • Nix installation terpikir sebagai kandidat eksperimen berikutnya

Belum ada komentar.

Belum ada komentar.