![画像](https://habrastorage.org/getpro/habr/post_images/0e7/b2c/f98/0e7b2cf981de00122b958d454f1b5e00.jpg)
時々(まれですが、それでも)カーネル内のすべてのお気に入りのLinuxのカーネルに何かを追加またはやり直す必要がある場合があります。 そして、疑問が生じます:そして、これらのすべての変更を迅速かつスモークブレークなしで開始してチェックする方法は?
モジュールの形で新しい機能を整理できれば、カーネル自体を再起動せずに、insmodでオンとオフを切り替えるだけで簡単にテストできます。 しかし、モジュール性の概念が適用できない場合はどうでしょうか? たとえば、私の場合のように、 Jet9の新しいコントロールグループサブシステム(cgroups)を追加する必要があり、変更を確認するたびにカーネルを再起動する必要があった場合はどうなりますか?
qemu仮想化システム(またはqemu-kvm)がこれを支援します。 システムのパーティションだけでなく、カーネル( bzImage )およびinitramfsのファイル自体もパラメーターとして使用できます。 この機能を使用すると、テスト環境をすばやく構成して使用できます。 セットアップは、2つのステップのみで構成されます。
- initramfsを作成する
- 新しいカーネルとinitramfsを作成してqemu-kvmを実行する
次に、これらの2つのステップについて簡単に説明します。 コメントで質問にお答えします。
initramfsを作成する
ディレクトリ構造を作成します。
mkdir -p initramfs/{bin,sbin,etc,proc,sys,cgroup,usr/bin,usr/sbin}
必要なすべてのUNIXユーティリティを追加します。 これを行う最も簡単な方法はbusyboxを使用することです。 バイナリはここからダウンロードして 、 / bin / busyboxに入れることができます。 initが開始されるように、 shのシンボリックリンクを必ず追加してください。
cd initramfs ln -s bin/busybox bin/sh
次のスクリプトを./initに追加します(イメージのルートにあるはずです):
#!/bin/sh #Create unix-utils symlinks to /bin/busybox /bin/busybox --install -s #Mount pseudo-fs mount -t proc proc /proc mount -t sysfs sysfs /sys mount -t cgroup cgroup /cgroup #Create null device mknod /dev/null c 1 3 exec sh
起動時に、すべての主要なUNIXユーティリティへのシンボリックリンクを作成し、便利なpseudo-fsをマウントし、device / dev / nullを作成して(スクリプトで後で使用し、不要な出力を抑制できるようにします)、シェルを起動します。
もちろん、これを超えるものが必要な場合は、必要に応じてこのスクリプトを簡単に変更できます。 たとえば、シェルを起動する前にテストの起動を追加して、毎回手動で実行しないようにしました。 追加のユーティリティでも同じことができます-必要なパスに沿って画像に追加するだけです。 同様にモジュールでも-テスト時に使用する場合は、/ lib / modules / <kernel-ver>に追加するだけです
次に、すべてを1つのファイルにパックします。
find . | cpio -H newc -o | gzip -c > ../initramfs.gz
これで、initramfsの準備が整いました。
KVMの起動
ここではすべてが非常に簡単で、すべてはコマンドによって開始されます。
kvm -m 128 -kernel ./arch/x86/boot/bzImage -initrd initramfs.igz -serial stdio -append "console=ttyAMA0 console=ttyS0" -display none
パラメータ:
-m-マシンに割り当てられるRAMの量
-kernel-新しくコンパイルされたカーネル
-initrd -initramfsの上に作成
-append-カーネルへのパラメーター
最も興味深いのは-appendパラメータで、入力/出力をシリアルポートにリダイレクトし(これを覚えていますか?;)、- serialパラメータはシリアルポートをstdin / stdoutにリダイレクトします。 これにより、すべてが満足できない80x25の黒いウィンドウをバイパスして、カーネル出力をコンソールに直接取得できます。 ちなみに、 -display noneオプションを使用すると、反映しないように削除することができます(カーネルは、GUIではなく興味深いものです)。
利益! これでカーネルが起動し、3秒未満でスキャンする準備ができました。