小ネタ: IBM Cloudの仮想サーバーで独自イメージ・テンプレートからのブートが失敗したら


# 要は(TL;DR)
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/8c01c950-a524-b280-a736-ef6388e33bdc.png)

- 【状況】:one: IBM CloudでUbuntu 18.04の仮想サーバーを新規オーダー。:two: 起動後にカスタマイズして独自のイメージ・テンプレートを作った:three:
- 【事象】そのイメージ・テンプレートから新たに仮想サーバーをオーダー:four:したが:five:ブートが完了しない（ハング状態で最終的にキャンセル)
- 【原因】大元の仮想サーバーをオーダーする時(:one:)に使用したイメージが**"cloud-init"** Enabledなもの[^1]だった。起動後にデスクトップ環境を使いたかったので :two: gnome3をインストール(apt install ubuntu-desktop)したが、その過程でネットワーク定義が変更されてしまった。その状態で:three:テンプレートを作ったために、:four::five: 次回のcloud-initのブートが失敗したもの
- 【対応】始めの仮想サーバーをオーダーする時に**デフォルトのメニューからは行わず**、パブリック・イメージ・テンプレートから**cloud-init" が無効化(Disabled)されたOSイメージ**を選んで、それを指定して仮想サーバーをオーダーするといいかも！

[^1]: メニューから普通に仮想マシンをオーダーすると"cloud-init"が有効なイメージが選択されるようです


# はじめに
こんにちわ！石田です。先般IBM Cloudで仮想サーバーを使っていた際に遭遇した事象をシェアします。レア・ケースかもしれませんが同様のことでお困りの方のためにメモとして書いておきますネ。

# 背景・やりたかったこと

IBM Cloudを使ったハンズオンセミナーを調査検討していました。クラウド上の仮想サーバーにカスタマイズしたハンズオン環境を作ってイメージ・テンプレート（AWSでいえばスナップショット)として保存しておけば、あとは参加人数に応じて必要な数の環境を簡単に準備できるのでいいよね！と思ってましたが、ハマりました。。。orz

# うまくいかなかった事象の再現

【1】まずはカタログのメニューから仮想サーバーをオーダー
「コンピュート」－「Virtual Server」
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/283327e6-27ea-d740-8625-68a7ae91a41f.png)

【2】OSとしてubuntu 18.04を選んだ以外は全部デフォルトでオーダー
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/fe9084e9-1955-f479-73cd-f0ffd14e705d.png)

【3】起動したらSSHでroot ログインし、デスクトップが欲しいのでgnome3をインストール(1000個以上を追加するので30分以上かかります）[^2]

[^2]: 実際は他にもいろいろとカスタマイズしたが、本稿の主旨とは関係ないので省略。要はubuntu-desktopをいれたことでcloud-initの想定していた構成が破壊された模様


`apt update`
`apt install ubuntu-desktop`

【4】インストールが終わったらイメージ・テンプレートの作成
 
仮想サーバーの明細パネルの右上「アクション」－「イメージ・テンプレートの作成」
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/95c14003-3cfe-e630-4a8a-f9c6b8d7f57c.png)

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/b26b380a-8d80-b64d-4694-b554108318b3.png)

とれました
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/7efd458e-ffad-391a-5830-fbd0ea954ab0.png)

- 起動状態にあった仮想マシンは自動的に遮断され、イメージテンプレート作成後に自動的に再度起動されます。テンプレをとる元になる仮想サーバーのほうは何度でもリブートは成功します。失敗するのは「テンプレから起動した仮想サーバー」のほうですので、お間違えなきよう。cloud-initって要は初回のOS導入&起動なので、それが終わればあとは関係ないのでしょう。

【5】いましがた取ったイメージテンプレートをベースにして、仮想マシンをオーダー

「公開VSIの注文」
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/21414488-8030-51ab-c7bd-608381a478d8.png)

OSのイメージが「**カスタム**」である以外は全部同じ
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/25ea4645-f4bc-7390-2f7a-ed4326983aa8.png)

起動してしばらく待ってIPアドレスが割り振られても、パスワードが作られませんし時計マークが消えません（ハング）。。30分位放置するとセンター側でキャンセルされます。(自分ではキャンセルできません）
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/d208502d-5f75-e461-b587-306529f6f12c.png)

- ちなみにイメージテンプレートからの起動ではrootのパスワードは初期化されます。root以外に自分でユーザーを作った場合は、そのユーザーは保持されますしパスワードは変わりません。


# ブートが完了しない原因

サポートとやり取りしながら、カスタマイズの範囲を段階的に狭めて原因特定・問題判別を行いました。**結果的に私の場合にはubuntu-desktopのインストールがcloud-initが想定しているネットワーク構成定義を意図せず上書き破壊したために、その破壊された状態で採取したイメージテンプレートは次回のブート時に基盤(IBM Cloud)との通信ができず、結果的にブートがハング(失敗)したものでした。** 詳しく存じませんがcloud-initはその名の通り、クラウド環境でのOSブートの自動化のための機能ですが、[「IBM Cloud Standard Imageの正しい取り方」](https://qiita.com/satorubz/items/57103287b688e749d54e)なんて記事があるように結構センシティブで、元の環境と変えると結構な確率でブートに失敗したりするようです。（というかあまり変更してはいけないようです）

# 対応

ということで「初めに使ったOS起動イメージがcloud-init対応のものであった」ことと「ubuntu-desktopのインストール」が不整合であったことが原因でしたので、「**初めに使ったOS起動イメージがcloud-initを使わないもの**」であればいいわけです。(cloud-initを使わない場合は従来のSoftlayerの起動スクリプトを使うそうですが、要は起動すればいいんで、 結果オーライですね)　IBM Cloudでは「パブリック・イメージ」に様々なイメージが置いてあります。今回はubuntu 18.04を探したら、cloud-initを使ってないイメージもありました！　よって最初の仮想マシンをオーダーする段階で、このイメージを指定すればオーケーです。

Devices- Manage- Imagesで「パブリック・イメージ（すべてのイメージ）」を選び条件検索すると、複数のイメージが列挙されます（ubuntu 18.04でディスク25GBのものは4つ）

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/1274f3db-f438-1b46-f6f8-c9fcaf332352.png)

これらの明細を見ると、cloud-initが有効(Enabled)なものと無効(Disabled)なものがあります。
今回のubuntuの例では[:three:のイメージ](https://cloud.ibm.com/gen1/infrastructure/image-templates/1948895/details#main)は「クラウド初期設定(cloud-init)」が「有効(Enabled)」であり、[:four:のイメージ](https://cloud.ibm.com/gen1/infrastructure/image-templates/1949057/details#main)は「クラウド初期設定(cloud-init)」が「無効(Disabled)」です。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/cc6ab9f9-e6ab-396f-2774-50a4997923e3.png)

よって:four:のイメージを選択して右上のボタンから「公開VSIの注文」をすればオーケーです。
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/7b187cd0-142d-83e7-9b68-cbb4176b6bd0.png)

私のケースではこの:four:から起動した仮想サーバーにgnome3を入れたり様々なカスタマイズを行いましたが、その後作ったイメージ・テンプレートは正常にブートできました。

ということで長々書きましたが、当記事がIBM Cloud利用中にイメージテンプレートからブートできない方のお役に立てば幸いです。

# いわずもがな、ですが一応
当記事の主旨は「cloud-initは一切使わない方がよい」とか「ubuntu18.04にgnome3入れてからイメージテンプレ取ると、絶対にブート失敗する[^3]」とかを言ってるわけではありません。「不整合」なので、生憎何と何がぶつかるか、はぶつかってみないとわかりません。当記事の主旨は「**普通に仮想マシンをオーダーしてテンプレ作っただけなのに、そのテンプレからのブートが失敗したなら、cloud-init使わないOSイメージを使ったら回避できるかもよ！**」ということです。

[^3]: 当記事執筆時点である2019年10月24日時点では絶対にブート失敗しますが、それが仕様であり将来もそうだ、とわけではありません。