SoftLayer

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

More than 3 years have passed since last update.

警告:

以下の手順で作成した Live CD には、作成に使用したサーバーの情報の多くがそのまま含ます。

また、Live CD で起動した状態の KVM コンソールから、ログイン無しで root 権限のコマンドの実行が可能です。

さらに、各種ソフトのバージョンは Live CD 作成時点に固定される為、その時点以降に発見/対応された脆弱性の影響を受ける可能性は高くなります。

上記の警告の意味を理解した上で、ご活用下さい。


0. はじめに

以前の投稿 SoftLayer における Object Storage への Linux システム・バックアップ(バックアップ&リストア編) では、rescue 環境として CentOS 5 が利用できる Linux 環境に対象を絞っていました。

投稿後、「次は Live CD での手順だね :smiley: 」というご意見を頂いたので、まず、SoftLayer 環境で Object Storage にアクセスできる Live CD を作る手順をまとめました。

「ここまでしなくても、既に公開されている LiveCD で同じことができるよ~」という情報も絶賛募集中です :sweat_smile:


1. 断捨離

1) OS はインストール済みシステムから Live CD を作成する手順が公開されている 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 の仮想サーバーをオーダーします( 1 CPU、メモリー1GB の仮想サーバーでテストしています) 。

その際、上記 1. のプロビジョニング・スクリプトを指定します。また、サーバーのオーダー時に 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マウントの 「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

ソフトレイヤー活用ガイド第2部 コンフィグレーション・ガイドより、

1.2 仮想サーバーを起動するには?

1.2.2 設定スクリプトの自動実行

5.1 オブジェクト・ストレージを利用するには?

Qiita より、

シェルで SoftLayerの仮想サーバー注文

pyenv と slcli コマンドをインストールする手順

ShinobiLayer: CentOS7のLiveCDをBoot From ImageからISOマウント