NTTPC Indigo で OS を入れ替える
NTTPC が提供する Indigo という VPS がある。 この VPS はびっくりするほど単価が安いが、OS のクリーンインストールをサポートしていない。
その上、提供しているイメージが一世代古い LTS な Ubuntu 18.04 や CentOS Stream へ統合されると宣言されている CentOS 7/8 のみという状況。選べるのは実質 Ubuntu 18.04 だけ。
インストールしたかったのは Ubuntu 20.04 だったので最悪 dist-upgrade すればよかったが、できればクリーンインストールしたかったので方法を探る旅に出た。
(というのも Arch Linux のインストール ISO を dd で直接 /dev/vda に焼くという行儀の悪いことをし、copytoram をセットして、debootstrap しなければならなかったから。非常に面倒かつ DHCP もない環境でコピペのできないシリアルコンソールもどきで書くのは心が折れてしまった…)
じゃあ提供されている Ubuntu 18.04 ではどうやって IP や SSH 鍵を設定しているのかというと、cloud-init で実行されており、常にマウントされている CD-ROM (LABEL = cidata) に設定が焼き込まれていた。 つまり Ubuntu 18.04 としてインストールしたインスタンスに、 cloud-init が実行される OS イメージをつっこめば、なにも設定せずとも移行できそうってことがわかる。
また、この環境は KVM であることはサービスとして明記されていて、シリアルコンソール相当の NoVNC を開くと Connected to QEMU と表示されることからほぼほぼ QEMU + KVM の組み合わせだろうとわかる。 これらの情報で a_r_g_v.icon に相談した結果、Cloud Image として各ディストリから配布されている QCOW2 のイメージを焼き込めればいけるんちゃう、という提案をもらった。 Cloud Image っていうのは cloud-init が含まれる IaaS 向けイメージをそう呼び、その中に QEMU 向けの QCOW2 イメージが含まれるらしい。ドンピシャで欲しかったもので、これを入れることに決定
肝心の Ubuntu の Cloud Image は で配布されている。 で、.img とつくものが QCOW2 イメージなので、好きなバージョンの好きな QCOW2 イメージを選択する。
今回は Ubuntu 20.04 の最新ビルド、何も suffix のついてない https://cloud-images.ubuntu.com/focal/20201210/focal-server-cloudimg-amd64.img を選択した。もしかしたら -disk-kvm.img ってついてるほうがあってるかもしれない
そうしたら Ubuntu 18.04 でセットアップしたインスタンスに接続、次のようにコマンドを叩き、再起動すれば cloud-init によって IP アドレスと SSH 鍵がセットされた状態の OS になる。
code:replace.sh
sudo su
apt-get update && apt-get install -y qemu-utils
mkdir /tmp/ci && mount -f tmpfs -o size=2G /dev/shm /tmp/ci # オンメモリにイメージを落とす
cd /tmp/ci
cp $(which qemu-img) . # コマンド間違えたときにディスクが破損していても再実行できるようにコピーしておく
# 必要ならここで checksum を確認
# ↓ ここからシリアルコンソールでやったほうがいいかもしれない
qemu-img dd -f qcow2 -O raw if=./qcow.img of=/dev/vda bs=2M
https://gyazo.com/fb700acd2cf56db8e42eb1f255421496
よかったですね。
ここからは完全に余談だが、NTTPC Indigo には "Import VM" という謎の機能がある。
ただ資料から VM のディスクイメージを突っ込むことは察することができる。
QEMU + KVM という組み合わせから予想して QCOW2 だろうってことで Debian の Cloud Image を入れたらビンゴ。起動することがわかった。ただし Import VM 機能を使ってインストールした Debian への ping が通らなかったため、どうも cloud-init 用 CD-ROM は挿入されないらしい。よって SSH 鍵や IP アドレスの自動設定もされない。Cloud Image はだいたい SSH 鍵のみでのログインなので使えない。あと Debian の Cloud Image はシングルユーザーモードが潰されていて無理矢理変更することもできなかった。
でも 自前で QCOW2 イメージさえ用意できればいくらでも OS は入れ替えられることがわかったのは収穫。どんな URL でもリダイレクトさえなければ素直にダウンロードしてくれるので、Cloud Image が提供されていないディストリでも入れることができると思う
sshkey_id というフィールドもあるし、実は Import VM しても勝手に sshkey が選択されて cloud-init が走るのかもしれない。ただ単に Ubuntu / CentOS の Cloud Image に渡す設定の流儀と Debian の Cloud Image が合わなかったのかも。機会があったら検証したい
追記: Ubuntu 18.04 を置き替えるのに使った Ubuntu 20.04 の Cloud Image で Import VM を試したが動かなかったので、 cloud-init の設定は注入されないらしい。やはり自前で QCOW2 イメージを用意する必要がある
追記2: API ドキュメントでは OS Type を指定していて、Ubuntu にしている。そこが肝なのかもしれない。OS をうまく指定すれば操作できる可能性がある
おわり