前回はon memory
mini-Plamoの機能確認
カスタマイズを行うまえに、このmini-Plamoのままで何ができるか確認しておきましょう。前回の手順のようにPlamo Linuxの
インストールされるパッケージ群は動作に必須のカーネルやglibc、シェル等だけでなく、coreutilsやutil_
またdhclientやsshdも自動起動するものの、デフォルトではrootユーザのssh接続は禁止しているので、このままでは外部から利用することができません。そこでテストを兼ねて一般ユーザ用のアカウントを作り、外部からのログインを試してみましょう。
まずはコンソールからrootでログインし新規ユーザを作ります。今回はユーザ名
一般ユーザ
mini-Plamoのカスタマイズ
前節で紹介したように、mini-Plamo環境はユーザの新規登録やパッケージの追加等も可能なものの、メモリー上に展開されたinitramfsで動いているため、電源を落せば元の状態に戻ってしまいます。永続的に使いたい機能はinitramfsに組み込む必要があり、そのためには前回VirtualBoxから吸い出したVboxHDDディレクトリに戻っての作業となります。
$ ls VBoxHDD/ bin/ dev/ home/ lib/ lost+found/ mnt/ root/ sbin/ tmp/ var/ cdrom/ etc/ init@ lib64/ media/ proc/ run/ sys/ usr/
手順としては、このVBoxHDD/以下にchrootして必要な設定やパッケージを追加し、その環境を再度initramfsにまとめ直す、ということになります。
まず、chroot先の環境から各種システム情報を利用できるようにするため、/proc、/sys、/devをVBoxHDD/以下にバインド・
$ sudo mount --bind /dev ./VBoxHDD/dev $ sudo mount --bind /proc ./VBoxHDD/proc $ sudo mount --bind /sys ./VBoxHDD/sys $ sudo mount -o loop,ro /Srcs/Plamo-8/plamo-8.2_x86_64_2024-03-29_usb.iso ./VBoxHDD/cdrom
あとはこのVBoxHDD/にchrootして、必要な設定やパッケージを追加するだけです。例として、先に試した
$ sudo chroot ./VBoxHDD/ # ls bin/ dev/ home/ lib/ lost+found/ mnt/ root/ sbin/ tmp/ var/ cdrom/ etc/ init@ lib64/ media/ proc/ run/ sys/ usr/ # adduser Can you read Japanese chars on this term? [Y/n] y Japanese mode 新しいユーザのログイン名を指定してください(8 文字以内)。 []: plamo plamo のユーザ ID は? [自動登録の場合は 1000 番台になります]: ... #
ついでにplamoユーザからsudoできるように、visudoで/etc/
# visudo ... ## User privilege specification ## root ALL=(ALL:ALL) ALL plamo ALL=(ALL:ALL) ALL ...
もう1ヵ所、/etc/
# vim /etc/fstab /dev/sda1 / ext2 defaults 1 1 ←この行を削除する。 /dev/sr0 /cdrom iso9660 user,ro,noauto,exec,iocharset=utf8 0 0 proc /proc proc defaults 0 0 tmpfs /run tmpfs defaults 0 0 ...
initramfs上の/etc/
前回の手順ではinitramfsを作成したのと同じ環境でテストしていたので、ルートパーティションの設定が残っていても露見しないため見逃してました。
さて、次に追加パッケージのインストールに移ります。loopbackマウントしたISOイメージは/cdrom以下に見えるので、/cdrom/
# ls /cdrom/ ChangeLog README efiboot.img plamo/ plamo-8.1 EFI/ contrib/ isolinux/ plamo-8.0 plamo-8.2 # installpkg /cdrom/plamo/02_devel/Python-3.11.8-x86_64-B1.tzst Python-3.11.8-x86_64-B1([required]) のインストール中 PACKAGE DESCRIPTION: Python: Python3 Python: Python: 仕様を洗練するために後方互換性を捨てて進化したPythonの新バー Python: ジョン。Python2と共存するためにコマンド名は python3 Python: になっています。 Python: Python-3.11.8-x86_64-B1 のインストールスクリプトを実行中 # python -V Python 3.11.8
インストールが終わればchroot環境を終了し、./
# exit $ for i in proc sys dev cdrom ; do > sudo umount ./VBoxHDD/$i > done $
あとは前回同様の方法でパッケージを追加したVBoxHDD/以下をinitramfsに固め、ISOimg/
$ su password: # cd VBoxHDD # find . | cpio -ov -Hnewc | zstd -12 > ../new_initramfs.tzst .... # cd .. ; ls -lh drwxr-xr-x 20 kojima users 313 4月 2日 12:40 VBoxHDD/ -rw-r--r-- 1 root root 820M 4月 3日 08:47 new_initramfs.tzst # ls -lh ISOimg/isolinux/ 合計 764M -rw-r--r-- 1 root root 746M 2月 27日 00:32 initramfs.tzst -rw-r--r-- 1 kojima users 44K 2月 27日 11:12 isolinux.bin -rw-r--r-- 1 kojima users 146 2月 27日 11:23 isolinux.cfg -rwxr-xr-x 1 kojima users 120K 2月 27日 11:12 ldlinux.c32* -rwxr-xr-x 2 kojima users 9.2M 2月 27日 11:13 vmlinuz* -rwxr-xr-x 2 kojima users 9.2M 2月 27日 11:13 vmlinuz-6.6.15-plamo64* # rm -f ISOimg/isolinux/initramfs.tzst # mv new_initramfs.tzst ISOimg/isolinux/initramfs.tzst # exit $ xorrisofs -o testimg_02.iso -b isolinux/isolinux.bin -no-emul-boot \ -boot-load-size 4 -boot-info-table ISOimg ... $ ls -lh *iso -rw-r--r-- 1 kojima users 755M 2月 27日 12:28 testimg.iso -rw-r--r-- 1 kojima users 829M 4月 3日 09:38 testimg_02.iso
追加したPython-3.
USBメモリからの起動
Plamo Linuxではこうして作ったmini-Plamoをインストーラの基盤に使っているものの、mini-Plamo自体は汎用的な小規模Linuxシステムなので、起動しなくなったPCを復旧する際のレスキューツールとしても使えます。
Plamo LinuxのインストーラはDVD用のISOイメージとして作成していて、USBメモリからインストールする際もISOイメージをベタ書きした疑似DVDとして扱っていますが、レスキューツールとして使う場合は書き込みもできるUSBメモリとして使えた方が便利です。そこで今回は通常のUSBメモリからmini-Plamoを起動する方法を紹介しましょう。もっとも、この話題は以前にも取り上げたことがあるので、詳しい話はそちらを参照してもらうことにして、以下では概要の紹介程度にします。
USBメモリ起動用のgrubイメージの作成
GRUB
$ grub-mkimage -v -p '' -o bootx64.efi -O x86_64-efi fat part_msdos iso9660 gzio \ all_video gfxterm font terminal normal linux echo test search configfile cpuid minicmd grub-mkimage: 情報: the total module size is 0x92170. grub-mkimage: 情報: reading /usr/lib/grub/x86_64-efi/kernel.img. grub-mkimage: 情報: locating the section .text at 0x0. ... grub-mkimage: 情報: kernel_img=0x7fdfdfe60010, kernel_size=0x1e000. grub-mkimage: 情報: the core size is 0xb0170. grub-mkimage: 情報: writing 0xb4000 bytes. $ ls -lh bootx64.efi -rw-r--r-- 1 kojima users 720K 4月 3日 13:36 bootx64.efi $ file bootx64.efi bootx64.efi: PE32+ executable (EFI application) x86-64 (stripped to external PDB), for MS Windows, 4 sections
USBメモリ上に起動用領域を設置
作成したUEFI用grubブートローダ
$ mkdir -p /USB/EFI/BOOT $ cp bootx64.efi /USB/EFI/BOOT
カーネルとinitramfsはISOイメージ同様、isolinuxディレクトリに収めることにします。
$ mkdir -p /USB/isolinux $ cp ISOimg/isolinux/{vmlinuz-6.6.15-plamo64,initramfs.tzst} /USB/isolinux
grubブートローダ用の設定ファイル
$ cat << EOF > /USB/EFI/BOOT/grub.cfg menuentry "mini-Plamo on USB" { linux (hd0,msdos1)/isolinux/vmlinuz-6.6.15-plamo64 root=/dev/ram0 ro net.ifnames=0 edd=off initrd (hd0,msdos1)/isolinux/initrd.tzst } EOF $
UEFIな起動用USBメモリは以上の設定で完成です。後はPC起動時のUEFIメニューから起動デバイスとしてUSBメモリ上のUEFI環境を指定するだけです。
UEFI用ISOイメージの作成
さて、ついでなのでUEFI環境で起動できるISOイメージも作ってみましょう。ISOイメージをUEFI経由で起動する場合、前回紹介したsyslinuxのisolinux.
まず、ブートローダ
$ dd if=/dev/zero of=efiboot.img bs=1k count=1440 1440+0 records in 1440+0 records out 1474560 bytes (1.5 MB, 1.4 MiB) copied, 0.0337408 s, 43.7 MB/s $ /usr/sbin/mkfs.msdos -F 12 -M 0xf8 efiboot.img mkfs.fat 4.2 (2021-01-31)
作成したFDイメージファイル
$ mkdir /tmp/loop $ sudo mount -o loop efiboot.img /tmp/loop $ sudo mkdir -p /tmp/loop/EFI/BOOT $ sudo cp bootx64.efi /tmp/loop/EFI/BOOT
作成したefiboot.
$ sync ; sudo umount /tmp/loop $ mv efiboot.img ./ISOimg
UEFI環境でDVDメディア
一方、UEFIから起動されたbootx64.
$ mkdir -p ./ISOimg/EFI/BOOT $ cat << 'EOF' > ./ISOimg/EFI/BOOT/grub.cfg menuentry "mini Plamo on UEFI" { linux (cd0)/isolinux/vmlinuz-6.6.15-plamo64 root=/dev/ram0 rw net.ifnames=0 edd=off initrd (cd0)/isolinux/initramfs.tzst } EOF $
ここまでの作業の結果として、ISOimg以下は以下のようなファイル構成になります。
$ find ISOimg/ ISOimg/ ISOimg/isolinux ISOimg/isolinux/isolinux.bin ISOimg/isolinux/ldlinux.c32 ISOimg/isolinux/vmlinuz-6.6.15-plamo64 ISOimg/isolinux/vmlinuz ISOimg/isolinux/isolinux.cfg ISOimg/isolinux/initramfs.tzst ISOimg/EFI ISOimg/EFI/BOOT ISOimg/EFI/BOOT/grub.cfg ISOimg/efiboot.img
UEFI対応のISOイメージを作成するにはxorrisofsにいくつか指定を追加する必要があります。追加したオプションは、-eltorito-alt-bootがEl Toritoの起動方法に代替がある指定で、-eltorito-platform efiはその代替環境はUEFIであり、その環境で起動する場合は"efiboot.
$ xorrisofs -o uefi_test.iso -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table \ -eltorito-alt-boot -eltorito-platform efi -eltorito-boot efiboot.img ISOimg
こうして作ったISOイメージ
今回もずいぶん駆け足になってしまったものの、mini-Plamoのようなinitramfs環境の可能性を感じてもらえたでしょうか?
最近のOSは数千を越えるファイルやディレクトリから組み立てられた壮大な構築物ですが、initramfsを使えばそれらを1つのファイルに封じ込めることができ、カーネルやブートローダと言った少数のパーツと組み合わせるだけでDVDやUSBメモリといったさまざまな環境上で利用できます。
initramfsのこの特徴は、インストーラや起動時のモジュール組み込みのみならず、レスキューツールやキオスクPC、ファイルサーバ、ルータ/ブリッジといったさまざまな用途に応用できるでしょう。
用途や使い方が厳しく制限される商用ソフトウェアとは異なり、アイデアや工夫次第で無限の可能性が広がるのがOSSの魅力です。その魅力の一端でも読者の方に伝えることができれば幸いです。