SoftLayer 環境で Object Storage へアクセスできる Live CD を作る

警告：
以下の手順で作成した Live CD には、作成に使用したサーバーの情報の多くがそのまま含ます。
また、Live CD で起動した状態の KVM コンソールから、ログイン無しで root 権限のコマンドの実行が可能です。
さらに、各種ソフトのバージョンは Live CD 作成時点に固定される為、その時点以降に発見/対応された脆弱性の影響を受ける可能性は高くなります。
上記の警告の意味を理解した上で、ご活用下さい。

#0. はじめに
以前の投稿 [SoftLayer における Object Storage への Linux システム・バックアップ（バックアップ＆リストア編）](http://qiita.com/conservativerad/items/e778b991cbadd9841bd6) では、rescue 環境として CentOS 5 が利用できる Linux 環境に対象を絞っていました。
投稿後、「次は Live CD での手順だね :smiley: 」というご意見を頂いたので、まず、SoftLayer 環境で Object Storage にアクセスできる Live CD を作る手順をまとめました。
「ここまでしなくても、既に公開されている LiveCD で同じことができるよ~」という情報も絶賛募集中です :sweat_smile: 

#1. 断捨離
1) OS はインストール済みシステムから Live CD を作成する[手順][LiveCD]が公開されている Ubuntu を利用
2) 容量削減の為、以下の機能のみを利用

- Ubuntu Linux 14.04 LTS Trusty Tahr - Minimal Install (64 bit)  としてインストールされる機能
- python-swiftclient
- curl
- 作成環境の固定 IP アドレスでのネットワーク接続
  (IP アドレス変更時は LiveCD を再作成します)

作成手順が非常に長い為、以下のプロビジョニング・スクリプトを利用します。

```
cp -f /etc/ssh/sshd_config /root/sshd_config.org
sed -i -e "s/#PasswordAuthentication yes/PasswordAuthentication no/g" /etc/ssh/sshd_config
sed -i -e "s/ChallengeResponseAuthentication yes/#ChallengeResponseAuthentication yes/g" /etc/ssh/sshd_config
sed -i -e "s/#ChallengeResponseAuthentication no/ChallengeResponseAuthentication no/g" /etc/ssh/sshd_config
sed -i -e "s/#ListenAddress 0.0.0.0/ListenAddress 0.0.0.0/g" /etc/ssh/sshd_config
sed -i -e "s/Port 22/Port 23456/g" /etc/ssh/sshd_config
service ssh restart
apt-get update
apt-get -y install curl python-swiftclient
export WORK=~/work
export CD=~/cd
export FORMAT=squashfs
export FS_DIR=casper

cat << 'EOS' > chroot.sh
LANG=
apt-get -y install casper lupin-casper
depmod -a $(uname -r)
update-initramfs -u -k $(uname -r)
apt-get clean
find /var/log -regex '.*?[0-9].*?' -exec rm -v {} \;
find /var/log -type f | while read file
do
        cat /dev/null | tee $file
done
EOS

mkdir -p ${CD}/{${FS_DIR},boot/grub} ${WORK}/rootfs
rsync -a --one-file-system --exclude=/proc/* --exclude=/dev/* \
--exclude=/sys/* --exclude=/tmp/* --exclude=/home/* --exclude=/lost+found \
--exclude=/var/tmp/* --exclude=/boot/grub/* \
--exclude=/var/mail/* --exclude=/var/spool/* --exclude=/media/* \
--exclude=/etc/fstab --exclude=/etc/mtab --exclude=/etc/hosts \
--exclude=/etc/timezone --exclude=/etc/shadow* --exclude=/etc/gshadow* \
--exclude=/etc/X11/xorg.conf* --exclude=/etc/gdm/custom.conf \
--exclude=/etc/lightdm/lightdm.conf --exclude=${WORK} --exclude=${CD} \
--exclude=/root/.cache --exclude=/root/.aptitude / ${WORK}/rootfs
cp -av /boot/* ${WORK}/rootfs/boot
mount -o bind /dev/ ${WORK}/rootfs/dev
mount -t proc proc ${WORK}/rootfs/proc
mount -t sysfs sysfs ${WORK}/rootfs/sys
mount -o bind /run ${WORK}/rootfs/run
chroot ${WORK}/rootfs /bin/bash /root/chroot.sh
rm ${WORK}/rootfs/root/chroot.sh
rm ${WORK}/rootfs/root/post_install.*
rm ${WORK}/rootfs/root/sshd_config.org
rm ${WORK}/rootfs/root/.bash_history
export kversion=`cd ${WORK}/rootfs/boot && ls -1 vmlinuz-* | tail -1 | sed 's@vmlinuz-@@'`
cp -fvp ${WORK}/rootfs/boot/vmlinuz-${kversion} ${CD}/${FS_DIR}/vmlinuz
cp -fvp ${WORK}/rootfs/boot/initrd.img-${kversion} ${CD}/${FS_DIR}/initrd.img
umount ${WORK}/rootfs/proc
umount ${WORK}/rootfs/sys
umount ${WORK}/rootfs/dev
umount ${WORK}/rootfs/run
apt-get -y install xorriso squashfs-tools grub-pc-bin
mksquashfs ${WORK}/rootfs ${CD}/${FS_DIR}/filesystem.${FORMAT} -noappend
rm ${CD}/md5sum.txt
echo -n $(du -s --block-size=1 ${WORK}/rootfs | tail -1 | awk '{print $1}') | tee ${CD}/${FS_DIR}/filesystem.size
find ${CD} -type f -print0 | xargs -0 md5sum | sed "s@${CD}@.@" | grep -v md5sum.txt | tee -a ${CD}/md5sum.txt

cat << EOS > ${CD}/boot/grub/grub.cfg
set default="0"
set timeout=10

menuentry "Ubuntu CLI" {
linux /casper/vmlinuz boot=casper textonly ip= noprompt
initrd /casper/initrd.img
}

menuentry "Boot from the first hard disk" {
set root=(hd0)
chainloader +1
}
EOS

grub-mkrescue -o ~/live-cd.iso ${CD}
```

#2. サーバーのオーダー
Ubuntu14.04-64 Minimal の[仮想サーバーをオーダー][VS]します( 1 CPU、メモリー１GB の仮想サーバーでテストしています) 。
その際、上記 1. の[プロビジョニング・スクリプトを指定][Script]します。また、サーバーのオーダー時に ssh のパブリック･キーを指定します。
slcli を使用した場合は以下の様になります。

```
# slcli vs create -D softlayer.com -H LiveCD -c 1 -m 1024 -o UBUNTU_14_64 --billing hourly -d tok02 --public -i https://somewebhost.com/somescriptfile.md -k SSH_key --disk 25 -n 100
This action will incur charges on your account. Continue? [y/N]: y
:.........:......................................:
:    name : value                                :
:.........:......................................:
:      id : 16566253                             :
: created : 2016-03-08T14:54:33+09:00            :
:    guid : 411e950a-176a-4549-a161-c719e18fbb45 :
:.........:......................................:
```

デプロイが完了すると、23456 ポート経由で秘密鍵を使用した ssh で接続可能です。デプロイ完了後しばらくすると、Live CD が ISO イメージ・ファイル(live-cd.iso)として作成されています。

#3. Object Storage への認証情報の設定
以下の様なスクリプト・ファイルを linux 環境からであれば、scp コマンドで、Windows 環境であれば、Putty の pscp コマンドで転送し、Object Storage を操作するシェルから source コマンドで実行します。

```
#!/bin/bash
export ST_AUTH=https://tok02.objectstorage.service.networklayer.com/auth/v1.0/
export ST_USER=Object Storageのユーザー名
export ST_KEY=Object StorageのAPI Key(Password)
```

パブリック･インターフェース経由で Object Storage へアクセスする場合、ST_AUTH に https://tok02.objectstorage.softlayer.net/auth/v1.0/ を指定します。

#4. Object Storage へのイメージのアップロードとインポート
認証情報の設定後、Live CD イメージ・ファイルをObject Storage へのアップロードします。

```
swift upload コンテナ名 live-cd.iso
```

アップロード完了後に、カスタマー・ポータルから[ShinobiLayer: CentOS7のLiveCDをBoot From ImageからISOマウント][Import]の 「3 . Object Storage上のアップロードファイルをimageとしてimportする。」とそれに続く「Boot From Imageの実行」に従って ISO ファイルのインポートとオーダーしたサーバーを「イメージからブート」(Boot From Image) します。

#5. 動作確認
Boot From Image の実施後、しばらくすると root ユーザーとして、23456 ポート経由で秘密鍵を使用した ssh で接続可能となります。
KVM 経由で接続した場合、ubuntu というユーザーのプロンプトがログイン無しで表示されています。ubuntu の設計思想からは、外れそうですが、sudo su - にて、root ユーザーのシェルに入ることが可能です。
上記 3. Object Storage への認証情報の設定の手順を再度実施することで、Live CD 環境から自由に Object Storage へアクセスすることができるようになります。

#6. ネットワーク構成の変更

Live CD の作成環境*1 で /work/rootfs/etc/network/interfaces 、を修正することで、ネットワークの変更が可能です。
また、カーネルの起動パラメーターは /root/cd/boot/grub/gurb.cfg の該当行を編集することで、変更可能です。

上記の変更後、/root から以下のスクリプトを実行します。

```
#!/bin/bash
export WORK=~/work
export CD=~/cd
export FORMAT=squashfs
export FS_DIR=casper
mksquashfs ${WORK}/rootfs ${CD}/${FS_DIR}/filesystem.${FORMAT} -noappend
rm ${CD}/md5sum.txt
echo -n $(du -s --block-size=1 ${WORK}/rootfs | tail -1 | awk '{print $1}') | tee ${CD}/${FS_DIR}/filesystem.size
find ${CD} -type f -print0 | xargs -0 md5sum | sed "s@${CD}@.@" | grep -v md5sum.txt | tee -a ${CD}/md5sum.txt
grub-mkrescue -o ~/live-cd.iso ${CD}
```

*1 もしくは Live CD の作成環境環境から /root 下の work, cd の各ディレクトリ内を全てコピーし、 mksquashfs と grub-mkrescue を使用できるようにした環境

#7. 宿題
この手法で作成した Live CD を Hardware Assisted Virtualization(HVM) 環境となる CentOS7 で利用すると、hvc0 をコンソールとして利用を試みて失敗したことを示すと思われる以下のエラーが出ます。
[  769.497828] init: hvc0 main process (2305) terminated with status 1
[  769.497838] init: hvc0 main process ended, respawning

単に、SSH 経由で Object Storage を利用するに問題ありませんが、KVM 経由では問題になるので、対策を継続調査中です。


#蛇足
この投稿を書く際、以下の 3 点で嵌っていました。

- grub2 をインストールした時点で仮想サーバーが起動しなくなる

事態の把握に手間取り、一番厳しい問題でしたが、参考にした手順に含まれる grub2 パッケージのインストール時に起動領域を破損していました。Live CD に必要なのは grub2 とその依存パッケージの換わりに、grub-pc-bin パッケージだけをインストールすることにしました。


- DHCP サーバーへネットワーク構成を取りに行く動作がとまらない

本来、カーネルの起動パラメーターとして ip=IFACE,ADDRESS,NETMASK,GATEWAY[:IFACE,ADDRESS,NETMASK,GATEWAY] を指定することで DHCP は利用しないはずです(http://manpages.ubuntu.com/manpages/trusty/man7/casper.7.html より)。しかし、どうしても DHCP サーバーを参照使用とする動作を抑止できないので、発想を転換して Live CD のスクリプトである casper パッケージの提供するスクリプトを見直し、ip= のみを指定することでファイルシステム上の /etc/network/interfaces の構成をそのまま利用することにしました。

- Live CD から再起動すると、メディアの取り出しメッセージで止まる
本来はメディアでの起動なので、必要な動作ですが、SoftLayer の仮想サーバーではかえって操作が煩雑になります。カーネルの起動パラメーターに noprompt を追加して、この動作を抑止しました。

# 参考：
ubuntu CommunityHelpWiki より、
[MakeALiveCD/DVD/BootableFlashFromHarddiskInstall
][LiveCD]

ソフトレイヤー活用ガイド第2部 コンフィグレーション・ガイドより、
[1.2 仮想サーバーを起動するには？][VS]
[1.2.2 設定スクリプトの自動実行][Script]
[5.1 オブジェクト・ストレージを利用するには？][ObjectStorage]

Qiita より、
[シェルで SoftLayerの仮想サーバー注文][VSOrder]
[pyenv と slcli コマンドをインストールする手順][VScli]
[ShinobiLayer: CentOS7のLiveCDをBoot From ImageからISOマウント][Import]

[LiveCD]:https://help.ubuntu.com/community/MakeALiveCD/DVD/BootableFlashFromHarddiskInstall
[VS]:https://www.change-makers.jp/post/10292
[ObjectStorage]:https://www.change-makers.jp/post/10354
[Import]:http://qiita.com/testnin2/items/7db7e4d3726dccb4f8a3
[Script]:https://www.change-makers.jp/post/10294
[VSOrder]:http://qiita.com/MahoTakara/items/134b2850ee64dcce1a31
[VScli]:http://qiita.com/MahoTakara/items/cbd861112b00da82c95b