keçən bölməsində Biz initramfs şəklini necə yaratmağı və sınaqdan keçirməyi izah etdik. Bu bölmədə biz minimal kök kataloqu (rootfs) yaratmaq istəyirik və statik ve dinamik Fayllar arasındakı fərqləri izah edəcəyik.

Statik və Dinamik kompilyasiya

Statik halbuki faylın heç bir asılılığa ehtiyacı yoxdur dinamik Tərtib edilmiş faylın asılılıqları var. Faylın dinamik olub olmadığını öyrənmək üçün ldd əmrindən istifadə olunur.

$ ldd məşğul qutusu dinamik icra oluna bilən deyil $ ldd /bin/bash linux-vdso.so.1 (0x00007ffd63d6a000) libreadline.so.8 => /lib64/libreadline.so.8 (0x00007f6121182000.lib /bin/bash) /libtinfo.so.6 (64x6f0) libc.so.00007 => /lib6121141000/libc.so.6 (64x6f0f00007) libtinfow.so.6120 => /lib71000/libtinfow.so.6 (64x6ld) /0ld linux-x00007-6120.so.30000 (64x86f64d2)

Bütün dinamik tərtib edilmiş fayllar üçün libc.so.6 faylı və ld-linux-x86-64.so.2 tərcüməçi faylı lazımdır. Bundan başqa, tətbiqin istifadə etdiyi əlavə kitabxanalardan asılılıqlar var. Linux paylamalarından asılılıq ağacı bunları nəzərə alaraq qurulur.

İndi gəlin aşağıdakı kimi bir C mənbə koduna sahib olaq və bu mənbə kodunu tərtib edək.

#daxildir int main(){ qoyur("Salam Word"); 0 qaytarmaq; }
# dinamik tərtib gcc -o main.dynamic main.c # statik tərtib gcc -o main.static main.c -statik

Hər ikisini ldd əmri ilə yoxlaya bilərsiniz.

Statik faylların ölçüsü daha böyükdür, çünki bütün tələb olunan kitabxanalar bir fayla daxil edilir və bu, ölçüsünün artmasına səbəb olur. Buna görə də paylamalarda statikdən daha çox dinamik kompilyasiyaya üstünlük verilir.

Minimum köklərin yaradılması

İndi dinamik tərtib edilmiş fayldan rootfs Yaradaq. Bunun üçün əvvəlcə faylımızı boş bir qovluğa kopyalayaq və fayl Komandadan istifadə edərək tərcüməçinin adını öyrənək.

Əsas $ faylı: ELF 64-bit LSB pastası icra edilə bilən, x86-64, versiya 1 (SYSV), dinamik əlaqəli, tərcüməçi /lib64/ld-linux-x86-64.so.2, GNU/Linux 3.2.0 üçün, qeyd silindi

burada /lib64/ld-linux-x86-64.so.2 fayl qovluğumuzda eyni yerdə olmalıdır. Bu səbəbdən lib64 kataloqunu açıb ora kopyalayaq.

$ mkdir lib64 $ quraşdırın /lib64/ld-linux-x86-64.so.2 lib64/

Linux paylamalarında /lib kataloqu var. Biz lib64 kataloqumuzu burada simvollaşdıra bilərik.

$ ln -s lib64 lib

İndi də ldd Komandadan istifadə edərək onların asılılıqlarını tapıb onları da köçürək.

$ ldd əsas linux-vdso.so.1 (0x00007ffd1efe6000) libc.so.6 => /lib64/libc.so.6 (0x00007f0af6a13000) /lib64/ld-linux-x86-64.so.2 (0x00007) şərhi Artıq kopyalandığı üçün ikinci dəfə köçürmürük. # linux-vdso.so.0 fayl olaraq sistemdə tapılmayıb. Linux nüvəsindən gəlir. Biz də onu kopyalamırıq. # Bu halda libc.so.6 faylımızı kopyalamalıyıq. $ /lib000/libc.so.1 lib6 quraşdırın

İndi biz rootf yaratdıq. sınamaq chroot /əsas əmrindən istifadə edə bilərik.

$ chroot. /əsas HelloWord

Gördüyünüz kimi biz minimal rootf əldə etdik və onu işə saldıq. İstəsək rootfs qovluğumuzu initramfs olaraq dəyişə bilərik. Bizim tərtib etdiyimiz fayl /içində Gəlin faylı öz yerinə qoyub yenidən paketləyək. Göstərildiyi kimi kernel panik xəta verəcəkdir. Bunun səbəbi sistemin əsas prosesinin (pid 1) bağlanmamasıdır.

Kernel panik

initramfs Linux paylamalarında init sistemin quraşdırıldığı bölməni quraşdırmaq və orada xidmət menecerini işə salmaq üçün istifadə olunur. Digər tərəfdən, xidmət menecerləri heç vaxt bağlanmamaq üçün hazırlanmışdır. Bu misaldakı C kodunu aşağıdakı kimi dəyişdirərək onun bağlanmasının qarşısını ala bilərik.

#daxildir int main(){ qoyur("Salam Word"); while(1); 0 qaytarmaq; }

İndi initramfs şəklimizi yenidən kompilyasiya edək və paket edək.

Linux nüvəsi ilə Salam Dünya çapı

Gördüyünüz kimi, kodumuz çıxmadığı üçün kernel panik xətası almırıq.