Linux 'initrd' imajını nasıl yükler?


13

Önyükleme sürecini anlamaya çalışıyordum, ama başımdan geçen tek bir şey var ..

Linux çekirdeği başlatılır ve kök dosya sistemi (/) monte edilir edilmez programlar çalıştırılabilir ve ek işlevler sağlamak için başka çekirdek modülleri entegre edilebilir. Kök dosya sistemini monte etmek için belirli koşulların karşılanması gerekir. Çekirdek, kök dosya sisteminin bulunduğu aygıta (özellikle SCSI sürücüleri) erişmek için ilgili sürücülere ihtiyaç duyar. Çekirdek ayrıca dosya sistemini okumak için gereken kodu içermelidir (ext2, reiserfs, romfs, vb.). Kök dosya sisteminin zaten şifrelenmiş olması da düşünülebilir. Bu durumda, dosya sistemini bağlamak için bir parola gerekir.

İlk ramdisk (initdisk veya initrd olarak da adlandırılır) yukarıda açıklanan sorunları tam olarak çözer. Linux çekirdeği, gerçek bir kök dosya sistemi monte edilmeden önce küçük bir dosya sisteminin bir RAM diskine yüklenmesi ve programların çalıştırılması için bir seçenek sunar. Initrd yüklemesi bagaj yükleyicisi (GRUB, LILO, vb.) Tarafından gerçekleştirilir. Önyükleme yükleyicileri, önyükleme ortamından veri yüklemek için yalnızca BIOS rutinlerine ihtiyaç duyar. Önyükleme yükleyicisi çekirdeği yükleyebiliyorsa, ilk ramdiski de yükleyebilir. Özel sürücüler gerekli değildir.

/ Boot farklı bir bölüm değilse, ancak / bölümünde bulunuyorsa, önyükleyicinin 'initrd' görüntüsüne ve çekirdek görüntüsüne erişmek için SCSI sürücülerine ihtiyaç duymaması gerekir mi? Görüntülere doğrudan erişebiliyorsanız, neden tam olarak SCSI sürücülerine ihtiyacımız var?

Yanıtlar:


20

Nighpher, sorunuzu cevaplamaya çalışacağım, ancak önyükleme işleminin daha kapsamlı bir açıklaması için IBM makalesini deneyin .

Tamam, sanırım, açıklama için önyükleyiciniz olarak GRUB veya GRUB2 kullanıyorsunuz. Öncelikle, BIOS önyükleyiciyi yüklemek için diskinize eriştiğinde, ünlü 13 saat kesintisinde depolanan disk erişimi için yerleşik yordamlarını kullanır. Bootloader (ve kurulum aşamasında çekirdek) bu rutinleri diske eriştiklerinde kullanır. BIOS'un gerçek mod (16 bit) işlemci modunda çalıştığına dikkat edin, bu nedenle gerçek moddaki her adres segment_adresi * 16 + ofsetinden oluştuğu için 2 ^ 20 bayttan fazla RAM (2 ^ 20 değil 2 ^ 16) hem segment adresi hem de uzaklık 16 bit olduğunda, bkz. http://en.wikipedia.org/wiki/X86_memory_segmentation ). Bu nedenle, bu rutinler 1 MiB'den fazla RAM'e erişemez, bu da katı bir sınırlama ve büyük bir rahatsızlıktır.

BIOS, önyükleyici kodunu doğrudan MBR'den yükler - diskinizin ilk 512 baytı ve yürütür. GRUB kullanıyorsanız, bu kod GRUB aşama 1'dir. Bu kod, DOS uyumluluk bölgesi olarak adlandırılan disk alanının ilk 32 KiB'sinde veya dosya sisteminin sabit bir adresinden bulunan GRUB aşama 1.5'i yükler. Bunu yapmak için dosya sistemini anlamasına gerek yoktur, çünkü aşama 1.5 dosya sisteminde olsa bile, "ham" koddur ve doğrudan RAM'e yüklenebilir ve yürütülebilir: http://www.pixelbeat.org/ dokümanlar / disk / . Stage1.5'in diskten RAM'e yüklenmesi, BIOS disk erişim rutinlerini kullanır.

resim açıklamasını buraya girin

Stage1.5 dosya sistemi yardımcı programlarını içerir, böylece stage2'yi dosya sisteminden okuyabilir (yine de diskten RAM'e okumak için BIOS 13h'yi kullanır, ancak şimdi inodes vb. Hakkında dosya sistemi bilgilerini deşifre edebilir ve ham kodu disk). Eski BIOS'lar, disk adresleme modundaki sınırlamalar nedeniyle tüm HD'ye erişemeyebilir - Silindir Başlı Sektör sistemini kullanabilirler, ilk 8 GiB disk alanından fazlasını ele alamazlar : http: //en.wikipedia. org / wiki / Silindir kafası sektörü .

Stage2 çekirdeği RAM'e yükler (yine BIOS disk yardımcı programlarını kullanarak). 2.6+ çekirdeğe sahipse, içinde derlenmiş initramfs vardır, bu yüzden yüklemeye gerek yoktur. Daha eski bir çekirdekse, bootloader bağımsız initrd görüntüyü belleğe yükler, böylece çekirdek onu bağlayabilir ve diskten gerçek dosya sistemini monte etmek için sürücüler alabilir.

Sorun şu ki, çekirdek (ve ramdisk) 1 MiB'den daha ağırdır, bu yüzden bunları RAM'e yüklemek için ilk 1 MiB'ye çekirdek yüklemeniz, ardından korumalı moda (32 bit) atmanız, yüklü çekirdeği yüksek belleğe taşımanız (ücretsiz gerçek mod için ilk 1 MiB), ardından tekrar gerçek (16 bit) moda dönün, diskten ilk 1 MiB'ye (ayrı bir initrd ve daha eski çekirdekse) ramdisk alın, muhtemelen tekrar korumalı (32 bit) moda geçin, ait olduğu yere koyun, muhtemelen gerçek moda geri dönün (veya değil: /programming/4821911/does-grub-switch-to-protected-mode ) ve çekirdek kodunu yürütün. Uyarı: Açıklamanın bu bölümünün tamlığı ve doğruluğundan tam olarak emin değilim.

Şimdi, nihayet çekirdeği çalıştırdığınızda, zaten var ve ramdisk, bootloader tarafından RAM'e yüklenmiştir , böylece çekirdek, size gerçek kök dosya sistemini monte etmek ve ona kök döndürmek için ramdisk'ten disk yardımcı programlarını kullanabilir. ramfs sürücüleri çekirdeğin içinde bulunur, bu yüzden initramfların içeriğini anlayabilir.


Önyükleyici korumalı moda atlamak yerine sadece çekirdeği parçalar halinde yükleyemiyor mu ?? Ve 1 MB boşaltma ihtiyacı nedir .. (Üzgünüm .. bunu anlayamadım ..)
rpthms

İlk 1MiB'yi serbest bırakma ihtiyacı şu şekildedir: önyükleyici, sabit sürücünüze yalnızca gerçek modda erişebilir, gerçek mod olan BIOS yardımcı programlarıyla erişmesine neden olabilir (16 bit bağımsız değişkenlerde çalışır ve 16 bit işlemler kullanır). Gerçek mod, ilk 1 MiB dışında herhangi bir RAM görmez. Ancak RAM içine çekirdek + initramfs yüklemeniz gerekir ve RAM'de ~ 5 MiB yer kaplarlar. Bu BIOS yardımcı programları 5 MiB'yi ilk 1 MiB'ye sıkıştıramayacak. Bu nedenle, bootloader bunları diskten ilk 1 MiB'ye kopyalamalı, ardından korumalı moda geçmeli ve ilk 1Mb RAM'den daha yüksek RAM'e taşımalıdır. Şimdi daha net mi? :)
Boris Burkov

1
Tüm aşama 1 / 1.5 / 2 şeyler grubun mirasıdır.
psusi

1
@CMCDragonkai Evet, stage2 önyükleyici dosya sisteminde (yani, /bootbölüm olarak). Çekirdek bu noktada yüklü değildir - minimalist dosya sistemi sürücüleri aracılığıyla dosya /bootsistemindeki (örneğin /boot/grubdosyada) stage2'ye erişen grub'un stage1.5'i . Çekirdek ayrıca /bootbölümden de okuyabilecektir , ancak daha sonra grub2 kodunun ve çekirdek yükünün yürütülmesinden sonra ve çekirdek initramfs okuduktan sonra olacaktır. Eğer söz ediyorsunuz init.shInitramfs ait? /bootSabit sürücünüzün bölümünde bulunur , sonra grubun 2. aşaması RAM'e koyar ve Çekirdek RAM'den okur.
Boris Burkov

1
İnitrd zorunda ayrı bir dosya olacak. Yeni initramfs edilebilir çekirdeğe bağlanmış, ancak vermez olmak zorunda - bu da bootloader tarafından ayrı bir dosya olarak yüklenebilir. İnitramfs dosyası bir cpio arşiv dizisi olarak tanımlandığından, bazı önyükleyiciler (örn. İPXE) , birbiri ardına belleğe yüklenecek birden fazla initramfs dosyasına bile izin verir . Ayrıca, bazı Linux dağıtımları geriye dönük uyumluluk için initrd tarzı dosya adlarını kullanır, ancak kullanılan gerçek teknoloji şimdi initramfs'dir.
telcoM

1

Belirli bootloader'ın hangi özellikleri desteklediğine inanıyorum. Örneğin. birleştirilmiş (önyükleme + kök) bölümünüzün belirli dosya sistemini bilmek zorunda değildir. Bu durumda, önyükleyicinizle çalışacak şekilde ayrı bir önyükleme bölümü oluşturursunuz ve kök bölümünüzü nasıl monte edeceğinizin diğer karmaşıklıkları, önyükleme bölümünden önyüklenen çekirdeğe ve initrd görüntüsüne bırakılır. Bootloader, kendi sürücülerini kullanarak veya BIOS rutinlerini kullanarak SCSI cihazlarına (ve hangi bootloader'ın kullanıldığına bağlı olarak diğer cihazlara) nasıl erişileceğini bilir. Dahası, bazı dosya sistemlerini vb. Okumayı bilir.

Örneğin; UEFI ürün yazılımının aslında EFI bölümüne erişmeyi, okumayı ve ara önyükleyiciye gerek kalmadan linux çekirdeğini nasıl yükleyeceğini zaten bildiği UEFI önyükleme yolu. Bu durumda, linux görüntüsü kök bölümden ayrı yaşar ve UEFI ürün yazılımının, erişmek için tüm egzotik dosya sistemlerini bilmek zorunda değildir. "Önyükleme" görüntülerinin "kök" bölümünden ayrılmasının çok anlamlı olduğuna inanıyorum. Başka bir şey için değilse, kök dosya sistemi şifrelemesini ayarlarken bu gereklidir.


0

Sadece kayıt için bir bootloader eğer, değil initrd'yi yük başka bootloader test etmek faydalıdır; Ben böyle bir durumun içine sadece ran ettik bu ve GRUP 2.00 başarılı LILO sessizce düzgün orta büyüklükte initrd'yi belirtilen (becinin SATA SSD tek ext4 rootfs GPT <4Mb) görmezden geldi.

Önyükleme işlemi hızlı bir şekilde tipik bir

RAMDISK: Couldn't find valid RAM disk image starting at 0.
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(8,3)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.