it-swarm-id.com

Perbedaan antara initrd dan initramfs?

Sejauh yang saya tahu, initrd bertindak sebagai perangkat blok, sehingga membutuhkan driver sistem file (seperti ext2). Kernel harus memiliki setidaknya satu modul bawaan untuk mendeteksi filesystem initrd. Dalam artikel ini, Memperkenalkan initramfs, model baru untuk disk awal RAM , ada tertulis bahwa:

Tetapi ramdisks benar-benar membuang lebih banyak memori karena caching. Linux adalah dirancang untuk menyimpan semua file dan entri direktori yang dibaca atau ditulis untuk memblokir perangkat, jadi Linux menyalin data ke dan dari ramdisk ke "cache halaman" (untuk data file), dan "cache dentry" (untuk entri direktori .__). Kelemahan dari ramdisk berpura-pura menjadi perangkat blok itu diperlakukan seperti perangkat blok.

Apa itu page cache dan dentry cache? Dalam paragraf, apakah itu berarti data diduplikasi karena ramdisk diperlakukan sebagai perangkat blok, sehingga semua data di-cache?

Dalam konstrast, ramfs:

Beberapa tahun yang lalu, Linus Torvalds punya ide bagus: bagaimana jika cache Linux dapat dipasang seperti sistem file? Simpan saja file dalam cache dan jangan pernah menyingkirkannya sampai terhapus atau sistem dinyalakan kembali? Linus menulis pembungkus kecil di sekitar cache yang disebut "ramfs", dan lainnya pengembang kernel menciptakan versi yang lebih baik yang disebut "tmpfs" (yang dapat menulis data untuk bertukar ruang, dan membatasi ukuran titik mount sehingga mengisi sebelum mengkonsumsi semua memori yang tersedia). Initramfs adalah turunan dari tmpfs.

Filesystem berbasis ram ini secara otomatis tumbuh atau menyusut agar sesuai dengan ukuran data yang dikandungnya. Menambahkan file ke ramf (atau memperluas file Yang ada) secara otomatis mengalokasikan lebih banyak memori, dan menghapus atau memotong file membebaskan memori itu. Tidak ada duplikasi antara blokir perangkat dan cache, karena tidak ada blokir perangkat. Salinan dalam cache adalah satu-satunya salinan data. Yang terbaik dari semuanya, ini bukan baru kode tetapi aplikasi baru untuk kode caching Linux yang ada, yang berarti hampir tidak ada ukuran, sangat sederhana, dan didasarkan pada infrastruktur yang diuji dengan sangat baik.

Singkatnya, ramfs hanya file yang dibuka dan dimuat ke memori, bukan? 

Baik initrd dan ramfs di-zip pada waktu kompilasi, tetapi perbedaannya adalah, initrd adalah perangkat blok yang dibongkar untuk dipasang oleh kernel saat boot, sedangkan ramfs diekstrak melalui cpio ke dalam memori. Apakah saya benar? Atau apakah ramfs sistem file yang sangat minim?

Akhirnya, hingga hari ini, gambar initrd masih disajikan di kernel terbaru. Namun, apakah initrd sebenarnya ramfs yang digunakan saat ini dan namanya hanya untuk tujuan sejarah? 

48
Amumu

Cache Dentry (dan inode)

Subsistem Filesystem di Linux memiliki tiga lapisan. VFS (virtual filesystem), yang mengimplementasikan antarmuka panggilan sistem dan menangani persimpangan mountpoints dan izin default serta membatasi pemeriksaan. Di bawahnya adalah driver untuk sistem file individual dan mereka yang pada gilirannya antarmuka ke driver untuk perangkat blok (disk, kartu memori, dll.; Antarmuka jaringan adalah pengecualian).

Antarmuka antara VFS dan sistem file adalah beberapa kelas (ini adalah C sederhana, jadi struktur yang berisi pointer ke fungsi dan semacamnya, tetapi antarmuka berorientasi objek secara konseptual). Tiga kelas utama adalah inode, yang menjelaskan objek apa pun (file atau direktori) dalam sistem file, dentry, yang menjelaskan entri dalam direktori dan file, yang menggambarkan file terbuka oleh suatu proses. Ketika di-mount, driver filesystem menciptakan inode dan dentry untuk root dan yang lainnya dibuat sesuai permintaan ketika proses ingin mengakses file dan akhirnya kedaluwarsa. Itu adalah cache dentry dan inode.

Ya, itu berarti bahwa untuk setiap file yang terbuka dan direktori apa pun hingga ke root harus ada struktur inode dan dentry yang dialokasikan dalam memori kernel yang mewakilinya.

Cache halaman

Di Linux, setiap halaman memori yang berisi data userland diwakili oleh struktur page yang disatukan. Ini mungkin menandai halaman sebagai anonim (mungkin ditukar dengan ruang swap jika tersedia) atau mengaitkannya dengan inode pada beberapa sistem file (mungkin ditulis kembali ke dan dibaca kembali dari sistem file) dan itu dapat menjadi bagian dari sejumlah memori peta, yaitu terlihat di ruang alamat dari beberapa proses. Jumlah semua halaman yang saat ini dimuat dalam memori adalah cache halaman.

Halaman digunakan untuk mengimplementasikan antarmuka mmap dan sementara panggilan sistem baca dan tulis reguler dapat diimplementasikan oleh sistem file dengan cara lain, sebagian besar antarmuka menggunakan fungsi generik yang juga menggunakan halaman. Ada fungsi-fungsi umum, yaitu ketika diminta membaca file, alokasikan halaman dan panggil sistem file untuk mengisinya, satu per satu. Untuk sistem file berbasis perangkat blok, ia hanya menghitung alamat yang sesuai dan mendelegasikan pengisian ini ke driver perangkat blok.

ramdev (ramdisk)

Ramdev adalah perangkat blok biasa. Ini memungkinkan meletakan sistem file apa pun di atasnya, tetapi dibatasi oleh antarmuka perangkat blok. Dan itu hanya metode untuk mengisi halaman yang dialokasikan oleh penelepon dan menulisnya kembali. Itulah tepatnya yang diperlukan untuk perangkat blok nyata seperti disk, kartu memori, penyimpanan massal USB dan semacamnya, tetapi untuk ramdisk artinya, bahwa data ada di memori dua kali, sekali di memori ramdev dan satu kali di memori yang dialokasikan oleh penelepon.

Ini adalah cara lama menerapkan initrd. Dari saat-saat initrd adalah kejadian langka dan eksotis.

tmpfs

Tmpfs berbeda. Ini adalah sistem file dummy. Metode yang disediakan untuk VFS adalah minimum mutlak untuk membuatnya berfungsi (dengan demikian itu dokumentasi yang sangat baik tentang apa yang harus dilakukan oleh inode, dentry, dan metode file). File hanya ada jika ada inode dan dentry yang sesuai dalam cache inode, dibuat ketika file dibuat dan tidak pernah kedaluwarsa kecuali file tersebut dihapus. Halaman terkait dengan file ketika data ditulis dan berperilaku sebagai anonim (data dapat disimpan untuk ditukar, page struktur tetap digunakan selama file ada).

Ini berarti tidak ada salinan tambahan dari data dalam memori dan semuanya jauh lebih sederhana dan karena itu juga sedikit lebih cepat. Ini hanya menggunakan struktur data, yang berfungsi sebagai cache untuk sistem file lain, karena ini penyimpanan utama.

Ini adalah cara baru untuk mengimplementasikan initrd (initramfs, tetapi gambar tersebut masih disebut hanya initrd).

Ini juga merupakan cara untuk menerapkan "memori bersama posix" (yang berarti tmpfs dipasang pada /dev/shm dan aplikasi bebas untuk membuat file di sana dan mmap mereka; sederhana dan efisien) dan baru-baru ini /tmp dan /run (atau /var/run) sering memiliki tmpfs dipasang terutama pada notebook untuk menjaga disk agar tidak berputar atau menghindari keausan jika SSD.

42
Jan Hudec

Saya pikir Anda benar dalam semua.

Perbedaannya mudah dilihat jika Anda mengikuti langkah-langkah yang diperlukan saat mem-boot:

initrd

  • Perangkat blok ramdev dibuat. Ini adalah perangkat berbasis ram, yaitu hard disk yang disimulasikan yang menggunakan memori, bukan disk fisik.
  • File initrd dibaca dan di-unzip ke dalam perangkat, seolah-olah Anda melakukan zcat initrd | dd of=/dev/ram0 atau yang serupa. 
  • initrd berisi gambar sistem file, jadi sekarang Anda dapat memasang sistem file seperti biasa: mount /dev/ram0 /root. Biasanya, filesystem memerlukan driver, jadi jika Anda menggunakan ext2, driver ext2 harus dikompilasi di dalam kernel.
  • Selesai!

initramfs

  • tmpfs di-mount: mount -t tmpfs nodev /root. Tmpfs tidak membutuhkan driver, ia selalu di-kernel. Tidak diperlukan perangkat, tidak ada driver tambahan.
  • initramfs tidak dikompres secara langsung ke sistem file baru ini: zcat initramfs | cpio -i, atau serupa.
  • Selesai!

Dan ya, itu masih disebut initrd di banyak tempat meskipun itu adalah initramfs, terutama di boot loader, karena bagi mereka itu hanya sebuah BLOB. Perbedaannya dibuat oleh OS saat boot.

52
rodrigo

Untuk menambahkan perbedaan penting lainnya antara initrd dan initramfs tidak disebutkan dalam jawaban yang sangat baik di atas.

  • Dengan initrd kernel secara default menyerahkan ke userspace pid 0 di /sbin/init
  • Namun initramf yang lebih baru mengubah segalanya dan mengeksekusi pid 0 di /init

karena bisa menjadi jebakan (lihat https://unix.stackexchange.com/a/147688/24394 )

0
humanityANDpeace

Contoh QEMU runnable minimal dan penjelasan pemula

Dalam jawaban ini, saya akan:

  • berikan contoh Buildroot + QEMU minimal yang bisa dijalankan untuk Anda coba
  • jelaskan perbedaan paling mendasar antara keduanya untuk pemula yang kemungkinan besar menelusuri Google

Semoga ini akan berfungsi sebagai dasar untuk memverifikasi dan memahami lebih detail detail perbedaan internal.

Pengaturan minimal sepenuhnya otomatis di sini , dan ini adalah persiapan yang sesuai .

Pengaturan mencetak perintah QEMU saat dijalankan, dan seperti yang dijelaskan dalam repo itu, kita dapat dengan mudah menghasilkan tiga jenis kerja berikut:

  1. root filesystem dalam "hard disk" ext2:

    qemu-system-x86_64 -kernel normal/bzImage -drive file=rootfs.ext2
    
  2. root filesystem di initrd:

    qemu-system-x86_64 -kernel normal/bzImage -initrd rootfs.cpio
    

    -drive tidak diberikan.

    rootfs.cpio berisi file yang sama dengan rootfs.ext2, kecuali file-file tersebut berada dalam format CPIO , yang mirip dengan .tar: ia membuat serialisasi direktori tanpa mengompresnya.

  3. root filesystem ada di initramfs:

    qemu-system-x86_64 -kernel with_initramfs/bzImage
    

    Baik -drive atau -initrd tidak diberikan.

    with_initramfs/bzImage adalah kernel yang dikompilasi dengan opsi yang identik dengan normal/bzImage, kecuali satu: CONFIG_INITRAMFS_SOURCE=rootfs.cpio yang menunjuk ke CPIO yang sama persis dengan contoh -initrd.

Dengan membandingkan pengaturan, kami dapat menyimpulkan properti paling mendasar dari masing-masing:

  1. dalam pengaturan hard disk, QEMU memuat bzImage ke dalam memori.

    Pekerjaan ini biasanya dilakukan oleh bootloader/firmware yang dilakukan di hardware nyata seperti GRUB .

    Kernel Linux melakukan booting, kemudian menggunakan drivernya membaca sistem file root dari disk.

  2. dalam pengaturan initrd, QEMU melakukan beberapa pekerjaan bootloader lebih lanjut selain memuat kernel ke dalam memori: ia juga:

    Kali ini, kernel hanya menggunakan rootfs.cpio dari memori secara langsung, karena tidak ada hard disk.

    Menulis tidak persisten di seluruh reboot, karena semuanya ada di memori

  3. dalam pengaturan initramfs, kami membangun kernel sedikit berbeda: kami juga memberikan rootfs.cpio ke sistem kernel build.

    Kemudian kernel build system tahu bagaimana cara menempelkan image kernel dan CPIO menjadi satu gambar.

    Karena itu, yang perlu kita lakukan adalah meneruskan bzImage ke QEMU. QEMU memuatnya ke dalam gambar, sama seperti yang dilakukan pada pengaturan lain, tetapi tidak ada yang diperlukan: CPIO juga akan dimuat ke dalam memori karena ia terpaku pada gambar kernel!