Ventoyとは
普通、LinuxやWindowsなど新しいOSをインストールしようと思ったらDVDやUSBメモリを丸ごと使ってisoなどを焼く必要があります。しかしVentoyを使えば、Ventoy自体をインストールするだけで、あとはUSBメモリ(あるいは他のパーティション・ディスクでも)に入っているisoやvhd(仮想ディスクイメージ)やブートローダーを指定してそこから直接OSを起動することができます。
なんでこんなことが可能なのかよくわかりませんが、このへんを見ると、任意のisoなどで可能というわけではなく、あくまでWindowsやLinuxなど一般的なOSの種類に応じて動作を変えてうまくやっているようです。実際Ventoyだとうまくいかないという例もあるらしいです。とはいえVentoyでWindowsをインストールしている人も普通にいるので、たいていは動く模様。
「Super-UEFIinSecureBoot-Disk」を内部で使っているため、セキュアブート環境でも(MOKが正常に動けば)動きます(前回のWindows・Linuxにおけるセキュアブートと関連ツール(shim・MOK)、およびセキュアブートやTPMの効果について - turgenev’s blogを参照)。
Ventoyを普通にインストールしてみる
Ventoyを普通にインストールする場合、USBの全体を使います。つまりそのUSBにもともとあったデータは使えなくなります。
デフォルトではMBR形式のパーティションテーブルを使ってインストールされ(※注: この部分を含め以下の内容はほとんどすべてLinux上で確認しています)、結果は以下のようになります。
一方、オプション指定によりGPT形式でインストールすることもでき、この場合は以下のような結果になります。
いずれにしても共通点は以下の通りです。
- ディスクの末尾32MBがFAT形式のEFIシステムパーティション(「VTOYEFI」)になり、ここにVentoy本体がインストールされる。
- ディスクの先頭(正確には1MB空けたところだが、そうするのが普通)から上記のパーティションの直前までが、メインのデータパーティション(ここにisoとかを入れる)になる。
また、ディスクの後ろを空けておくことで他のパーティションを後ろに作れるようにするオプションもあるようです。
Ventoyの非破壊的インストールオプション
ただ、USBに既に色々なものが入っていてそれを消したくない場合もあります。そういうときに無理やり元の内容を維持したままインストールできないか?というのを考えたのがこの記事です。
実は、(比較的最近の)Ventoyには、既存のディスク構造を維持したままインストールするオプションが既に用意されています。
以下の条件が満たされていれば(あるいはGPartedなどでそういう状態にすれば)これを使うことができます。
- 先頭のパーティションが1MBのところから始まっている
- 以下のどちらかが満たされている
- パーティション数の上限(MBRなら4、GPTなら128)(ただしMBRは拡張パーティションを使えば実質もう少し増やせる)に達していない
Ventoyが起動する正確な条件
上記の非破壊インストールも、ディスクが使用(マウント)されている最中に使えないという制約はあります。その他、特殊な条件だとエラーが出るかもしれません。そこで、いくつかの参考サイト(これとかこれ)とこの関数と実際に色々試した結果から、Ventoyがちゃんと起動する正確な条件を調べました。おそらく、こんな感じになっています。
- パーティションが少なくとも2つある。
- ディスク先頭から見て1つ目と2つ目のパーティションは、基本パーティション(MBRの論理パーティションでない)であり、パーティション番号がそれぞれ1と2になっている。
- 1つ目のパーティションのフォーマット形式がサポートされている(exFAT/FAT32/NTFS/UDF/XFS/Ext2/Ext3/Ext4とのこと)。
- ちなみにデフォルトのexFATは若干不安定なところもあるフォーマット。
- 1つ目のパーティションは、ディスクの先頭(正確には1MB空けたところ)から始まる。
- 通常、パーティションのブロックサイズは512Bなので、コード上では「ブロックが2048個(1MB÷512B)ある」ことを判断している。GPartedで「開始セクタ」が2048になっていれば良さそう。ブロックサイズを4KBにしてもいけるのかは不明。
- 対応するエラー: 「Ventoy partition is not start at 1MB」
- 2つ目のパーティションは、1つ目のパーティションから間を空けずに直後から始まっている。
- 対応するエラー: 「Disk partition layout check failed」(だったはず、やや自信なし)
- 2つ目のパーティションはFAT形式で、サイズはちょうど32MB。
- 2つ目のパーティションの名前(ラベル)は「VTOYEFI」。
- 対応するエラー: 「Partition name is not VTOYEFI」
- MBRセクタ(GPTディスクでも存在する)に、Ventoy特有の内容が書き込まれている
- 対応するエラー: 「MBR check failed」
これらに加えて、Legacy BIOS環境で起動する場合は、MBRセクタと先頭のパーティションとの間(ほぼ1MB、2047ブロック分)にGRUB関連?のデータが書き込まれていることが必要です(無いと、エラーが出るというより単に起動しません)。チェックされるわけではないのでUEFI環境では不要です。
逆に、以下のような部分は適当でいいようです。
- 上記2つのパーティションにはbootやespなどのフラグが立っていなくてもよい。つまり、他にEFIシステムパーティションがあっても問題ない。
- 先頭のパーティションは、かなりサイズが小さくてもよい。(例えば2MBのNTFSパーティションなどでもいけた)
手動でインストールする
上記の基準に従えば、実は結構適当にインストールしてもVentoyは動くことがわかりました。
例えばMBR形式のUSBメモリ(デバイスとしては/dev/sdbとします)だったら以下のようにします。以下、基本的にはrootで操作します。
- まずはインストール済みのVentoyの例が必要。既にVentoyが入ったUSBメモリ等を持っていればそれを使ってもよい。無い場合の手順を示す。
- スパースファイル(ここでは128MBとする)(実際にはほとんど消費しない)を作成
truncate -s $((128*1024*1024)) ./sparse.img
- 上記ファイルをパーティション付きループバックデバイスとして設定
losetup -fP ./sparse.img --show
- これで/dev/loop0(前のコマンドで表示される)とかにデバイスができるので、これを指定してVentoyをインストール
Ventoy2Disk.sh -i /dev/loop0
- 先頭1MB分(MBR+GRUB?)のデータを抽出しておく
dd if=/dev/loop0 of=ventoy-header.bin bs=512 count=2048
- スパースファイル(ここでは128MBとする)(実際にはほとんど消費しない)を作成
- ここからUSB側をいじる。パーティション情報をバックアップする(必須)
sfdisk -d /dev/sdb > sdb.part
- 先頭1MB分をバックアップ(必須ではないが、やっておいた方が安心)
dd if=/dev/sdb of=usb-header.bin bs=512 count=2048
- さきほどの先頭1MB分のデータをUSBに書き込み(書き込み先を間違えないよう注意)(/dev/loop0から直接コピーしてもよい)
dd if=ventoy-header.bin of=/dev/sdb bs=512 count=2048
- MBR内部のパーティション情報が壊れている(loop0のものがコピーされてしまっている)ので、それを修正
sfdisk /dev/sdb < sdb.part
- (この段階でGPartedなどで見てみて正常に認識できなければ、3でバックアップしたbinを書き戻す(ifとofを逆にするだけ))
- 先ほどの条件に合うようにパーティションを編集し、2つ目のパーティションの名前を「VTOYEFI」にする。
- 「VTOYEFI」パーティションの中に、/dev/loop0p2(普通にインストールした方の「VTOYEFI」)の中にあるファイルを全てコピーする。
このようになります。ちなみにsfdiskのあたりはChatGPTに聞いた結果であり筆者が自信をもって使えるコマンドではありませんが見た感じちゃんと動いていました。
GPT形式のUSBメモリの場合も同様ですが、いくつか変更点があり、以下のようになります。
- ほぼ先ほどと同じ。
- 不要
- 同様だが、countは2048でなく1でよい
- 同様だが、countは2048でなく1でよい
- GPT関連のいくつかのコマンド(こちらもChatGPT(←GPTが2種類あって紛らわしいですね)に聞いたもの)
- よくわからないコマンド
partprobe /dev/sdb
- さっき先頭に書き込んだMBRを末尾にもコピー(GPTではそうすることになっている)
sgdisk -e /dev/sdb
- 最終確認?不要そう
gdisk /dev/sdb- 「v」と押してverify、「w」と押してwriteとやるようにChatGPTに言われたものの、「v」で特に問題がなかったし、「w」を押したら「本当に大丈夫ですか?」みたいなことを言われたので、やらなかった
- よくわからないコマンド
- 同じ
- 同じ
- 同じ
こんな感じです。GPTでも手元で試してうまくいくことを確認しました。
ちなみにMBRとGPTどっちがいいの?という話ですが、耐障害性とか(基本)パーティションの数からしてまあGPTが正解ではあります。とはいえ使う予定ないけどLegacy BIOS環境でも起動すると嬉しいという気持ちもわかるので難しいところです。
あと、Ventoyには他のパーティションから起動する機能(Browse機能)もあるので、ディスクスペースを無駄にしないという観点では先頭のパーティションは5MB以下とかにしておいて後ろを自由に使うほうがむしろいいのではないかとも思いました。あるいは先頭100-200MBをEFIシステムパーティションとして使うのもいいと思います。