Apakah kernel Linux memerlukan sistem file untuk dijalankan?

19

Pendapat saya adalah ya, memang, karena semua paparan yang berguna ke dunia luar (mode prosesor non-istimewa) pertama-tama akan memerlukan proses yang berjalan di dunia luar. Itu akan membutuhkan sistem file, bahkan sistem file sementara, dalam RAM,.

Insinyur lain tidak setuju dengan saya, tetapi sepertinya saya tidak dapat membuktikan hal ini di luar semua kasus (yang tidak saya ketahui).

Apakah jawaban untuk pertanyaan ini tergantung pada definisi 'berlari'?

Peter L.
sumber
4
saya berpikir bahwa kernel yang berjalan tidak "memerlukan"useful exposure to the outside world
jsotola
19
Membawa firewall Linux lama yang terhenti (sekitar tahun 2002)
Jeff Schaller
1
Jika Anda menambahkan kode baru ke kernel, Anda dapat melakukan apa saja. Jika Anda tidak bisa, itu akan menginisialisasi baik-baik saja sampai pada titik di mana ia mencoba untuk menjalankan init(proses ruang pengguna pertama), dan itu akan gagal.
user253751
1
Tentukan "jalankan" ...
Thorbjørn Ravn Andersen
Baca sistem operasi: tiga potong mudah
Basile Starynkevitch

Jawaban:

27

Itu pertanyaan yang agak aneh karena Anda tidak menjalankan kernel seperti Anda menjalankan program. Kernel adalah platform untuk menjalankan program. Tentu saja ada kode setup dan shutdown tetapi tidak mungkin untuk menjalankan kernel sendiri. Harus selalu ada proses "init" utama. Dan kernel akan panik jika tidak ada. Jika init mencoba keluar, kernel juga akan panik.

Saat ini proses init adalah sesuatu seperti systemd. Jika tidak ditentukan, kernel akan mencoba menjalankan program dari daftar lokasi yang dimulai dengan /sbin/init. Lihat init Param di sini http://man7.org/linux/man-pages/man7/bootparam.7.html dalam keadaan darurat Anda dapat mem-boot Linux denganinit=/bin/bash . Tetapi perhatikan bagaimana Anda selalu menentukan file pada sistem file untuk dijalankan.

Jadi kernel akan panik jika dijalankan tidak memiliki sistem file karena tanpa itu tidak ada cara untuk memuat init.

Beberapa kebingungan mungkin timbul karena situasi ayam dan telur di mana kernel harus memuat driver untuk mengakses sistem file itu. Untuk mengatasinya, ramdisk awal dimuat dari gambar di disk yang berisi driver vital dan skrip pengaturan. Ini dijalankan sebelum sistem file dimuat. Tapi jangan salah ramdisk awal itu sendiri adalah sistem file. Dengan ramdisk awal /initdisebut (yang disimpan di ramdisk awal). Dalam banyak distribusi pada akhirnya inilah yang disebut /sbin/init. Sekali lagi tanpa sistem file, ini tidak mungkin.

Philip Couling
sumber
Tidakkah ada kondisi di mana kernel menyerah mencoba menginisialisasi perangkat keras dan memuat sistem file yang dikenal (tidak initrd masuk ke kernel melalui par init), kemudian turun ke shell yang sangat terbatas (tanpa init = / bin / bash)? Juga, karena Anda membuka / bin / bash, apakah kernel selalu memiliki sistem file minimal yang tersedia, bahkan jika itu dibangun dengan opsi .config lain yang berpotensi menghilangkan ini?
Peter L.
1
@PeterL. shell batas itu adalah beberapa shell dari initrd / initramfs / apa pun kernel yang di-boot dengan, IIRC.
muru
3
Perhatikan bahwa Anda dapat membangun initramfs (arsip CPIO yang diekstraksi ke sistem file ramfs atau tmpfs) ke dalam kernel. Apakah atau tidak yang dianggap sebagai kernel "membutuhkan sistem file" terserah Anda, karena itu berarti Anda dapat mem-boot kernel dan tidak lain kecuali kernel dan memiliki sistem fungsional (jika agak terbatas). Juga perhatikan bahwa, bahkan jika Anda menambal kernel untuk tidak lagi memerlukan init, itu masih akan membuat sistem file virtual internal yang tidak pernah terpapar.
hutan
@ forest Sistem tidak harus "terbatas" - Anda dapat mengemas systemd dan gnome ke initrd Anda (bersama dengan hal-hal yang sebenarnya berguna ;-)). Salah satu batasan initramfs adalah (masih?) Bahwa itu tidak mendukung atribut yang diperluas - saya memang bekerja di sekitar itu di android dengan memasukkan gambar ext4 dalam arsip cpio initrd yang kemudian dipasang sebagai perangkat loop dari init.$DEV.rcskrip.
Paman Billy
1
@IsmaelMiguel, tidak, initramfs adalah arsip cpio. Squashfs adalah pilihan yang baik untuk filesystem tertanam, dan satu bisa membuat initrd (vs initramfs) yang menggunakan itu (istilah ini sering digunakan secara bergantian, tetapi mereka tidak cukup hal yang sama), tapi itu bukan format Linux membongkar ke nya initramfs. (Memang, gambar squashfs tidak perlu dibongkar sebelum dapat digunakan sama sekali; itu diindeks dengan benar).
Charles Duffy
16

Jawabannya akan tergantung pada apakah Anda benar-benar berarti tanpa sistem file atau jika pertanyaan ini dimaksudkan untuk ditafsirkan sedikit berbeda dari bagaimana sebenarnya dinyatakan. Jawaban untuk sedikit variasi dalam bagaimana pertanyaan ditafsirkan adalah:

  • Menjalankan Linux tanpa perangkat blok apa pun sepenuhnya dapat dilakukan dan berguna untuk beberapa kasus penggunaan khusus.
  • Menjalankan Linux tanpa sistem file apa pun akan membutuhkan penulisan ulang beberapa bagian dari kode kernel dan sepertinya itu bukan upaya yang bermanfaat.
  • Menjalankan Linux tanpa menggunakan deskriptor file apa pun akan membutuhkan banyak usaha. Saya cukup yakin itu tidak akan sepadan dengan usaha.

Alasan Anda harus menulis ulang bagian dari kode kernel untuk membuat sistem yang berfungsi tanpa sistem file adalah:

  • Setiap utas memiliki direktori root dan direktori kerja saat ini yang harus mengarah ke beberapa sistem file.
  • Program dimulai oleh execvepemanggilan sistem yang memerlukan eksekusi dari sistem file.
  • Kernel menciptakan sistem file berbasis memori selama proses boot.

Setelah program mulai digunakan execve , dimungkinkan untuk menghapus peta yang dapat dieksekusi dari mana ia dimulai, meskipun untuk melakukannya tanpa segera men-crash-nya terlebih dahulu harus membuat pemetaan memori yang dapat dieksekusi yang tidak didukung oleh file, dan harus menginisialisasi dengan beberapa kode yang berguna sebelum melompat ke sana dan unmapping yang dapat dieksekusi.

Dengan demikian program mode pengguna yang berjalan dapat ada dalam keadaan di mana ia tidak memiliki pemetaan memori yang didukung oleh file dan dapat menutup semua deskriptor file yang didukung oleh file. Itu tidak bisa berhenti memiliki direktori root dan direktori kerja saat ini, tetapi bisa menahan diri dari itu.

Jadi meskipun dalam kondisi ini Anda dapat menerapkan kode kernel untuk merobek sistem file dari bawah program dan membuatnya tetap berjalan, itu tidak terdengar seperti itu berguna. Dan memasuki kondisi akhir tanpa melalui kondisi perantara menggunakan sistem file akan menjadi lebih banyak pekerjaan tanpa manfaat yang bermanfaat.

Pengaturan yang berguna untuk beberapa kasus penggunaan khusus

Menghindari penggunaan perangkat blok dapat bermanfaat. Selama boot kernel menciptakan sistem file memori, dan itu juga dapat mengisi sistem file itu dengan konten dari cpioarsip sebelum dieksekusi init. Dengan begitu Anda dapat menjalankan sistem sepenuhnya dari sistem file berbasis memori tanpa perangkat blokir untuk mendukungnya.

Ini dapat berguna untuk sistem di mana Anda tidak ingin mempertahankan keadaan apa pun dan menyukai sistem untuk memulai dari yang bersih setelah me-reboot.

Tentu saja kernel dan arsip cpio harus mendapatkan entah bagaimana ada di memori sebelum kernel diberikan kontrol. Bagaimana mereka sampai di sana adalah pekerjaan untuk boot loader. Boot loader bisa memuatnya dari perangkat blok meskipun sistem terakhir yang berjalan tidak menggunakan perangkat blok. Tetapi boot loader juga dimungkinkan untuk mendapatkan arsip kernel dan cpio tanpa menggunakan perangkat blok misalnya dengan mem-boot melalui jaringan.

kasperd
sumber
1
Pertanyaannya adalah apakah kernel Linux dalam konfigurasi apa pun yang dibangun (tanpa menulis ulang apa pun) dapat 'dijalankan' tanpa sistem file apa pun. Itu tidak harus melakukan apa pun yang bermanfaat atau mempertahankan negara. Dari semua jawaban, saya memahami bahwa beberapa jenis sistem file disediakan dan diasumsikan dalam kernel itu sendiri, setidaknya sampai shutdown. Bahkan '/' adalah sistem file. Jadi, saya pikir untuk menyederhanakan jawaban itu adalah 'ya'.
Peter L.
2
@PeterL. Ya, jika Anda tidak menulis ulang apa pun Linux akan membutuhkan sistem file. Ketika orang berbicara tentang kegunaan praktis untuk Linux tanpa sistem file, mereka biasanya merujuk pada yang didukung oleh perangkat blok dan Anda dapat menjalankan Linux tanpa sistem file yang didukung oleh perangkat blok. Anda masih memiliki semacam sistem file.
kasperd
3

Di Linux, hampir setiap perangkat adalah file , jadi Anda harus memiliki sistem file untuk menjalankannya.

K7AAY
sumber
8
Tetapi tentu saja driver perangkat ada di dalam kernel terlepas dari apakah file perangkat menunjuk kepada mereka atau tidak.
Philip Couling
6
Tidak setiap perangkat adalah file. Antarmuka jaringan ( eth0, wlan0dll.) Tidak, misalnya.
Ruslan
1
Ini adalah kesalahpahaman umum. Sementara secara teori, semuanya adalah file dalam sistem UNIX dan seperti UNIX, hanya benar untuk sistem yang sangat khusus seperti Plan 9 (meskipun jauh lebih benar daripada untuk Windows). Untuk Linux, beberapa hal bukan file. Ini semakin dan semakin benar karena banyak driver sudah mulai menggunakan netlink daripada ioctls pada perangkat karakter (yang merupakan file).
hutan
@forest Plan 9 bukan sistem "sangat terspesialisasi" - sistem ini seharusnya merupakan sistem tujuan umum seperti Unix atau windows (mengapa gagal menggantikan Unix dan tetap menjadi sistem penelitian adalah cerita yang sama sekali berbeda). Bagaimanapun, sama seperti Linux, plan9 mengekspos antarmuka tervirtualisasi ke perangkat kerasnya (dan tidak memiliki ioctl - saya tidak melihat bagaimana menggunakan faktor netlink vs ioctls dalam semua ini), bahkan jika itu berusaha untuk menjadi lebih konsisten (misalnya antarmuka jaringan dapat diakses melalui sistem file). Dengan diperkenalkannya ruang nama, Linux sudah lebih seperti plan9 daripada unix klasik.
Paman Billy
1
Argumen yang sangat bagus: apakah ada devfs, yang merupakan filesystem per definisi, atau tidak ada devfs, dalam hal ini Anda memerlukan filesystem untuk meng-host node perangkat ...
pmf
-1

Kernel adalah sebuah program, sama seperti kernel lainnya. Secara default kernel Linux mencoba mengakses sistem file, namun perilaku ini dapat dihilangkan dengan modifikasi sepele oleh kernel (sebenarnya hanya penambahan fungsi "arch_call_rest_init ()"). Untuk melakukan "pekerjaan yang bermanfaat" maka kami berharap bahwa pengembang dapat menyertakan utas kernel (kthreads), perhapos dalam driver khusus, untuk melakukan beberapa inisialisasi yang diinginkan dan beban kerja jenis aplikasi. Kernel Linux sudah mengandung banyak kthread, tetapi terutama untuk melakukan pekerjaan tambahan untuk kernel atau driver. API yang tersedia dalam konteks kernel sangat berbeda dari yang tersedia di ruang pengguna Linux. Sebagian besar fungsionalitas panggilan sistem akan menjadi tidak berguna dalam skenario tanpa sistem file.

Ya, Linux mengharapkan akses ke sistem file secara default. Tidak, kernel yang dimodifikasi dapat dibuat untuk melakukan pekerjaan yang bermanfaat tanpa sistem file apa pun. Penggunaan praktis dari sistem file Linux tanpa IMO cukup terbatas, tetapi tidak nol. FWIW, di masa lalu banyak kernel real-time dibangun ke ruang-nama & biner yang sama dengan aplikasi RT.

stevea
sumber