Bir çekirdek kök bölümünü nasıl bağlar?


29

Sorum, Linux sisteminin ayrı bir / önyükleme bölümünden başlatılması ile ilgili. Çoğu yapılandırma dosyası ayrı / bir bölüme yerleştirilmişse, çekirdek önyükleme zamanında çekirdeği doğru şekilde nasıl bağlar?

Bununla ilgili herhangi bir detaylandırma harika olur. Temel bir şeyi kaçırmışım gibi hissediyorum. Ben çoğunlukla süreç ve işlemlerin sırası ile ilgileniyorum.

Teşekkürler!

EDIT: Sormam gereken şeyin kök çekirdek parametresinde kullanılan dev dosyasının satırları boyunca daha fazla olduğunu düşünüyorum. Örneğin, root param'ı root = / dev / sda2 olarak verdiğimi söyleyin. Çekirdeğin / dev / sda2 dosyasının eşlemesi nasıldır?


Aşağıdaki insanlar initrd'yi kapsamasına rağmen, initrd'nin neden kullanıldığı hakkında çok az tartışma var. Benim düşünceme göre, Debian gibi dağıtımlar bir mimariyi aynı mimarideki birçok makinede, ancak muhtemelen farklı donanımlarda kullanmak istiyor. Bu, donanım desteğinin çekirdek modülleri aracılığıyla modülerleştirilmesiyle mümkün olmaktadır. İnitrd, önyüklemek için fazla donanım desteği gerektirmez ve bir kez devam ettiğinde gerekli donanım modüllerini yükler. Buradaki detaylandırma / düzeltmeler takdir edilmektedir.
Faheem Mitha

/ Boot dizini bulunmadığı için ilk önce / mount olmadan / boot yapamazsınız.
psusi

Yanıtlar:


20

Linux başlangıçta bir ramdisk ( initrd"INITial RamDisk" için denir ) olarak önyükleme yapar /. Bu diskte gerçek kök bölümünü (gerekli tüm sürücü ve dosya sistemi modülleri de dahil olmak üzere) bulabilmek için yeterli. Kök bölümünü, üzerindeki geçici bir montaj noktasına monte eder initrd, ardından pivot_root(8)kök ve geçici montaj noktalarını değiştirerek, içinde bırakılacak initrdbir konumda umountve asıl kök dosya sistemini açık bırakmaya çağırır /.


2
Ya LFS gibi bir initrdiniz yoksa (linuxfromscratch.org)?
Bay Shickadance 23:11

@Bay. Shickadance: LFS işlerin nasıl yapıldığına bakmamış olsaydı, çekirdeğin içine gerekli tüm modüllerin derlendiğinden emin olduklarını sanırdım (ya da GRUB 2 aracılığıyla yüklendi, ki bu henüz pek çok dağıtımın henüz farketmediği kadar yenidi). Asıl kök bölümünden başlayabilir.
geekosaur

4
@Bay. Shickadance. İnitrd'si olmayan sadece LFS değil. Kendi çekirdeğini derleyen herkes, intoord kullanmama seçeneğine sahiptir, bu Gentoo'da yaptığım şey.
jonescb

1
@ Faheem: grub2 modülleri çekirdek modülleriyle aynı değildir. Grub2'nin çekirdek modüllerini yüklemesi için bazı yetenekler görüyorum, ancak bilmediğim bir şey bunun Linux çekirdeği için mi yoksa yalnızca * BSD için mi çalışacağı (bootloader çekirdeği modüllerinin normal olduğu). Çekirdeğin yüklü modüller için adres haritasını nerede bulacağının öğretilmesi gerektiğinden ve herkesin grub2'ye taşınması gerektiğinden şüpheliyim (grub1 bazı dağıtımlarda hala standart).
geekosaur

1
Pivot_root kirli bir hack olarak kabul edildiğinden, initrd, initramfs ile değiştirildi.
psusi

41

Eski zamanlarda, çekirdek, aygıt kökünün büyük / küçük sayısını bilmek zor kodlanır ve çekirdeğe yerleştirilmiş tüm aygıt sürücülerini başlattıktan sonra bu aygıtı monte eder. Yardımcı rdevprogram, çekirdek görüntüsündeki kök cihaz numarasını, yeniden derlemek zorunda kalmadan değiştirmek için kullanılabilir.

Sonunda boot yükleyicileri geldi ve çekirdeğe bir komut satırı iletebildiler. Eğer root=argüman geçildiyse, bu, çekirdeğe fs kökünün yerleşik değer yerine nerede olduğunu söyledi. Buna erişmek için sürücülerin hala çekirdeğe yerleştirilmeleri gerekiyordu. Argüman /devdizindeki normal bir cihaz düğümü gibi gözükse de /dev, kök fs kurulmadan önce hiçbir dizin yoktur , bu yüzden çekirdek orada bir dev düğümü arayamaz. Bunun yerine, iyi bilinen bazı cihaz isimleri çekirdeğe kodlanmış olarak kodlanmıştır, böylece ip cihaz numarasına çevrilebilir. Bu nedenle, çekirdek gibi şeyleri tanıyabilir /dev/sda1, ancak /dev/mapper/vg0-rootUUID gibi daha egzotik olmayan şeyleri tanıyabilir .

Daha sonra, initrdresme geldi. Çekirdeğin yanı sıra, önyükleyici bir initrdçeşit sıkıştırılmış dosya sistemi görüntüsü (gzip ext2 görüntüsü, gzip romfs görüntüsü, squashfs baskın hale geldi) olan görüntüyü yüklerdi. Çekirdek bu görüntüyü bir ramdisk içine açar ve ramdisk'i kök fs olarak bağlar. Bu görüntü, gerçek yerine bazı ek sürücüler ve önyükleme komut dosyaları içeriyordu init. Bu önyükleme komut dosyaları, donanımı tanımak, baskın dizileri ve LVM gibi şeyleri etkinleştirmek, UUID'leri tespit etmek ve şimdi UUID, birim etiketi ve diğer gelişmiş şeyler tarafından belirtilebilecek asıl kökü bulmak için çekirdek komut satırını ayrıştırmak için çeşitli görevler gerçekleştirdi. Daha sonra gerçek kök fs'nin içine yerleştirildi /initrd, ardından pivot_rootçekirdek takasının yapılması için sistem çağrısını yürüttü /ve/initrd, sonra /sbin/initgerçek kök üzerinde çalıştırılır , bu daha sonra /initrdramdisk'i söküp serbest bırakır.

Sonunda, bugün biz var initramfs. Bu, benzer initrd, ancak bir ramdisk içine yüklenen sıkıştırılmış bir dosya sistemi görüntüsü yerine, sıkıştırılmış bir cpio arşividir. Kök olarak bir tmpfs monte edilir ve arşiv orada çıkarılır. Önyükleme komut dosyası pivot_root, kirli bir bilgisayar korsanlığı olarak kabul edilmek yerine initramfs, asıl kökü /rootbağlar, tmpfs kökündeki tüm dosyaları, sonra chrootiçine /rootve exec komutunu siler /sbin/init.


1
Chroot'tan sonra tmpfs'ler otomatik olarak kaldırılıyor mu? Sadece kayboluyor mu?
jiggunjer

@jiggunjer, hayır, hala orada, sadece boş (/ root dizinini içermesi dışında) ve artık kullanılmıyor.
psusi

Bahsettiğiniz köklerin her yinelemesinde yeni bir şey öğrendim. Mükemmel cevap!
jpaugh 02

3

Çekirdeğin / etc yapılandırma dosyalarına erişmeden, hangi bölümün kök bölüm olduğunu "nasıl bildiğini" soruyor gibisiniz.

Çekirdek, herhangi bir program gibi komut satırı argümanlarını kabul edebilir. GRUB veya diğer birçok önyükleyici, komut satırı argümanlarını kullanıcı girişi olarak kabul edebilir veya bunları saklayabilir ve çeşitli menülerde komut satırı argümanlarının kombinasyonlarını yapabilir. Önyükleyici, komut satırı argümanlarını yüklediğinde çekirdeğe geçirir (bu konvansiyonun adını veya mekaniğini bilmiyorum ama muhtemelen bir uygulamanın çalışan bir çekirdekte çağıran bir işlemden komut satırı argümanlarını nasıl aldığıyla benzer).

Bu komut satırı seçeneklerinden biri root, kök dosya sistemini belirtebileceğiniz yerdir, örn root=/dev/sda1.

Eğer çekirdek bir initrd kullanıyorsa, bootloader çekirdeği nerede olduğunu söylemekten veya initrd'yi standart bir hafıza konumuna koymaktan sorumludur (bence) - bu en azından Guruplug'umda çalıştığı şeklidir.

Bir tanesini belirtmemek ve ardından bir kök dosya sistemini bulamadığından şikayet etmeye başladıktan hemen sonra çekirdeğinizin panikine uğraması tamamen mümkündür.

Bu seçeneği çekirdeğe geçirmenin başka yolları da olabilir.


3
İnitrd / initramfs olmadığında doğru açıklama budur, ancak bulmacanın bir parçasını eksik. Normalde çekirdek /dev/sda1, bir dosya sistemine girdiği için böyle bir cihazı tanımlar . Yapabilirsin cp -p /dev/sda1 /tmp/foove /tmp/fooaynı cihazı temsil ederdin. Çekirdek komut satırında, çekirdek normal aygıt adlandırma kuralını izleyen yerleşik bir çözümleyici kullanır: sda1ilk SCSI benzeri diskin ilk bölümü anlamına gelir.
Gilles 'SO- kötülük yapmayı bırak'

@ Gilles, böylece modern çekirdekler hala UUID tabanlı bir birimi monte etmeyi kaldıramıyor mu? Olmadan initrdya da initramfsdemek istedim. /dev/sdxFormda "basit" bir bölüm olmalı ?
jiggunjer

1
@jiggunjer Modern çekirdekler, UUID tarafından bir birim aramayı destekler. Bakın init/do_mounts.c.
Gilles 'SO- kötülük'

1

Grub /bootbölümü monte eder ve ardından çekirdeği çalıştırır. Grub'un yapılandırmasında, çekirdeğe kök aygıtı olarak ne kullanılacağı anlatılır.

Örneğin Grub’ta menu.lst:

kernel /boot/linux root=/dev/sda2

1

Hadi, GRUB "boot" / boot yapmaz, sadece 'menu.lst' ve bazı modülleri okur, LINUX çekirdeğinin bir parçası değildir. Çekirdeği çağırdığınızda, kök bölümle birlikte "root" argümanını ileteceksiniz. En kötüsü, çekirdek, sadece / önyüklemenin monte edildiğini bilir (LOL).

Sonraki: geekosaur haklı, Linux sıkıştırılmış görüntü biçiminde bir başlangıç ​​ramdisk kullanıyor ve ardından gerçek kök dosya sistemini arayarak bağlar pivot_root. Böylece Linux bir görüntüden ve ardından yerel disk sürücünüzden çalışmaya başlar.


1
Grub kesinlikle, özellikle grub2'de bir dosya sistemini 'bağlama' yeteneğine sahiptir. Tabii ki, onunla / yapabileceği / yapabileceği tek şey, bir şerit veya diğerinin önyüklenebilir çekirdeği aramaktır, ancak bu hala montaj. Ayrıca, çekirdek derlenmiş sürücüleriniz sabit diskiniz için modüller kadar önemli olmadıkça linux initrd gerektirmez .
Shadur

5
ibm.com/developerworks/linux/library/l-linuxboot Bu, Linux Çekirdeğinin önyükleme yaparken yaptıklarının oldukça özlü bir özetidir.
jsbillings

2
@Shadur, mount manpage'den : Bir Unix sisteminde erişilebilen tüm dosyalar büyük bir ağaçta düzenlenir, dosya hiyerarşisi, /. Bu dosyalar birkaç aygıta yayılabilir. Mount komutu, bazı cihazlarda bulunan dosya sistemini büyük dosya ağacına tutturmaya yarar. - GRUB tarafından kullanılan dosya sistemleri dosya hiyerarşisine eklenmediğinden, montaj DEĞİLDİR .
D4RIO

1
@Shadur, BTW: İnitrd'nin sadece başka bir kök dosya sistemi olduğu için gerekli olmadığı açıktır, ancak çekirdek önyükleme için gerekli yükler, ardından önyükleme ve son olarak her şeyi yükler, çünkü genellikle küçük önyükleme zamanı kökü olarak kullanılır.
D4RIO

1
@ d4rio GRUB tarafından monte edilirler, linux değil - grubu sadece bir bootloader yerine kendi başına bir microkernel OS olarak gördüğünüzde daha kolay anlaşılır.
Shadur

1

Bagaj yükleyicisi, gruba veya lilo'ya veya her ne olursa olsun, çekirdeğe root=bayrakla nereye bakılacağını söyler ve isteğe bağlı olarak bir ilk ramdisk'i belleğe yükler.initrd , çekirdeği başlatmadan önce .

Daha sonra çekirdek yükler, donanım ve aygıt sürücülerini test eder ve görebildiklerini görmek için sistemin etrafına bakar (bu tanılama bilgisini yazarak gözden geçirebilirsiniz dmesg; günümüzde muhtemelen çok hızlı bir şekilde kaydırılması muhtemeldir) ve sonra belirtilen bölümü monte etmeye çalışır.root= parametresi.

Bir initrd varsa, önce monte edilir ve kök dosya sistemi kurulmadan önce üzerine herhangi bir modül / aygıt sürücüsü yüklenir ve test edilir. Bu sayede sabit sürücülerinizin sürücülerini modül olarak derleyebilir ve yine de önyükleme yapabilirsiniz.

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.