今更だがAmazonLinux2のboxをVirtualBoxで自作してみた (Windows10)

AmazonLinux2で本番EC2サーバを構築していて、localでも動くVM環境が欲しくなったのでメモという位置づけです。

**対象者** 
・**既にAmazonLinux2をlocal以外の環境で利用している人**
・**AmazonLinux2を試してみたい人**
・**自作のBoxを作成してみたい人**

**環境**
Windows10

# localのVM環境あると何が便利？
- 本番やステージング環境と合わせることで環境依存の不具合を無くせる
- Vagrantや構成管理ツール (Ansible, Chef, Puppet)などと合わせると汎用性が増す
- 開発の手軽さが増し増し

**今回はuserの作成などは特にせずデフォルトで最低限必要の設定のみ実施しています**
**Vagrantで使用する前提かつ、ユーザの作成や環境設定などは実施する前提で作成します**

# VirtualBoxのインストール
以下からVirtualBoxをダウンロードしてインストール
https://www.virtualbox.org/wiki/Downloads

# Vagrantのインストール
以下からVagrantをダウンロードしてインストール
https://www.vagrantup.com/downloads.html
**※Hyper-Vをオフにしないと使用できません。**

# Virtual Box Imageをダウンロード

最新のイメージをダウンロードする場合は以下からダウンロード。
https://cdn.amazonlinux.com/os-images/latest/virtualbox/

古いイメージをダウンロードする際は、URLのlatest部分が以下のように指定することになります。
https://cdn.amazonlinux.com/os-images/2.0.20181114//virtualbox/

# Box用のディレクトリを作成
どこでもいいので2階層のディレクトリを作成しましょう。
**作成したディレクトリが作業ディレクトリとなります。**
**今回はsampleディレクトリとsample配下にconfigディレクトリを作成します。**

# 必要なファイルの作成
作成したsampleディレクトリとsampleディレクトリ配下configディレクトリの中身は最終的に以下になります。

```bash
/sample
|--amzn2-virtualbox-2.0.20190612-x86_64.xfs.gpt.vdi
|--config
|  |--meta-data
|  |--seed.iso  #←後程作成します
|  |--user-data
```

まずはダウンロードしたVirtual Box Imageをsampleディレクトリに入れます。

## meta-data, user-data作成

次にmeta-data, user-dataを作成していきます。
記述は必要に応じて変更してください。

```yaml:meta-data
local-hostname: localhost.localdomain
```

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

chpasswd:
  list: |
    root:root
  expire: False

# VirtualBox Guest Additions のビルドに必要なパッケージをインストール
packages:
  - kernel-devel
  - kernel-headers
  - gcc
  - make
  - perl
  - bzip2
  - mod_ssl
```
この初期化の段階でユーザを作成したい人は`users`のところにユーザを追加し、[必要な設定](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-user-account-cloud-init-user-data/)をいる必要があります。


## seed.isoファイルの作成

seed.isoファイルは今回[ISO Creator](https://free-iso-creator.softonic.jp/)を用いて作成します。
**seed.isoファイルはAmazonLinux2のcloud-initで使用するもので、seed.isoを作成するには前述のmeta-dataとuser-dataが必要です。**
※cloud-initはインスタンスが初期化するためのユーティリティとなります。

![isocreator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403879/227d9d9f-adaf-e034-b28f-be07717dc16d.png)


ISO File Path (ファイルの出力先に)にsample/configディレクトリ配下seed.isoとして指定します。
**Volume Nameは必ずcidataとしてください (seed.isoをcloud-initで読み込ませるのに必要です)**

**Folder Pathはmeta-data, user-dataが配置されているディレクトリを指定します。**
つまりsample/configディレクトリです！
指定後startするとseed.isoが作成されますよ。


# 仮想マシンの作成
ここまで準備ができたら、VirtualBoxを起動し、仮想マシンを作成していきます。

## 仮想マシンの作成時の設定

![virtualbox.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403879/f98e8511-d4af-53f8-5070-d49568c4b8f1.png)

AmazonLinux2は基本的にRedhat7ベースで作成されているバージョンはRedhatを選択しましょう。
マシンフォルダーはデフォルトで問題ないです。

![virtual-memory.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403879/bf6818bb-78a2-ab10-e2ec-949b5b6b0fd4.png)

メモリはデフォルトで問題ないかと。
**後程Vagrantで設定が可能なので。**


![virtual-disk.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403879/9380d65f-6ed3-70d5-281d-2aa985e1920c.png)

**ここで仮想ハードディスクファイルを、ダウンロードしてきたAmazonLinux2のファイルを選択します。**
これで仮想環境ができました。

## 仮想マシンの起動前設定

これから起動前に設定していきます。
無駄な設定を無効化し、seed.isoをディスクに追加します。
※起動前にseed.isoを入れることによってcloud-initで設定を読み込ませます。

![virtual-audio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403879/90ed2f3d-fbc7-da29-f84b-cd07f5c30dac.png)

![virtual-usb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403879/c4cc7dd0-f51b-8b40-ce51-92d07c62bd7c.png)

**不要なオーディオや、USBなどの設定は無効化しておきましょう。**


![virtual-drive.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403879/67c1e310-cbe7-8391-275d-2bc5a377dbbb.png)


**仮想光学ドライブに作成したseed.isoを追加します**


# 仮想マシンの起動
仮想マシンを起動後の作業をまとめておきます。

## 仮想マシンにログイン
仮想マシンを起動後、VirtualBoxの仮想マシンウィンドウがたちあがるので、CLI上でuser-dataに記載しているID/PWを入力してログインします。

```bash
localhost login: root
password: root
```

![virtual-login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403879/e34b5bd9-313f-5f6b-b794-143055877948.png)


## 独自boxを作成するための手順

以下のコマンドを仮想マシンウィンドウで実行します。

```bash
# isoファイルのアンマウント
eject

# yumのアップデート
yum update -y

# Vagrantを使用する場合はRHELと認識させる必要があるため以下を実行
ln -s /etc/system-release /etc/redhat-release

# ここまでで他に設定しておきたいものがあれば実施してください

# 再起動
shutdown -r now

# 再起動後、vitualboxの仮想マシンウィンドウから、[デバイス] > [Guest Additions CD イメージの挿入]を実行

# Guest Additionsをインストール
mount -r -t iso9660 /dev/cdrom /media
/media/VBoxLinuxAdditions.run
umount /media
systemctl enable vboxadd.service

# 後処理
## historyの削除
export HISTSIZE=0

# yumのキャッシュ削除
yum clean all
rm -rf /var/cache/yum

# 仮想ハードディスクの領域最適化
dd if=/dev/zero of=/ZERO bs=1M
rm -f /ZERO

# シャットダウン
shutdown -h now
```

# 仮想マシンのbox化

**以下powershellで実行してください**

```shell
cd マシンフォルダで設定したディレクトリ
vagrant package --base '仮想マシン名' --output 出力box名
```


# まとめ
実際に独自Boxを作成してみて、AmazonLinux2の構造を調べる機会が多かったのでためになりました。
AmazonLinux2は保守期間も長いのでお勧めではありますが、まだ情報が少ないように思います。
記述した内容等のご質問や、建設的なご意見ありましたら是非いただけると助かります。