1台作り込んだ仮想マシンのイメージを複製して、何台も立ち上げた
別のサーバーやのに SSH で「前と同じ鍵」みたいな話になって混乱した
【疑問】仮想マシンのイメージを複製したら SSH で警告が出た。仮想マシンとコンテナ、クラウドのゲスト、マシン ID と cloud-init【LPICレベル1】
前提のおさらい。パッケージは apt・dnf・zypper などで入れて、設定は /etc に置く。複製すると /etc の中身もそのまま写る
>>1
複製したら変えなあかんものがある。代表はこの2つ
SSH のホスト鍵(/etc/ssh/ssh_host_*_key)。同じ鍵やと、別々のマシンを区別できない
マシン ID(/etc/machine-id)。systemd や D-Bus がマシンを見分けるのに使う
>>3
作り直し方は?
>>4
ホスト鍵は古いものを消して ssh-keygen -A(足りない種類の鍵を全部作る、ssh-keygen の man)。Debian 系なら dpkg-reconfigure openssh-server でもできる
マシン ID は、machine-id の man によると、複製して使うイメージでは空のファイルにしておいて、起動したときに作らせる。systemd-machine-id-setup で作ることもできる
>>5
試したマシンでは /etc/machine-id は33バイト(16進32文字と改行)、/var/lib/dbus/machine-id は /etc/machine-id へのリンクやった
>>2
仮想マシンとコンテナはどう違うん?
>>7
仮想マシンはハイパーバイザの上で、ハードウェアを丸ごとまねして、ゲストごとに自分のカーネルを動かす。コンテナはホストのカーネルを共有して、プロセスとファイルの見え方だけを分ける。だからコンテナは軽いけど、ホストと違うカーネルは使えない
>>8
ハイパーバイザには、ハードウェアの上で直接動くもの(Xen や KVM)と、普通の OS の上でアプリとして動くもの(VirtualBox など)がある
>>8
自分のいる環境がどっちか分かる?
>>10systemd-detect-virt。試したら container-other と出て、-v(仮想マシンだけ見る)は kvm。KVM の仮想マシンの中のコンテナやった。lspci にも Virtio のデバイスが並んでた
>>11
Virtio みたいに、ゲストが仮想マシンの中にいると知ってて使う速いドライバを、準仮想化のドライバと言う。VirtualBox の Guest Additions のような、ゲストに入れる道具もある
>>2
クラウドで立ち上げるときの初期設定は?
>>13
cloud-init。起動のときにクラウドから渡された user-data を読んで、ホスト名・ユーザー・SSH の公開鍵・パッケージ・コマンドなどを設定する。#cloud-config で始まる YAML か、#! で始まるスクリプト
>>14
IaaS では計算資源(インスタンス)、ブロックストレージ、ネットワーク、外から届くアドレスなどを借りて、OS から上は自分で面倒を見る。そこで最初の設定を cloud-init にやらせるんか
>>3
複製したらホスト鍵とマシン ID を作り直す、VM は自分のカーネル、コンテナは共有、初期設定は cloud-init。混乱の原因が分かった
管理人のひとこと
- 仮想マシンはハイパーバイザの上でゲストごとに自分のカーネルを動かす(Xen・KVM、VirtualBox など)。コンテナはホストのカーネルを共有して隔離する。
systemd-detect-virtで環境を判定できる。 - ゲスト用の準仮想化ドライバ(Virtio など)や Guest Additions で性能や連携を良くする。
- イメージを複製したら SSH のホスト鍵(/etc/ssh/ssh_host_*_key、
ssh-keygen -Aで作り直す)とマシン ID(/etc/machine-id、128ビット。イメージでは空にして起動時に作らせる。D-Bus の ID も同じもの)を一意にする。 - IaaS ではインスタンス・ブロックストレージ・ネットワークを借り、cloud-init が起動時に user-data(
#cloud-configの YAML など)で初期設定を行う。