どのように私はLinuxはそれがただ一つのプログラムとして、ほとんど全く同じように実行されますディストリビュー自分の「カスタム」の作成に取り掛かることができXBMCbuntuを。
どのように私はLinuxはそれがただ一つのプログラムとして、ほとんど全く同じように実行されますディストリビュー自分の「カスタム」の作成に取り掛かることができXBMCbuntuを。
回答:
私はLFSをいじり始めません、それはいくつかの暗い森に通じる庭の道です。
Archなどの初期インストールやUbuntuサーバーなどのヘッドレスエディションを細かく制御できるディストリビューションから始めます。これの目的は、init構成の複雑さを区切るほどスペースを節約することではありません。ヘッドレスディストリビューションから始めて、実行するアプリケーションにGUIが必要な場合は、initによって開始されたGUIログイン(別名:ディスプレイマネージャーまたはDM)と本格的なデスクトップを必要とせずに、必要なものを追加できます。それと一緒に行く環境。
次に、目的に合わせてinitシステムを構成する方法を学びたいと思います-initなしでは実行できないことに注意してください。これは、目標を達成するための最良の方法かもしれません。Linuxで一般的に使用されるinitには3つのバリエーションがあります(他にもいくつかあります)。
Debianは、古典的なUnix SysVスタイルのinitのバリエーションを使用しています。jessie
リリースの時点で、Debianもsystemd
(https://wiki.debian.org/systemd)に切り替えました
Ubuntuと派生物はupstartを使用します。
Fedora、Arch、および派生物はsystemdを使用します。
これらのいずれかについてまだ何も知らない場合、それらのどれも、他のどれよりも使用するのが特に難しいことはありません。後の2つのうちの1つを使用する場合、それらはSysVとの下位互換性のためのいくつかのメカニズムを提供しますが、それを気にしないでください。それは単純ではありません。1
ここでのポイントは、起動時にinitが行うことを最小限に抑えることであり、これにより、焦点を当てたいアプリケーションをサポートするための最小限のソフトウェアを実行するシステムを作成できます-これは基本的にサーバーのセットアップ方法です、ところで、これは一般的なタスクです(文字通り「1つだけ」のユーザーランドプロセスを実行することはできません。少なくとも役に立たないことに注意してください)。
実行するアプリケーションがGUIプログラムである場合(GUIアプリケーションはXサーバーを必要とするため、文字通り1つのアプリケーションを実行できない理由の良い例)、~/.xinitrc
次のようなを使用できます。
#!/bin/sh
myprogram
すると、実行中のstartx
プログラムはプログラムだけになり、ウィンドウマネージャーやデスクトップ環境がないため(つまり、ウィンドウフレームやタイトルバーもないため)、デスクトップを変更したり何かを開始したりすることができなくなります。
1.要点を少し注意する:これを研究していると、以前はSysVに精通していた人たちから、systemdや新興企業が複雑すぎるなどの不満を感じるかもしれません。ただし、客観的にはそれらはSysVよりも複雑ではありません(実際には、IMO systemdの方が使用が簡単です)。しかし、ほとんどの犬は、いわば古いトリックを好みます。このグリップは衰退し始めており、両方のシステムがしばらく使用されています。
init
が、確かにあなたがすることなく行うことができますupstart, systemd,
またはsysv. init
名前のちょうどいくつかの実行可能ファイルであるinit
カーネル呼び出すこと、それはマウント時にinitramfs.
ほとんどの場合、これらの他の3つはさえないですinit
が、彼らが実際にしているexec
ことでにエドinit,
一般的であるbusybox.
busybox
ことにも注意してください。これは、個別の回答で個別の扱いに値するためですが、私自身によるものではありません。
最小限のinit 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
exitシステムコール、またはカーネルパニックを使用できません。
次に:
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"
これにより、hello worldを備えたファイルシステムが作成されます/init
。これは、カーネルが実行する最初のユーザーランドプログラムです。さらにファイルを追加することもでき、カーネルの実行時にプログラム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
動的リンクには、動的リンカー実行可能ファイルをセットアップする必要があります。その最も一般的なものは、glibcなどのC標準ライブラリの一部です。
USBがオンになっている実際のハードウェアで実行できます/dev/sdX
。
make isoimage FDINITRD="$ROOTFS_PATH"
sudo dd if=arch/x86/boot/image.iso of=/dev/sdX
このテーマに関するすばらしい情報源:技術のヒント:initramfsの使用方法| landley.netまたgen_initramfs_list.sh
、プロセスの自動化に役立つLinuxカーネルソースツリーのスクリプトであるの使用方法についても説明しています。
Ubuntu 16.10、QEMU 2.6.1でテスト済み。
次のステップ
次に、BusyBoxをセットアップします。
BusyBoxは、POSIX-yシェルを含む基本的なPOSIX-y CLIユーティリティを実装しています。これを使用すると、システムをインタラクティブに簡単に試すことができます。
個人的には、この時点では、ソースからすべてのビルドとルートファイルシステムの作成を自動化する驚くべきスクリプトセットであるBuildrootのみに依存することを好みます。
そのための非常に詳細で自動化されたヘルパーをhttps://github.com/cirosantilli/linux-kernel-module-cheatにアップロードしました
プログラミングが少しで、ゼロから作成したい場合は、LFS、つまりLinux from Scratch http://www.linuxfromscratch.org/を使用できます。
ubutnuをカスタマイズする場合は、ubunt-builderを使用できます。rpmベースで使用する場合は、SUsE-Studioを使用できます。Susestudioを使用すると、カスタムsuse linuxを作成できます
乾杯
それはあなたの「1つのプログラム」が必要とするものについての詳細です。
LFS(別名「Linux From Scratch」)を構築することで、物事を組み立てる方法を理解するための良いスタートを切ることができます。次に、プログラムに必要なものを追加するか、フルディストリビューションを行います。LFSでGnomeやKDEのような重いサブシステムを構築するのは実に簡単なことです。
もちろん、最初は後戻りする方が簡単かもしれませんが、完全なディストリビューションから削除するのは面倒な場合があります。VMでこれを実行し、すべてのステップでこのVMのコピーを実行します。
(2セント)
編集:
CentOSやUbuntuのような完全なディストリビューションから始めるのではなく、SecurityBeastによって指摘されたように、次のようなディストリビューションツールの構築についても確認することができます。
質問する必要があるのは、「1つのプログラム」に何が必要で、どのようなリソースを持っているかです。
幅広いライブラリとサポートバイナリが必要な場合は、「通常の」Linuxディストリビューション(Debianまたは類似)を使用して、ブートプロセスを少しいじるのが最善の方法です。
それはサポートのもののより狭い選択を必要としますが、異なるカーネルモジュールまたはユーザーランドサポートビットを使用するさまざまなハードウェアのネットワークまたはサポートのようなものがまだ必要であり、通常のディストリビューションのディスクスペースオーバーヘッドが必要ない場合は、組み込みディストリビューション(buildrootまたは類似)または多分Linuxのゼロからのアプローチ(ただし、メンテナンスの問題になる可能性があります)
非モジュールカーネルが提供できるものだけが必要な場合は、カーネルで独自のバイナリを直接実行することで機能し、最も軽量なソリューションになる可能性があります。
busybox
が、それはおそらくあなたが望むものではないからです。必要な時間をとって、必要なことを伝えてください。サポートさせていただく場合があります。質問を編集して、関連する要素を追加してください。