カスタムLiveCDイメージを作成する
Linux環境をお試ししたり、さくっとインストールしたりするのにとっても便利なLive CD。私はインストールするときはCentOS LiveCDを使っています。
さて、今回はこの便利なLiveCDイメージをカスタム化してみましたので記録しておきます。カスタムLiveCDは何がうれしいかというと、以下の通り。
- 解析環境が一通り入っているLiveDVD/USBを作成する事ができる
- そこからインストールする事もできる
概要
検索するといくつか作成方法が出てきますが、基本的にはゼロから作成する方法であり、例えばCentOS 6.5 LiveCDをベースにしてカスタムイメージを作る、という方法はなかなか見つかりません(私は見つけられませんでした…)。私の場合、「LiveCDをベースにして追加のパッケージをインストールしたもの」を作りたかったのでいろいろと試してみました。
以下のような感じです。
[ベースとなるLiveCD] + [追加でインストールしたいパッケージ&設定]
これを作るためには以下の物が必要です。
- CentOS-6.5-x86_64-LiveCD.iso -- 2015年9月現在、6.7 LiveCDがリリースされています
- 追加したいRPMファイル群またはリポジトリ
- Kickstart設定ファイル
手順
作成は以下の手順で行います。
- Kickstart設定ファイルの用意
- 追加パッケージRPMファイルまたはリポジトリの用意
- livecd-creatorを実行する
initramfsの落とし穴
livecd-creatorは処理の途中で/boot/initramfs-2.6.32-rel.el6.x86_64.imgをisolinux/initrd0.imgにコピーします。ところが、CentOS LiveCDでは容量を節約するため(?)に/boot/initramfs-2.6.32-431.el6.x86_64.imgが収録されていないので、途中でfile not foundエラーで処理が止まってしまいます。
この問題を回避するためにinitramfsをインストールするRPMパッケージが必要になります。ファイルをコピーするなどの手段が使えないのは以下の理由によります。
livecd-creatorはimgcreateモジュールを使用しますが、その中では以下の順で処理が実行されます。
- %packageセクションに従ってパッケージをインストール
- /bootにあるvmlinuz, initramfsをisolinux用にvmlinuz0, initrd0.imgとしてコピー
- %postセクションの実行
2のコピー時にfile not foundエラーが出るので、1.の%packageセクションでインストールするしかないのです(ベースイメージを使う場合%preセクションは実行されないようです)。
なお、後ほど解説しますが、ベースとなる6.5 LiveCDのsyslinuxディレクトリのinitrd0.imgにはxhci-hcdモジュールが含まれていないため、このinitrdではUSB 3.0のUSBメモリからは起動できないようです(6.7では未確認)。
initramfsを作成するRPMパッケージを用意する
RPM自体にソースファイルを含まないポストインストール/ポストアンインストール時にスクリプトを実行するRPMパッケージを作成しました。このパッケージはインストール時の%postセクション(インストール後の処理)でdracutを用いてinitramfsを作成します。この処理は存在する全てのvmlinuzのバージョンに対して行われます。
またアンインストール時にはinitramfsを全て削除します。従って、実環境には絶対にインストールしないで下さい。LiveCDを作成する時のみに使用します。
- 作成したRPMは以下です
- livecd-create-initramfs-1-0.el6.noarch.rpm
- livecd-create-initramfs.spec -- パッケージ作成用SPECファイル
- livecd-dracut.conf -- 参考:ベースとしているdracut.conf。コマンドラインに記述しているので不要
このlivecd-create-initramfsをKickstart設定ファイルに追加すればLiveCD作成プロセス中にinitramfsファイルが作成されます。
ローカルリポジトリの準備
上記のlivecd-create-initramfsパッケージなどをローカルに準備します。もちろんhttpdを用意してもいいのですが、お手軽にローカルファイルシステム上に用意します。
% mkdir -p mylocalrepo/packages <-- パッケージファイルを置く場所 % cp livecd-create-initramfs-1-0.el6.noarch.rpm mylocalrepo/packages <-- ファイルをコピー % cd mylocalrepo % createrepo . <-- リポジトリを作成
この場所が/home/dobuo/mylocalrepoとするとKickstartのrepo設定では以下のようになります。
repo --name=local --baseurl=file:///home/dobuo/mylocalrepo
ローカルにファイルを用意すれば必要なパッケージを簡単に追加する事ができます。
Kickstart設定ファイル
続いてKickstartファイルを用意します。ベースイメージを使う場合は記述する内容に難しい点はありません。
# BASE IMAGE: CentOS-6.5-x86_64-LiveCD # livecd-creator -b CentOS-6.5-x86_64-LiveCD -c licecd-update-to-6.6.ks -f LiveCD-6.6.20150305-x86_64 --cache ./cache lang en_US.UTF-8 keyboard jp106 timezone Asia/Tokyo part / --fstype=ext4 # For using latest release repo --name=base --baseurl=ftp://ftp.riken.jp/Linux/centos/6/os/$basearch repo --name=update --baseurl=ftp://ftp.riken.jp/Linux/centos/6/updates/$basearch repo --name=local --baseurl=file:///home/dobuo/repo/$basearch %packages # General # No /boot/initramfs-2.6.32.431.el6.x86_64.img on Live CD causes "file not found" on copying it. # Avoiding it, installation of /boot/initramfs-2.6.32.431.el6.x86_64.img is needed. # After configuration of boot loader, it will be remove (in %post section). livecd-create-initramfs # For Shellshock fix, BASH_FUNC_module(): line 0: syntax error near unexpected token `)' is caused. # It needs updating bash on newer environment. bash %end # This section is for updating base OS. %post --nochroot # Copy resolv.conf from Host environment for yum networking cp /etc/resolv.conf $INSTALL_ROOT/etc %end %post # yum update and erase the old kernel yum -y erase livecd-create-initramfs yum -y erase thunderbird yum -y update --nogpgcheck yum -y erase kernel-2.6.32-431.el6 # Clear resolv.conf rm -f /etc/resolv.conf touch /etc/resolv.conf # Add xhci-hcd (USB 3.0 Host Driver) to dracut.conf and dracut # The initramfs created will be keep for the next generating livecd. echo -e '\ndrivers+="xhci-hcd "' >> /etc/dracut.conf /sbin/dracut --force /boot/initramfs-`uname -r`.img `uname -r` cp -av /boot/initramfs-`uname -r`.img /boot/initrd0.img cp -av /boot/vmlinuz-`uname -r` /boot/vmlinuz0 %end %post --nochroot mv -v $INSTALL_ROOT/boot/initrd0.img $LIVE_ROOT/isolinux/initrd0.img mv -v $INSTALL_ROOT/boot/vmlinuz0 $LIVE_ROOT/isolinux/vmlinuz0 %end
古い情報
ベース用initrdの作成
- 仮想環境(VirtualBoxなど)でCentOS 6.5 LiveCDを起動
initramfsを作成するための環境としてLiveCDを起動します。 - イメージを作成するための設定ファイルを作成
以下の内容でファイル(livecd-dracut.conf)を作成します。mdadmconf="yes" lvmconf="yes" filesystems+="squashfs ext4 ext3 ext2 vfat msdos " drivers+="sr_mod sd_mod ide-cd cdrom =ata sym53c8xx aic7xxx ehci_hcd uhci_hcd ohci_hcd usb_storage usbhid firewire-sbp2 firewire-ohci sbp2 ohci1394 ieee1394 mmc_block sdhci sdhci-pci pata_pcmcia mptsas udf virtio_blk virtio_pci " add_dracutmodules+=" dmsquash-live " drivers+="xhci-hcd "
- dracutでイメージを作成
% dracut -c livecd-dracut.conf initramfs-xhci-2.6.32-431.el6.x86_64.img
- これでLiveCD用のinitrdが構成されます
- 作成したRPMは以下です
- livecd-initramfs-xhci-2.6.32-431.el6.x86_64.rpm
- livecd-initramfs-xhci-2.6.32-431.spec -- パッケージ作成用SPECファイル
- livecd-dracut.conf