1 puan yazan GN⁺ 2024-07-03 | Henüz yorum yok. | WhatsApp'ta paylaş
  • Yerel disk veya NFS yerine Google Drive’ı kök dosya sistemi olarak kullanıp Arch Linux’u önyükleme deneyi
  • initramfs aş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 s3fs ile kavram doğrulandıktan sonra, switch_root ve pivot_root hataları PID 1 üzerinde chroot çalıştırılarak aşılıyor
  • Google Drive uygulamasında google-drive-ocamlfuse kullanı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, initramfs iç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 initramfs oluş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, mkisofs gibi FUSE ile ilgili ikililer eklendi
  • dracut.sh ile 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 e1000 ile sürücüler yüklendi
    • dhclient eth0 ve yönlendirme ayarlarıyla ağ yapılandırıldı
    • s3fs ile yerel S3 bucket’ı /sysroot altına bağlandı

switch_root hatası ve chroot ile çözüm

  • /sysroot altında Arch Linux kökü görünmesine rağmen, switch_root /sysroot /sbin/init Input/output error ile başarısız oldu
  • pivot_root da initramfs içindeki rootfs üzerinde kullanılamadığı için Invalid argument hatası verdi
  • Başvurulan Stack Exchange yanıtına göre, initramfs rootfs üzerinde pivot_root veya unmount mümkün olmadığından yeni kökü bind mount ile üstüne geçirip chroot sonrası 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.sh dosyasına ağ yapılandırması, s3fs bağlama işlemi, /sys, /dev, /proc bind mount’ları eklenip en sonda exec 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 / dizininin s3fs türü olarak bağlandığı doğrulandı
  • pacman -Sy fastfetch çalıştırılırken geo.mirror.pkgbuild.com gibi 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 chroot ile 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.conf içine nameserver 1.1.1.1 yazı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 rsync iş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/lib ile 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ı
  • FUSE sürücüsünü veya çekirdeği değiştirmeme şartı korunduğu için, başarısız rsync günlüklerine bakılarak sembolik bağlantılar elle oluşturuldu

Google Drive için initramfs düzenlemeleri

  • initramfs iç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-certificates ile ilgili dosyalar Dracut imajına dahil edildi
  • Google Drive köküyle önyükleme sırasında chroot: /sbin/init: File not found hatası oluştu
  • Gerçek dosya mevcut olsa bile bağımlı kütüphaneler veya dinamik bağlayıcı yolu yoksa Linux File not found döndürebilir
  • Göreli sembolik bağlantı sorunu nedeniyle çekirdek /sysroot içinde tekrar /sysroot/sysroot aramaya başladı; çözüm olarak /sysroot/sysroot oluşturulup /sysroot onun 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/ttyS0 bekleme zaman aşımı yüzünden önyükleme takıldı
  • /etc/systemd/system/dev-ttyS0.device içinde JobTimeoutSec=infinity ayarlanarak ve /etc/login.defs içinde LOGIN_TIMEOUT değeri 0 yapı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 e1000 yerine dizüstünün Ethernet portu için r8169 sürücüsü kullanıldı
    • Seri ekran kullanılmadı
    • Ağ ayarları ev ağ topolojisine göre değiştirildi
  • 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 modprobe yönergesi bulunamadığından hid_usb yü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.

Henüz yorum yok.