Switch_root üzerinden pivot_root'u ne zaman kullanırsınız?


20

Bir sistemi nfs yerine ceph üzerinden netboot etmek için Linux init sürecini daha iyi anlamak istiyorum.

Bu süreçte iki çeşit anahtarlama köküne rastladım. Biri switch_root, diğeri pivot_root olarak adlandırıldı. Bu komut dosyaları, tftp yoluyla pxe önyükleme işlemi kullanılarak elde edilen bir bellek dosya sisteminden (initramfs) çalıştırılır.

Birini ne zaman diğerinin üzerinde kullanırsınız? İkisinin de bazı init betiklerinde kökte kullanıldığını gördüm.

Yanıtlar:


17

Burada harika bir açıklama buldum . Ancak, cevapta anladığımın daha kısa bir biçimini koymaya çalışayım.

Kısa Versiyon

  1. Sistem önyükleme yaparken erken bir kullanıcı alanına ihtiyaç duyar. Bu initramfs veya initrd kullanılarak elde edilebilir.
  2. initrd , gerçek bir DOSYA SİSTEMİ olan ramdisk'e yüklenir .
  3. initramfs olduğu değil bir dosya sistemi .
  4. İçin initrd'ye pivot_root kullanılan ve için Initramfs switch_root kullanılır.

Daha Uzun Versiyon

Şimdi, yukarıda ne koyduğumun ayrıntılı açıklamasına.

Hem initramfs hem de initrd aynı amaca hizmet ederken, 2 fark vardır. En belirgin fark, bir initrd'in ramdisk'e yüklenmesi. Bir ramdiske monte edilmiş gerçek bir dosya sisteminden (genellikle ext2) oluşur. Öte yandan, bir initramfs bir dosya sistemi değildir. Bir tmpfs içine paketlenmiş (sıkıştırılmış) bir cpio arşivi (newc türünde). Bunun, initramfs'i çekirdek önyükleme işleminde bir initrd'den biraz daha optimize ve yükleme yapabilme yan etkisi vardır. Ayrıca, bellekteki initramflerin boyutu daha küçüktür, çünkü çekirdek, önceden tanımlanmış ramdisk boyutlarına güvenmek yerine, tmpfs'nin boyutunu gerçekte yüklü olana uyarlayabilir,

Başka bir yan etki farkı da var: kök cihazın (ve ona geçişin) nasıl ele alındığı. Bir initrd, ram olarak paketlenmiş gerçek bir dosya sistemi olduğundan, kök aygıtın aslında ramdisk olması gerekir. Bir initramfs için, initramfs'nin paketlenmediği tmpfs haline gelen bir çekirdek "rootfs" vardır (eğer çekirdek bir initramfs yüklerse; eğer değilse, rootfs sadece root = kernel boot parametresi ile belirtilen dosya sistemidir), ancak bu geçici rootfs root = boot parametresi olarak belirtilmemelidir (ve eklenmiş bir cihaz olmadığı için bunu yapmanın bir yolu olmaz). Bu, initramfs kullanırken gerçek kök aygıtınızı çekirdeğe geçirebileceğiniz anlamına gelir. Bir initrd ile, gerçek kök cihazın kendinizin ne olduğunu işlemelisiniz. Ayrıca, "gerçek" bir initrd ile kök cihaz ramdisk, çekirdek gerçekten bir gerçek cihazdan (ramdisk) diğerine (gerçek kökünüz) kök cihazları swith gerekir. Bir initramfs durumunda, initramfs alanı (tmpfs) gerçek bir cihaz değildir, bu nedenle çekirdek gerçek cihazları değiştirmez. Bu nedenle, pivot_root komutu bir initrd ile kullanılırken, bir initramfs için farklı bir komut kullanılmalıdır. Buslib, bunu gerçekleştirmek için switch_root sağlarken, klibc new_root sunar. initramfs için farklı bir komut kullanılmalıdır. Buslib, bunu gerçekleştirmek için switch_root sağlarken, klibc new_root sunar. initramfs için farklı bir komut kullanılmalıdır. Buslib, bunu gerçekleştirmek için switch_root sağlarken, klibc new_root sunar.


2
pivot_rootGeçmişte initramfs için kullandım switch_root, o zaman yoktu. sadece daha fazla temizlik yapan ve aynı zamanda hamle ve benzeri yapan switch_rootkolaylık yöntemi gibi görünüyor - sadece kökün kendisi değilpivot_root/proc /sys/dev
Daniel Alder

2
Bir initramfs rootfs üzerinde pivot_root kullanamazsınız, Geçersiz Argüman alırsınız. Yalnızca gerçek dosya sistemlerini özetleyebilirsiniz.
TiCPU

@TiCPU Peki Linux erken kullanıcı alanından nasıl çıkacaktı?
Melab

Sağlanan çözüm yanlış görünüyor. Linus, pivot_root () veya chroot () işlevinin yalnızca geçerli işlem başvurusunu değiştireceğini söylüyor /. Anladığım kadarıyla bu herhangi bir yol olabilir ve gerçek "diskler" ile ilgisi yoktur.
erikbwork

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.