Palm84 某所の日記

死のうは一定、しのびクマには何しよぞ...

【USBメモリ】おら partnew コマンドでisoブートすっただ!【マルチブート】

grub4dos の partnew コマンド利用で簡単isoマルチブートしてみたYO!

f:id:palm84:20181224081225p:plain

partnew コマンドの詳細については grub4dos の ReadMe をご参照あれ。

f:id:palm84:20181224081230p:plain

設定は簡単ですが汎用性は低そうかなと思います。パーティションテーブルを弄るので壊れる可能性も若干ありそうな気がしないでもない(※ partnew で作成した仮想?パーティション以外の実在パーティションやisoと別のドライブのパーティションはエラーとなりますけど)。バックアップを取ったうえで、自分専用や実験・確認用にはいいかも。

やることはこんだけ

  1. isoをUSBメモリのルートへコピー
  2. ルートに menu.lst をちょちょっと書く
  3. USBメモリへ grub4dos をインストール

元のisoファイルは触る必要なっしんぐ。

どんなかんじでブートすんの?

f:id:palm84:20181224081235p:plain

  • Puppy Linux Precise-550JP
title precise-550JP.iso
partnew (hd0,3) 0x00 (hd0,0)/precise-550JP.iso 
map (hd0,0)/precise-550JP.iso (0xff) 
map --hook
chainloader (0xff)
  1. partnewhd0,3 (= sdx4)作成
    • iso の内容hd0,3 にマウント(これは仮想パーティションみたいなかんじ)
  2. 実在isoをマウントして kernel, initrd をロードして小さなLinux起動
  3. 小さなLinux起動後に hd0,3 内のルートイメージをマウントして大きなLinux起動

sdx4 は Windows のディスクの管理では存在しない、Linux の parted, GParted でも同じ。fdisk では下記の通り表示されます。サイズはisoと同量。type は 00 (Empty)。

Disk /dev/sdb: 3965 MB, 3965714432 bytes
255 heads, 63 sectors/track, 482 cylinders, total 7745536 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0000f788

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *        2048     7745535     3871744    b  W95 FAT32
/dev/sdb4           19016      371843      176414    0  Empty

マウントすると type は iso9660。

/dev/sdb4 on /mnt/sdb4 type iso9660 (ro,relatime,iocharset=utf8)
menu.lst 一例

【追記】万が一の為、(hd0,3) にファイルが存在する場合は partnew を実行せずにメインメニューに戻るようにしてみた。(ls (hd0,3)/ && configfile /menu.lst)

color white/blue yellow/cyan

title ubuntu-ja-13.04-desktop-i386.iso
ls (hd0,3)/ && configfile /menu.lst
partnew (hd0,3) 0x00 (hd0,0)/ubuntu-ja-13.04-desktop-i386.iso 
map (hd0,0)/ubuntu-ja-13.04-desktop-i386.iso (0xff) 
map --hook
chainloader (0xff)

title knoppix_v7.0.2DVD_20120530-20120615.iso
ls (hd0,3)/ && configfile /menu.lst
partnew (hd0,3) 0x00 (hd0,0)/knoppix_v7.0.2DVD_20120530-20120615.iso 
map (hd0,0)/knoppix_v7.0.2DVD_20120530-20120615.iso (0xff) 
map --hook
chainloader (0xff)

title KNOPPIX_V7.2.0CD-2013-06-16-JA-LCR.iso
ls (hd0,3)/ && configfile /menu.lst
partnew (hd0,3) 0x00 (hd0,0)/KNOPPIX_V7.2.0CD-2013-06-16-JA-LCR.iso 
map (hd0,0)/KNOPPIX_V7.2.0CD-2013-06-16-JA-LCR.iso (0xff) 
map --hook
chainloader (0xff)

※ KNOPPIX DVD版は 4 GiB あるので FAT32フォーマットではだめです。

Puppy はこんなかんじの方がいいかもしれない。(もしくは、iso内の menu.lst 修正でも)

title precise-550JP.iso
ls (hd0,3)/ && configfile /menu.lst
partnew (hd0,3) 0x00 (hd0,0)/precise-550JP.iso 
map (hd0,0)/precise-550JP.iso (0xff) 
map --hook
root (0xff)
kernel /vmlinuz pmedia=usbflash pfix=fsck
initrd /initrd.gz
注意点
  • PLoP Boot Manager 経由では書き込み不可となるので partnew コマンド実行不可
  • isoが断片化してるとだめ
  • 毎回パーティションテーブルを書き換えるのでちょっとコワいYO!

確認したもの・・・

  • Ubuntu 日本語 Remix
    • ubuntu-ja-13.04-desktop-i386.iso
    • ubuntu-ja-11.10-desktop-i386
  • KNOPPIX 日本語版
    • KNOPPIX_V7.2.0CD-2013-06-16-JA-LCR.iso (ライブCDの部屋)
    • knoppix_v7.0.2DVD_20120530-20120615.iso (産総研)
  • Puppy Linux 日本語版
    • precise-550JP.iso
    • lupu-528JP.iso
    • wary-511-01j-k2.6.32.28-small.iso
    • pup_431JP2012.iso

KNOPPIX や Ubuntu は元々isoブート対応ですけど、Puppy などマルチにするには楽でいいかもしれない。

grub4dos のインストール

RMPrepUSB、または BOOTICE がおすすめ。

※ フォーマットは必須ではござらぬ。ブートできない時は試行するべし。(ファイルはすべて消えるのでご注意!)

f:id:palm84:20181224081240p:plain

BOOTICE の方はなんかウイルス疑惑されてるみたいなのでリンクは割愛しときます。

f:id:palm84:20181224081245p:plain

【追記】パーティション・テーブル

sdb4 の位置は sdb1 内になってるので、sdb1 内のisoを配置(loopback マウント?)してるみたいです。つまり、sdb4 は実体のない仮想的なパーティションってことかな。

RMPrepUSB フォーマット + Ubuntu 13.04 起動後
  • ubuntu-ja-13.04-desktop-i386.iso (898 MiB)
  • RMPrepUSB v2.1.709 使用
  • Boot as HDD (C: 2PTNS) 指定でフォーマット
  • fdisk の出力
ディスク /dev/sdb: 3965 MB, 3965714432 バイト
ヘッド 122, セクタ 62, シリンダ 1024, 合計 7745536 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスク識別子: 0x2ea082ee

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdb1   *          63     7743329     3871633+   b  W95 FAT32
/dev/sdb2         7743330     7743392          31+  21  不明
/dev/sdb4         2032712     3871815      919552    0  空
  • パーティション・テーブル
---------------------------------------------------------
ADDRESS   00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
---------------------------------------------------------
000001B0  00 00 00 00 00 00 00 00 EE 82 A0 2E 00 00 80 01
000001C0  01 00 0B FE 7F E1 3F 00 00 00 23 27 76 00 00 00
000001D0  41 E2 21 00 7F E2 62 27 76 00 3F 00 00 00 00 00
000001E0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 87
000001F0  12 7E 00 02 19 F1 48 04 1F 00 00 10 1C 00 55 AA

sdb4 の詳細は、

  • 開始位置 : 0x001f0448 = 2032712 = 992 MiB (終了 = 3871815 =1890 MiB)
  • セクタ数 : 0x001c1000 = 1839104 = 898 MiB
BOOTICE フォーマット + Puppy precise-550JP 起動後
  • precise-550JP.iso (172 MiB)
  • BOOTICE 1.0.4 使用
  • USB-HDD mode (Single Partition)
  • Start LBA = 2048 指定でフォーマット
  • fdisk の出力
Disk /dev/sdb: 3965 MB, 3965714432 bytes
255 heads, 63 sectors/track, 482 cylinders, total 7745536 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0000f788

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *        2048     7745535     3871744    b  W95 FAT32
/dev/sdb4           19016      371843      176414    0  Empty
  • パーティション・テーブル
---------------------------------------------------------
ADDRESS   00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
---------------------------------------------------------
000001B0  00 00 00 00 00 00 00 00 88 F7 00 00 00 00 80 FE
000001C0  FF FF 0B FE FF FF 00 08 00 00 00 28 76 00 00 00
000001D0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000001E0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2E
000001F0  36 01 00 25 12 17 48 4A 00 00 3C 62 05 00 55 AA

sdb4 の詳細は、

  • 開始位置 : 0x00004a48 = 19016 = 9.28 MiB (終了 = 371842 = 181 MiB)
  • セクタ数 : 0x0005623c = 352828 = 172 MiB

ほなの。