1つのプログラムのみを実行する独自の「カスタム」Linuxディストリビューションを作成する方法は次のとおりです。XBMCこの写真。
答え1
段階的最小初期化 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
シャットダウンシステムコールは使用できません。それ以外の場合、カーネルがクラッシュしてinitを正常に終了する唯一の方法は次のとおりです。reboot
システムコールを使用してシステムの電源を切る。
それから:
mkdir d
as --64 -o init.o init.S # assemble
ld -o d/init init.o # link
cd d
find . | cpio -o -H newc | gzip > ../rootfs.cpio.gz
ROOTFS_PATH="$(pwd)/../rootfs.cpio.gz"
/init
これにより、カーネルが実行する最初のユーザーモードプログラムであるhello worldを使用してファイルシステムが作成されます。また、より多くのファイルを追加し、カーネルの実行中にプログラムがそのファイルd/
にアクセスできるようにすることもできます。/init
次に、cd
Linuxカーネルツリーに移動し、通常どおりビルドし、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
ダイナミックリンクのためには、ダイナミックリンカ実行可能ファイルを設定する必要があり、その最も一般的なものはC標準ライブラリ(glibcなど)の一部です。
USBを使用して物理ハードウェアで実行でき、/dev/sdX
次のことができます。
make isoimage FDINITRD="$ROOTFS_PATH"
sudo dd if=arch/x86/boot/image.iso of=/dev/sdX
このトピックの重要なソース:技術的なヒント:initramfsの使い方landley.com |gen_initramfs_list.sh
また、プロセスの自動化に役立つLinuxカーネルソースツリーのスクリプトであるこれを使用する方法についても説明します。
Ubuntu 16.10、QEMU 2.6.1でテストされました。
次のステップ
次の作業は設定です。忙しい箱、次のトピックも参照してください。最小のLinux実装は何ですか?
BusyBoxはPOSIX-yシェルを含む基本的なPOSIX-y CLIユーティリティを実装しているため、対話的にシステムをより簡単にテストできます。
個人的に今の時点でルート構築、ソースからすべてを自動的に構築し、ルートファイルシステムを生成する素晴らしいスクリプトのセットです。
これについて非常に詳細で自動化されたヘルパーをアップロードしました。https://github.com/cirosantilli/linux-kernel-module-cheat
答え2
私は暗い森につながる庭の道であるLFSに触れません。
Archなどの初期インストール、またはUbuntu Serverなどのヘッドレスバージョンを制御できるディストリビューションから始めます。これの目的は、スペースを節約するのではなく、init構成の複雑さを制限することです。ヘッドレス展開から起動して実行するアプリケーションにGUIが必要な場合は、initで終わらずに必要なものを追加できます。 GUIログイン(ディスプレイマネージャまたはDMとも呼ばれます)とそれに合った完全なデスクトップ環境を起動します。
その後、設定方法を知りたいです。システム初期化あなたの目的のために - initなしでは生きていけないことに注意してください。これはおそらくあなたの目標を達成するための最良の方法です。現在、ほとんどのLinuxディストリビューションで使用されている初期化システムは次のとおりです。システム。
ここでのポイントは、起動時にinitが実行する作業を最小限に抑えることです。これは、集中したいアプリケーションをサポートするために最小限のソフトウェアを実行するシステムを作成する方法です。これは基本的にサーバーを設定する方法です。ところで、それは一般的な作業です(少なくとも有用ではありませんが、実際には「単一の」ユーザー領域プロセスを実行することはできません)。
実行するアプリケーションがGUIプログラムである場合(GUIアプリケーションにはXサーバーが必要なため、アプリケーションを実行できない理由の良い例です)、~/.xinitrc
このプログラムに似たアプリケーションを持つことができます。
#!/bin/sh
myprogram
これはあなたのプログラムstartx
だけを実行し、デスクトップを変更したり他のプログラムを起動したりすることはできません。部分的には、ウィンドウマネージャやデスクトップ環境がないためです(したがって、ウィンドウフレームやタイトルバーもありません)。
答え3
プログラミングについて少し知っていて、最初から作成したい場合は、LFS、つまりLinux from Scratchを使用できます。http://www.linuxfromscratch.org/
ubutnuをカスタマイズするにはubunt-builderを使用し、rpmベースで使用するにはSUSE-Studioを使用し、Suse studioを使用してsuse linuxをカスタマイズできます。
乾杯
答え4
あなたが尋ねなければならないのは、あなたの「プロジェクト」に必要なものと、あなたが持っているリソースが何であるかです。
複数のライブラリとサポートバイナリが必要な場合は、「一般的な」Linuxディストリビューション(Debianまたは同様のディストリビューション)を使用してブートプロセスを少し操作する方が良いでしょう。
より狭い範囲のサポートコンテンツが必要ですが、まだ他のカーネルモジュールまたはユーザースペースサポートビットを使用するネットワーキングまたはさまざまなハードウェアのサポートが必要で、通常の展開のディスクスペースオーバーヘッドを望まない場合は、次の点を検討してください。組み込みディストリビューション(ビルドルートまたは類似)または最初からLinuxアプローチ(メンテナンスの問題になる可能性があります)
非モジュール式カーネルが提供できるものだけが必要で、他のものが必要ない場合は、カーネルで直接バイナリを実行することがおそらく機能し、最も軽いソリューションです。