私は、カーネル(v4.1-rc5)とbusybox(v1.23.2)が設定されたinitramfsのみで構成される最小限のLinuxシステムを構築しています。ほとんどの部分で問題なく動作しますが、組み込みのinitramfsを使用しているか、外部のinitramfsを使用しているかに関係なく、/ initでのコマンド実行の動作に違いがあります。
/ initスクリプトは次のとおりです。
#!/bin/sh
dmesg -n 1
mount -t devtmpfs none /dev
mount -t sysfs none /sys
mount -t proc none /proc
echo "Welcome"
while true
do
setsid cttyhack /bin/sh
done
次に、カーネル.configのCONFIG_INITRAMFS_SOURCEオプションをinitramfsのすべてのフォルダーを含むディレクトリに設定するか、
find . | cpio -H newc -o | gzip > ../rootfs.cpio.gz
それを構築します。
次に、CONFIG_INITRAMFS_SOURCEが設定されているかどうかに関係なく、カーネルをコンパイルすると、システムの2つのバリアントが作成されます。
initramfsが埋め込まれたbzImage
bzImage + rootfs.cpio.gz(外部initramfs)
私が今それらを使用し始めたとき qemu
qemu-system-x86_64 -enable-kvm -kernel bzImage
または
qemu-system-x86_64 -enable-kvm -kernel bzImage -initrd rootfs.cpio.gz
次の動作の違いがあります。
バージョン2(外部initramfs)では、すべてが正常に機能し、「ようこそ」が表示され、プロンプトが表示されます。ただし、バージョン1では(initramfsが埋め込まれている)警告が表示されます
unable to open an initial console
「ようこそ」が表示されず、プロンプトが表示されます。
プロセスを理解している限り、これらの2つのバージョンのinitramfsには同じファイルが含まれているはずです。これは、同じフォルダーからビルドする(またはカーネルにビルドさせる)ためです。
誰かがこの動作の説明を手伝ってくれるだろうか?
*更新*
mikeservがコメントで言ったように、カーネルにはデフォルトで最小限の組み込みinitramfsが含まれています。これは、外部のものを使用する場合にも存在しますが、独自のものを埋め込むと上書きされます。仕様に反して、これは確かに空ではないことがわかりましたが、devフォルダー、ルートフォルダー、および/ dev / consoleデバイスが含まれています。このデバイスは、外部initramfsを使用するときに使用されますが、独自のデバイスを埋め込むと上書きされます。そのため、mknod -m 622 initramfs_src/dev/console c 5 1
独自のものを埋め込む場合は、initramfsソースに/ dev / consoleデバイスを含める必要があります。
mikeserv、frostschutz、JdeBPに頭を悩ませてくれてありがとう。
/dev/console
組み込みのものに設定されている権限は何ですか?違いは、どちらのケースで誰が梱包するかということかもしれません。