Linux bir yorumlayıcıdır
(astrid.tech)- initrd, çekirdeğin doğrudan yorumlayıp çalıştırdığı bir program birimi olarak tanımlanıyor ve Linux bir tür yorumlayıcı olarak yeniden ele alınıyor
kexec,base64,cpiokullanılarak kendi kendini yeniden başlatan özyinelemeli bir Linux dağıtımı kuruluyor; initrd kendisini yeniden çalıştırıyor/initbetiği kendi cpio imajını çıktılıyorsa, Quine biçiminde kendini kopyalayan bir initrd oluşuyor- ELF yürütme yapısı ve
ld.so,binfmt_miscüzerinden yorumlayıcı katmanlarının çekirdeğe kadar uzanan yapısı açıklanıyor kexecveya QEMU kullanıldığında Linux üzerinde başka bir Linux'u kuyruk özyinelemeli olarak çalıştırmak mümkün oluyor; böylece çekirdek, sanallaştırma ve yorumlayıcı arasındaki sınırlar deneysel olarak genişletiliyor
rkx.gz tersine mühendisliği ve kendi üzerine özyinelemeli initrd yapısı
curl https://astrid.tech/rkx.gz | gunzip | sudo shkomutu, 20 MB boyutunda base64 kodlu bir kabuk betiğini indirip çalıştırıyor- Betik root yetkisini doğruluyor ve
kexec,base64,cpiovarlığını denetliyor - base64 verisini çözüp
radlı bir cpio arşivi oluşturuyor, ardından içindenkadlı çekirdek imajını çıkarıyor kexecilekçekirdek,rise ramdisk olarak yüklenip çalıştırılıyor
- Betik root yetkisini doğruluyor ve
r.cpioiçinde/bin,/init,kdosyaları bulunuyor;k, Linux 6.18.18 çekirdek imajı,/initise kabuk betiği biçiminde/init,/procdosya sistemini bağlıyor, ardından geçerli dosya sistemini/riçine cpio olarak paketleyipkexecile/kve/rdosyalarını yeniden çalıştırıyor- Sonuç olarak kendi kendini sürekli yeniden başlatan özyinelemeli bir Linux dağıtımı ortaya çıkıyor
Linux çekirdeğine yorumlayıcı olarak bakış
- initrd, yalnızca önyükleme için kullanılan bir ramdisk değil, Linux çekirdeğinin yorumlayıp çalıştırdığı bir program olarak görülebilir
curl | shveyapython3 script.pygibi, initrd de çekirdek tarafından çalıştırılan bir giriş programı biçimindedir- Dolayısıyla Linux çekirdeği, initrd'yi yorumlayan bir yorumlayıcı gibi işlev görür
- Bu yapı, kuyruk özyineleme optimizasyonuna (tail-call optimization) benzer
kexec, önceki çekirdeğin üzerine yazmak yerine onu yeni bir bellek alanına yükleyip çalıştırır- Her çekirdek önceki durumu korumaz; yeni bir “stack frame” ile yer değiştirir
Quine ve initrd'nin kendini kopyalaması
- Quine, kendi kendisini üreten program anlamına gelir
/initbetiği son bölümdecat /rçalıştıracak şekilde yapılırsa, kendisiyle aynı cpio çıktısını üretir- Bu durumda Linux initrd yorumlayıcısının bir Quine'ı oluşur
- Tüm dosyalar RAM üzerindeki
tmpfsiçinde bulunduğundan gerçek disk G/Ç işlemi gerçekleşmez
ELF, ld.so ve yorumlayıcı katmanları
- ELF yürütülebilir dosyaları, başlıklarında yorumlayıcı (
ld-linux-x86-64.so.2) yolunu taşır- Çalıştırma sırasında çekirdek önce
ld.so'yu başlatır; ardındanld.so, ELF'in dinamik kütüphanelerini yükleyip programı çalıştırır - Bu nedenle ELF de bir tür yorumlayıcı dili olarak görülebilir
- Çalıştırma sırasında çekirdek önce
/bin/sh,ld.sotarafından yorumlanır;ld.soise çekirdek tarafından doğrudan yorumlanırld.sostatik bağlantılı bir ELF olduğundan çekirdek tarafından doğrudan çalıştırılabilir- Böylece yorumlayıcı katmanlarının taban durumu (base case) oluşur
binfmt_misc ile CPIO çalıştırma
binfmt_misckullanılarak belirli magic byte'lara sahip dosyalar belirtilen yorumlayıcıyla çalıştırılabilir- Örnek kayıt komutu:
echo ':cpio:M::\x30\x37\x30\x37\x30\x31::/path/to/my/script.sh:' > /proc/sys/fs/binfmt_misc/register - Bu ayarla
chmod +xverilmiş CPIO dosyaları doğrudan çalıştırılabilir
- Örnek kayıt komutu:
- QEMU ile CPIO'yu initrd olarak çalıştıran bir betik yorumlayıcı olarak kaydedilebilir
- QEMU, belirtilen çekirdek ve initrd ile sanal makineyi önyükler
- Sonuçta CPIO dosyasının yorumlayıcısı, QEMU'nun çalıştırdığı Linux çekirdeği olur
Özyinelemeli yorumlayıcılar ve “en tuhaf döngü”
- QEMU tabanlı yorumlayıcı yeni bir Linux ortamı için yeni bir stack frame oluşturur
- Linux üzerinde başka bir Linux çalıştıran bu yapı, bellek sınırına kadar iç içe geçebilir
- Yerine
kexectabanlı yorumlayıcı kullanılırsa kuyruk çağrısı optimize edilmiş özyinelemeli Linux çalıştırma mümkün olur
/initiçindebinfmt_misckaydedilip/rçalıştırılacak şekilde yapılandırılırsa kendi kendisini çalıştıran bir initrd tamamlanmış olur/r, CPIO biçimindeki bir sonraki init sürecidir ve çalıştırıldığında yeniden kendisini yorumlar
Sonuç
- initrd yalnızca bir önyükleme aracı değil, Linux çekirdeğinin yorumladığı bir program birimidir
kexecvebinfmt_miscile Linux'un kendisini bir yorumlayıcı gibi özyinelemeli biçimde çalıştırmak mümkündür- Bu yapı, çekirdek, sanallaştırma, yorumlayıcı ve kendini kopyalayan programlar arasındaki sınırları bulanıklaştıran deneysel bir kavramdır
- İlgili kaynak kodu GitHub deposu ifd3f/rekexec içinde yayımlanmıştır
2 yorum
Cehalet cesaret getirir derler ya... Keşke bu tür yazılardan kaçınılsa.
Hacker News görüşleri
Bu yazıyı okurken çok fazla yanlış anlama yüzünden acı çektim
cpio arşivi bir dosya sistemi değildir. Yazar initramfs kullanıyor; bu da tmpfs tabanlıdır. Linux, cpio'yu tmpfs'e çıkarabilir. Dosya ve dizin arşivi kendi başına bir program değildir
Bir şeyin benzer görünmesi onun aynı olduğu anlamına gelmez. İkili program CPU'da çalışır; eğer bir yorumlayıcı varsa bu donanım ortamının içinde gizlidir. Bu, çekirdeğin kapsamı dışındadır
Bir shell script çalıştırmak için, o scripti yorumlayacak bir shell gerekir. Yazar bu kısmı atlıyor ve çekirdekle shell programını karıştırıyor
Linux, initramfs veya ramdisk olmadan da derlenebilir ve yine de dosya sistemindeki userland'i çalıştırabilir
“Linux initrd interpreter” ifadesi gerçekten çok yanlış bir açıklama
Her OS, çekirdek yetkileriyle çalışan bir makine kodu yorumlayıcısı değil mi?
Bu yazı, “Linux bir yorumlayıcıdır” şeklinde bir zihinsel model olarak bakınca fena değil, ama harfi harfine alınırsa yanlış
CPU komutları düzeyinde yorumlama değil; çekirdeğin ELF, shebang script'leri ve initramfs gibi yürütme biçimlerini orkestre etmesi olarak bakılırsa daha anlamlı. Karışıklık muhtemelen ‘yorumlayıcı’ kelimesinin iki farklı anlamının birbirine karışmasından doğuyor
Asıl mesele benzetmenin doğru olup olmaması değil; 'çalıştırma' kavramının ne kadar ortama bağımlı olduğunu göstermesi
“Her şey yorumlayıcı mı?”
Turing'in Theta Combinator'ü
Serinin önceki yazısında yazar, Contabo'nun object storage'ını kullanmak istemediği için VPS imajını kendisinin yaptığını söylüyor
Aylık 1,50 dolardan tasarruf etmek için 50 saat harcamakla, token'lara 250 bin dolar harcamak gibi iki uç arasında bir denge noktası olduğunu düşünüyorum.
Altyapı maliyetlerini karşılayamıyorsanız, sorun teknik beceriden çok sosyal etkenler de olabilir. Doom'u
curlile çalıştırmaya takıntılı olmak bana çok üretken gelmiyorman ld.soçıktısına bakarsanız, ELF'nin.interpbölümünde saklanan dinamik bağlayıcının çalıştırıldığı açıkça yazıyor. Bölüm adının kendisi de ilginçLinux, programlanabilir bir arayüz olarak çok kullanışlı. Windows'ta da mümkün ama Linux'un daha uygun olduğunu düşünüyorum
GUI'nin Windows'ta daha iyi olduğunu düşünüyorum ama GNOME ya da KDE de rahat değil. Bu yüzden fluxbox, icewm, bazen de xfce veya mate-desktop kullanıyorum. Bugünlerde basit ve hızlı ortamları tercih ediyorum. İşlerimin çoğunu komut satırı ve kod düzenleme ile hallediyorum