Linux ayrı bir / önyükleme bölümüyle nasıl başa çıkıyor?


11

Linux'un ayrı bir önyükleme bölümüyle nasıl başa çıktığını öğrenmek istiyorum. Ben am değil aslında bunu ilgilenen, ancak bu altında-luk nasıl çalıştığını bilmek istiyorum.

sdaİki bölümlü bir sabit sürücüyü düşünün sda1ve sda2. Hadi diyelim ki sda2bir rootbölüm /Linux işletim sistemini içeriyor.

Anladığım kadarıyla bootloader GRUB2, monte edilmiş /boot. Bununla birlikte, dizin /bootayrı bir bölümdeyken sda2, bunun /gerçekte nasıl bağlanmış olduğu daha önce nasıl olabilir ?

/bootBu durumda BIOS, Ana önyükleme kaydı ve GRUB (veya dosyalar ) arasındaki etkileşim nasıl başarılı olur? Buradaki veriler bu erken aşamada /bootgerçekte /dosya sistemine bağlı değil midir?

Not: Bu soru kök bölümün montajıyla ilgilidir, ancak ayrı bir önyükleme bölümünü tartışmaz.

Yanıtlar:


18

İşte anlayışınızdaki sorun:

Anladığım kadarıyla, GRUB2 bootloader / boot'a monte edilmiş.

GRUB önyüklemeye "monte edilmedi". GRUB edilir yüklü etmek /bootedilir ve yüklü Master Boot Record içinde koddan. MBR / BIOS (GPT / UEFI değil) ile GNU / Linux dağıtımı varsayarak, modern önyükleme işlemine basitleştirilmiş bir genel bakış:

  1. BIOS yüklenir.
  2. BIOS, Ana Önyükleme Kaydındaki küçük kod parçasını yükler.
  3. GRUB, Ana Önyükleme Kaydının boyutu olan 440 bayta sığmaz. Bu nedenle, yüklenen kod aslında bölüm tablosunu ayrıştırır, /boot(GRUB'u Ana Önyükleme Kaydına yüklediğinizde belirlendiğine inanıyorum) bölümü bulur ve dosya sistemi bilgilerini ayrıştırır. Daha sonra Aşama 2 GRUB'u yükler. (Bu, sadeleştirmenin devreye girdiği yerdir.)
  4. 2. Aşama GRUB, GRUB yapılandırması da dahil olmak üzere ihtiyaç duyduğu her şeyi yükler, ardından bir menü sunar (veya kullanıcı yapılandırmasına bağlı olarak).
  5. Bir önyükleme sırası seçilir. Bu, bir zaman aşımı, kullanıcının bir menü girişi seçmesi veya bir komut listesi önyüklemesi olabilir.
  6. Önyükleme sırası yürütülmeye başlar. Bu, bir şeyler yapabilir - örneğin, bir çekirdek yüklemek, başka bir önyükleyiciye zincir yükleme - ancak önyükleme sırasının standart GNU / Linux olduğunu varsayalım.
  7. GRUB Linux çekirdeğini yükler.
  8. GRUB ilk ramdiski yükler .
  9. İlk ramdisk /altına takılır /new_root(muhtemelen kriptografik olarak kilidini açar), udev'i başlatır, takastan devam ettirir vb.
  10. İlk ramdisk , gerçek olarak pivot_rootayarlamak için yardımcı programı kullanır ./new_root/
  11. initbaşlar. Bölümler monte edilir, cinler başlar ve sistem önyüklenir.

Çekirdeğin sadece 7. adımda nasıl yüklendiğine dikkat edin. Bu nedenle, 7. adıma kadar bir montaj konsepti yoktur . Bu nedenle /boot, GRUB zaten kullanmış olsa bile, 9. adımda tekrar monte edilmesi gerekir.

GRUB'daki Wikipedia sayfasının GRUB 2 bölümüne bakmak da yararlı olabilir .


Kafamı tam olarak batırdın. Aradığım şey buydu. Yani başlangıçta /bootkök bölüme monte edilmiş bir dizine atıfta bulunmuyor mu?
jii

@jesterII harika! bu durumda, oy oklarının hemen altındaki onay işaretini tıklayarak bu yanıtı kabul eder misiniz?
Ocak'ta Strugee

7
MBR kodu bir dosya sistemini ayrıştıramaz. İlk bölümden önce MBR'yi takip eden kullanılmayan sektörlerden grub çekirdek görüntüsünü yükler ve bu kod grub yapılandırma dosyalarını, ek modülleri ve çekirdeklerinizi bulmak için / boot bölümünü nasıl bulacağınızı ve bağlayacağınızı anlar. Ayrıca pivot_root kirli bir saldırı olarak kabul edildi ve yerine run-initinitramfs içindeki tüm dosyaları silen ve daha sonra kök dosya sistemine kökleri değiştirildi.
14'te psusi

Modern önyükleme işlemi şimdi olmalı Legacy önyükleme işlemini olarak UEFIdaha fazla ve daha popurlar alma ;-) @strugee
Kiwy

1
@strugee, util-linux posta listesindeki tartışmadan sonra hatırlamamın biraz kapalı olduğu görünüyor: gerçek rootfs üzerinde pivot_root'a izin vermeyi bıraktılar, bu yüzden artık kimse önyükleme sırasında kullanmıyor. Systemd, orijinal initrd'e (gerçek köke geçiş yaparken kendini kaldırır) dönmek için değil, yeni yüklenen bir duruma geçmek için kapatma sırasında kullanır. Bkz. Marc.info/?l=util-linux-ng&m=139100788306216&w=2
psusi

6

Soru 1

Anladığım kadarıyla, GRUB2 bootloader / boot'a monte edilmiş. Bununla birlikte, dizin / önyükleme sda2 ayrı bölümünde olduğunda, bunun gerçekte monte edilmesinden önce / gerçekleşmesi nasıl olur?

Burada tam olarak anladığını sanmıyorum. Gönderen GNU GRUB Vikipedi sayfası :

alıntı

Bir bilgisayar açıldığında, bilgisayarın BIOS'u yapılandırılmış birincil önyüklenebilir aygıtı (genellikle bilgisayarın sabit diski) bulur ve ilk önyükleme programını ana önyükleme kaydından (MBR) yükler ve yürütür . MBR, sabit diskin ilk sektörüdür ve 0 rakamına sahiptir (sektör sayımı 0'dan başlar). Uzun bir süredir, bir sektörün boyutu 512 bayt olmuştur, ancak 2009'dan beri Gelişmiş Biçim diskleri adı verilen 4096 bayt sektör boyutuna sahip sabit diskler bulunmaktadır . Ekim 2013 itibariyle, bu tür sabit disklere 512 baytlık sektörlerde 512e öykünmesi kullanılarak erişilmektedir .

In GRUB sürüm 2 şu gerçekleşir:

alıntı

Bilgisayarı Başlatma

Güç açıldığında aşağıdakiler olur:

  • Donanım başlatılır, CPU'yu gerçek moda ayarlar (sanal bellek yok) ve sabit 0xFFFF0 konumuna (CPU devrelerinde kablolu) atlar
  • Bu nedenle, bir ROM'da saklanan BIOS kodu veya bu konuma eşlenen flash bellek yürütülür.
  • BIOS kodu, önyükleme aygıtının hangisi olduğunu görmek için BIOS yapılandırma verilerine bakar. Bu BIOS yapılandırma verileri, gücü açtıktan hemen sonra bazı özel tuş dizilerine basılarak düzenlenebilir ve bu da BIOS yapılandırma programının çalışmasına neden olur. Diğer şeylerin yanı sıra, önyükleme aygıtı genellikle burada seçilebilir.
  • BIOS kodu, önyükleme aygıtının MBR'sini RAM'e yükler. Bir MBR'nin sadece 512 bayt olduğunu unutmayın! Yüklenen veriler elbette grub-install dinamik olarak oluşturulan ve grub-install programı yürütüldüğünde yazılan verilerdir.
  • BIOS kodu, yüklü MBR'nin başlangıç ​​adresine atlar (örn. Grub kodu, açıldıktan sonra ilk kez yürütülür).
  • Grub'un MBR kodu, adresi MBR bloğuna bağlanan tek bir sektörü yükler. Daha sonra, bu sektördeki tüm verileri diskten belleğe yükleyen (adres, len) çiftleri arasında dolaşır (yani dosyanın içeriğini /boot/grub/core.imgveya “katıştırılmış” kopyasını yükler ). MBR kodu yüklenen koda atlar, yani programı “yürütür” core.img.
  • “Grub Kurulumu” bölümünde açıklandığı gibi, ham disk blok adreslerini gömmenin bu hilesi, core.imgbir bölüm içinde olmayan ve hiçbir zaman bir dosya sistemi olarak biçimlendirilmemiş (“gömme”) alanların depolanmasını mümkün kılar . Ve bu durumda, core.imgdeğiştirilirse, yeni sürüm aynı konuma "gömülü" olduğu sürece, MBR kodunun güncellenmesi gerekmez.
  • Alternatif olarak, core.imggerçek bir dosya sisteminin içinde olmak ve Grub'un core.imgbu dosya sistemi için bir sürücü olmadan dosya içeriğini okuması mümkündür . Ancak bu durumda, core.imgdeğiştirilirse dosyanın ilk bloğuna disk üzerinde yeni bir adres verilebilir; bu durumda MBR'nin bu yeni konumu gösterecek şekilde güncellenmesi gerekir. Bununla birlikte, core.imggenellikle grub-install çalıştırılarak güncellendiğinden, bu genellikle bir sorun değildir.
  • Teorik olarak, core.imgMBR'den farklı bir cihazdaysa ve yeni donanım eklendiğinde, Grub tarafından oluşturulan MBR kaydının core.imgdosyayı doğru şekilde yükleyemeyebileceğini unutmayın ; ilk sektörünün core.imgbulunacağı cihaz kimliği, aranmayan MBR'ye kablolanmıştır. Ancak bunun için bir çözüm yoktur; Grub “arama” komutunun eşdeğerini 512 bayt MBR'ye gömmenin bir yolu yoktur. Ancak bu sorun muhtemelen muhtemel değildir; normalde core.imgMBR ile aynı cihaza gömülüdür. Ve core.imgyüklendikten sonra, diğer tüm /boot/grubdosyaları bulmak için search.mod'u kullanabilir ve bu nedenle donanım yeniden düzenlemelerine karşı bağışıktır.
  • Yürütülen core.imgkod artık içine yerleştirilmiş (bağlı core.img) tüm modülleri başlatır ; bu modüllerden biri, dizinin /boot/grubyaşadığı dosya sistemini okuyabilen bir dosya sistemi sürücüsü olacaktır .
  • Ayrıca bir dizi yerleşik komut kaydeder: set, unset, ls, insmod.
  • Bir "config dosyası" bağlanmışsa core.img, bu işlem için çok basit bir yerleşik komut dosyası ayrıştırıcısına aktarılır. Yapılandırma dosyasındaki komut dosyası komutları yalnızca yerleşik veya bağlantılı komutları çağırabilir. Basit senaryolar (örneğin, tipik bir masaüstü bilgisayarı yerel bir sürücüden önyükleme) yapılandırma dosyasına ihtiyaç duymaz; bu tesis, pxe, remote nfs veya /boot/grubbir LVM cihazındayken önyükleme gibi şeyler için kullanılır .
  • Core.imgşimdi dosyayı “/boot/grub/normal.mod”dinamik olarak diskten yükler ve giriş işlevine atlar. Bu adımın uygun dosya sistemi sürücüsünün (ör. Yerleşik) kurulması gerektiğini unutmayın.

     önyükleme işlemi ss

NOT: Hangi OS / Kernel'in önyükleneceğini seçtiğiniz tipik GRUB2 menüsünü gördüğünüzde, /boot/grubbu noktada sistemin dizinine başvuruyorsunuz .

                                         ss of grub tui

Referanslar


Birisi yanlış olduğu için wikipedia girişini düzeltmelidir. Aşama 1 / 1.5 / 2 yalnızca eski grub için geçerlidir. Tamamen grub2 rewrite ile bitti ve resmi grub 2 belgelerinde bu terimler için herhangi bir referans bulamazsınız.
psusi

@psusi - açıkladığınız için teşekkürler. Orada da bahsettiğimde biraz kafam karıştı, aynı duyduğumdan beri 1 / 1.5 / 2'nin gittiğini. Wikipedia makalelerini kimin düzenlemesini isteyeceğimi bilemezdim, böyle bir yayını düzenlemek için nitelikli hissetmezdim. Belki GRUB2 ekibini uyarmak bir sonraki en iyi şey olacaktır?
slm

@psusi - işte ref. aşamalı olarak elenir. GRUB2 için dokümanlar: gnu.org/software/grub/manual/grub.html ... "GRUB'u oluşturan görüntü dosyaları (bkz. Resimler) yeniden düzenlendi; Aşama 1, Aşama 1.5 ve Aşama 2 artık yok."
slm

6

Linux (çekirdek) kaç tane önyükleme bölümünüz olduğunu umursamıyor. Çekirdeği diskten yüklemek, önyükleyicinin (örn grub. grub2, lilo) Görevidir ve bu araçlar bir çekirdeğin yerleştirilebileceği konumların sayısını da umursamaz. Sadece belirli bir yeri önemsiyorlar.

Bir örnek olarak, benim önyükleme bölümü ise /dev/md1, fiziksel bölümleri tarafından desteklenen bir mdadm RAID ayna olan /dev/sde1ve /dev/sdf1. İstersem bunları tek tek monte edebilirim ve bu şekilde teknik olarak aynı verileri içermesine rağmen iki önyükleme bölümüne sahip olarak sayılır.

Benim için / boot için iki bölüme sahip olmak bir kullanılabilirlik sorunudur, ancak bunlar aynı şekilde farklı / boot bölümleri olabilir. Bir sonraki adım, önyükleyicinin nasıl bilmesi gerektiğidir? İşte böyle:

menuentry 'Linux 3.10.17 (sde) kernel-3.10.17-g' {
        root=hd0,1
        linux /boot/kernel-3.10.17-g domdadm dolvm root=/dev/md3
        initrd /boot/initrd-3.10.17-g
}

menuentry 'Linux 3.10.17 (sdf) kernel-3.10.17-g' {
        root=hd1,1
        linux /boot/kernel-3.10.17-g domdadm dolvm root=/dev/md3 
        initrd /boot/initrd-3.10.17-g
}

Bu, bir grub2yapılandırmadan bir alıntıdır ve tek farkın root=hd0,1ve root=hd1,1hangi önyükleme bölümünün bu başvuruya başvurduğunu belirlediğini göreceksiniz .


Şimdi burada ne olduğunu anlayabilmeniz için önyükleme yaparak yürüyelim.

  • BIOS, MBR'yi önyükleme biriminden okur ve önyükleyiciye atlar
  • Önyükleyici (örn. grub2) Hangi aygıtın ve bölümün çekirdeğinizi içerdiğini bilmek üzere yapılandırılmıştır. Grub2 bu bölüme doğrudan erişir ve çekirdeğinizi belleğe yükler.
  • Önyükleyiciniz daha sonra çekirdeğe atlar ve çekirdek makinenizi önyükler.

Bootloader, kaç tane önyükleme bölümünüz olduğunu umursamıyor, sadece nerede olduklarını umursuyor ve bu bilgileri söylemelisiniz.

Çekirdek, kaç önyükleme bölümünüz olduğunu umursamıyor, çünkü onları asla görmesi gerekmiyor (örneğin yalnızca yeni çekirdekler eklemek için kullanılabilir olması gerekir).

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.