2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-03-08

警告:
以下の手順で作成した 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マウント

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?