玩式草子─ソフトウェアとたわむれる日々

第11回P-Plamoのカスタマイズその1]

前回までにP-Plamoの概要や起動処理について解説しました。その際にも触れたように、P-PlamoではPlamo Linuxの環境をできるだけ変更せずに使うために、liveDVD化に必要な処理は起動時のinitrdに集め、squashfsに収めたPlamo Linuxには、自らが特殊な環境で動いていることを意識させないような作りにしています。また、liveDVD化の処理を担うinitスクリプトも、前回までに紹介したように、簡単なシェルスクリプトになっています。

そのため、Plamo Linuxを使い慣れた人なら、パッケージを取捨選択して自分好みの環境を作ったり、特定用途向けにチューニングするなど、P-Plamoを比較的簡単にカスタマイズできるでしょう。そのようなカスタマイズの例として、今回はP-PlamoをUSBメモリから起動する方法を紹介します。

USBメモリへのインストール

現在のP-PlamoはDVDのイメージファイルの形で公開しています(たとえばP-Plamo-100329_dvd.iso⁠。このイメージファイルは、isolinuxをブートローダにして、mkisofsコマンドでEl Torito形式でブート可能にしています。今までに紹介してきたsquashfs化したルートファイルシステムやinitスクリプトを含むinitrdなどは、全てこのイメージファイルの中に含まれています。

P-PlamoをDVDから起動して使うには、このイメージファイルをダウンロードして、cdrecordgrowisofsコマンドでDVDメディアに書き込めばいいわけですが、P-PlamoをUSBメモリから起動するには、上記DVDのイメージファイルの中からsquashfs化したルートファイルシステムやinitrd等の必要なファイルを取り出して、それらを直接USBメモリ上に配置する必要があります。また、USBメモリから起動するためにはsyslinuxというブートローダをUSBメモリの先頭部分に書き込んでやる必要があります。

これらの作業はPlamo Linuxから行うことも可能ですが、P-Plamoにも必要なコマンドは用意しているので、以下ではDVDメディアから起動したP-Plamo環境で、P-PlamoをUSBメモリにインストールする手順を紹介しましょう。

まずDVDメディアからP-Plamoを起動し、root権限でログインしておきます。P-Plamoではrootのパスワードはpasswordにしています。

P-Plamo login:root
Password:password
P-Plamo:~# 

USBメモリを挿入します。しばらく待つと画面上にカーネルがUSBメモリを認識した旨の表示が出ます。

P-Plamo:~# sd 7:0:0:0 [sdb] Assuming drive cache: write through
sd 7:0:0:0: [sdb] Assuming drive cache: write through

この例ではUSBメモリは/dev/sdbとして認識されたことがわかりますが、念のためにfdisk -lでディスクのリストを確認しておきます。

P-Plamo:~# fdisk -l

ディスク /dev/sda: 100.0GB, 100030242816 バイト
ヘッド 240, セクタ 63, シリンダ 12921
....
ディスク /dev/sdb: 4016MB, 4016046080 バイト
ヘッド 90, セクタ 25, シリンダ 3486
...
デバイス  ブート        始点            終点    ブロック      Id システム
/dev/sdb1                 19            3487    3917824        b  W95 FAT32

fdisk -lで見ると、USBメモリはFAT32形式のファイルシステムで/dev/sdb1として認識されています。

このUSBメモリから起動可能にするには、パーティションのブート可能フラグを有効にしておく必要があります。この操作はfdiskコマンドから行います。

P-Plamo:~# fdisk /dev/sdb

コマンド (m でヘルプ):a
領域番号 (1-4):1

コマンド (m でヘルプ):p

ディスク /dev/sda: 100.0GB, 100030242816 バイト
ヘッド 240, セクタ 63, シリンダ 12921
....
ディスク /dev/sdb: 4016MB, 4016046080 バイト
ヘッド 90, セクタ 25, シリンダ 3486
...
デバイス  ブート        始点            終点    ブロック      Id システム
/dev/sdb1   *             19            3487    3917824        b  W95 FAT32

コマンド (m でヘルプ):w
領域テーブルは交換されました!

ioctl() を呼び出して領域テーブルを再読み込みします
...
P-Plamo:~#

ここで使っているコマンドは、 "a" がブート可能フラグのトグル、"p" が情報の表示、"w" が実際の書き込み処理です。fdiskコマンドは、安全のために、データの変更処理はメモリ上で行い、"w" コマンドで書き込みを指示した段階で実際に対象デバイスに書き込まれるようになっています。"w" コマンドで実際に書き込む操作を忘れると、処理が反映されないのでご注意ください。

このパーティションを /media/usb にマウントし、isolinuxディレクトリにあるP-Plamoに必要なファイル一式をコピーします。

P-Plamo:~# mkdir /media/usb
P-Plamo:~# mount /dev/sdb1 /media/usb
P-Plamo:~# cp -r /loop/cdrom/isolinux /media/usb

P-Plamoでも、デスクトップ環境を利用していればUSBメモリを挿入すると自動的にマウントして内容を表示してくれますが、今回はコンソールから直接root権限で操作しているので手動でマウントポイントを作りマウントしています。動作中のP-Plamoでは、前回紹介したpivort_rootにより、起動したDVDイメージは/loop/cdrom以下に見えるようになっているので、そこからisolinuxディレクトリをUSBメモリ上にコピーしています。

なお最後のコピー処理は、1.6GB程度のファイルをUSBメモリ上にコピーするため、かなり時間がかかります。ちゃんと動いているか心配な人はcpコマンドに "&" を付けてバックグラウンドで実行するか、Alt+F2 等でコンソールを切り替えてログインし、df -h等でUSBメモリへの書き込みが正常に進行しているか適宜確認してみてください。

この操作でP-PlamoをUSBメモリからブートするために必要なファイルはコピーできましたが、USBメモリからブートするためのブートローダである syslinux の設定ファイルsyslinux.cfgは、起動デバイスのルートディレクトリに置く必要があるので、このファイルをisolinuxディレクトリからUSBメモリのルートディレクトリに移動しておきます。

なお、syslinux.cfgには、あらかじめisolinuxディレクトリにあるvmlinuzをカーネルとして起動する設定を記載してあります。

P-Plamo:~# cd /media/usb
P-Plamo:~# mv ./isolinux/syslinux.cfg .

これで必要なファイルの準備ができたので、syslinuxコマンドを実行してUSBメモリの先頭部分にブートローダを書き込みます。

P-Plamo:~# syslinux -d isolinux /dev/sdb1

以上の操作で、たいていのUSBメモリからP-Plamoを起動できるはずです。

init スクリプトの修正

上記手順でUSBメモリからP-Plamoを起動しようとすると、起動の途中で「squashfsが見つからない」旨のエラーになることがあります。

trying CD device:sr0 umount: can't umount /cdrom: Invalid argument
cannot find partition include squashfs. cannot continue booting. exit
/bin/sh: can't access tty; job control turned off
/ # _

このエラーは、initrd上のinitスクリプトがUSBメモリ上のsquashfsファイルを正しく見つけられないことが原因で、USBメモリをチェックする前に少し待ち時間を置くと解決するようです。

liveDVDの場合、この手の修正を加えるためには一度HDD上にliveDVDの中身をコピーした上で必要な修正を施し、再度isoイメージを作成し直すという手間がかかるのに対し、USBメモリの場合はファイルを直接書き替えることが可能なので、修正を加えるのは簡単です。

再度DVDメディアから起動し、/media/usb/ にUSBメモリをマウントしておきます。

先にコピーしたisolinuxディレクトリに移動して、initrd.gzを展開、適当なディレクトリにloopbackマウントします。

P-Plamo:~# cd /media/usb/isolinux
P-Plamo:/media/usb/isolinux# gunzip initrd.gz
P-Plamo:/media/usb/isolinux# mkdir /tmp/loop
P-Plamo:/media/usb/isolinux# mount initrd /tmp/loop -o loop

この状態で、前回紹介したinitスクリプトは/tmp/loop/initとしてアクセスできるので、このファイルを修正します。修正すべき箇所は23行目からのUSBメモリをマウントしてチェックしている部分で、24行目に10秒間ほど時間待ちを置いてみます。

initスクリプトの一部
23 # check USB device first
24 sleep 10
25 if [ $mount_ok -eq 0 ]; then
26     echo -n "trying USB device:"
27     for i in sda sdb sdc sdd sde sdf sdg sdh ; do

修正できれば、initrdを圧縮し直します。

P-Plamo:/media/usb/isolinux# gzip initrd
P-Plamo:/media/usb/isolinux# ls
boot.cat      isolinux.cfg  pplamo.lss      syslinux.cfg
initrd.gz     ldlinux.sys   rootimg.squash  vmlinuz
isolinux.bin plamo41.lss    sample.msg      vmlinuz-2.6.32.10-plamoSMP

USBメモリの場合、initスクリプトの修正はこれで終了です。再起動してUSBメモリから起動できるか確認します。

USBメモリから起動した際の新機能

動作中に書き替えることができないDVDメディアに対し、USBメモリでは動作中でも自由に書き替えることができます。そこでUSBメモリから起動した際は、ユーザがホームディレクトリに作ったファイルをUSBメモリ上に保存するような機能を追加してみました。

具体的には、USBメモリから起動したP-Plamoを終了する際、tmpfs上のユーザ領域に作成されたファイルを保存するか否かを問い合わせ、保存する場合はUSBメモリ上にユーザ領域のファイルをアーカイブファイルとして保存します。起動時には、このアーカイブファイルの有無をチェックして、ファイルがあればあらかじめユーザ領域に展開しておき、前回終了時の状態から使い続けることができるようにしました。

demo@P-Plamo:~$ sudo halt -p
パスワード:demo

Broadcast message from root (tty1)...

The system is going down for system halt NOW!
INIT: Switching to runlevel: 0
....
Saving ALSA sound mixer...
起動メディア(USBメモリ)にデータが保存可能です。
今回作成したユーザ領域のデータを保存して、次回以降も利用しますか?[y/N]
y
ramdisk 上のデータを保存中
....

ここで作成したアーカイブファイルはUSBメモリ上にP_Plamo_backup.cpio.gzという名称で保存されています。名称が示すように、このファイルはcpio形式でgzip圧縮しています。

起動時には、USBメモリ上にこの名称のファイルがあれば、以前のデータを復旧するかを問い合わせ、復旧するならば、tmpfs 上に用意されたユーザ領域上に保存されたアーカイブファイルの中身を展開します。

Finished Reading Files
Starting wpa_supplicant...
以前のユーザデータのバックアップファイルが見つかりました
バックアップされたユーザデータを復旧しますか?[y/N]
y
データの復旧中...
...
The system is ready.
..

これらの処理は、前回紹介したinitスクリプトでinitrd上のetcディレクトリからコピーした修正版(modified)rc.Mrc.6で行っています。

具体的には、終了時の処理を行うrc.6の中で起動メディアに書き込めるかをテストして、書き込めるようならばaufsのユーザ用領域に使っている/tmp/ow/home以下から、キャッシュやaufsの作業ファイル以外のファイルをcpio+gzipで固める処理を追加しました。

rc.6.modifiedの一部
74  touch /loop/cdrom/rw_test 2> /dev/null
75  if [ $? -eq 0 ]; then
76      rm /loop/cdrom/rw_test
77      echo "起動メディア(USBメモリ)にデータが保存可能です"
78      echo "今回作成したユーザ領域のデータを保存して、次回以降も利用しますか?[y/N]"
79      read ans
80      if [ $ans = "Y" -o $ans = "y" ]; then
81          echo "ramdisk上のデータをバックアップ中.."
82          ( cd /tmp/ow ; find home  | grep -v -i cache  | grep -v ".wh..wh*" | cpio -ov -Hnewc | gzip > /loop/cdrom/P_Plamo_backup_cpio.gz )
83          echo "終了しました"
84          sync ; sync ; sync
85      fi
86  fi

それに合わせて、起動時の処理を行うrc.Mの方では、書庫ファイルがあればそれらをaufsの作業領域上に展開する処理を追加しました。

rc.M.modified の一部
283  if [ -f /loop/cdrom/P_Plamo_backup_cpio.gz ]; then
284      echo "以前のユーザデータのバックアップファイルが見つかりました"
285      echo "バックアップされたユーザデータを復旧しますか? [y/N]"
286      read ans
287      if [ $ans = "y" -o $ans = "Y" ]; then
288          echo "データの復旧中..."
289          ( cd /tmp/ow ; zcat /loop/cdrom/P_Plamo_backup_cpio.gz | cpio -iumvd )
290      else
291          echo "旧データは復旧しません"
292      fi
293  fi

これらは簡単なハックですが、実際に使ってみると、前回に施した各種設定やホームディレクトリに作ったファイルなどを引き継ぐことができ、案外便利です。ただし、アーカイブファイル作成時にUSBメモリの空き容量のチェックはしていないので、ファイルが多すぎると容量不足になるかも知れませんのでご注意ください。

USBメモリから起動できるかは環境を選ぶので、当初はUSBブートはP-Plamoのオプション的に考えていましたが、実際に使ってみると、USBメモリはDVDメディアよりもアクセス速度が速いのでコマンド起動時に待たされる時間もずいぶん短くなりました。

また、USBメモリはDVDメディアよりもコンパクトなので、ポケットに入れて気軽に持ち運ぶことも可能です。利用可能なPCは選ぶものの、最近ではDVDメディアよりもUSBメモリの方が、Plamo Linuxを「持ち歩く」のに適しているようです。

おすすめ記事

記事・ニュース一覧