UEFIでなくLegacy BIOSの場合、MBRにはGrub4Dosをインストールし、Grub4Dosが起動して Grub2 にチェインする。これが grub2configのやり方。FrugalPupを踏襲したもの。
この場合、起動パーティションが vfatまたはNTFS、また ext2やext3は問題がない。起動パーティションが ext4(64bit)のときは、為す術が無い。
ext4(64bit)の場合だけ Grub4Dosに代えて Extlinuxを使おうか?
しかしなぜチェインが必要か? grub2を直接MBRに書き込めば良いのではないか。その方法が分からなかった。
もちろん、grub-installコマンドでそれはできる。そのために複雑なGrub2の全体をインストールしなければならないので、簡素を旨とするパピーにそれはやりたくない。
次の方法を考えました。じっさいの作業は VirtualBox上で。
1. BionicPup32をライブ起動、あるいはHDDにインストール。
2. grub2_2.0.2 をインストール。Puppyパッケージマネージャーから。
3. USBメモリを差し第一パーティションをマウント。/mnt/sdb1 となった。
4. 次のコマンドを実行。
grub-install --no-floppy --modules="ext2 fat ntfs part_msdos" --boot-directory=/mnt/sdb1/boot.pup --target=i386-pc /dev/sdb
/mnt/sdb1 に boot.pup フォルダができた。boot.pup/grub/grub2.cfg とフォントを加えて tar.xz にアーカイブ。
5. /dev/sdb のMBRに grub2のIPLがあるはずなので、それを取り出す。
dd count=100 if=/dev/sdb of=grub2.mbr
ブロックサイズはデフォルトの512byteなので、count=100というのは 50kB。さきのコマンドで作られた core.imgは 32kBなので、たぶんMBR先頭50kB内にIPLは収まっているだろうという推測(希望?)
こうして取り出した grub2.mbr の先頭部分にはパーティション・テーブルが含まれているので、これを別のディスクにそのまま書き込むと、そのディスクのパーティション・テーブルを壊してしまう。
ターゲット、ここでは /dev/sdx への書き込みはひと手間かかる。
dd bs=446 if=grub2.mbr of=/dev/sdx ;# IPLの先頭部分
(残り64byteがパーティション・テーブル)
dd bs=1 count=2 seek=510 skip=510 if=grub2.mbr of=/dev/sdx ;#先頭セクタ512byte中最後の2byteで、IPL有効の印 (0xAA55)
dd seek=1 skip=1 if=grub2.mbr of=/dev/sdx ;# IPLの続き
ネット上で見つけた参考記事→
https://www.hazymoon.jp/OpenBSD/arch/i3 ... cture.html
grb2config-2.1 で実装しました→
https://sakurapup.com/forum1/viewtopic. ... 312#p29312