Saya mencoba menjalankan aplikasi Linux dan yang ingin saya jalankan adalah aplikasi ini dari boot. Saya perlu jaringan dan itu saja (tidak ada layar, periferal, dll.). Saya tidak ingin aplikasi lain berjalan sehingga aplikasi yang saya jalankan memiliki 100% CPU. Apakah ini mungkin?
17
Jawaban:
Program dunia Halo CPIO initrd minimal selangkah demi selangkah
Kompilasi dunia halo tanpa dependensi yang berakhir pada loop tak terbatas.
init.S
:Kami tidak dapat menggunakan
sys_exit
, atau panik kernel.Kemudian:
Ini menciptakan sistem file dengan hello world kami di
/init
, yang merupakan program userland pertama yang dijalankan oleh kernel. Kami juga bisa menambahkan lebih banyak file ked/
dan mereka akan dapat diakses dari/init
program ketika kernel berjalan.Kemudian
cd
ke dalam pohon kernel Linux, build seperti biasa, dan jalankan di QEMU:Dan Anda akan melihat garis:
di layar emulator! Perhatikan bahwa ini bukan baris terakhir, jadi Anda harus melihat lebih jauh.
Anda juga dapat menggunakan program C jika Anda menautkannya secara statis:
dengan:
Anda dapat menjalankan perangkat keras nyata dengan USB menyala
/dev/sdX
dan:Sumber hebat tentang hal ini: http://landley.net/writing/rootfs-howto.html Ini juga menjelaskan cara menggunakan
gen_initramfs_list.sh
, yang merupakan skrip dari pohon kode sumber Linux untuk membantu mengotomatiskan proses.Langkah selanjutnya: siapkan BusyBox agar Anda dapat berinteraksi dengan sistem: /unix/2692/what-is-the-smallest-possible-linux-implementation/203902#203902
Diuji pada Ubuntu 16.10, QEMU 2.6.1.
sumber
Anda dapat memulai kernel dengan
init=/path/to/myapp
parameter yang ditentukan di bootloader Anda.sumber
Kedengarannya Anda sedang mencoba membuat kios . Sebagian besar panduan seputar Internet fokus pada peramban web seperti Firefox sebagai satu-satunya aplikasi yang berjalan. Lihatlah panduan ini untuk mendapatkan ide.
sumber
Anda tentu dapat menjalankan hanya satu aplikasi pengguna setelah mem-boot kernel. Tetapi tidak akan memiliki 100% CPU karena akan ada beberapa proses terkait kernel lainnya yang harus ada. Ini biasanya dilakukan pada perangkat embedded-Linux, misalnya router nirkabel. Saya juga memiliki pengalaman langsung melakukan ini untuk aplikasi multi-threaded.
Setelah kernel di-boot, skrip inisialisasi atau startup dijalankan. Baca di Linux runlevel dan proses init. Ada berbagai skema startup yang digunakan, jadi tidak mungkin spesifik. Tetapi Linux akan memungkinkan Anda untuk mengkonfigurasi aplikasi dan daemon mana yang akan dieksekusi untuk situasi Anda. Selain file startup di root, file yang perlu diubah ada di / etc , dan khususnya /etc/init.d
BTW, kecuali jika Anda adalah orang yang superprogrammer atau sebelum Anda menjalankan server GDB jarak jauh, Anda akan memerlukan beberapa bagian dari konsol debug (baik konsol PC atau port serial) untuk aplikasi Anda. Ini akan memungkinkan Anda untuk diberitahu tentang kesalahan seg, kesalahan bus dan kegagalan pernyataan. Jadi rencanakan untuk memiliki "perangkat" selain "jaringan".
sumber
Ada beberapa aplikasi sistem yang harus dijalankan, selain itu, Anda dapat mendedikasikan sisa sumber daya komputer untuk aplikasi itu. Untuk mendapatkan yang paling minimum, Anda dapat melihat distro Linux yang sangat kecil seperti TinyCore Linux dll.
Juga akan tergantung pada aplikasi itu sendiri juga, layanan apa yang dibutuhkannya selain jaringan dll.
Saya pikir jika Anda dapat memberikan informasi yang lebih spesifik, Anda akan mendapatkan respons yang lebih rinci.
Seperti jenis aplikasi dll.
sumber
Jika Anda benar-benar tidak menginginkan apa pun selain kernel Linux, jaringan, dan aplikasi Anda, satu-satunya cara untuk melakukannya adalah ini:
make menuconfig
) kernel khusus Anda sendiri dan menghapus semua fitur yang tidak terkait dengan menjalankan sistem dan jaringan. Anda ingin menonaktifkan untuk memblokir lapisan, saya tidak tahu bagaimana melakukan ini pada kernel terbarumake menuconfig
.init
gagal untuk tidak melakukannya, atau bersiaplah untuk hidup dengan 1 proses ruang pengguna tambahan.Saya tahu itu mungkin untuk modul kernel untuk membuat proses - sederhana
ps aux
akan menunjukkan banyak pada sistem yang khas (mereka semua dalam tanda kurung). Anda mungkin ingin modul Anda membuat proses kernel. Untuk menyingkirkan semua proses yang dibuat kernel selain dari Anda, Anda harus menonaktifkan utas [kthreadd
], manajemen daya [pm
], lapisan peristiwa [events
], dan lainnya.Jika Anda menginginkan pengaturan proses ruang pengguna kernel + 1 yang lebih praktis, itu mungkin.
Linux memiliki opsi baris perintah kernel yang disebut
init=
- ini yang akan dimulai oleh kernel ketika selesai memuat. Program harus berada di perangkat root yang ditentukan denganroot=
atau di initrd (dimuat oleh bootloader Anda).Jika program ini keluar, Linux akan panik, jadi pastikan ia tidak pernah keluar.
Banyak distribusi modern Linux yang mengaturnya sehingga sebuah
init
program di initrd melakukan inisialisasi ruang pengguna tambahan, sebelum memulai/sbin/init
atau/sbin/systemd
. Anda harus mencari tahu apa yang dilakukan distro Anda di sini (info untuk Debian ada di sini ) dan menemukan di mana Anda dapat menentukan program "handoff" akhir, dan dari sana Anda dapat memerintahkannya untuk memulai aplikasi Anda alih-alihinit
atausystemd
.systemd
mengelola banyak fungsi dasar, seperti membangun/dev
, mengatur nama host, dan hal-hal lain, jadi jika Anda fleksibel, Anda mungkin ingin melihat ke dalam konfigurasisystemd
untuk menelurkan satu proses, dan secara opsional restart jika gagal. Jika saya tidak salah itu pada dasarnya melakukan ini untuk pengguna tunggal atau mode pemulihan - ini memulai sebuah shell.Anda akan memiliki 2 proses berjalan (
systemd
dan program Anda) tetapi sistem tidak akan panik jika program Anda keluar atau crash.Pertimbangkan juga hanya instalasi ringan Debian - instalasi "netinst" tidak memiliki banyak berjalan selain kernel, shell, dan beberapa layanan - atau pertimbangkan OpenWRT / LEDE - ia memiliki server web untuk Luci berjalan secara default dan pasangan layanan lain tetapi mudah dinonaktifkan.
sumber