Bagaimana cara membuat sistem Linux yang menjalankan satu aplikasi?

17

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?

dschatz
sumber
Ini tidak akan dapat mengambil 100% dari CPU karena OS Anda masih membutuhkan beberapa sumber daya.
n0pe
@ Maxmackie Jelas, tapi saya ingin OS hanya mengambil alih atas nama aplikasi (untuk keperluan jaringan misalnya).
dschatz
1
Anda menyadari bahwa bahkan dengan lingkungan desktop yang dimuat, tetapi duduk diam, itu tidak menggunakan waktu cpu kan? Dan ram yang digunakan dapat ditukar jika aplikasi lain menuntutnya.
psusi
@dschatz Ini akan membantu jika Anda memasukkan lebih detail dalam pertanyaan Anda. Seperti memberi tahu kami lebih banyak tentang aplikasi apa yang ingin Anda jalankan, bagaimana Anda ingin menjalankannya, dan jenis perangkat keras apa yang Anda gunakan.
NN
Jika memungkinkan, saya ingin tahu mengapa Anda menginginkan ini. Dari apa yang saya mengerti, Anda ingin menghapus semuanya dari OS (termasuk konsol) hanya untuk menjalankan aplikasi Anda. Keuntungan kinerja akan marjinal jadi apa gunanya memiliki semua itu?
nmat

Jawaban:

13

Program dunia Halo CPIO initrd minimal selangkah demi selangkah

masukkan deskripsi gambar di sini

Kompilasi dunia halo tanpa dependensi yang berakhir pada loop tak terbatas. init.S:

.global _start
_start:
    mov $1, %rax
    mov $1, %rdi
    mov $message, %rsi
    mov $message_len, %rdx
    syscall
    jmp .
    message: .ascii "FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n"
    .equ message_len, . - message

Kami tidak dapat menggunakan sys_exit, atau panik kernel.

Kemudian:

mkdir d
as --64 -o init.o init.S
ld -o init d/init.o
cd d
find . | cpio -o -H newc | gzip > ../rootfs.cpio.gz
ROOTFS_PATH="$(pwd)/../rootfs.cpio.gz"

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 ke d/dan mereka akan dapat diakses dari /initprogram ketika kernel berjalan.

Kemudian cdke dalam pohon kernel Linux, build seperti biasa, dan jalankan di QEMU:

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
git checkout v4.9
make mrproper
make defconfig
make -j"$(nproc)"
qemu-system-x86_64 -kernel arch/x86/boot/bzImage -initrd "$ROOTFS_PATH"

Dan Anda akan melihat garis:

FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR

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:

#include <stdio.h>
#include <unistd.h>

int main() {
    printf("FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n");
    sleep(0xFFFFFFFF);
    return 0;
}

dengan:

gcc -static init.c -o init

Anda dapat menjalankan perangkat keras nyata dengan USB menyala /dev/sdXdan:

make isoimage FDINITRD="$ROOTFS_PATH"
sudo dd if=arch/x86/boot/image.iso of=/dev/sdX

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.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber
3

Anda dapat memulai kernel dengan init=/path/to/myappparameter yang ditentukan di bootloader Anda.

Michał Šrajer
sumber
2
Ini adalah solusi yang agak ekstrem. Mengganti skrip startup dengan aplikasi pengguna akan membuat aplikasi berjalan tanpa jaringan, tanpa sistem file apa pun selain rootfs yang terpasang (tidak ada sysfs atau proc atau tmpfs), dan mungkin beberapa node perangkat tidak akan dibuat.
serbuk gergaji
2
@sawdust: Sepenuhnya setuju. Tetapi pertanyaannya juga agak ekstrim ... :-)
Michał Šrajer
2

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.

William Jackson
sumber
2
Hmm, saya benar-benar hanya mencoba menjalankan satu aplikasi dengan jaringan. Saya tidak ingin ada X dan beberapa aplikasi lain berjalan semaksimal mungkin. Saya tidak melihat bagaimana ini membatasi semua daemon yang tidak perlu dijalankan.
dschatz
dapatkah aplikasi berjalan tanpa X?
Journeyman Geek
2

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".

serbuk gergaji
sumber
1

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.

bakytn
sumber
Aplikasi saya menggunakan pthread library untuk menjalankan beberapa beban kerja mulithreaded (operasi aritmatika) dan dapat diperintahkan untuk melakukan perhitungan yang berbeda berdasarkan input dari tcp / ip. Melihat TinyCore Linux, boot ke lingkungan desktop penuh, yang saya tidak mau.
dschatz
TinyCore memiliki saudara lelaki yang lebih kecil bernama MicroCore. Tidak ada GUI, coba lihat.
n0pe
1
@ Maxmackie Saya sebenarnya ingin tidak ada antarmuka pada mesin itu sendiri di luar tcp / ip stack. Aplikasi dapat memblokir pada port dan dapat dikontrol melalui paket tcp yang dikirim ke port tersebut.
dschatz
1
Saya akan merekomendasikan lingkungan dengan sedikit layanan berjalan (lihat ini linuxhelp.blogspot.com/2006/04/... ) dan hampir tidak ada hal lain selain aplikasi Anda dan dependensinya telah diinstal.
n0pe
1
@dschatz baik, maka Anda perlu meretas kernel, menghapus semua yang lain dan kompilasi aplikasi Anda ke dalamnya. tidak ada bash tidak ada yang lain. hanya aplikasimu..lol.
bakytn
1

Jika Anda benar-benar tidak menginginkan apa pun selain kernel Linux, jaringan, dan aplikasi Anda, satu-satunya cara untuk melakukannya adalah ini:

  • Anda perlu membuat aplikasi Anda sebagai modul kernel - pastikan ia telah ter-debug dan teruji dengan baik. Modul kernel ini harus menginisialisasi hal-hal yang biasanya dilakukan melalui userspace seperti mengatur alamat IP antarmuka dan semua hal yang baik.
  • Anda perlu mengunduh dan mengkonfigurasi ( 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 terbaru make menuconfig.
  • Anda kemudian perlu memasukkan modul Anda ke dalam kernel sehingga dimasukkan sebagai bagian dari kernel dan bukan modul yang dapat dimuat. Anda kemungkinan akan menonaktifkan modul yang dapat dimuat pada langkah di atas. Jika Anda cukup tahu C / C ++ untuk membuat modul kernel ini seharusnya mudah bagi Anda.
  • Anda perlu memodifikasi bagian mana pun dari kernel yang panik jika initgagal 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 auxakan 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 dengan root=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 initprogram di initrd melakukan inisialisasi ruang pengguna tambahan, sebelum memulai /sbin/initatau /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-alih initatau systemd.

systemdmengelola banyak fungsi dasar, seperti membangun /dev, mengatur nama host, dan hal-hal lain, jadi jika Anda fleksibel, Anda mungkin ingin melihat ke dalam konfigurasi systemduntuk 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 ( systemddan 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.

LawrenceC
sumber