1 điểm bởi GN⁺ 2024-07-03 | Chưa có bình luận nào. | Chia sẻ qua WhatsApp
  • Đây là một thử nghiệm khởi động Arch Linux bằng cách dùng Google Drive làm hệ thống tệp gốc thay vì đĩa cục bộ hay NFS
  • Ở giai đoạn initramfs, tác giả mount hệ thống tệp FUSE và tạo một ảnh EFI tùy chỉnh bằng Dracut, bao gồm mạng và các binary cần thiết
  • Sau khi kiểm chứng ý tưởng trước với S3 và s3fs, tác giả обход các lỗi của switch_rootpivot_root bằng cách chạy chroot ở PID 1
  • Trong quá trình áp dụng với Google Drive, tác giả dùng google-drive-ocamlfuse, nhưng do các giới hạn về symbolic link, hardlink, quyền và tốc độ, cần hiệu chỉnh thủ công và điều chỉnh timeout
  • Cuối cùng, ngay cả trên một laptop không có thiết bị lưu trữ, hệ thống vẫn khởi động được bằng tệp EFI tích hợp trên USB và driver mạng có dây; tuy tính thực dụng thấp, thử nghiệm cho thấy các biến thể khả thi như root dựa trên SSHFS hoặc Git

Dùng Google Drive làm hệ thống tệp gốc

  • Sau khi thấy các trường hợp khởi động Linux từ NFS, tác giả thử một mục tiêu khó hơn: khởi động với root trên Google Drive
  • Vì muốn một cấu trúc tự hoàn chỉnh, không cần máy helper riêng, tác giả chọn FUSE, hoạt động như một driver hệ thống tệp trong không gian người dùng
  • Điều kiện cốt lõi là đưa chương trình FUSE và cấu hình mạng vào initramfs, mount hệ thống tệp gốc từ xa, rồi tiếp tục quá trình khởi động bình thường

Điểm có thể can thiệp trong quá trình khởi động Linux

  • Luồng khởi động Linux có thể chia đại khái thành các bước sau
    • Firmware BIOS/UEFI khởi chạy bootloader
    • Bootloader nạp kernel
    • Kernel giải nén initramfs, một hệ thống tệp tạm trong RAM, và dùng các công cụ để mount hệ thống tệp thật
    • Kernel chuyển sang hệ thống tệp thật và chạy hệ thống init của hệ thống tệp mới
  • Nếu mount hệ thống tệp FUSE ở bước thứ ba, có thể tiếp tục khởi động trong khi dùng kho lưu trữ từ xa như root

Bản chứng minh ý tưởng S3 tạo bằng Dracut

  • Tác giả dùng Dracut để tạo initramfs tùy chỉnh
  • Bản phân phối nền được chọn là Arch Linux, tương đối nhẹ và quen thuộc
  • Module Dracut bao gồm các binary liên quan đến FUSE như fusermount, fuseiso, mkisofs
  • Tác giả tạo ảnh EFI bằng dracut.sh và chạy trong QEMU; sau cảnh báo thiếu tham số root=, hệ thống vào debug shell
  • Trong debug shell, tác giả tự thực hiện các thao tác cần cho khởi động
    • Nạp driver bằng modprobe fuse, modprobe e1000
    • Cấu hình mạng bằng dhclient eth0 và thiết lập routing
    • Mount bucket S3 cục bộ vào /sysroot bằng s3fs

switch_root thất bại và cách обход bằng chroot

  • Dù đã thấy root Arch Linux trong /sysroot, lệnh switch_root /sysroot /sbin/init thất bại với lỗi Input/output error
  • pivot_root cũng không dùng được trên rootfs của initramfs, gây lỗi Invalid argument
  • Theo câu trả lời Stack Exchange được tham khảo, trên rootfs của initramfs không thể dùng pivot_root hay unmount, vì vậy cần mount đè root mới rồi chạy init sau khi chroot
  • Nếu chỉ chạy chroot /sysroot /sbin/init trong shell, systemd không phải PID 1 nên không thể khởi động bình thường
  • Tác giả sửa init.sh của Dracut để đưa vào cấu hình mạng, mount s3fs, bind mount /sys, /dev, /proc, rồi cuối cùng chạy exec chroot /sysroot /sbin/init, qua đó khởi động thành công với root trên S3

Vấn đề DNS lộ ra trên root S3

  • Sau khi khởi động, kết quả mount cho thấy / được mount dưới kiểu s3fs
  • Khi chạy pacman -Sy fastfetch, hệ thống thất bại vì không phân giải được các host mirror gói như geo.mirror.pkgbuild.com
  • Vì hệ thống tệp gốc nằm trên S3, có thể mount root đó từ một máy khác rồi vào bằng chroot để cài công cụ
  • systemd-resolved không chạy được do vấn đề quyền khi kết nối stdout với socket journal, nên tác giả обход DNS bằng cách thêm nameserver 1.1.1.1 vào /etc/resolv.conf

Chuyển sang Google Drive

  • Tác giả dùng google-drive-ocamlfuse làm triển khai FUSE cho Google Drive
  • Sau khi tạo secret OAuth2 trong tài khoản Google và bật API, tác giả cài gói AUR trên VM Arch Linux
  • Sau khi mount Google Drive, tác giả sao chép các tệp Arch Linux lên Drive bằng một tác vụ rsync dài
  • Với root dựa trên Google Drive, khác biệt trong hành vi hệ thống tệp liên tục gây vấn đề
    • Symbolic link trỏ đến symbolic link không hoạt động, gây vấn đề với các mục liên quan đến /usr/lib
    • Hardlink không hoạt động
    • Symbolic link tương đối không hoạt động
    • Symbolic link bị gãy không được cho phép
    • Symbolic link trỏ ra ngoài Google Drive không hoạt động
    • Quyền và thuộc tính không hoạt động
    • Tốc độ rất chậm
  • Để giữ điều kiện không sửa driver FUSE hay kernel, tác giả dựa trên log rsync thất bại để tạo symbolic link thủ công nhằm xử lý

Sửa initramfs cho Google Drive

  • initramfs bao gồm tệp token tạo trên laptop, binary FUSE của Google Drive và chứng chỉ SSL
  • Các tệp liên quan đến /.gdfuse/default/config, /.gdfuse/default/state, /etc/ssl, /etc/ca-certificates được đưa vào ảnh Dracut
  • Khi khởi động với root Google Drive, lỗi chroot: /sbin/init: File not found xảy ra
  • Ngay cả khi tệp thật sự tồn tại, Linux vẫn có thể trả về File not found nếu thiếu thư viện phụ thuộc hoặc đường dẫn dynamic linker
  • Do vấn đề symbolic link tương đối, kernel rơi vào tình huống tìm lại /sysroot/sysroot bên trong /sysroot; tác giả giải quyết bằng cách tạo /sysroot/sysroot rồi bind mount /sysroot vào đó
  • Sau đó quá trình khởi động vẫn rất chậm
    • Tái tạo cache dynamic linker mất khoảng 5 phút
    • Mỗi unit systemd mất khoảng 1 phút
    • Quá trình khởi động bị dừng vì timeout chờ /dev/ttyS0
  • Tác giả đặt JobTimeoutSec=infinity trong /etc/systemd/system/dev-ttyS0.device và đổi LOGIN_TIMEOUT thành 0 trong /etc/login.defs để tránh timeout đăng nhập
  • Sau khi cache được tích lũy, việc đọc tệp đỡ chậm hơn so với ban đầu

Chạy trên laptop không có thiết bị lưu trữ

  • Tác giả thử khởi động trên phần cứng thật bằng một laptop dự phòng không có thiết bị lưu trữ
  • Từ cấu hình cho QEMU, tác giả đổi một số mục cho phù hợp với phần cứng
    • Dùng driver r8169 cho cổng Ethernet của laptop thay vì e1000 mặc định
    • Không dùng màn hình serial
    • Thay đổi cấu hình mạng theo topology mạng tại nhà
  • Tác giả dùng Powerline thay vì cáp Ethernet dài
  • Tác giả build một tệp EFI tích hợp, đặt vào đường dẫn khởi động EFI trên ổ USB và khởi động laptop
  • Không tìm được chỉ thị modprobe cho bàn phím tích hợp, nên tác giả nạp hid_usb và dùng bàn phím ngoài để cấu hình mạng
  • Kết quả cuối cùng là một “Cloud Native Computer” hoạt động với root dựa trên Google Drive mà không cần thiết bị lưu trữ

Các biến thể khả dĩ và giới hạn

  • Bản thân dự án mang tính nghịch ngợm khá cao, nhưng cùng cách này có thể khởi động Linux trên SSHFS
  • Nếu dùng gitfs, cũng có thể khởi động Linux từ một kho Git và theo dõi thay đổi bằng Git
  • Có nhiều khả năng, nhưng tính thực dụng còn hạn chế
  • Tác giả nghĩ đến việc cài Nix như ứng viên thử nghiệm tiếp theo

Chưa có bình luận nào.

Chưa có bình luận nào.