ここしばらく年末年始の雑用に忙殺されて間が空いてしまったものの、前回紹介した既存インストーラの改造に続き、今回はインストーラ用にinitramfsを新しく作成する手順を紹介しましょう。
仮想環境で小規模システムの構築
前回も触れたように、Plamo Linuxのインストーラは小さいながらも独立したLinux環境なので、カーネルやCライブラリ、シェル、設定ファイル、各種ツール等が必要になります。それらを手っ取り早く揃えるには仮想マシン上に小規模なシステムを構築するのが簡単で、今回はVirtualBoxを使ってインストーラ用のシステムを作ってみます。
コンテナ環境LXCにはPlamo用のコンテナを作るためのテンプレートが用意されているので、"lxc-create"コマンド1つで小規模なPlamo環境を作ることが可能なものの、この方法で作った環境は設定ファイルの一部がコンテナ用にカスタマイズされるため、自立した環境として使うには向いていません。
VirtualBoxにはインストールに使うISOイメージに応じて各種ディストリビューションに適した環境を自動的に用意する機能がありますが、残念ながらPlamo Linuxは対象外なので、今回は
EFIへの対応はインストーラではなくブートローダの仕事なので、この環境でEFIの有無は関係ありません。
ISOイメージから起動してroot/
インストールするパッケージは"01_
インストール方法は"RECOM"を指定し、"00_
インストールが終了すれば再起動し、新しい環境が正しく動作することを確認します。確認できればいったんshutdownし、仮想マシンを停止します。
インストールしたシステムの吸い出しとinitramfs化
次は、この仮想環境のファイル一式をホスト側に吸い出す作業です。その際にはVirtualBoxに付属のvboximg-mountコマンドが便利です。"vboximg-mount"は、VirtualBoxが利用している仮想HDDをfuseを使ってホスト側から見えるようにするためのツールです。
"vboximg-mount"はVirtualBoxと共にインストールされ、通常は/opt/
fuse
$ sudo modprobe fuse
デフォルトでは、fuseマウントした環境はそのマウントを実行した利用者しかアクセスできないものの、ファイルの吸い出しはroot権限で実行したいため、他の利用者からもfuseマウント環境を利用可能にしておきます。そのためにはfuse用の設定ファイル/etc/
$ cat -n /etc/fuse.conf 1 # Set the maximum number of FUSE mounts allowed to non-root users. ... 8 # 9 user_allow_other
まずは、vboximg-mount -lでVirtualBox用に作成した仮想HDDを調べます。VirtualBoxが使用するHDDは、ファイルシステム上の位置に関係なくUUIDで識別されます。
$ vboximg-mount -l ----------------------------------------------------------------- VM: Plamo_installer UUID: 8b803653-d056-4a96-bcd4-73b43dd98db2 Image: Plamo_installer.vdi UUID: 4792f9c4-244a-4017-a3c6-552d923e2edd
次にこの仮想HDDを適当なディレクトリにマウントします。fuseマウントは空でないディレクトリにマウントしようとするとエラーになるので、新たに"Tmpmnt"というディレクトリを作り、そこにマウントすることにします。"-o allow_
$ mkdir ./Tmpmnt $ vboximg-mount -i 4792f9c4-244a-4017-a3c6-552d923e2edd -o allow_root ./Tmpmnt $ ls ./Tmpmnt/ Plamo_installer.vdi@ vhdd vol0
この Tmpmnt/以下に見えているのがVirtualBoxの仮想HDDの内部構成で、そのうちの"vol0"が実際のファイルシステムイメージです。このファイルシステムイメージをloopback経由でマウントして中身を取り出そう、というわけです。
$ sudo mount -o loop ./Tmpmnt/vol0 /loop $ ls /loop bin/ cdrom/ etc/ lib/ lost+found/ mnt/ root/ sbin/ tmp/ var/ boot/ dev/ home/ lib64/ media/ proc/ run/ sys/ usr/
仮想HDDを壊すと面倒なので、以後の作業用に/loop以下の環境一式を新たに作成したVboxHDDディレクトリに吸い出しておきます。
$ su # mkdir VboxHDD ; cd VboxHDD # cp -av /loop/* . '/loop/bin' -> './bin' '/loop/bin/bzip2' -> './bin/bzip2' '/loop/bin/dialog' -> './bin/dialog' ... # ls -alr 合計 32,768 drwxr-xr-x 12 root root 190 3月 1日 2022年 var/ drwxr-xr-x 15 root root 221 4月 18日 2023年 usr/ drwxrwxrwt 2 root root 10 5月 30日 2017年 tmp/ ...
ここまでの操作で./
# ln -sf ./sbin/init . # ls -l 合計 28,672 drwxr-xr-x 2 root root 4,096 2月 25日 14:38 bin/ ... lrwxrwxrwx 1 root root 11 2月 26日 23:45 init -> ./sbin/init* ...
この環境のboot/以下には起動用のカーネルイメージが置かれているものの、initramfsはブートローダによってカーネルと共に読み込まれるので、内部にカーネルを置く必要はありません。もっとも、ここにあるカーネルイメージは後でisolinux用に使うので、削除するのではなく、このディレクトリの外側に移動させておきましょう。
# mv boot ../
次に、この環境をinitramfs化するためcpio + zstdで固めます。
# find . | cpio -ov -Hnewc | zstd -12 > ../initramfs.tzst . ./bin ./bin/bzip2 ./bin/dialog ... ./var/db/sudo/lectured ./var/krb5kdc ./init 4068768 ブロック # ls -lh ../initramfs.tzst -rw-r--r-- 1 root root 746M 2月 27日 00:04 ../initramfs.tzst
これで最新のPlamo Linuxを使った新しいinitramfsが完成しました。次に、このinitramfsをカーネルと共に読み込むブートローダを用意します。
syslinux/isolinuxの設定
カーネルやinitramfsをメモリに読み込むのがブートローダの役割です。Linux用のブートローダと言うと"GRUB2"を連想するものの、CD/
syslinuxの開発はここ10年ばかり停滞していて、公式リリースは2014年のsyslinux-6.
さて、まずはsyslinux-6.
$ wget https://mirrors.edge.kernel.org/pub/linux/utils/boot/syslinux/6.xx/syslinux-6.03.tar.xz ... mirrors.edge.kernel.org (mirrors.edge.kernel.org)|147.75.48.161|:443 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 6855224 (6.5M) [application/x-xz] `syslinux-6.03.tar.xz' に保存中 ... $ tar xvf syslinux-6.03.tar.xz syslinux-6.03/ syslinux-6.03/efi32/ syslinux-6.03/efi32/com32/ ...
取り出されたsyslinux-6.
$ ls syslinux-6.03/bios codepage/ core/ dos/ extlinux/ libinstaller/ lzo/ memdisk/ sample/ utils/ version.h win64/ com32/ diag/ dosutil/ gpxe/ linux/ mbr/ mtools/ txt/ version.gen win32/ $ ls syslinux-6.03/bios/core/ elflink/ isolinux-debug.bin kwdhash.gen ldlinux.bss legacynet/ lpxelinux.bin lzo/ pxelinux.0 thread/ fs/ isolinux.bin ldlinux.bin ldlinux.sys lpxelinux.0 lwip/
これらを使って起動可能なISOイメージを作成するため、まずは"ISOimage"という作業用ディレクトリを作り、その下にブート用ファイルを収める"isolinux"ディレクトリを作ります。
$ mkdir -p ISOimage/isolinux $ ls ISOimg/ isolinux/
このisolinuxディレクトリに作成したinitramfsイメージとカーネルを配置します。最後のハードリンクはISO9660形式のファイル名制限を回避するための別名付けです。
$ cd ISOimg $ mv ../initramfs.tzst ./isolinux $ mv ../boot/vmlinuz-6.6.15-plamo64 ./isolinux $ ( cd isolinux ; ln vmlinuz-6.6.15-plamo64 vmlinuz )
次にsyslinux-6.
$ cp ../syslinux-6.03/bios/core/isolinux.bin isolinux/ $ cp ../syslinux-6.03/bios/com32/elflink/ldlinux/ldlinux.c32 isolinux/
次にisolinux.
$ cat -n isolinux/isolinux.cfg 1 prompt 1 2 timeout 100 3 default pl_install 4 5 label pl_install 6 kernel vmlinuz 7 append initrd=initramfs.tzst root=/dev/ram0 ro net.ifnames=0 edd=off
1-3行目は
必要なファイルが用意できたので、xorrisofsでこれらをISOイメージにまとめます。その際、isolinux/を含むディレクトリが指定対象になるので、作業用ディレクトリ
$ cd .. ; ls ISOimg isolinux/ $ ls ISOimg/isolinux/ initramfs.tzst isolinux.bin isolinux.cfg ldlinux.c32* vmlinuz* vmlinuz-6.6.15-plamo64* $ xorrisofs -o testimg.iso -b isolinux/isolinux.bin -no-emul-boot \ -boot-load-size 4 -boot-info-table ISOimg GNU xorriso 1.5.6.pl01 : RockRidge filesystem manipulator, libburnia project. Drive current: -outdev 'stdio:testimg.iso' Media current: stdio file, overwriteable Media status : is blank ... Written to medium : 386549 sectors at LBA 0 Writing to 'stdio:testimg.iso' completed successfully. $ ls -lh testimg.iso -rw-r--r-- 1 kojima users 755M 2月 27日 11:44 testimg.iso $ file testimg.iso testimg.iso: ISO 9660 CD-ROM filesystem data 'ISOIMAGE' (bootable)
"xorrisofs"に与えたオプションを説明しておくと、"-o testimg.
ISOイメージからのブートは"El Torito
新しいISOイメージのテスト
さて、それでは新たに作成したISOイメージからの起動を試してみましょう。そのためには最初に作ったVirtualBox環境を流用するのが簡単です。
まず、中身を吸い出すためにマウントした仮想HDDをアンマウントします。これを忘れると
$ sudo umount /loop $ umount Tmpmnt
次に仮想マシンの
この状態で起動すると、新たに作成した"testimg.
10秒ほど待つか、リターンキーを押せば、isolinux.
今回は仮想環境にインストールしたPlamo Linuxをinitramfs化して、on memoryで動かすまでの手順を紹介しました。この環境はインストール済みのパッケージこそ少ないものの、通常のPlamo Linux同様に使えるので、一般ユーザを作成したり、パッケージをネットワーク経由でダウンロード、インストールして、機能を追加することも可能です。しかしながら、initramfs上で動いているため電源を落すと追加した機能は消えてしまいます。そこで次回はこの環境をカスタマイズする方法を考えます。