Google Drive’dan Linux önyüklemek
(ersei.net)- Yerel disk veya NFS yerine Google Drive’ı kök dosya sistemi olarak kullanıp Arch Linux’u önyükleme deneyi
initramfsaşamasında FUSE dosya sistemi bağlanıyor ve Dracut ile ağ ile gerekli ikilileri içeren özel bir EFI imajı oluşturuluyor- Önce S3 ve
s3fsile kavram doğrulandıktan sonra,switch_rootvepivot_roothataları PID 1 üzerindechrootçalıştırılarak aşılıyor - Google Drive uygulamasında
google-drive-ocamlfusekullanıldı ancak sembolik bağlantı, sabit bağlantı, izinler ve hız kısıtları yüzünden elle düzeltme ve zaman aşımı ayarları gerekti - Sonuçta depolama aygıtı olmayan bir dizüstünde bile USB’deki birleşik EFI dosyası ve kablolu ağ sürücüsüyle önyükleme yapıldı; pratikliği düşük olsa da SSHFS veya Git tabanlı kök gibi varyasyonların mümkün olduğunu gösteriyor
Google Drive’ı kök dosya sistemi olarak kullanmak
- NFS’ten Linux önyükleme örneğini gördükten sonra, daha zorlu bir hedef olarak Google Drive kök önyükleme denendi
- Ayrı bir yardımcı makine olmadan kendi içinde tamamlanmış bir yapı istendiği için, kullanıcı alanında dosya sistemi sürücüsü gibi çalışan FUSE seçildi
- Temel şart,
initramfsiçine FUSE programı ve ağ yapılandırmasını koyup uzak kök dosya sistemini bağladıktan sonra normal önyüklemeye devam etmekti
Linux önyükleme sürecine nerede müdahale ediliyor?
- Linux önyükleme akışı genel olarak şu aşamalara ayrılıyor
- BIOS/UEFI bellenimi önyükleyiciyi başlatır
- Önyükleyici çekirdeği yükler
- Çekirdek RAM’de geçici dosya sistemi olan initramfs’i açar ve gerçek dosya sistemini bağlamak için araçları kullanır
- Çekirdek gerçek dosya sistemine geçer ve yeni dosya sisteminin init sistemini çalıştırır
- Üçüncü aşamada FUSE dosya sistemi bağlanırsa, uzak depolama kökmüş gibi kullanılarak önyükleme sürdürülebilir
Dracut ile oluşturulan S3 kavram kanıtı
- Özel
initramfsoluşturmak için Dracut kullanıldı - Temel dağıtım olarak görece hafif ve aşina olunan Arch Linux seçildi
- Dracut modülüne
fusermount,fuseiso,mkisofsgibi FUSE ile ilgili ikililer eklendi dracut.shile EFI imajı oluşturulup QEMU’da çalıştırıldı;root=parametresinin olmadığı uyarısından sonra hata ayıklama kabuğuna düşüldü- Hata ayıklama kabuğunda önyükleme için gereken işler elle yapıldı
modprobe fuse,modprobe e1000ile sürücüler yüklendidhclient eth0ve yönlendirme ayarlarıyla ağ yapılandırıldıs3fsile yerel S3 bucket’ı/sysrootaltına bağlandı
switch_root hatası ve chroot ile çözüm
/sysrootaltında Arch Linux kökü görünmesine rağmen,switch_root /sysroot /sbin/initInput/output errorile başarısız oldupivot_rootdainitramfsiçindekirootfsüzerinde kullanılamadığı içinInvalid argumenthatası verdi- Başvurulan Stack Exchange yanıtına göre,
initramfs rootfsüzerindepivot_rootveya unmount mümkün olmadığından yeni kökü bind mount ile üstüne geçiripchrootsonrası init çalıştırmak gerekiyor - Kabukta basitçe
chroot /sysroot /sbin/initçalıştırıldığında systemd PID 1 olmadığı için düzgün başlayamadı - Dracut’ın
init.shdosyasına ağ yapılandırması,s3fsbağlama işlemi,/sys,/dev,/procbind mount’ları eklenip en sondaexec chroot /sysroot /sbin/initçalıştırılacak şekilde değiştirilerek S3 kök önyüklemesi başarıldı
S3 kökünde ortaya çıkan DNS sorunu
- Önyükleme sonrasında
mountçıktısında/dizininins3fstürü olarak bağlandığı doğrulandı pacman -Sy fastfetchçalıştırılırkengeo.mirror.pkgbuild.comgibi paket aynası ana makineleri çözümlenemediği için işlem başarısız oldu- Kök dosya sistemi S3 üzerinde olduğu için, başka bir makinede bu kök bağlanıp
chrootile içine girilerek araçlar kurulabildi systemd-resolved, journal soket stdout bağlantısı izin problemi nedeniyle çalışmadı; DNS’i aşmak için/etc/resolv.confiçinenameserver 1.1.1.1yazıldı
Google Drive’a geçiş
- Google Drive için FUSE gerçekleştirmesi olarak google-drive-ocamlfuse kullanıldı
- Google hesabında OAuth2 gizli değeri oluşturulup API etkinleştirildikten sonra, Arch Linux VM’e AUR paketi kuruldu
- Google Drive bağlandıktan sonra uzun bir
rsyncişlemiyle Arch Linux dosyaları Drive’a kopyalandı - Google Drive tabanlı kökte dosya sistemi davranış farklılıkları sürekli sorun çıkardı
- Sembolik bağlantıyı gösteren sembolik bağlantılar çalışmadığı için
/usr/libile ilgili öğelerde sorun oluştu - Sabit bağlantılar çalışmadı
- Göreli sembolik bağlantılar çalışmadı
- Bozuk sembolik bağlantılara izin verilmedi
- Google Drive dışını gösteren sembolik bağlantılar çalışmadı
- İzinler ve öznitelikler çalışmadı
- Hız çok yavaştı
- Sembolik bağlantıyı gösteren sembolik bağlantılar çalışmadığı için
- FUSE sürücüsünü veya çekirdeği değiştirmeme şartı korunduğu için, başarısız
rsyncgünlüklerine bakılarak sembolik bağlantılar elle oluşturuldu
Google Drive için initramfs düzenlemeleri
initramfsiçine dizüstünde üretilen token dosyası, Google Drive FUSE ikilisi ve SSL sertifikaları eklendi/.gdfuse/default/config,/.gdfuse/default/state,/etc/ssl,/etc/ca-certificatesile ilgili dosyalar Dracut imajına dahil edildi- Google Drive köküyle önyükleme sırasında
chroot: /sbin/init: File not foundhatası oluştu - Gerçek dosya mevcut olsa bile bağımlı kütüphaneler veya dinamik bağlayıcı yolu yoksa Linux
File not founddöndürebilir - Göreli sembolik bağlantı sorunu nedeniyle çekirdek
/sysrootiçinde tekrar/sysroot/sysrootaramaya başladı; çözüm olarak/sysroot/sysrootoluşturulup/sysrootonun içine bind mount edildi - Sonrasında da önyükleme çok yavaştı
- Dinamik bağlayıcı önbelleğini yeniden oluşturmak yaklaşık 5 dakika sürdü
- Her systemd birimi yaklaşık 1 dakika aldı
/dev/ttyS0bekleme zaman aşımı yüzünden önyükleme takıldı
/etc/systemd/system/dev-ttyS0.deviceiçindeJobTimeoutSec=infinityayarlanarak ve/etc/login.defsiçindeLOGIN_TIMEOUTdeğeri0yapılarak oturum açma zaman aşımı önlendi- Önbellek dolduktan sonra dosya okuma ilk duruma göre daha az yavaş hale geldi
Depolamasız bir dizüstünde çalıştırmak
- Depolama aygıtı olmayan yedek bir dizüstüyle gerçek donanımda önyükleme denendi
- QEMU için yapılan ayarlardan donanıma uygun olarak birkaç nokta değiştirildi
- Varsayılan
e1000yerine dizüstünün Ethernet portu içinr8169sürücüsü kullanıldı - Seri ekran kullanılmadı
- Ağ ayarları ev ağ topolojisine göre değiştirildi
- Varsayılan
- Uzun Ethernet kablosu yerine Powerline kullanıldı
- Birleşik EFI dosyası derlenip USB sürücüsünün EFI önyükleme yoluna yerleştirildi ve dizüstü buradan başlatıldı
- Dahili klavye için uygun
modprobeyönergesi bulunamadığındanhid_usbyüklendi ve ağ yapılandırması harici klavyeyle yapıldı - Ortaya çıkan nihai sistem, depolama aygıtı olmadan Google Drive tabanlı kökle çalışan bir “Cloud Native Computer” oldu
Olası varyasyonlar ve sınırlar
- Projenin kendisi büyük ölçüde eğlenceli bir deneme olsa da, aynı yöntemle SSHFS üzerinde Linux önyüklemek mümkün
- gitfs kullanılırsa Linux’u bir Git deposundan önyükleyip değişiklikleri Git ile takip eden bir yapı da kurulabilir
- Olanak çok ama pratiklik sınırlı
- Bir sonraki deney adayı olarak Nix kurulumu düşünülüyor
Henüz yorum yok.