Amazon Linux 2 をProxmox6のKVMで動かす

## 参考

* [Amazon Linux 2 を仮想マシンとしてオンプレミスで実行する - Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/amazon-linux-2-virtual-machine.html#amazon-linux-2-virtual-machine-download)

* 起動した画面

![スクリーンショット_2019-09-02_14-05-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/8c6a1edc-d150-0afd-1b0f-5fe0e04844e3.png)



## ステップ 1: seed.iso 起動イメージを準備する

### ネットワーク設定

```yaml:meta-data
local-hostname: amazonlinux2.onprem

network-interfaces: |
  auto eth0
  iface eth0 inet static
  address 192.168.100.62
  netmask 255.255.255.0
  gateway 192.168.100.1
  dns-nameservers 8.8.8.8 8.8.4.4
  dns-search hoge.local bar.info
```

### ユーザー設定

* user-data は初回起動時しか使われない様子。
* user-dataは `/var/lib/cloud/instance/user-data.txt` に保存される。平文で書いたパスワードは平分で残るので注意。

```yaml:user-data
#cloud-config

users:
  - default

chpasswd:
  list: |
    ec2-user:plain_password_1

## パスワード認証の場合以下
#ssh_pwauth: True

ssh_authorized_keys:
  - ssh-rsa AAAAB...cnnc0 ec2-user@localhost

runcmd:
  - [ cp, /usr/share/zoneinfo/Asia/Tokyo, /etc/localtime]
```

* [cloud-init/cloud-config.txt at 177cf3bb6690f9669a0a560c09ca5abbcbea964a · number5/cloud-init · GitHub](https://github.com/number5/cloud-init/blob/177cf3bb6690f9669a0a560c09ca5abbcbea964a/doc/examples/cloud-config.txt) 書き方のサンプル

```sh:seed.isoの作成
genisoimage -output seed.iso \
  -volid cidata -joliet -rock \
  user-data meta-data
```


## ステップ 2: Amazon Linux 2 VM イメージのダウンロード

* https://aws.amazon.com/jp/amazon-linux-2/faqs/
    * https://cdn.amazonlinux.com/os-images/latest/

![スクリーンショット_2019-09-02_12-34-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/7ec45d4b-25e4-b816-fef9-e764090563d5.png)

用意されているqcow2イメージの論理サイズは`25GB`。


## ステップ 3: 新しい VM を起動して接続する

### proxmox6にて`Create VM`

VM名を指定

![スクリーンショット_2019-09-02_12-51-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/ee0b1685-b7b9-54f7-666c-3b9747ed5f18.png)

seed.iso を指定

![スクリーンショット_2019-09-02_12-53-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/aa9cf172-1776-da20-f7eb-7d835734776d.png)

Next

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/7b2639ea-f3cd-0c24-a68a-4c1a5e8abc2a.png)

* VirtIO Block (これは好み)
* 25GB を指定 (実際には指定しなくても動作するが念のため指定)

![スクリーンショット_2019-09-02_12-56-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/c11c5583-c39e-ce68-34f1-3bd9b53e3ceb.png)

残りは全て`Next`


### proxmox6で作成されたVMイメージをAmazonのものに差し替え

```sh
sudo -s
cp -a "amzn2-kvm-2.0.20190612-x86_64.xfs.gpt.qcow2" \
  "/var/lib/vz/image/262/vm-262-disk-0.qcow2"
```

## 起動

`Start`を押下し起動を見守る。

![スクリーンショット_2019-09-02_13-01-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/3e4925cf-add5-8aa0-7956-29aa59061fa3.png)

![スクリーンショット_2019-09-02_13-03-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/c6674a32-130d-f2e3-1760-1071b6dc476a.png)

----

## その他情報

### 暗号化したパスワードの生成方法

```sh:(参考までに)暗号化したパスワードの生成方法
# python -c 'import crypt,getpass; print crypt.crypt(getpass.getpass())'
```

### 初回起動時の自動セキュリティアップデートを無効にする

* 参考 [Amazon Linuxのcloud-init Tips集 ｜ DevelopersIO](https://dev.classmethod.jp/cloud/aws/cloud-init-tips/)

```yaml:
repo_update: none
repo_upgrade: none
```

* ログ
    * /var/log/cloud-init.log
    * /var/log/cloud-init-output.log

---

### (メモ) DNS無効時、gssproxy.serviceの起動で１分待たされる

* [オンプレのKVM](https://qiita.com/tukiyo3/items/0ec795da4c3f7907d858)で[Amazon Linux 2.0.20190612](https://cdn.amazonlinux.com/os-images/2.0.20190612/kvm/) にて検証

* 起動時の以下で１分待たされる

![スクリーンショット_2019-09-03_06-24-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/9529122f-9148-1dd5-de5c-30784b949133.png)

* nfs-client.target の起動で以下エラーを発見

![スクリーンショット_2019-09-03_06-28-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/63c17a8d-f8aa-a45b-f610-f23fa09db683.png)


### 方法1. gssproxy.serviceをスキップする方法

* /usr/lib/systemd/system/nfs-client.target

```diff:/usr/lib/systemd/system/nfs-client.target
  [Unit]
  Description=NFS client services
  Before=remote-fs-pre.target
  Wants=remote-fs-pre.target
  
  # Note: we don't "Wants=rpc-statd.service" as "mount.nfs" will arrange to
  # start that on demand if needed.
  Wants=rpc-statd-notify.service

  # GSS services dependencies and ordering
- Wants=auth-rpcgss-module.service
- After=rpc-gssd.service gssproxy.service
+ #Wants=auth-rpcgss-module.service
+ #After=rpc-gssd.service gssproxy.service
  
  [Install]
  WantedBy=multi-user.target
  WantedBy=remote-fs.target
```


### 方法2. nfs-client.target サービス自体をsystemctlからは起動させない方法

```sh:nfsを使わない場合
systemctl disable nfs-client.target
```

* OS再起動し、早くなったことを確認。
* nfsを使いたい場合は別の起動方法をすると良いと思います。

```sh:rootのcronに仕込む例
@reboot (/bin/systemctl start nfs-client.target)
```

## その他イメージ

* Dockerイメージ
    * https://hub.docker.com/_/amazonlinux/
* Vagrant
    * https://app.vagrantup.com/mvbcoding/boxes/awslinux