Kapan Anda menggunakan pivot_root di switch_root?

19

Saya ingin memahami proses init Linux lebih baik untuk netboot sistem lebih dari ceph daripada nfs.

Dalam prosesnya saya telah menemukan dua bentuk switching root. Satu disebut switch_root, dan yang lainnya disebut pivot_root. Script ini dijalankan dari sistem file dalam memori (initramfs) yang diperoleh melalui tftp menggunakan proses boot pxe.

Kapan Anda akan menggunakan satu di atas yang lain? Saya telah melihat keduanya digunakan pada beberapa skrip init yang ditempatkan di root.

Matt H
sumber

Jawaban:

16

Saya menemukan penjelasan yang bagus di sini . Namun, izinkan saya mencoba memasukkan dalam format yang lebih pendek dari apa yang saya pahami dalam jawabannya.

Versi Lebih Pendek

  1. Saat sistem melakukan booting, ia membutuhkan ruang pengguna awal. Itu dapat dicapai dengan menggunakan initramfs atau initrd.
  2. initrd dimuat ke ramdisk yang merupakan SISTEM FILE yang sebenarnya .
  3. initramfs adalah tidak sebuah sistem file .
  4. Untuk initrd pivot_root digunakan dan untuk initramfs switch_root digunakan.

Versi yang lebih panjang

Sekarang, untuk penjelasan rinci tentang apa yang telah saya tulis di atas.

Sementara initramf dan initrd memiliki tujuan yang sama, ada 2 perbedaan. Perbedaan yang paling jelas adalah initrd di-load ke ramdisk. Ini terdiri dari sistem file aktual (biasanya ext2) yang dipasang di ramdisk. Initramfs, di sisi lain, bukan sistem file. Ini hanyalah sebuah arsip cpio (terkompresi) (dari tipe newc) yang diurai menjadi tmpfs. Ini memiliki efek samping membuat initramfs sedikit lebih dioptimalkan dan mampu memuat sedikit lebih awal dalam proses boot kernel daripada initrd. Juga, ukuran initramfs dalam memori lebih kecil, karena kernel dapat mengadaptasi ukuran tmpfs dengan apa yang sebenarnya dimuat, daripada mengandalkan ukuran ramdisk yang telah ditentukan,

Ada juga perbedaan efek samping lainnya: bagaimana perangkat root (dan beralih ke itu) ditangani. Karena initrd adalah sistem file aktual yang dibongkar ke dalam ram, perangkat root harus benar-benar menjadi ramdisk. Untuk sebuah initramfs, terdapat sebuah kernel "rootfs" yang menjadi tmpfs yang inpackknya dibongkar (jika kernel memuat initramfs; jika tidak, maka rootf hanyalah sistem file yang ditentukan melalui root = parameter boot kernel), tetapi rootfs sementara ini tidak boleh ditentukan sebagai root = parameter boot (dan tidak akan ada cara untuk melakukannya, karena tidak ada perangkat yang terpasang padanya). Ini berarti Anda masih bisa meneruskan perangkat root asli Anda ke kernel saat menggunakan initramfs. Dengan initrd, Anda harus memproses apa perangkat root sebenarnya. Juga, karena "nyata" perangkat root dengan initrd adalah ramdisk, kernel harus benar-benar mengubah perangkat root dari satu perangkat nyata (ramdisk) ke perangkat lain (root asli Anda). Dalam kasus initramfs, ruang initramfs (tmpfs) bukan perangkat nyata, sehingga kernel tidak beralih perangkat nyata. Jadi, ketika perintah pivot_root digunakan dengan initrd, perintah yang berbeda harus digunakan untuk initramfs. Busybox menyediakan switch_root untuk mencapai hal ini, sementara klibc menawarkan new_root. perintah yang berbeda harus digunakan untuk initramfs. Busybox menyediakan switch_root untuk mencapai hal ini, sementara klibc menawarkan new_root. perintah yang berbeda harus digunakan untuk initramfs. Busybox menyediakan switch_root untuk mencapai hal ini, sementara klibc menawarkan new_root.

Ramesh
sumber
2
Saya menggunakan pivot_rootdi masa lalu untuk initramfs, switch_roottidak ada pada waktu itu. switch_roottampaknya menjadi metode kenyamanan pivot_rootyang melakukan pembersihan lebih lanjut dan juga bergerak /proc /sysdan /devlain-lain dan bukan hanya root itu sendiri
Daniel Alder
2
Anda tidak dapat menggunakan pivot_root pada rootfs initramfs, Anda akan mendapatkan Argumen Tidak Valid. Anda hanya dapat memutar sistem file nyata.
TiCPU
@TiCPU Lalu bagaimana Linux keluar dari ruang pengguna awal?
Melab
Solusi yang diberikan tampaknya salah. Linus sendiri mengatakan bahwa pivot_root () atau chroot () hanya akan mengubah referensi proses saat ini untuk /. Jadi dari pemahaman saya bisa jadi ada jalan dan tidak ada hubungannya dengan "disk" yang sebenarnya.
erikbwork