Khởi động Linux từ Google Drive
(ersei.net)- Đâ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ủaswitch_rootvàpivot_rootbằng cách chạychrootở 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.shvà 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 eth0và thiết lập routing - Mount bucket S3 cục bộ vào
/sysrootbằngs3fs
- Nạp driver bằng
switch_root thất bại và cách обход bằng chroot
- Dù đã thấy root Arch Linux trong
/sysroot, lệnhswitch_root /sysroot /sbin/initthất bại với lỗiInput/output error pivot_rootcũng không dùng được trên rootfs của initramfs, gây lỗiInvalid 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_roothay unmount, vì vậy cần mount đè root mới rồi chạy init sau khichroot - Nếu chỉ chạy
chroot /sysroot /sbin/inittrong 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.shcủa Dracut để đưa vào cấu hình mạng, mounts3fs, bind mount/sys,/dev,/proc, rồi cuối cùng chạyexec 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ả
mountcho thấy/được mount dưới kiểus3fs - 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-resolvedkhô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êmnameserver 1.1.1.1và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ụ
rsyncdà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
- 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
- Để giữ điều kiện không sửa driver FUSE hay kernel, tác giả dựa trên log
rsyncthấ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 foundxảy ra - Ngay cả khi tệp thật sự tồn tại, Linux vẫn có thể trả về
File not foundnế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/sysrootbên trong/sysroot; tác giả giải quyết bằng cách tạo/sysroot/sysrootrồi bind mount/sysrootvà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=infinitytrong/etc/systemd/system/dev-ttyS0.devicevà đổiLOGIN_TIMEOUTthành0trong/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
r8169cho cổng Ethernet của laptop thay vìe1000mặ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à
- Dùng driver
- 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ị
modprobecho bàn phím tích hợp, nên tác giả nạphid_usbvà 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.