wubiのイメージをvirtualboxからmountする

2021年10月15日

nativeなlinuxが必要なときたまにwubiを使うことがあるのですが、今回はそのイメージをWindows VirtualBox上のLinuxから見る、という記事です。

wubiとは

Windowsにアプリとしてインストールすると、何度か再起動した後にUbuntuが起動可能になるソフトです(wikipediaの説明)(WindowsアプリをアンインストールするとUbuntuも一緒に消える)。VirtualBoxなどと違い、Windowsアプリとして動作するのではなく、何のエミュレーションもしていないUbuntuが動作します。ただインストールされるUbuntuは本物とはインストールされるパッケージが少し違います。

wubiアプリが行うことは、ユーザーに必要最低限の設定をしてもらった後、ISOをダウンロード(事前にしておく方法もある)してからその設定でUbuntuのインストーラを起動させるように次回のブート設定を変更することです。実際wubiアプリのインストールが終わると再起動を促され、再起動するとUbuntuのインストーラが全自動で動き、NTFS上のイメージファイルにシステムをインストールしていきます。その後(通常のUbuntuと同様に)再度再起動することになり、再起動すると、NTFS上のイメージファイルを/としてUbuntuが起動可能になります。

wubiは、それまでWindowsとLinuxのデュアルブートにつきものな、ディスク増設や空きパーティション作成といった手間やリスクを軽減した、手軽なLinuxインストール手段を提供しました。しかしそんなwubiも公式にサポートされていたのは8.04~12.10までで、リポジトリに現れていたのもせいぜい14.10まででした。その後はUEFI対応などが必要で開発も止まっていたのですが、非公式にフォークされたwubiuefiがUEFIに対応し、現在(20.04)も細々と利用者に愛用されています。

wubiのイメージ

(wubiでインストールした)Ubuntuが/としてマウントするNTFS上のイメージファイルをここでは「wubiのイメージ」と呼んでいます。このファイルはデフォルトでインストールした場合、C:\ubuntu\disks\root.diskになります。このファイルから、Linuxファイルシステム上のファイルを取り出すことが本記事のミッションです。

wubiのイメージの正体

wubiのイメージの正体は、パーティションイメージ(ext4)です。VirtualBoxなどではメディアにrawイメージを選べます(変換できる)が、これは通常ディスクイメージであり、パーティション単体ではありません。

wubiのイメージをvirtualboxからmountする

イメージのマウント方法

VirtualBoxは物理デバイスならパーティションを参照する形の仮想メディアは作れますが、イメージファイルでは無理なようです。なので、方法としては何らかの形でLinux上のファイルシステム上にイメージファイルとして出現させ、それをループバックマウントする形になります。

イメージファイルへのアクセス

いくつか方法はありますが、イメージファイルはとてもサイズが大きい(私の場合は200GBくらいあります)ので、おいそれとコピーをするわけにもいかず、せいぜい移動するくらいになります。すると、VirtuaBox上のLinuxからアクセスするとすると、共有フォルダを作成して、そこに移動するのが一番合理的になりそうです。

共有フォルダの作成

まずはGuest Additions CDを入れて、VirtualBox用の専用Linuxドライバを動かさないと共有フォルダは使えません。

専用Linuxドライバのインストール

基本はCDについている自動起動するスクリプトを動して再起動するだけなのですが、端末エミュレータソフト(xtermなど)がなかったり、基本的な開発用のパッケージ(ubuntuではbuild-essential)が入ってないとスクリプトが正しく動きません。

https://www.virtualbox.org/manual/ch04.html#mountingadditionsiso

ちゃんと入ると再起動後にドライバがこんな感じで出てきます。

$ lsmod | grep ^vbox
vboxsf                 81920  1
vboxvideo              36864  0
vboxguest             348160  6 vboxsf
$

共有フォルダの設定

こんな感じです。

ちゃんと設定できると、こんな感じに出てきます。

$ mount | grep sf_
vbox_shared on /media/sf_vbox_shared type vboxsf (rw,nodev,relatime,iocharset=utf8,uid=0,gid=998,dmode=0770,fmode=0770,tag=VBoxAutomounter)
$

ループバックマウント

あとは共有フォルダにroot.diskを入れて、ループバックマウントするだけです(今回は読み込み専用でマウント)。

$ cd /media/sf_vbox_shared # この名前は設定した共有名で変わります
$ ls -lAFh root.disk 
-rwxrwx--- 1 root vboxsf 205G  6月 25 17:51 root.disk
$ sudo mount -t ext4 -o ro,noload,loop root.disk /mnt/

これで/mntからアクセスできます。

まとめ

共有フォルダにイメージファイルを格納して、ext4でループバックマウントするだけ。