#目的
「一般的なWindowsPC」さえあればできるだけ元の環境を汚さずに寄生して自分用のLinuxを利用できる万能USBメモリを作るためのリンク・メモ
#機能
USBメモリ1つで下記の機能を実現する
- BIOSによるLinuxブート・利用
- UEFIによるLinuxブート・利用
-
USBメモリ内のPortable-VirtualBox経由でのLinuxの利用※現在これに対応するのは困難
#おおまかな手順
- パーティションの分割
- Linuxのインストール(BIOSブート)
- UEFIブート環境を設定
- Portable-Virtualboxのインストール・設定
- ハードウェアクロックをローカルタイムに設定
#パーティションの分割
上記の機能を実現するために、USBメモリのパーティションを2つ(swap領域も作るのなら3つ)に分割する。
- FAT32(UEFIブート・Portable-VirtualBox用)
- ext4他(Linux本体用)
- swap領域(作らなくても動く)
※インストール時にパーティション構成ごと変更してしまうChromiumOS等では下記の手段は使えない。そもそもVirtualBoxのGuestAdditionalに対応していないのでできたとしても大してメリットもないですが。
上記のパーティションの分割さえできればWindows上で行ってもLinuxインストール時に行っても問題ないです。
Windows上で行う場合は標準の機能では分割できないようなので分割ソフト(フリー版もあり)を別途インストールするか、VirtualBox内でLinuxインストールするついでに分割する。
#Linuxインストール
※Linuxのインストール方法そのものについては触れません
ここで気をつけることはデストリビューションによってはインストーラーをブートした方法に合わせてブートローダーを設定するのでその場合インストールするDVDまたはISOファイルをBIOSでブートすること。
UEFIでしかブートできないPCの場合はVirtualBox内でインストールする。(システムのEFIを有効化をチェックしないでおくとBIOSでブートする)
VirtualBoxでインストールする場合、USBメモリを認識させる方法が2種類あるが一長一短なので状況に合わせて選択する。
-
USBデバイスとしてゲスト側に認識させる
長所: ホスト側は完全に認識しなくなるので競合する不安がない
短所: ExtensionPack及び専用のデバイスドライバーをインストールする必要がある
-
USBメモリを指すVMDKファイルを作成しストレージに設定
長所: ExtensionPackや専用のドライバーをインストールする必要がない
短所: VMDKファイルをコマンドラインで作成する必要がある
Virtualboxを管理者権限で起動する必要がある(なおPortable-VirtualBoxは常に管理者権限で起動するようになっている)
ホスト側が認識しているパーティション(!)を読み書きしようとするとアクセス拒否で停止するので工夫が必要
USBメモリを指すVMDKファイルを作成する方法はこちらを参照
http://app-review.poox.xyz/archives/1625
上記の通りVMDKを利用する場合はアクセス拒否されないよう、Linuxをインストールする予定のパーティションをWindowsでは認識できないファイルシステムまたは未割り当て状態にしておく。
試した範囲ではWindows用のパーティション分割ソフトでパーティション分割し、VMDKファイルを作成してVirtualBox内でLinuxインストールが最も手軽で環境もさほど汚さない(分割ソフトインストールの影響だけ)と思われる、後述のPortable-VirtualBox環境を構築済みならVMDKファイル作成の手間が省けるので更に簡単。
一切環境を汚せない場合はLiveDVDまたはLiveLinux起動用USBメモリを別途用意して起動しそこから目的のUSBメモリをパーティション分割またはLinuxインストールまでしてしまうのが確実。(間違って本体のHDD/SSDにパーティション設定、インストールしてしまわないように注意)
#UEFIブート環境の設定
fatまたはvfatと書いてあるが、FAT32でも同様、上記のgrub.cfgの内容で(hd0,msdos2)となっている部分はパーティションの切り方(基本パーティション・論理パーティション等)によって(hd0,msdos5)等になる場合もあるのでインストール時やパーティション管理ツールで確認する(/dev/sd?の後の数字と一致している)
また上記の方法だと、UEFIブート時にフォントがない旨のエラーが出るので(ブート自体は無事に完了する)気になる場合は/EFI/BOOT/fontsフォルダを作って/usr/share/grub(ubuntu系ディストリビューションの場合)のunicode.bf2をコピーする。
一度この作業を完了すればパーティションの構成を変えない限り別のUSBメモリに移行する際もそのままファイルを新しいUSBメモリ(FAT32領域に)コピーするだけでUEFIブートができるようになる。
(前述のパーティションの切り方が違う場合はgrub.cfgを編集する必要あり)
#Portable-VirtualBoxのインストール・設定
注意
2021年8月現在Portable VirtualboxがVirtualbox 6.1に対応していないため、下記の手順は使えない。
6.0以前(サポート終了)を使うか自力でソースを修正してコンパイルする必要がある。
Oracle VirtualBox v6.1.xxのポータブル化
liliも放棄宣言をしている。
旧手順
http://www.vbox.me/
からダウンロード・インストール。
そのままでは対応するVirtualBoxのバージョンが古く、Windows10では動作しない(起動せず即終了する)ため別に新しいバージョンのVirtualBoxを公式サイトよりダウンロードしてそのファイルをインストールファイルのパスに指定してインストールする。
VirtualBoxは通常ではUSBメモリからのブートに対応していないため、上記のようにUSBメモリを指すVMDKを作成してストレージとして認識させてブートするのが常套手段だが、Windowsの場合ドライブの構成によってUSBメモリを指すデバイス番号が変わるため、PCによっては都度VMDKを作り直す必要があるが、いちいち番号を調べてコマンドラインで作っていられないので工夫をする。
https://www.linuxliveusb.com/
LinuxLive USB Creator(lili)には専用のPortable-VirtualBoxからのLiveブートにも対応しているが、これを実現するためにデバイス番号を取得してVMDKを都度自動作成する機能が組み込まれているのでこれを拝借する。
の「Portable-VirtualBox 5.0.16」がlili版のPortable-VirtualBox(zipファイル)なのでこれをダウンロード・解凍する。
lili版のVirtualBoxフォルダ内の2つのEXEファイルをFAT32パーティションのルートフォルダにコピー。
lili版のVirtualBox\Portable-VirtualBoxフォルダ内のdataフォルダ、linuxliveフォルダをUSBメモリのPortable-VirtualBoxフォルダ内に上書きコピー。
USBメモリにインストールしたオリジナルのPortable-VirtualBox.exeは使えないので適当なファイル名(Portable-VirtualBox-Original.exe等)にリネームし、lili版のPortable-VirtualBox.exeをコピー。
64bit版のLinuxをインストールした場合、そのままではブートしないのでルートフォルダのVirtualBox.exeを起動し、LinuxLive仮想マシンの「設定」→「一般」→「基本」タブ→「バージョン」の「Other Linux(32-bit)」を「Ubuntu(64-bit)」等に変更する。
これでVirtualize_This_Key.exeを起動するとVirtualBoxからLinuxのブートが始まりWindows内でLinuxが利用できるようになる。
一度上記の作業をすればUSBメモリを移行する時もFAT32領域にファイルをそのままコピーするだけでPortable-VirtualBox環境が完成するので移行のたびに同じ作業を繰り返さなくてもよい。
#ハードウェアクロックをローカルタイムに設定
Windowsは特に設定しなければハードウェアクロック(PC本体が記憶している時計)をローカルタイムとして扱うが、LinxuではほとんどのデストリビューションでハードウェアクロックをUTCとして扱うので、そのままだと時間が(日本の場合)9時間ずれて表示されるため、この場合は通常のWindowsの挙動に合わせてハードウェアクロックをローカルタイムとして扱うようにLinuxおよびVirtualboxの設定を変更する。
Virtualboxでは「設定」→「システム」→「マザーボード」タブ→「拡張機能」の「ハードウェアクロックをUTCにする」のチェックを外すとローカルタイムとして扱うようになる。
Linuxではデストリビューションやそのバージョンによってやり方が異なるためインストールしたLinuxに合わせて変更する。
最新のUbuntu系デストリビューションの場合は
sudo timedatectl set-local-rtc 1
sudo hwclock -D --systohc --localtime
でハードウェアクロックをローカルタイムとして扱う。