[[どぶお/Linuxで遊ぼう!]]
 
 * カスタムLiveCDイメージを作成する [#uba9048a]
 Linux環境をお試ししたり、さくっとインストールしたりするのにとっても便利なLive CD。私はインストールするときはCentOS LiveCDを使っています。~
 さて、今回はこの便利なLiveCDイメージをカスタム化してみましたので記録しておきます。
 さて、今回はこの便利なLiveCDイメージをカスタム化してみましたので記録しておきます。カスタムLiveCDは何がうれしいかというと、以下の通り。
 - 解析環境が一通り入っているLiveDVD/USBを作成する事ができる
 - そこからインストールする事もできる
 
 ** 概要 [#wfc52f4a]
 ~検索するといくつか作成方法が出てきますが、基本的にはゼロから作成する方法であり、例えばCentOS 6.5 LiveCDをベースにしてカスタムイメージを作る、という方法はなかなか見つかりません(私は見つけられませんでした…)。私の場合、「LiveCDをベースにして追加のパッケージをインストールしたもの」を作りたかったのでいろいろと試してみました。
 ~以下のような感じです。
 
  [ベースとなるLiveCD] + [追加でインストールしたいパッケージ&設定]
 
 これを作るためには以下の物が必要です。
 - CentOS-6.5-x86_64-LiveCD.iso -- 2015年9月現在、6.7 LiveCDがリリースされています
 - 追加したいRPMファイル群またはリポジトリ
 - Kickstart設定ファイル
 
 ** 手順 [#u15850ef]
 作成は以下の手順で行います。
 + Kickstart設定ファイルの用意
 -- 追加パッケージRPMファイルまたはリポジトリの用意
 + livecd-creatorを実行する
 
 *** initramfsの落とし穴 [#i8c95c46]
 ~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パッケージ''が必要になります。ファイルをコピーするなどの手段が使えないのは以下の理由によります。
 
 #classdiv(box-yellow)
 &color(red){''livecd-creatorはimgcreateモジュールを使用しますが、その中では以下の順で処理が実行されます。''};
 
 + %packageセクションに従ってパッケージをインストール
 + /bootにあるvmlinuz, initramfsをisolinux用にvmlinuz0, initrd0.imgとしてコピー
 + %postセクションの実行
 
 2のコピー時に''file not found''エラーが出るので、1.の%packageセクションでインストールするしかないのです(ベースイメージを使う場合%preセクションは実行されないようです)。
 #classdiv(end)
 
 なお、後ほど解説しますが、ベースとなる6.5 LiveCDのsyslinuxディレクトリのinitrd0.imgにはxhci-hcdモジュールが含まれていないため、このinitrdではUSB 3.0のUSBメモリからは起動できないようです(6.7では未確認)。
 
 #classdiv(box-blue)
 &color(blue){''initramfsを作成するRPMパッケージを用意する''};
 ~RPM自体にソースファイルを含まないポストインストール/ポストアンインストール時にスクリプトを実行するRPMパッケージを作成しました。このパッケージはインストール時の%postセクション(インストール後の処理)でdracutを用いてinitramfsを作成します。この処理は存在する全てのvmlinuzのバージョンに対して行われます。
 ~またアンインストール時にはinitramfsを全て削除します。従って、&color(red){''実環境には絶対にインストールしないで下さい''};。LiveCDを作成する時のみに使用します。
 
 - 作成したRPMは以下です
 -- &ref(livecd-create-initramfs-1-0.el6.noarch.rpm);
 -- &ref(livecd-create-initramfs.spec); -- パッケージ作成用SPECファイル
 -- &ref(livecd-dracut.conf); -- 参考:ベースとしているdracut.conf。コマンドラインに記述しているので不要
 #classdiv(end)
 
 このlivecd-create-initramfsをKickstart設定ファイルに追加すればLiveCD作成プロセス中にinitramfsファイルが作成されます。
 
 *** ローカルリポジトリの準備 [#q879d744]
 上記の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設定ファイル [#k0b9f07b]
 続いて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
 
 ** 古い情報 [#sa09d28e]
 #classdiv(box-blue)
 &color(blue){''ベース用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
 #classdiv(end)