どぶお/Linuxで遊ぼう!

カスタムLiveCDイメージを作成する  

Linux環境をお試ししたり、さくっとインストールしたりするのにとっても便利なLive CD。私はインストールするときはCentOS LiveCDを使っています。
さて、今回はこの便利なLiveCDイメージをカスタム化してみましたので記録しておきます。カスタムLiveCDは何がうれしいかというと、以下の通り。

概要  

検索するといくつか作成方法が出てきますが、基本的にはゼロから作成する方法であり、例えばCentOS 6.5 LiveCDをベースにしてカスタムイメージを作る、という方法はなかなか見つかりません(私は見つけられませんでした…)。私の場合、「LiveCDをベースにして追加のパッケージをインストールしたもの」を作りたかったのでいろいろと試してみました。

以下のような感じです。

[ベースとなるLiveCD] + [追加でインストールしたいパッケージ&設定]

これを作るためには以下の物が必要です。

手順  

作成は以下の手順で行います。

  1. Kickstart設定ファイルの用意
    • 追加パッケージRPMファイルまたはリポジトリの用意
  2. livecd-creatorを実行する

initramfsの落とし穴  

livecd-creatorは処理の途中で/boot/initramfs-2.6.32-rel.el6.x86_64.imgisolinux/initrd0.imgにコピーします。ところが、CentOS LiveCDでは容量を節約するため(?)に/boot/initramfs-2.6.32-431.el6.x86_64.imgが収録されていないので、途中でfile not foundエラーで処理が止まってしまいます。

この問題を回避するためにinitramfsをインストールするRPMパッケージが必要になります。ファイルをコピーするなどの手段が使えないのは以下の理由によります。

livecd-creatorはimgcreateモジュールを使用しますが、その中では以下の順で処理が実行されます。

  1. %packageセクションに従ってパッケージをインストール
  2. /bootにあるvmlinuz, initramfsをisolinux用にvmlinuz0, initrd0.imgとしてコピー
  3. %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を作成する時のみに使用します。

この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の作成

  1. 仮想環境(VirtualBoxなど)でCentOS 6.5 LiveCDを起動
    initramfsを作成するための環境としてLiveCDを起動します。
  2. イメージを作成するための設定ファイルを作成
    以下の内容でファイル(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 "
  3. dracutでイメージを作成
    % dracut -c livecd-dracut.conf initramfs-xhci-2.6.32-431.el6.x86_64.img
  4. これでLiveCD用のinitrdが構成されます
  5. 作成したRPMは以下です
    • livecd-initramfs-xhci-2.6.32-431.el6.x86_64.rpm
    • livecd-initramfs-xhci-2.6.32-431.spec -- パッケージ作成用SPECファイル
    • livecd-dracut.conf