7.4でKVM構築(基盤構築~仮想マシンインストールまで)2018/04/29KVMLinuxだいぶ更新に間が空きました。あっという間にGWですね。あやうく休日出勤になりそうだったところを全力で回避してきたので、自宅のLinuxマシンにKVMを導入します。仮想マシンはVirtualBoxで動かしてきて、1マシン単位の検証ではそんな問題なかったけど、ネットワークセグメントをザクザク切った上で行う複数マシン単位の検証にはやっぱり不便だったので、導入に踏み切りました。kB1234567891011CPUは仮想化支援機構に対応していることが前提です。以下のコマンドでCPUに仮想化支援機能があるか確認。出力があればOKです。出力内容は省きますが、スレッドごとに対応/非対応が表示され、i3-7100を使っているので、4行表示されていました。vmx1AMDのCPUなら以下のコマンドで確認。svm1なお、CPUに仮想化支援機能が存在していても、BIOS/UEFIで無効にされていると使用できないので注意。Machineであり、Linuxカーネルにデフォルトでその機能が組み込まれていますが、その管理回りだとかAPI周りだとかは新規にインストールする必要があります。ディストリによってはこれらがすでに入っていることも。bridge-utils1qemu-kvm:ハードウェアエミュレータ。KVMにはハイパーバイザとしての機能しかないたのでエミュレーションソフトが必要。メモリやディスクI/Oをエミュレートします。CPUエミュレートはCPUの仮想化支援機能で。libvirt:仮想化ソフト管理用の共通API。KVMのみならずXenやLXC、ESXiなどいろんなものを管理できます。LinuxのネットワークにおけるNetworkManagerのようなもの。virt-install:インストールメディア等から新しい仮想マシンを作成するためのツール。libvirtプロジェクトで作成されているものの一つです。libvirt同様にいろいろな仮想化基盤に対応しています。virt-manager:仮想マシンを管理するlibvirtプロジェクトのGUIインタフェース。コマンドでやりたいのであまり使いません。仮想マシンのGUIインストール時に使用するコンソールとしてのみ利用します。なければVNCクライアントを操作端末に入れて仮想マシンに接続してGUIインストール作業をする方法もあります。bridge-utils:仮想ブリッジのユーティリティ。仮想ブリッジの作成はNetworkManagerからやります。ありがちですけど、NetworkManagerが入っている環境ではネットワーク関連は全てこれからやらないとこける(私はこけた)。今回は仮想ブリッジの接続確認の表示のために使います。インストール後、KVMのカーネルモジュールが有効か念のため確認。OSインストール後に意図的に無効にしているとかでなければ有効なはず。kvm、kvm_intel(またはkvm_amd)が存在していることを確認。kvm1234そして起動。ブリッジネットワーク作成VirtualBoxもそうでしたが、KVMはデフォルトではNATを利用して仮想マシンが外界と疎通できるようになっています。外界から仮想マシンにアクセスするためにはポートごとにDNATを設定する必要がありますが、仮想マシンを普通にサーバとして使うにはいちいち変換テーブルを定義なぞしていられません。ブリッジネットワークを作成します。手順自体はさらっとしていますが、概念を理解するのにてこずったので後のほうでまとめておきます。仮想ブリッジの作成NetworkManagerから。これがインストールされている環境ではこれ以外でネットワークをさわるべきではない。仮想ブリッジのSTP無効化、IPなど設定ブリッジを作成するとデフォルトでスパツリが有効になっています。単独のブリッジとして動かすのでスパツリは不要。余計なパケット垂れ流しますし無効化しておきます。no1作成した仮想ブリッジに、「物理ホストで使用していた値と同じ値の」固定IPアドレス、デフォゲ、DNS設定を行う。ここがはてなポイントその1だった。作成した仮想ブリッジに物理NICを接続します。接続後、「もともとあった物理NICの設定は不要になる」ため削除します。ここがはてなポイントその2。削除の際は通信が途切れるので、ネットワーク越しに構築を行っているなら同時にリブートをかけるようにしておく。直前にsudo打っておくなど、なんらかの方法でsudoのパスワードは聞かれないようにしておいてください。仮想ブリッジbr0が作成されたことを確認。物理NIC(例ではenp0s31f6)の接続名がbridge-slave-*になっていてブリッジに接続されていることを確認。nmcliではどのブリッジに接続されているかはわかりません。--1234567物理NICがbr0に接続されていることを確認。virbr0-nic1234ipがbr0に割り当てられていることを確認。ff:ff:ff:ff:ff:ff123456789101112131415161718192021以上でブリッジネットワーク作成完了。お試しで仮想マシン作成とりあえずvirt-managerを使ってポチポチ仮想マシンを構築してみます。自動化&コード化したいところ。これもVagrantを使うのがいいのかな。スナップショット取っておいて複製後にAnsibleで自動展開するのがいいのかな。ホストマシンにGUIログインし、以下のコマンドで「仮想マシンマネージャー」を起動。sudoつけない場合、起動はしますがあらゆる操作が怒られます。ユーザをグループに追加してもいいです。virt-manager1このようにQEMU/KVMで仮想化基盤が稼働していることを確認します。virt-managerはlibvirtプロジェクトなので、他の仮想基盤が本ホストで稼働している場合、それもこの画面に表示されるはず。「ファイル」→「新しい仮想マシン」をクリック。今回はローカルのインストールメディアを利用して仮想マシンをインストールします。isoはどっかから落っことしてきて/var/lib/libvirt/images配下に置いておいてください。インストールメディアのイメージファイルを選択。割り当てるメモリとCPU数を選択。ストレージデバイスの選択。ディスクイメージを置くパスも変更できますが、今回はそのまま(/var/lib/libvirt/images/)で。最終確認画面が出ますが、忘れずに「ネットワークの選択」を行います。さっき作成したbr0を選択。まって仮想マシンのGUIインストーラが表示されたら成功。あとは普通のLinuxマシン同様ぽちぽちインストールしていきます。外界からブリッジ接続経由でsshなどでアクセス出来たら成功。GUIなんてまぁめんどいのできっとこの方法での仮想マシン作成はもうやらない。NetworkManagerとKVMと仮想ブリッジ構築はわりとすんなりいけたのですが、悩んだのがここ。「既存の物理NICを仮想ブリッジにして、物理NICを接続する」と言われたとき混乱しました。仮想ブリッジにIP設定をして、物理NICには何も設定をしない。私が混乱していた理由は、NetworkManagerのデバイス名と接続名を混同していたからと、マスターとスレーブの概念を逆に理解していたからでした。いえば今までちゃんとNetworkManagerについて勉強したことなかったな。デバイス名と接続名の違いについて。デバイス名(ifname):仮想や物理を問わず、ネットワークデバイスを識別するための名前、重要なのが、NetworkManagerではデバイスに直接設定を付与するというわけではないということ。接続名(con-name):設定を識別するための名前。ここで設定を定義し、その設定をデバイスに紐づけることでデバイスが設定を持つことになります。firewalldの「ゾーンをNICに割り当てる」という考え方と同じですね。ややこしいのはデバイス名と接続名がまったく同じ名前なことがあること。スタンドアロンの物理NICをスタンドアロンで使う場合はデフォルトで同名なのでややこしい。続いてマスターデバイスとスレーブデバイスの違いについて。マスターデバイス:設定を持つ論理的なデバイス。チーミングでも、物理的なデバイスそれ自体にアクセスするのではなく、チーミングされた論理デバイスにアクセスします。今回はブリッジとしてマスターデバイスを作成したので、ここにIPアドレス等の設定をします。スレーブデバイス:論理デバイスを構成する物理デバイス(仮想も含みます。論理ではないという意味)。上記を踏まえて、NetworkManagerでやったことを説明するとこんなかんじ。br01デバイス名(ifname)br0をブリッジとして作成。接続名(conn-name)は省略されたため、NetworkManagerの命名規則に則りbridge-br0として作成。192.168.100.112接続名(conn-name)bridge-br0の設定を付与。bridge-br01デバイス名(ifname)enp0s31f6をブリッジスレーブとして作成。接続名は省略されたため、NetworkManagerの命名規則に則りbridge-slave-enp0s31f6として作成。enp0s31f61接続名enp0s31f6を削除。デバイスを削除したわけではないことに注意。これにより、デバイス名enp0s31f6の管理が既存の接続名enp0s31f6からbridge-slave-enp0s31f6に移管され、デバイスenp0s31f6が接続名bridge-br0のブリッジスレーブとなる。ゲストマシンもNetworkManageでネットワークが管理されていると仮定したとき、イメージとしてはこんな感じ。KVMホストマシンはブリッジとして稼働しているため、ゲストマシンのIPアドレス宛に来た通信は、ブリッジの動作としてそっちに転送する。ブリッジ自分自身もIPアドレスを持っているため、自分宛のIPアドレスに来たアクセスは自分が処理する。なんとなくこれが腹落ちするまで時間がかかったので、メモとして残しておきます。所感KVMのインストール自体はすんなり終わりました。仮想マシンの管理はVagrantでやっていたので、久しぶりに仮想マシンのインストールを手動でやりましたがやっぱりめんどくさい。それとは別に、仕事で使うかもしれないのでリバースプロキシとしてのnginxの検証も仮想マシン立ててやりたい。ここでネットワークセグメントを好きに切れるKVMが生きてくれると嬉しい。