Linuxアプリケーションを実行しようとしていますが、実行したいのは、この1つのアプリケーションだけを起動することです。ネットワークが必要で、それだけです(ディスプレイ、周辺機器などはありません)。他のアプリケーションが実行されないようにして、実行するアプリケーションのCPUが100%になるようにします。これは可能ですか?
Linuxアプリケーションを実行しようとしていますが、実行したいのは、この1つのアプリケーションだけを起動することです。ネットワークが必要で、それだけです(ディスプレイ、周辺機器などはありません)。他のアプリケーションが実行されないようにして、実行するアプリケーションのCPUが100%になるようにします。これは可能ですか?
回答:
最小限のinitrd CPIO Hello Worldプログラムのステップバイステップ
無限ループで終わる依存関係のないhello worldをコンパイルします。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
を使用することはできませんsys_exit。さもないとカーネルパニックが発生します。
次に:
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"
これにより/init、カーネルが実行される最初のユーザーランドプログラムであるhello worldでファイルシステムが作成されます。さらにファイルを追加して、カーネルの実行時にプログラムd/からアクセスできるようにすることもできました/init。
次にcdLinuxカーネルツリーにビルドし、通常どおりビルドし、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"
そして、次の行が表示されるはずです。
FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR
エミュレータ画面で!最後の行ではないことに注意してください。そのため、もう少し詳しく調べる必要があります。
Cプログラムを静的にリンクする場合も使用できます。
#include <stdio.h>
#include <unistd.h>
int main() {
printf("FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n");
sleep(0xFFFFFFFF);
return 0;
}
で:
gcc -static init.c -o init
USBがオンになっている実際のハードウェアで実行できます/dev/sdX。
make isoimage FDINITRD="$ROOTFS_PATH"
sudo dd if=arch/x86/boot/image.iso of=/dev/sdX
このテーマに関する優れたソース:http : //landley.net/writing/rootfs-howto.htmlまたgen_initramfs_list.sh、プロセスの自動化に役立つLinuxカーネルソースツリーのスクリプトであるの使用方法も説明しています。
次のステップ:システムと対話できるようにBusyBoxをセットアップします:https : //unix.stackexchange.com/questions/2692/what-is-the-smallest-possible-linux-implementation/203902#203902
Ubuntu 16.10、QEMU 2.6.1でテスト済み
init=/path/to/myappブートローダーで定義されたパラメーターでカーネルを起動できます。
キオスクを設置しようとしているようです。インターネットに関するほとんどのガイドは、実行する単一のアプリケーションとして、FirefoxなどのWebブラウザーに焦点を当てています。アイデアについては、このガイドをご覧ください。
カーネルを起動した後、確実に1つのユーザーアプリケーションのみを実行できます。ただし、他のカーネル関連プロセスが存在する必要があるため、CPUが100%になることはありません。これは一般に、組み込みのLinuxデバイス(ワイヤレスルーターなど)で行われます。また、マルチスレッドアプリケーションでこれを実際に行った経験もあります。
カーネルが起動すると、初期化または起動スクリプトが実行されます。Linuxのランレベルと初期化プロセスを読んでください。さまざまなスタートアップスキームが使用されているため、特定することはできません。ただし、Linuxでは、状況に応じて実行するアプリケーションとデーモンを正確に構成できます。ルートの起動ファイル以外に、変更が必要なファイルは/ etc、特に/etc/init.dにあります
ところで、スーパープログラマーのようなものでない場合、またはリモートGDBサーバーを実行する前に、アプリケーション用のデバッグコンソール(PCコンソールまたはシリアルポート)が必要になります。これにより、セグメンテーション違反、バスエラー、アサーションエラーを通知できます。そのため、「ネットワーキング」の他に「周辺機器」を用意することを計画してください。
実行する必要があるシステムアプリケーションがいくつかありますが、それらに加えて、コンピュータリソースの残りをそのアプリケーション専用にすることができます。最小限にするには、TinyCore Linuxなどの非常に小さなLinuxディストリビューションをご覧ください。
また、アプリケーション自体、ネットワーク以外で必要なサービスなどにも依存します。
より具体的な情報を提供できれば、より詳細な回答が得られると思います。
どんなアプリなどが好き
Linuxカーネル、ネットワーク、およびアプリケーションのみが本当に必要な場合、これを行う唯一の方法は次のとおりです。
make menuconfig独自のカスタムカーネルをダウンロードして構成()し、システムの実行とネットワークに関連しないすべての機能を削除する必要があります。レイヤーをブロックするために無効にする必要がありますmake menuconfig。最近のカーネルでを使用してこれを行う方法はわかりません。init起こさない場合は、パニックを起こす部分を変更するか、1つの余分なユーザー空間プロセスで生きる準備をする必要があります。カーネルモジュールがプロセスを作成する可能性があることを知っています-単純な例でps auxは、典型的なシステム上で多くが表示されます(すべて括弧で囲まれています)。モジュールでカーネルプロセスを作成したいでしょう。自分以外のすべてのカーネル作成プロセスを削除するには、スレッド[ kthreadd]、電源管理[ pm]、イベントレイヤー[ events]などを無効にする必要があります。
カーネル+ 1ユーザースペースプロセスのより実用的なセットアップが必要な場合は、可能です。
Linuxには、カーネルコマンドラインオプションと呼ばれるinit=ものがあります。これは、ロードが完了するとカーネルが起動するものです。プログラムroot=は、initrdで指定された、またはinitrd(ブートローダーによってロードされた)で指定されたルートデバイス上になければなりません。
このプログラムが終了すると、Linuxがパニックするため、終了しないようにしてください。
ので、Linuxの多くの近代的なディストリビューションでは、それを設定しているinitinitrdの中にプログラムが起動する前に、いくつかの追加のユーザー・スペースの初期化を行います/sbin/initか/sbin/systemd。ここであなたのディストリビューションが何をするのかを知り(Debianの情報はこちら)、最終的な「ハンドオフ」プログラムを指定できる場所を見つけ、そこからinitまたはの代わりにアプリケーションを起動するように指示する必要がありますsystemd。
systemdビルド/dev、ホスト名の設定などの多くの基本機能を管理するため、柔軟性がある場合は、代わりにsystemd単一のプロセスを生成するための構成を検討し、オプションで失敗した場合は再起動することができます。私が間違っていない場合、基本的にシングルユーザーモードまたはリカバリモードでこれを行います-シェルを起動します。
2つのプロセス(systemdおよびプログラム)が実行されますが、プログラムが終了またはクラッシュしてもシステムはパニックになりません。
また、単にDebianの軽量インストールを検討してください-「netinst」インストールは、カーネル、シェル、およびいくつかのサービス以外はあまり実行されません-またはOpenWRT / LEDEを検討してください-デフォルトで実行されるLuci用のWebサーバーと他のサービスを結合しますが、簡単に無効にできます。