Ubuntu Weekly Recipe

第3回Desktop CDを使いこなす(2):より高度なLiveCDのカスタマイズ

前回に引き続き、Ubuntuのデスクトップ向けインストールCD(Desktop CD)を用いて、オリジナルのLiveCDを作成するレシピを紹介します。

端末からのDesktop CDのカスタマイズ

UbuntuのDesktop CD(=LiveCD)には、RemastersysやUCKのような容易にカスタマイズを行う補助ツールが用意されています。今回はこれらのツールが内部で行っている、SquashFSの展開を始めとする操作をコマンドラインから行い、より細かな部分までカスタマイズする方法を紹介します。

カスタマイズの準備

前回も触れましたが、Desktop CDのLiveCD環境のカスタマイズは、SquashFS形式で圧縮されたルートファイルシステムである casper/filesystem.squashfs を改変することで行います。作業に必要な環境はRemastersys、UCKと同様に、5~10GBのディスク容量とある程度の搭載メモリです。手順を順番に見ていきましょう。

作業にはsquashfs-toolsとmkisofsパッケージが必要になりますので、インストールを行います。ここではapt-getを用いてインストールしていますが、Synapticなどからインストールしても構いません。

$ sudo apt-get install squashfs-tools mkisofs

補助ツールを用いる場合と同じく、コマンドラインからDesktop CDをカスタマイズする場合も既存のISOを改変することで行うのが普通です。http://cdimage.ubuntulinux.jp/releases/7.10/ubuntu-ja-7.10-desktop-i386.isoなどからベースとなるISOイメージをダウンロードしてください。ISOイメージがダウンロードできたら、作業ディレクトリとマウントポイントを作成してループバックマウントします(CDを光学ドライブに挿入して作業を行うことも可能です。この場合は~/livecd-work/mntを/media/cdromに読み替えてください⁠⁠。

$ cd ~
$ wget http://cdimage.ubuntulinux.jp/releases/7.10/ubuntu-ja-7.10-desktop-i386.iso
$ mkdir -p ~/livecd-work/mnt
$ sudo mount -o loop ubuntu-ja-7.10-desktop-i386.iso ~/livecd-work/mnt
$ cd ~/livecd-work

SOイメージをマウントしたら、filesystem.squashfs以外のファイルを編集用にコピーします。

$ mkdir extract-cd
$ rsync --exclude=/casper/filesystem.squashfs -a livecd-work/ extract-cd

casper/filesystem.squashfsを作業用ディレクトリに展開します。~/livecd-work/squashfs以下にLiveCD環境で利用するルートファイルシステムが作成されます。

$ sudo unsquashfs -d edit mnt/casper/filesystem.squashfs

編集を始める前に、このルートファイルシステムの構造を確認しましょう。以下は該当ディレクトリでlsを発行した結果です。

$ ls -F ~/livecd-work/extract-cd
bin/  boot/  dev/  etc/  home/  initrd/  initrd.img@  lib/  media/  mnt/  opt/  proc/  root/  sbin/  srv/  sys/  tmp/  usr/  var/  vmlinuz@

この中身は通常の(HDDにインストールした)Ubuntuのファイルシステムそのものです。Remastersysが既存のファイルシステムをSquashFSに圧縮することでLiveCDが構成できるのは、これが理由です。ただし、後の手順でも触れますが、LiveCD環境ではinitrd.imgとvmlinuzはここにあるファイルではなくISOイメージのcapser/以下にあるものが使われるため、別途作業を行う必要があります。

chrootによる作業・再圧縮

カスタマイズの準備が終了したら、展開したルートファイルシステムにchrootし、LiveCD環境を展開した~/livecd-work/extract-cdを/として作業を行います。

chrootする前に、⁠通常のLiveCD起動では起動時にスクリプトやDHCPクライアントによって生成される)/etc/resolv.confをコピーする必要があります。もしもお使いの環境で/etc/hostsを利用しているのであれば、それもコピーしてください。

$ cd ~/livecd-work
$ sudo cp /etc/resolv.conf edit/etc/
$ sudo cp /etc/hosts edit/etc/

準備ができたらchrootを行います。chrootの実行時点で環境変数による影響を受けないように、su -でrootユーザの標準環境を読み込んでおきます。また、ほとんどいないと思いますが、rootユーザのSHELLをbash以外に変更している場合は、/bin/bashに戻しておく必要があります(正確にはUCKなどと同じように、⁠LiveCD環境に用意されていないシェルをセットしている」場合にこの作業が必要になります⁠⁠。

$ sudo su -
# chroot edit

このままでは作業に支障があるため、proc、sys、devpts fsをマウントします。

# mount -t proc none /proc
# mount -t sysfs none /sys
# mount -t devpts none /dev/pts

この状態でapt-getなどのパッケージ操作コマンドを実行することで、パッケージの導入が行えます。たとえば次のように、"trac"パッケージをインストールすることで、~/livecd-work/editに展開されたルートファイルシステム上に適用されます。同様に、/etc/skel/以下など、あらゆるファイルは~/livecd-work/edit以下のものです(この例の場合であれば、~/livecd-work/edit/etc/skelに変更を加えたことになります⁠⁠。

操作は通常のUbuntuに対して端末から行う作業と同様ですが、次の点に注意する必要があります。

ログインユーザ・ホスト名・パスワードの変更

デフォルトのLiveCD環境ではユーザ"ubuntu"が利用されます。これらは/usr/share/initramfs-tools/scripts/casper-bottom/にあるスクリプトで設定されており(ユーザの設定は10adduser⁠⁠、/etc/casper.confに任意の値をセットすることで変更します。パスワードの変更を行う場合、10adduser内で決め打ちされているため、これを変更します。10adduser内ではソルトされたパスワードが必要なため、mkpasswdで得られるものをセットします。

これらはすべて、initramfsを更新しなければ有効になりません。変更後、必ずupdate-initramfsでinitrdファイルを更新してください。コマンドは次の通りです。

# mkinitramfs -o /initrd.gz `uname -r`

“Persistence”機能に使うパーティションの指定

/usr/share/initramfs-tools/scripts/casperを編集してください。変更後、update-initramfsが必要です。

編集に利用している環境とのネットワークポートの競合

chrootはあくまでファイルシステムレベルでの変更を行うだけです。このため、作業環境(chrootを実行する前の環境)で既に使用しているネットワークポートを利用することはできません。たとえば、編集に利用するシステム上でapache2(=TCP:22)を起動させている場合、chroot環境ではapache2を起動することができません。chroot環境でlsof -iを実行すると、作業環境で起動している各種daemonが待ち受けていることを確認できるはずです。

このような場合、chroot環境で起動したdaemonの動作をテストする前に、作業環境で該当daemonを停止させておく必要があります。

Apache(apache2)のインストール

LiveCD向けにapache2パッケージを導入する場合、LiveCD環境ではsendfile()を利用できないため、/etc/apache2/sites-available/defaultなどのサイト設定において、EnableSendfile Offを宣言する必要があります。

なお、6.10以前のchroot環境に導入したapache2は、起動時に/etc/init.d/apache2から読み込まれる設定ファイル/etc/default/apache2上でDO_NOT_START変数をセットしていたため、これも変更する必要があります。

一部のパッケージのメンテナスクリプトの実行失敗への対処

一部のパッケージでは、chroot環境ではapt-get installやdpkg -i時に実行されるメンテナスクリプトの実行に失敗する場合があります。このような場合は/etc/init.d/<パッケージ名>にあるスクリプトを確認し、適宜対処を行う必要があります。

xorg.confの変更

LiveCD環境では、/etc/X11/xorg.confファイルは起動時に毎回生成されています。このため、何らかの理由でxorg.confを変更したい場合(たとえば、正常に動作しないS3系VGAドライバを利用せず、強制的にvesaドライバで動作させたい場合)は生成スクリプトである/usr/bin/dexconfを変更する必要があります。

不要なパッケージキャッシュの削除

apt-getなどでパッケージを入手した場合、インストール後もパッケージの残骸が残ります。容量肥大の原因になりますので、apt-get cleanを実行して削除してください。

SquashFSとManifestファイルの作成

編集が終わったら、SquashFSを作成し、マスタリングの準備を行います。

chroot環境でマウントしたproc、sys、devpts fsをアンマウントし、exitします。アンマウントを忘れてexitした場合は/を~/livecd-work/に読み替えてアンマウントしてください。

# umount /proc
# umount /sys
# umount /dev/pts

chroot環境から脱出した後、不要ファイルを削除します。

$ sudo rm ~/livecd-work/edit/etc/resolv.conf
$ sudo rm ~/livecd-work/edit/etc/hosts
$ sudo rm -rf ~/livecd-work/edit/tmp/*
$ sudo rm -rf ~/livecd-work/edit/tmp/.*
$ sudo rm -rf ~/livecd-work/root/*
$ sudo rm -rf ~/livecd-work/root/.*

manifestファイルを再作成します。このファイルはCDに導入されたパッケージの一覧です。

$ cd ~/livecd-work/
$ chmod +w extract-cd/casper/filesystem.manifest
$ sudo chroot edit dpkg-query -W --showformat='${Package} ${Version}\n' > extract-cd/casper/filesystem.manifest
$ sudo cp extract-cd/casper/filesystem.manifest extract-cd/casper/filesystem.manifest-desktop
$ sudo sed -ie '/ubiquity/d' extract-cd/casper/filesystem.manifest-desktop

SquashFSを生成します。

$ sudo mksquashfs edit extract-cd/casper/filesystem.squashfs

SquashFS以外のカスタマイズ

Desktop CDのSquashFS以外の領域を変更することで、起動時のデフォルトオプションを始めとした、いくつかの要素を変更することができます。これらの作業は不要であれば省略するべきものです。

デフォルトで“Persistence”機能が有効になるLiveCD

前回触れた⁠Persistence⁠機能は、起動時に毎回persistentキーワードを入力し、起動オプションを変更する必要がありました。この起動オプションは、isolinux/isolinux.cfgで規定されています。isolinux.cfgの、次のような部分にpersitentキーワードを追加した状態でCDをマスタリングすることで、この作業を省略することができます。

LABEL live
  menu label ^Start or install Ubuntu
  kernel /casper/vmlinuz
  append  file=/cdrom/preseed/ubuntu.seed boot=casper initrd=/casper/initrd.gz quiet splash tz=Asia/Tokyo utc=no --

ただし、⁠Persistence⁠機能はcasper-rw領域が存在しない場合に起動プロセスがクラッシュするため、無条件で有効にすべきものではありません。

その他の起動オプション

persistent以外にLiveCDに追加することを検討する価値があると考えられるオプションは、次の通りです。これらは主に特定のハードウェアで動作しない場合の対策となります。通常は必要ありません。

  • irqpoll:
    all_generic_ide:

    いずれも、LiveCDの起動時に光学ドライブの検出方法を変更します。通常の起動ではinitrdが提供するbusybox shellに落ちてしまう場合に有効です。

  • noapic:

    APICの利用を行わず、強制的にPICを利用させます。
    通常の設定では動作せず、かつ、irqpollやall_generic_ideも有効でない特定のハードウェア(おおむね2004年までに製造されたもの)で有効なことがあります。

  • acpi=force:

    何かの理由でACPIがサポートされていないと誤認されている環境で、ACPIを強制的に有効にします。ACPIの有効化は通常は電源制御周りのアプローチの変更だけですが、バグのあるBIOSやチップセットを利用している場合はPIC/APICの動作を適正化するのに役に立ちます。
    通常の設定では動作せず、かつ、irqpollやall_generic_ideも有効でない特定のハードウェア(おおむね2004年までに製造されたものですが、まれに最近のハードウェアにも存在します)で有効なことがあります。

  • i8042.noloop:

    (主にMicrosoft VirtualPCでのマウス動作を改善するために)AUXポートへのprobeを省略します。

CDのマスタリング

CDのマスタリングを行う前に、kernelパッケージのアップデート、もしくはinitrd(initramfs)の再生成を行った場合は、LiveCDで使われるカーネルを更新する必要があります。

$ sudo cp edit/vmlinuz extract-cd/casper/vmlinuz
$ sudo cp edit/initrd.img extract-cd/casper/initrd.gz

メディアチェックに利用されるMD5ハッシュを更新します。

$ sudo /bin/sh -c "rm extract-cd/md5sum.txt"
$ sudo /bin/sh -c "(cd extract-cd && find . -type f -print0 | xargs -0 md5sum > md5sum.txt)"

ISOイメージを生成します。VolumeLabel部分はメディアに設定したいボリュームラベルに置き換えてください。

$ sudo mkisofs -r -V "VolumeLabel" -cache-inodes -J -l -b isolinux/isolinux.bin -c

以上でカスタマイズしたISOの生成は完了です。UCKやRemastersysも基本的には以上の手順とまったく同じことをしていますので、これらを構成するスクリプトを参考に独自の構築スクリプトを作成することができます。

また、以上で行った操作(に加えて、libdvdcss2とw32codecsをインストールし、DVDの視聴やマルチメディアファイルの再生に対応させ、さらにFlash Pluginを導入する)個人用CDを作成するためのラッパースクリプトがUbuntu Forumに投稿されています。このスクリプトは7.04時代に投稿されたものですが、7.10でも動作します。このスクリプトはchrootせず、dpkgのインストール先指定を変更することでパッケージをインストールしていますが、参考になるでしょう。

Desktop CDの今後

LiveCDとしてのDesktop CDの今後については、必ずしも順調な進捗ではありませんが、以下のようなプロジェクトが存在します。

  • 「カスタマイズのテンプレートとなりうる、ベースとなるLiveCDの構築を目指す」⁠LiveCDCreator⁠
  • 「DVD-RWなどにおいて、LiveCDとしての動作に加えて、書き換え可能なUDF領域を用いて⁠Persistence⁠機能を実現する」Live CD - Write-as-you-go

その他、参考になるドキュメント

おすすめ記事

記事・ニュース一覧