GLIMをext4に対応させたい
いくつか基本的な実験をした。現在のGLIMは、
- USB Mass Storage Deviceだけでなく、USB HDD/SSDにも対応できる(これはわかっていた)。
- インストール後なら、FAT32パーティションの後ろにEXT4パーティションを作っても問題ない。
物理的なUSB HDDで確認済み。以降の実験はVMWare上の仮想ディスクをターゲットとして行う。
GLIMは起動時に以下の動作を行う。
- grub.cfgが環境を整える。
- /boot/iso配下のディレクトリをスキャンし、ISOファイルが存在するならメニューに追加する。
- ユーザーがメニューから選んだISOを起動する。
ISOからの起動はディストリビューションごとに用意されるinc-*.cfgファイルが行う。
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}"
ここでは()
を含んでいることで、引数の順番が変わる。
とりあえず問題なさそうなので、正規表現から$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か月くらい待つか。
とりあえずこれ。