前回までに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から起動して使うには、このイメージファイルをダウンロードして、cdrecord やgrowisofs コマンドでDVDメディアに書き込めばいいわけですが、P-PlamoをUSBメモリから起動するには、上記DVDのイメージファイルの中からsquashfs化したルートファイルシステムやinitrd等の必要なファイルを取り出して、それらを直接USBメモリ上に配置する必要があります。また、USBメモリから起動するためにはsyslinux というブートローダをUSBメモリの先頭部分に書き込んでやる必要があります。
isolinux もsyslinux もH.Peter Anvinさんが開発したソフトウェアで、isolinuxがISO9660形式(CD/DVDメディア) 、syslinuxがDOS/VFAT形式(FD/USB/HDD)のファイルシステムからlinuxカーネルを起動するためのブートローダです。このシリーズのブートローダには、他にもext2/ext3形式のファイルシステムからブートするextlinux や、PXE機能を使ってネットワーク経由でブートするpxelinux があります。
これらの作業はPlamo Linuxから行うことも可能ですが、P-Plamoにも必要なコマンドは用意しているので、以下ではDVDメディアから起動したP-Plamo環境で、P-PlamoをUSBメモリにインストールする手順を紹介しましょう。
現在のP-Plamoは約1.6GBほどのサイズなので、2GBのUSBメモリに収めることができます。ただし、将来に渡って2GBに収まる保証はありませんし、2GBだとP-Plamoだけでほぼ一杯になってしまうので、自分用のデータを保存する等、いろいろやってみたい人は4GB程度の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を起動できるはずです。
「たいていの」と限定したのは、USBメモリにはかなり個体差があり、上記の操作だけでは起動できないUSBメモリも存在するためです。 手元では3種ほどのUSBメモリで試してみましたが、TranscendのJetFlash V30というUSBメモリでは syslinux(3.84)が設定ファイルを正しく認識できず、 P-Plamoのカーネルを起動することができませんでした。あれこれ試したところ、開発中のsyslinuxの最新版(syslinux-4.00-pre47)を使えば syslinux.cfg を読み込めるようになりました。このUSBメモリは、他の2種のUSBメモリに比べてファイルコピーがかなり高速なので、高速化されたUSBメモリのfirmwareに従来版のsyslinuxでは対応できていない、といった問題なのでしょう。
加えて、USBメモリから起動するにはPC側のBIOSが対応している必要もあります。このあたりはハードウェア依存なので一概には述べにくいですが、古めのマザーボードにはUSBメモリから起動できないBIOSが散見されるようです。確認するには、BIOSメニューの「起動デバイス」の対象に、USBストレージデバイスから起動する旨の設定が存在するかを調べてみてください。
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.M とrc.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メモリの空き容量のチェックはしていないので、ファイルが多すぎると容量不足になるかも知れませんのでご注意ください。
保存したファイルはメモリ上のtmpfsに展開されるので、保存するファイルが多くなると利用可能な空きメモリも圧迫することになります。そのように考えると、USBメモリの場合、ユーザのホームディレクトリを直接USBメモリ上に取ってしまう方がいいかも知れません。
USBメモリから起動できるかは環境を選ぶので、当初はUSBブートはP-Plamoのオプション的に考えていましたが、実際に使ってみると、USBメモリはDVDメディアよりもアクセス速度が速いのでコマンド起動時に待たされる時間もずいぶん短くなりました。
また、USBメモリはDVDメディアよりもコンパクトなので、ポケットに入れて気軽に持ち運ぶことも可能です。利用可能なPCは選ぶものの、最近ではDVDメディアよりもUSBメモリの方が、Plamo Linuxを「持ち歩く」のに適しているようです。