kexec-loaderは、MBRやPBRにインストールしなくても、起動時に読み込めるパーティションにvmlinuzとinitrd.imgのみをコピーして、それらをカーネルローダで読み込めば起動できます。

公式サイトはこちら

kexec-loader起動用CDの作成方法

以下の方法はkexec-loaderのバージョン2.2.1についての方法です。違うバージョンでは異なるかもしれません。

  1. kexec-loaderのダウンロードサイトから

    • kexec-loader-?-cdrom.tar.gz
    • modules-?.tar.gz
    をダウンロードします。
  2. modules-?.tar.gzを展開して生成したディレクトリの中の必要そうなモデュールファイル(拡張子がmodのファイル)を、 kexec-loader-?-cdrom.tar.gzを展開して生成したディレクトリの中のiso-modulesディレクトリにコピーします。
  3. 展開して生成したディレクトリの中のiso-filesディレクトリの中のkexec-loader.confを適当に編集します。その内容については、WEB上の説明(英語)あるいは、以下の「kexec-loader.confの書式」を参考ください。

  4. 端末で展開したディレクトリに移動し、

    ./mkiso.sh 作成したいISOファイルの名前.iso
    を実行します。
  5. すると、上記で設定した「作成したいISOファイルの名前.iso」という名前のファイルが生成されます。これをCD-Rなどに書き込んでください。

  6. Debian7 では、kexec-loader-?-cdrom.tar.gz を展開したディレクトリにある、mkiso.sh、addmod.sh はエラー終了します。暫定的に対応したシェルファイルを添付しておきます。

内蔵HDDにコピーしたkexec-loaderを利用する方法

CD-Rに書き込まなくても、内蔵HDDからkexec-loaderを起動できます。 以下の方法はkexec-loaderのバージョン2.2.1についての方法です。違うバージョンでは異なるかもしれません。

kexec-loaderのダウンロードサイトから

  • kexec-loader-?-cdrom.tar.gz
  • modules-?.tar.gz

をダウンロードします。

modules-?.tar.gzを展開して生成したディレクトリの中の必要そうなモデュールファイル(拡張子がmodのファイル)を、 kexec-loader-?-cdrom.tar.gzを展開して生成したディレクトリの中のiso-modulesディレクトリにコピーします。 kexec-loader-?-cdrom.tar.gzを展開して生成したディレクトリの中のmkiso.shをテキストエディタで編集し、その最後の行の

rm -rf iso-root

の先頭に

#

を付けて保存します。(行ごと削除しても良いです。) テキストエディタを閉じます。 端末で展開したディレクトリに移動し、

./mkiso.sh 作成したいISOファイルの名前.iso

を実行します。すると、iso-rootというディレクトリの中にモデュールを組み込んだinitrd.imgが生成されます。起動時に読み込めるパーティションにkexecldrという名前のディレクトリを作成してください。作成したkexecldrディレクトリの中に、iso-rootディレクトリの中のinitrd.imgとvmlinuzをコピーします。

/ディレクトリにコピーしても使えるのですが、Ubuntuがインストールされているパーティション(/にマウントされるパーティション)の/ディレクトリには同名のシンボリックリンクがあるので、問題が生じる可能性があります。そこで、新たにディレクトリを作成した方が安全です。

実際の起動時にkexec-loaderを利用できるようにするためには、別のカーネルローダでkexec-loaderのvmlinuzとinitrd.imgを読み込む必要があります。
grub4dosなら、menu.lstの末尾に

title kexec-loader
find --set-root /kexecldr/vmlinuz
kernel /kexecldr/vmlinuz
initrd /kexecldr/initrd.img

と追加すれば良いでしょう。
GRUB2なら、/etc/grub.d/40_linuxの末尾に

menuentry "kexec-loader" {
search -f --set /kexecldr/vmlinuz
linux /kexecldr/vmlinuz
initrd /kexecldr/initrd.img
}

と追加して、端末

update-grub

を実行すれば/boot/grub/grub.cfgの末尾に追加されるでしょう。

また、起動時にメニューを利用したい場合には、kexec-loader.confを、起動時に読み込めるパーティション(vmlinuzとinitrd.imgをコピーしたパーティションとは異なっても良いです)にコピーし、そのパーティションのラベルをGparted(パーティションエディタ)などで、

kexecloader

に変更します。 kexec-loader.confの書き方(使えるコマンド)は こちらに書いてあります。

kexec-loaderのコマンドラインでの利用

コマンドラインで使えるコマンドは こちらに書いてあります。

disks

で認識されているデバイスとパーティションの一覧を表示させ、Ubuntuのインストールされたパーティションを、例えば、/dev/hda5と認識されていたら、

root hda5

のように指定。

kernel カーネルの名前(フルパスで)

でカーネルを指定し、

initrd initramfsの名前(フルパスで)

でinitramfsを指定し、カーネルに渡すべきオプションがあるのなら、

cmdline カーネルに渡したいオプション

してから

boot

で起動が試みられます。 なお、

cat 閲覧したいテキストファイル名(フルパスで)

でテキストファイルの内容を表示させることができるので、例えば、grub legacyの起動メニューの書かれたファイル、/boot/grub/menu.lstの内容を見たければ、rootでパーティションを設定した後で、

cat /boot/grub/menu.lst

で表示されるのですが、長いと、表示が上に流れてしまい、最後の方しか閲覧できません。moreのように表示させる方法がありましたら、このページに書き込んでくださると有難いです。

kexec-loader.confの書式

kexec-loader.confの書き方(使えるコマンド)は こちらに書いてあります。

UbuntuでUUIDでパーティションが設定されている場合、UbuntuのUUIDを★として

title Ubuntu on UUID=★
root UUID=★
kernel /vmlinuz
initrd /initrd.img
cmdline root=UUID=★ ro カーネルに渡したい他のパラメータ

ぐらいで良いでしょう。「カーネルに渡したい他のパラメータ」と実際に書いてはいけません。 Smile :) また、/のパーティションと/bootのパーティションが別の場合、/vmlinuzと/inirtd.imgというシンボリックリンクが利用できないので、上記の内容では起動できません。

他のパラメータが不要なら、上記の「ro」以降は不要です。

kexec-loader.confを置くパーティションのラベルをkexecloaderに変えたく無い場合

  1. http://www.solemnwarning.net/kexec-loader/download.cgi からソースファイルをダウンロードしてください。

  2. 展開して、生成されたディレクトリの中のsrc/misc.cの中に
    kexecloader
    という文字列があるので、それをkexec-loader.confを置きたいパーティションのラベルに変更してください。
  3. 後は、適切にコンパイルすれば良いです。コンパイルの方法は、
    build.html
    に書かれているように、必要なパッケージが利用できさえすれば、展開したディレクトリでmakeでOKでしょう。 (ただし、Ubuntu9.10の2010/3/1の状態では、必要なパッケージが入手しにくく、makeしてもエラーが発生して失敗します。)

謝辞

このページの情報を作成するにあたり、 「 kexec-loader を内蔵 HDD にインストールする方法」については、
Daniel Collins (aka solemnwarning) さんからご教示を賜りました。

また、以上の方法は、 grub4dos や kexec-loader, kexec-tools, Ubuntu の開発者の方のご尽力があったからこそ実現できるものです。

この場をお借りして御礼申し上げます。

UbuntuJapaneseWiki: UbuntuTips/UsbInstall/BootUbuntuInUsbWithBiosWithoutSupportForUsb/KexecLoader (last edited 2016-02-06 16:00:17 by HeroTTF)