気の向くままに辿るIT/ICT/IoT
システム開発

Debian系OSをUSBメモリ/GRUB2/GPTでマルチブート

ウェブ造ホーム前へ次へ
Debian、Debian LiveをUSBメモリでマルチブートするには?

Debian系OSをUSBメモリ/GRUB2/GPTでマルチブート

Debian系OSをUSBメモリ/GRUB2/GPTでマルチブート

 Debian系では、ISOブートに対応しているようで形は違えどDebianはもちろん、Devian Liveをベースとしている模様のUbuntuやClonezilla、GPartedでもISOブートできました。

 尚、後述の通り、Debian、Ubuntu、Clonezilla、GPartedだけなら、これら用に基本パーティション1つ、データ保存用に1つ、GRUBを専用パーティションに入れるにしても3つあればよく、MBRパーティションでも充分であり、結果GPT対応のGRUB2でなくともGRUB LegacyでもOKです。

 そもそも今回は、インストーラを中心にCentOS/Fedora、Debian/Ubuntu、FreeBSD/NetBSD/OpenBSD、更にレスキューツールとしてClonezilla、GpartedのLive版をマルチブート構成としたLive USBにしてみようということで始めたのですが、結果的に単独で基本パーティションを要したのがFreeBSDとNetBSDのみ[訂正・追記:2016/08/09]FreeBSDのみでGRUB用とデータ保存用にパーティションを確保しても4つで事足りる為、MBRパーティションでも、よってGRUB LegacyでもOKでした。

 GParted、Clonezillaについては、Debian派生という意味ではなく、Debian Liveベースという意味でDebian系に書いています。

[追記:2016/12/23]
 同じくDebian LiveベースでWhoppix/Whax+Auditor由来の旧Backtrack Linuxから派生後、後継となったKali Linuxを追加しました。

Debian

menuentry 'Debian-7.7.0-i386-netinst' {
    set root=(hd0,gpt3)
# この方が無難 => set root=(hd0,3)
    set directory="/Debian-7.7.0-i386-netinst"
    linux $directory/vmlinuz
    initrd $directory/initrd.gz
}
menuentry ' ' { echo }

 今回、Debian wheezyのISOディスクイメージを使わせて頂くわけですが、例えば、Debian(lenny)のドキュメントにもその方法が記されています。

 そこにもあるようにDebianのインターネット経由でのインストールを前提とするネットワークインストール用ISOをUSBメモリで使用する場合、当該パーティション内にDebian用のディレクトリを用意した上、単にファイルとしてISOディスクイメージをコピー、更にhd-media(i386用)、グラフィカルならhd-media/gtkからvmlinuzとinitrd.gzをダウンロードしてコピーします。

 なんとDebianのインストーラでは、起動後にisoファイルを自動検出してくれるのでGRUB2からは、カーネルとイニシャルラムディスクを設定するだけで簡単に起動(ISOブート)でき、同一パーティション内にある他のOSともDebianをUSBメモリ/GRUB2/GPTといった環境下でマルチブートすることができました。

 この場合、grub.cfgの設定上は、ISOブートには見えませんが、実際は、ISOブートです。

 尚、hd-mediaからダウンロードせずにloopbackしてISOディスクイメージ内のvmlinuzとinitrd.gzを設定してしまうとインストーラこそ起動はするものの、「適切なCDが挿入されたCDドライブが見つからない」旨のエラーで先に進むことができなくなるので必ずhd-mediaから取得します。

 また、ISOディスクイメージとhd-mediaからダウンロードしたvmlinuz及びinitrd.gzは同じバージョンとする必要があるとのことです。

 ちなみにhd-mediaからダウンロードするvmlinuz及びinitrd.gzを設定の上、loopbackの記述をしてしまったとしても起動もしますし、ISOディスクイメージの自動検出もしてくれますが、ブートメッセージのしょっぱなで、なぜかISOファイルが見つかないという警告が表示されます。

 GTK版vmlinuz及びinitrd.gzを使わない限り、この指定で起動するDebianのメニュー画面は、昔ながらのテキストベースのグラフィカル風対話式メニューです。

[2019/11/23]
 尚、今日やってみたところ、GTK版vmlinuz及びinitrd.gzをそのまま使うと(詳細は、わかりませんが、なんらかの対応をしないと)正常にブートするかと思いきや、途中で[cannot open display:0]などと表示された画面がスクロールしまくったりするので注意です。

 尚、グラフィカルインストーラ用には、(syslinuxの場合)「video=vesa:ywrap,mtrr vga=788 追加すると良い」とありますが、GRUB2では、カーネルパラメータ[vga]が非推奨、代替として[gfxpayload]を使うことになっているなど仕様が変わっているので確認しておいた方がよいでしょう。

 インストーラーではなく、HDDなどにインストールしたDebianをGRUB 2で起動するケースの一例については、Debianのインストールとアップグレードを参照。

[2019/11/23]

 今どきは、ISO生成前のファイル群をローカルでISOイメージにするのが主流の模様。

 アーキテクチャやらLiveやらインストーラやら...需要に関係なく、作りまくるのは、確かに無駄ですしね、納得です。

 これまでwheezy、jessie、stretch、busterとアップグレードし続けてきたからか、それにしてもそんな中、Debian Live USBやDebianインストーラをisoブートしていたにもかかわらず、知りませんでした。

 ただ、リポジトリにmkisofsがなくなり、apt-cache search mkisofsするとxorrisoパッケージが出てきてビックリ、どうやら機能満載のxorrisoにとって代わられた模様。

 現在、amd64をメインで使用中の自身は、netinstのISOイメージという名のファイル郡をダウンロード、RepackBootableISO - amd64 release 5.0.4をそのまま、併せて非GTK版vmlinuz、initrd.gzを使えば、起動可能なisoファイルができました。

 っていうか、そんな前に既にあったってことですよね、xorriso...。

[2020/01/20]

 げっ...EngrampaやXarchiverで展開してしまってたからでした...、これらを介さず、単にダウンロードすれば、従前通り、.isoイメージファイルを取得できました...(恥)。

Ubuntu

menuentry 'Ubuntu-14.10-i386-mini mini.iso' {
    set root=(hd0,gpt3)
# この方が無難 => set root=(hd0,3)
    set directory="/Ubuntu-14.10-i386-mini"
    set isofile="$directory/mini.iso"
    loopback loop $isofile
    linux (loop)/vmlinuz
    initrd (loop)/initrd.gz
}
menuentry 'Ubuntu-mini-remix-14.10-i386 Live Remaster' {
    set root=(hd0,gpt3)
# この方が無難 => set root=(hd0,3)
    set directory="/Ubuntu-mini-remix-14.10-i386"
    set isofile="$directory/ubuntu-mini-remix-14.10-i386.iso"
    loopback loop $isofile
    linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noprompt noeject
    initrd (loop)/casper/initrd.lz
}
menuentry ' ' { echo }

 今回、Ubuntuについては、バージョン14.10の本家最小版mini.isoとubuntu-mini-remix.orgで配布されているLive CD Remaster/カスタマイズ用のubuntu-mini-remix-14.10-i386.isoを利用させて頂きましたが、何れもUSBメモリ/GRUB2/GPTといった環境下でISOブートでマルチブートすることができました。

 mini.isoは、Debian Liveを使っているのか、昔ながらのグラフィカル風テキストメニューによる言語選択から始まり、前述のDebian i386-netinstとほとんど同じような感じです。

 mini.isoは、ISOディスクイメージの中身を眺めるとISOファイルのルートにはファイルしかなく、その中にvmlinuzとinitrdがあった為、loopbackしてカーネルとイニシャルラムディスクを設定すれば普通にいけそうとやってみたら、無事起動しました。

 REMIXの方は、確かUbuntuは、[boot=casper]とか、[iso-scan/filename=ISOディスクイメージ]とかカーネルパラメータがいるんだよねと思いつつ、ISOディスクイメージの中身を(よく見るとinitrd.gzじゃなくてinitrd.lzだよねとか)確認、他方、64ビット版ではあるものの、Ubuntuのヘルプ Grub2/ISOBoot/Examplesの通りに(あ、やっぱり、.lzだし、カーネルパラメータもいるよねと思いつつ)指定すれば無事起動しました。

 尚、起動後は、オートログインでCLIとなり、REMIXは、[minimal.iso|mini.iso|bootonly.iso|netboot.iso]と検索して不特定多数のisoを探していて確認もせずに、これもUbuntuか。。。と思って試してみた為、何これ?Live?と思いつつ、先のサイトを見ると手作業でUbuntuベースのオリジナルLive CD/DVDを作るにあたって最小限のシステム構成となっており、必要に応じて他の各種ツールと連携するとよいとあり、今のところ予定はないので起動したことに満足し放置。

ClonezillaとGParted

 Clonezillaは、あらゆるファイルシステムに対応するディスクイメージ、ディスククローン作成ツール、GPartedは、パーティションの作成・削除、移動・サイズ変更、検査などの操作と多くのファイルシステムによる初期化やフラグ設定を行うことができるGNOMEプロジェクトによるパーティションエディタです。

 前述の通り、このページにおいてDebian系としてくくっているのは、Live版提供に際し、Debian LiveをベースにしているからであってDebianの派生というわけではありません。

 さて、ClonezillaとGPartedですが、何度かやってみて失敗した時のエラー画面からして、この2つは、何れもそのベースがDebian Liveの模様、GRUB2でloopbackする情報も結構あるものの、当サイト検証では、それでは上手くいかず、最終的にたどり着いたのが、米英語のQ&Aサイトでした。

 そこでは質問者の方が「Clonezillaでは上手くいったのにGPartedでは同じようにやっても何故かうまくいかないんだけど、どうしてかな?」といった旨の質問と共にmenuentryも併せて提示されており、linux16/initrd16を使った例を元にやってみたらClonezillaもGPartedもメニュー表示までは上手くいきましたが、2台のマシンで試したところClonezillaは1台はOK、1台は起動不能、GPartedは2台とも起動不能でした。

 質問者さんの意に沿う回答が得られていない様子もタイムスタンプが、もう1年以上も前のもののようですし、回答はしていないものの、そのバージョンのGPartedにmemdiskが含まれているか、含まれていればパスが正しいかを確認すれば、できるはず。。。現にできましたから。

 当初、メニュー表示までしか試さなかったのがいけなかったのですが、だいぶ経ってから、ふとやってみた際に判明、そこで前回も参照したGPartedのサイトをみると当時あったものとは違うものと思われるタイプのサンプルが掲載されており、vga=788は外したものの、GPartedもClonezillaも全く同じ指定で起動することができました。

 どちらの機能も併せ持つ高機能なParted Magicを試してみるという手もありましたが、システム要件によるとRAM512MB以上とあり、最小196MBのClonezillaや160MBのGPartedの方が、その必要性は限り無く少なくなってはいるものの、より古いマシンでも対応できそうだし、よいかななんて微妙にこだわってみた結果、試してもいません。

Clonezilla

 ClonezillaのLive版は、ISOディスクイメージ自体をファイルとして、また、今回は、いくつかの方法を試してみる為、そのディスクイメージの中身のファイルを全てコピーしましたが、linux16を利用するこの方法においては、memdiskだけでも充分なのかもしれませんが、同一パーティション内で他のOSやツールと共にClonezillaをUSBメモリ/GRUB2/GPTといった環境下でマルチブートすることができました。

menuentry 'Clonezilla-live-2.2.4-12-i486' {
    set root=(hd0,gpt3)
# この方が無難 => set root=(hd0,3)
    set directory="/Clonezilla-live-2.2.4-12-i486"
    set isofile="$directory/clonezilla-live-2.2.4-12-i486.iso"
#    linux16 $directory/iso/syslinux/memdisk
#    initrd16 $isofile
    loopback loop $isofile
    linux (loop)/live/vmlinuz boot=live config union=aufs noswap noprompt ip=frommedia toram=filesystem.squashfs findiso=$isofile
    initrd (loop)/live/initrd.img
}
menuentry ' ' { echo }

 ClonezillaのLive版は、ISOディスクイメージ自体をファイルとしてloopbackすることで同一パーティション内で他のOSやツールと共にClonezillaをUSBメモリ/GRUB2/GPTといった環境下でマルチブートすることができました。

 起動画面は、ClonezillaのLive版の標準的なグラフィカルメニューですが、Liveを開始すると昔ながらのテキストベースのグラフィカル風対話式メニューでキーボードタイプの選択をするか否かの選択を米英語で求められ、その後は、選択に応じてlocaleも設定されるようで日本語キーボードを選ぶと表示も日本語となり、対話的に進めることができます。

GParted

 GPartedのLive版もISOディスクイメージ自体をファイルとして、また、今回は、いくつかの方法を試してみる為、そのディスクイメージの中身のファイルを全てコピーしましたが、linux16を利用するこの方法においては、memdiskだけでも充分なのかもしれませんが、同一パーティション内で他のOSやツールと共にGPartedをUSBメモリ/GRUB2/GPTといった環境下でマルチブートすることができました。

menuentry 'GParted-live-0.20.0-2-i486' {
    set root=(hd0,gpt3)
# この方が無難 => set root=(hd0,3)
    set directory="/GParted-live-0.20.0-2-i486"
    set isofile="$directory/gparted-live-0.20.0-2-i486.iso"
#    linux16 $directory/iso/syslinux/memdisk
#    initrd16 $isofile
    loopback loop $isofile
    linux (loop)/live/vmlinuz boot=live config union=aufs noswap noprompt ip=frommedia toram=filesystem.squashfs findiso=$isofile
    initrd (loop)/live/initrd.img
}
menuentry ' ' { echo }

 GPartedのLive版もISOディスクイメージ自体をファイルとしてloopbackすることで同一パーティション内で他のOSやツールと共にGPartedをUSBメモリ/GRUB2/GPTといった環境下でマルチブートすることができました。

 起動画面は、GPartedのLive版の標準的なグラフィカルメニューですが、Liveを開始すると昔ながらのテキストベースのグラフィカル風対話式メニューで言語選択を米英語で求められ、その後は、テキスト画面かグラフィカル画面を選択、グラフィカル画面を選ぶとそれに応じた言語でデスクトップ、更にGPartedが起動します。

 可能な操作は、デスクトップ上のアイコンのみに限られるようでNetsurf(Dilloよりちょっと重いけど、そこそこ軽量なブラウザ)や端末、その他ツールも付属しており、ネットワークは手動設定のようでネットワーク構成用と思われるアイコンもあります。

Kali Linux

[追記:2016/12/23]
menuentry 'kali-linux-2016.2-i386.iso' {
set isofile='/boot/iso/kali-linux-2016.2-i386.iso'
loopback loop $isofile
linux (loop)/live/vmlinuz boot=live findiso=$isofile noconfig=sudo username=root hostname=kali
initrd (loop)/live/initrd.img
}
menuentry ' ' { echo }

 Kali Linuxのmenuentryは、wiki.archlinuxjp.orgに倣いました。

 当初、Lightを入れて起動してみましたが、Kaliらしいツールが、かなり限定されていた為、空き容量に余裕のあった32GB・GPT形式のUSBメモリには標準(GNOME 3。。。MATEかLXDEにすればよかった。。。)とLight両方、8GBのMBR形式のUSBメモリにはLightを入れました(当然、Lightも同様にすれば起動できます) 。

[追記:2016/12/24]

 が、よく考えてみるとKaliのメニューが出ることなく、直でブートしてしまう(別にインストールする気もないし、暗号化しようとも思わないけど、fail safeくらいはあってもいいか)。。。

netbsd~$ sudo mount /dev/sd0f /mnt/usb
netbsd~$ sudo vndconfig -c vnd0 /mnt/usb/kali-linux-2016.2-i386.iso
netbsd~$ sudo mount /dev/vd0a /mnt/iso
netbsd~$ cd /mnt/iso/isolinux
netbsd~$ cat menu.cfg live.cfg install.cfg | less
...

 ということでホストがNetBSDなので別の端末でvndconfig(旧vnconfigも使用可/NetBSD 7.0からvndconfig)でLive USBメモリ内のisoをデバイス化後、マウントして中身を眺めるとisolinuxのmenu.cfgがあるが、これをGRUB 2のconfigfileサブコマンドで呼んでも起動できなかった為、ディスク先頭のGRUB 2で直接指定することに。

netbsd~$ vi /dev/sd0e /mnt/boot
netbsd~$ vi /mnt/boot/grub/grub.cfg
...
submenu 'kali-linux-2016.2-i386.iso' {
  menuentry 'Kali Live' {
    set isofile='/boot/iso/kali-linux-2016.2-i386.iso'
    loopback loop $isofile
    linux (loop)/live/vmlinuz boot=live noconfig=sudo username=root hostname=kali findiso=$isofile
    initrd (loop)/live/initrd.img
  }
  menuentry 'Kali Fail Safe' {
    set isofile='/boot/iso/kali-linux-2016.2-i386.iso'
    loopback loop $isofile
    linux (loop)/live/vmlinuz boot=live config memtest noapic noapm nodma nomce nolapic nomodeset nosmp nosplash findiso=$isofile
    initrd (loop)/live/initrd.img
  }
...

 ついては、メニューが混み合う為、サブメニューに。。。ってGRUB 2だとどうやるんだっけ?ということで14.1.2 submenuを見るとその名もsubmenuでえらい簡単にできるということでisolinuxのmenu.cfgがincludeしているlive.cfg、install.cfg(、stdmenu.cfg)を眺めつつ、Kailの一連のメニューをGRUB 2のmenuentryとして読み替えて記述した結果がこれ。

 長すぎるから適当に3分割し、まずは、LiveとFail Safe。

...
  menuentry 'Kali Forensics No automount Unuse swap' {
    set isofile='/boot/iso/kali-linux-2016.2-i386.iso'
    loopback loop $isofile
    linux (loop)/live/vmlinuz boot=live noconfig=sudo username=root hostname=kali noswap noautomount findiso=$isofile
    initrd (loop)/live/initrd.img
  }
...

 続いてForensicsモード。

...
  menuentry 'Kali Persistence Mode' {
    set isofile='/boot/iso/kali-linux-2016.2-i386.iso'
    loopback loop $isofile
    linux (loop)/live/vmlinuz boot=live findiso=$isofile noconfig=sudo username=root hostname=kali persistence
    initrd (loop)/live/initrd.img
  }
  menuentry 'Kali Encryped Persistence Mode' {
    set isofile='/boot/iso/kali-linux-2016.2-i386.iso'
    loopback loop $isofile
    linux (loop)/live/vmlinuz boot=live persistent=cryptsetup persistence-encryption=luks findiso=$isofile noconfig=sudo username=root hostname=kali persistence
    initrd (loop)/live/initrd.img
  }
...

 そしてPersistence及び暗号化Persistenceモード。

...
  menuentry 'Kali Install GUI' {
    set isofile='/boot/iso/kali-linux-2016.2-i386.iso'
    loopback loop $isofile
    linux (loop)/install/gtk/vmlinuz video=vesa:ywrap,mtrr vga=788
    initrd (loop)/install/gtk/initrd.gz
  }
  menuentry 'Kali Install CLI' {
    set isofile='/boot/iso/kali-linux-2016.2-i386.iso'
    loopback loop $isofile
    linux (loop)/install/vmlinuz vga=788
    initrd (loop)/install/initrd.gz
  }
}
menuentry ' ' { echo }
...

 最後にGUIベースとCLIベースのインストールメニュー。

 syslinuxのinstall.cfgには、更に音声合成読み上げモード用のメニューもありましたが、今回は見送ることに。

 注意すべきは、インストールくらいでしょうか。。。イニシャルラムディスクについては、.img(イメージ)ではなく、.gz(圧縮ファイル)であること、更にインストールについては、GUI/CLI共にカーネル引数としてvga=788を指定しなければいけない点。(たとえ起動時、text|788 is deprecated. Use set ...と出たとしても、CLIであってもvga=788としないとダメ、GUIに至ってはそうしないとXorgエラーで起動しなくなる。。。という現象にしばしハマった)。

...
netbsd~$ sudo umount /mnt/iso /mnt/boot
netbsd~$ sudo vndconfig -u vnd0
netbsd~$ sudo umount /mnt/usb
netbsd~$

 後始末。

備考

 ちなみにmenuentry ' ' { echo }は、とりあえず空行を入れたくてなんとなく書いてみたら期待通りでしたが、他にちゃんとしたやり方があるのかどうかは調べてません。

ウェブ造ホーム前へ次へ