システムプログラミング実験 (OS演習) 第9回 加藤 真平(理学部情報科学科) TA: 三上、清水 os-enshu-ta@mmm.is.s.u-tokyo.ac.jp 2016年7月11日
本日の内容 カーネル開発環境の準備 課題9に向けた準備 カーネルコンパイルの仕方 kvm の使い方 2016/7/11 システム・プログラミング実験
実験の基礎知識 2016/7/11 システム・プログラミング実験
Linux カーネル Linux の中核をなすソフトウェアである 様々なバージョンがある 大部分が C 言語(gcc)で書かれている 必要な部分はアセンブリ言語で書かれている 様々なバージョンがある 本家(kernel.org)に置かれているものがオリジナル 最新の安定板バージョンは 4.1-rc8 (2015年6月22日現在) uname (1) を使うと、現在動作しているカーネルの情報がわかる バージョン番号の意味(3.x系列) 1桁目はメジャー番号、2桁目はマイナー番号、3桁目は安定版リリース番号 2016/7/11 システム・プログラミング実験
カーネルのコンパイルの必要性 カーネルを hacking したい 不要な機能を削ってコンパクトなカーネルを作りたい 最適化をしたい 従来のOSにない新しい機能に関する研究をするなど 不要な機能を削ってコンパクトなカーネルを作りたい ディストリビューション標準のカーネルは多数のデバイスドライバを含む ほとんど使われていないものも多い 最適化をしたい CPU ごとの細かいコンパイルオプションなど 標準で有効になっていない機能を使いたい まだ安定していない最新機能を使いたい場合など 2016/7/11 システム・プログラミング実験
Linux カーネルのソースコード ソースコードは完全に公開されている ディストリビューション毎のカーネルのソースコードも公開されている GPL ライセンスで配布されている インターネットから入手可能 本家は www.kernel.org ディストリビューション毎のカーネルのソースコードも公開されている 独自のパッチを当てていることが多い 本家にはまだ採用されていない最新機能をサポートする 最新機能の一部を安定板にバックポートする 独自の機能をサポートする 2016/7/11 システム・プログラミング実験
コンパイル・インストール手順 (1/2) 必要なパッケージのインストール 必要な機能の選択 カーネルコンパイル インストール Ubuntu では libncurses5-dev が必要になるはず 必要な機能の選択 “make menuconfig” どのカーネルの機能を組み込むかを選択する 終了すると .config というファイルができる カーネルコンパイル “make” 数分~数十分かかる 並列コンパイルを行うと早くなるかもしれない (例) “make –j4” インストール “make modules_install && make install” grub の書き換えまで行ってくれるはず 手動でやる必要があるかもしれない 2016/7/11 システム・プログラミング実験
コンパイル・インストール手順 (2/2) $ tar xvf linux-2.6.34.tar.bz2 $ cd linux-2.6.34 $ make menuconfig $ make –j4 arch/x86/boot/bzImageができる(これがカーネル本体) # make modules_install # make install /boot/vmlinuz-2.6.34 がカーネル本体 /boot/grub/menu.lst が GRUB の設定ファイル # reboot 2016/7/11 システム・プログラミング実験
カーネルの設定(config) 適切な設定を選択するのは難しい デフォルトの設定をベースにする。 必要なデバイスドライバを削ってしまうと起動しなくなる デフォルトの設定をベースにする。 /boot/config-* にあるデフォルトの設定を .config としてコピーする コピーしてから make oldconfig すると、上の .config をベースに新しい .config を作れる 起動に失敗しても古いカーネルから起動すれば大丈夫 使用しているマシンのデバイス情報を入手しておく lspci(8) PCIデバイスの一覧 lsmod(8) 現在ロードされているモジュール一覧 dmesg (8) カーネルメッセージを表示 デバイス認識の様子がわかる 2016/7/11 システム・プログラミング実験
Ubuntu の場合の注意点 適切なカーネルパラメータの指定が必要 実マシンでは複雑な設定になっている可能性もある GRUB などでカーネル起動時にパラメータを指定できる GRUB の起動画面で Tab を押すと編集できる /boot/grub/grub.conf か /boot/grub2/grub.cfg にも記載がある カーネルのファイル名の後の ”root=~ quiet splash” などのこと カーネルパラメータでルートファイルシステム(/)を指定する 指定方法には2通りある “root=UUID=~” パーティションの UUID を指定する “root=/dev/sda3” 1番目のハードディスク (sda) の 3 番目のパーティションを指定する(例) 実マシンでは複雑な設定になっている可能性もある 仮想マシンで試すとよい 2016/7/11 システム・プログラミング実験
kvm (kernel virtual machine) について 仮想マシンモニタの一つ 一つの物理マシン上で、複数の仮想的なマシンを作り出す その上でOS・アプリを動作させることができる (例)Linux上でkvmで仮想マシンを作り、Windowsを動作させることができる 他にも同様な仮想マシンモニタは多数ある Xen, lguest など (オープンソース) VMWare, Virtual PC, Paralles Desktop など (商用) Ubuntu では、パッケージとして提供される # aptitude install qemu-kvm 2016/7/11 システム・プログラミング実験
kvm の利用 今後のカーネル演習に使用予定 再起動が容易に行える 何度でも気軽にやり直せる 再起動中にも作業ができる ゲストOSが壊れてもホストOS側は無事 再起動が容易に行える 再起動中にも作業ができる 頻繁に再起動する際に待ち時間が減る ディスクイメージがキャッシュされて高速に再起動できる 2016/7/11 システム・プログラミング実験
課題9の準備 Linux カーネルをいじる準備 以下のことを実際に行って、手順を確認しておくこと (1) カーネルのコンパイル (2) kvm 上での実行 2016/7/11 システム・プログラミング実験
課題9の準備 (1) – カーネルのコンパイル kernel.org の Linux 2.6.34 を使う コンパイル準備 コンパイル kadai9 ディレクトリ以下に必要なファイルが置いてある ソースコード (kernel.orgのものと同じ) configファイル kvm 上で動く configuration を TA が用意してある(自分で作成しても構わない) ディスクイメージ Ubuntu Precise (x86 64bit)のイメージ コンパイル準備 $ tar xvf linux-2.6.34.tar.bz2 $ cp os2014.config linux-2.6.34/.config TA の configuration を使う場合 コンパイル $ cd linux-2.6.34; make –j4 make O=../build 等でビルド先を指定できる 2016/7/11 システム・プログラミング実験
課題9の準備 (2) – kvm 上での実行 kvm の実行準備 kvmの実行 ハードウェアの仮想化支援機能を ON にするとよい 起動時に F1 キーを押して BIOS の設定画面に入る Config → CPU → Intel® Virtualization Technology を Enabled にする Enabled にした後、再起動だけでなく電源 OFF が必要 ONにしなくても動くが遅い kvmの実行 カーネルを直接指定して起動することが可能 $ sudo kvm –drive file=rootfs.img –m 256 –smp 2 –kernel linux-2.6.34/arch/x86/boot/bzImage – append “root=/dev/sda1” ハードウェアの仮想化支援機能を使うには root 権限が必要 /dev/kvm のアクセス権限を変えてもよい 2016/7/11 システム・プログラミング実験
kvm 実行時のオプション -m [memory size] -smp [n] -drive file=[image file] メモリのサイズ -smp [n] N個の仮想的なCPUを与える -drive file=[image file] ハードディスクイメージを指定する 普通に指定すると、順番に/dev/sda, /dev/sdb,…と見えるはず -kernel [kernel image file] 起動するカーネルイメージファイルを指定する -append [command line parameters] カーネルに渡すパラメータを指定する (例) “root=/dev/sda1” ルートファイルシステム(/となるパーティション)は、/dev/sda1を使用する その他 ネットワークに関するオプション、デバッガに関するオプション等々 詳しくは、man kvmを参照 2016/7/11 システム・プログラミング実験