Ubuntu 16.04をセットアップ、KVM・LXDをブリッジ構成にする

# やること
* Ubuntu 16.04（固定IP）
    * KVM（ブリッジ接続）
    * LXD（ブリッジ接続・固定IP）

# インストール
UEFIの場合、事前にパーティションを切る。KVM上で試すときにUEFIの場合はEFI/ubuntu/grubx64.efiをEFI/BOOT/BOOTX64.EFIへコピー。

ホスト名は最初から設定し、ユーザーはとりあえずtestユーザーを作る。

## ディレクトリーを英語化
```
$ LANG=C xdg-user-dirs-gtk-update
```

## NetworkManagerを無効化
```
# NetworkManagerが起動しないようにコメントアウトする
$ sudo nano /etc/init/network-manager.conf

#start on (local-filesystems
#          and started dbus
#          and static-network-up)
```

## IPアドレスを固定
この手順を飛ばしてブリッジを作成しても構いません。

```
# イーサネットのデバイス名を調べる（下記の<xxx>）
$ ip a

# ネットワーク設定を変更
$ sudo nano /etc/network/interfaces
auto lo
iface lo inet loopback

auto <xxx>
iface <xxx> inet static
  address 192.168.1.<nnn>
  netmask 255.255.255.0
  gateway 192.168.1.1
  dns-nameservers 192.168.1.1

# 再起動
$ sudo shutdown -r now
```

## ブリッジを作成
```
# 仮想ブリッジを作るためにbridge-utilsをインストール
$ sudo apt-get install -y bridge-utils

# イーサネットのデバイス名を調べる（下記の<xxx>）
$ ip a

# ネットワーク設定を変更
$ sudo nano /etc/network/interfaces
auto lo br0
iface lo inet loopback

iface <xxx> inet manual

iface br0 inet static
	address 192.168.1.<nnn>
	netmask 255.255.255.0
	gateway 192.168.1.1
	dns-nameservers 192.168.1.1
	bridge_ports xxx

# 再起動
$ sudo shutdown -r now
```

## NetworkManagerを削除
```
$ sudo apt-get purge -y network-manager
```

# KVMをインストール
```
# 各種パッケージのインストール
$ sudo apt-get install -y qemu-kvm libvirt-bin virt-manager ovmf

# 操作したいユーザーをlibvirtdグループに追加
$ sudo gpasswd -a <user> libvirtd

# 再起動
$ sudo shutdown -r now

# libvirt-binの状況を確認
$ sudo /etc/init.d/libvirt-bin status
```

# KVMを管理
```
# 基本的にvirt-manager（仮想マシンマネージャー）で操作するがUUIDを変えたい場合
# 仮想マシンの一覧を確認
$ sudo virsh list --all

# 仮想マシンの設定(XML)をダンプ
$ sudo virsh dumpxml xxx > domain.xml

# 仮想マシンを管理対象から外す
$ sudo virsh undefine xxx

# XMLを直接編集してUUIDを変更
$ sudo nano domain.xml

# XMLを登録
$ sudo virsh define domain.xml
```

# LXDをインストール
```
# バックポート版をインストール
$ sudo apt-get install -y -t xenial-backports lxd

# 初期設定
$ sudo lxd init

# ブリッジを構成
$ sudo lxc profile device set default eth0 parent br0
```

# LXDを管理
```
# コンテナを作成
$ sudo lxc init ubuntu:16.04 <container>

# コンテナを起動
$ sudo lxc start <container>

# コンテナの一覧を確認
$ sudo lxc list

# IPアドレスを固定
$ sudo lxc exec <container> -- sh -c 'echo "network: {config: disabled}" > /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg'
$ sudo lxc exec <container> -- cat /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
network: {config: disabled}

$ address='192.168.1.<nnn>' &&
$ netmask='255.255.255.0' &&
$ gateway='192.168.1.1' &&
$ dns_nameservers='192.168.1.1' &&
$ cfg="auto lo\niface lo inet loopback\n\nauto eth0\niface eth0 inet static\n\taddress $address\n\tnetmask $netmask\n\tgateway $gateway\n\tdns-nameservers $dns_nameservers" &&
$ sudo lxc exec <container> -- sh -c "echo '$cfg' > /etc/network/interfaces.d/50-cloud-init.cfg"
$ sudo lxc exec <container> -- cat /etc/network/interfaces.d/50-cloud-init.cfg
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
	address 192.168.1.<nnn>
	netmask 255.255.255.0
	gateway 192.168.1.1
	dns-nameservers 192.168.1.1

# コンテナの中に入る
$ sudo lxc exec <container> bash

# コンテナの中から出る
# exit

# コンテナを停止
$ sudo lxc stop <container>

# コンテナを削除
$ sudo lxc delete <container>
```