Open9

GLIMをext4に対応させたい

堀江誠一堀江誠一

GLIMは、多数のISOファイルの中からメニューで選んで好きなISOをブートするツール。同様のものにVentoyがある。

昨日やコミュニティの活発さは圧倒的にVentoyが上。一方で分かりやすさは圧倒的にGLIM。

GLIMはFAT32に依存している。これはGLIMがリリースされた当初は問題なかったが、Linuxディストリビューションの巨大化によりFAT32の最大ファイルサイズ4GBの上限が問題になってきた。例えばUbuntu 25.04のISOファイルサイズは5GBを超える。

そこで、GLIMをフォークしてEXT4に対応させたい。

堀江誠一堀江誠一

いくつか基本的な実験をした。現在のGLIMは、

  • USB Mass Storage Deviceだけでなく、USB HDD/SSDにも対応できる(これはわかっていた)。
  • インストール後なら、FAT32パーティションの後ろにEXT4パーティションを作っても問題ない。

物理的なUSB HDDで確認済み。以降の実験はVMWare上の仮想ディスクをターゲットとして行う。

堀江誠一堀江誠一

GLIMは起動時に以下の動作を行う。

  1. grub.cfgが環境を整える。
  2. /boot/iso配下のディレクトリをスキャンし、ISOファイルが存在するならメニューに追加する。
  3. ユーザーがメニューから選んだISOを起動する。

ISOからの起動はディストリビューションごとに用意されるinc-*.cfgファイルが行う。

堀江誠一堀江誠一

grub.cfg内部ではisopath変数がキーのようなので、isopathに決め打ちでパーティション情報を追加する。

grub.cfg
#set isopath=/boot/iso
set isopath=(hd1,2)/boot/iso

こうしてISOイメージだけをEXT4におくと、イメージを認識する。しかし、イメージからのブート途中にinitramfsで失敗する。

堀江誠一堀江誠一

echoを使って内部を追跡した結果、inc-*.cfgの以下の部分で失敗しているらしいとなった。

regexp \
    --set 1:isoname \
    --set 2:version \
    --set 3:arch \
    "^${isopath}/rescuezilla/(rescuezilla-(.+)-([^.]+).+\.iso)\$" "${isofile}"

ここでは{isofile}から正規表現を使ってisoname, $version, $archを取り出している。問題はisopathが()を含んでいることで、引数の順番が変わる。

とりあえず問題なさそうなので、正規表現から$isopathを削ってみた。


regexp \
    --set 1:isoname \
    --set 2:version \
    --set 3:arch \
    "/rescuezilla/(rescuezilla-(.+)-([^.]+).+\.iso)\$" "${isofile}"

引数は正しく取れるようになったが、相変わらずinitramfsの途中で失敗する。

堀江誠一堀江誠一

kernelにISOのパスを渡すときに(hd1,2)を与えても通じないはず。UUIDを使う?

堀江誠一堀江誠一

とりあえずext4からブートした。

$isofileには(hdX,Y)形式のパーティション名を含むISOファイル名が入っている。これをそのままLinuxカーネルのisoscan/filename引数に渡したのが悪かった。isoscan/filenameにはパーティション・ルートからの絶対パスを渡す。パーティション名を入れてはいけない。

# Rescuezilla
function add_menu {
  isofile="$1"

  regexp \
    --set 1:isoname \
    --set 2:version \
    --set 3:arch \
    "rescuezilla/(rescuezilla-(.+)-([^.]+).+\.iso)\$" "${isofile}"
  menuentry "Rescuezilla ${version} ${arch}" "${isofile}" "${isoname}" --class rescuezilla {
    set isofile=$2
    set isoname=$3
    use "${isoname}"
    loopback loop ${isofile}
    linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=/boot/iso/rescuezilla/${isoname} toram quiet splash
    initrd (loop)/casper/initrd.lz
  }
}

for_each_sorted add_menu "$isopath"/rescuezilla/rescuezilla-*.iso

実験過程でパス名のべた書きをやったので、これを変数化していく必要がある。

とりあえず新プロジェクトとしてフォークするか。

堀江誠一堀江誠一

cshandley-ukがRescuezillaに対応していないかったから対応させた。

ただ、プルリクを出せない。glim本家をフォークしてPR出しているのが原因。glim本家のフォークを消すまでbash_glimはフォークできず、フォークしないとPRできない。glim本家はアクティビティが超低い。1か月くらい待つか。

とりあえずこれ。
https://github.com/suikan4github/bash_glim