Linuxカーネルの変更をテストするための環境のセットアップ

画像



時々(まれですが、それでも)カーネル内のすべてのお気に入りのLinuxのカーネルに何かを追加またはやり直す必要がある場合があります。 そして、疑問が生じます:そして、これらのすべての変更を迅速かつスモークブレークなしで開始してチェックする方法は?



モジュールの形で新しい機能を整理できれば、カーネル自体を再起動せずに、insmodでオンとオフを切り替えるだけで簡単にテストできます。 しかし、モジュール性の概念が適用できない場合はどうでしょうか? たとえば、私の場合のように、 Jet9の新しいコントロールグループサブシステム(cgroups)を追加する必要があり、変更を確認するたびにカーネルを再起動する必要があった場合はどうなりますか?



qemu仮想化システム(またはqemu-kvm)がこれを支援します。 システムのパーティションだけでなく、カーネル( bzImage )およびinitramfsのファイル自体もパラメーターとして使用できます。 この機能を使用すると、テスト環境をすばやく構成して使用できます。 セットアップは、2つのステップのみで構成されます。





次に、これらの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秒未満でスキャンする準備ができました。



All Articles