開発環境としてAmazonLinux2をVirtualBoxで動かすための備忘録

最終的にEC2かどうかは別としてもAWS上で動かすことになるんだから近い環境のAmazon Linuxがローカルで動いてれば安心じゃね？
って思ったので。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39622/5fa447da-06a0-8088-badb-1e32bc95dc97.png)

ローカルなのにEC2のロゴが出るの、なかなかの違和感。

# Amazon Linux 2のVirtualBoxイメージ

[https://cdn.amazonlinux.com/os-images/latest/virtualbox/](https://cdn.amazonlinux.com/os-images/latest/virtualbox/)
最新のVDIを取得。

# seed.iso

[https://cdn.amazonlinux.com/os-images/latest/](https://cdn.amazonlinux.com/os-images/latest/)
にあるサンプルのseed.isoでもいいけど。


## meta-data
```yaml
local-hostname: amazonlinux.onprem
```

# user-data
```yaml
#cloud-config
disable_root: false
ssh_pwauth: true
chpasswd:
  expire: false
  list: |
    root:password
```
1行目はコメントっぽいけど消すと動かなくなるディレクティブのようなもの。
どうせローカル用だし必要ならあとから変えればいいのでrootでログインできるように変更し、rootのパスワードをpasswordに。

## seed.isoの作成
```bash
genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data
```

# VirtualBox

## Host-only Networkの作成
- IPv4 Address:`192.168.56.1`（お好きなように）
- IPv4 ネットマスク：`255.255.255.0`（お好きなように）

## VMの新規作成

### Virtual machine Name and Operating System
- 名前：（お好きなように：ただし空白系の文字はNG）
- Folder：（お好きなように：ただし空白系の文字はNG）
- タイプ：`Linux`
- バージョン：`RedHat (64-bit)`

### Hardware
- メインメモリー：（お好きなように）
- Processor：（お好きなように）

### Virtual Hard disk
- Use an Existing Virtual Hard Disk File
    - 指定したVM用ディレクトリにVMの名前と同じディレクトリができているので、AL2のVDIを「コピー」し、それを選択する
    - なぜコピーかというと、設定をミスって最初からやり直したいときにもう一度ダウンロードしなくていいから

## VMの設定

### ストレージ
- 光学ドライブに作成したseed.isoをセット

### ネットワーク
- アダプター 1
    - 有効化
    - 割り当て：NAT
- アダプター 2
    - 有効化
    - 割り当て：ホストオンリーアダプター
    - 名前：作成したアダプターを選択

ここの`アダプター 2`の`MACアドレス`をしっかりメモしておく。

### 共有フォルダー
- フォルダーのパス：（お好きなところを）
- フォルダー名：（お好きな名前に）
- 永続化する

`フォルダー名`って書いてあるけど実際は共有名みたいなもの。

# ここまで設定したら一度VMを起動し、VM内で設定をする

## キーボードを設定
```bash
localectl list-keymaps
```
```bash
localectl set-keymap jp-OADG109A
```

## リモートからもrootで入れるように設定
`/etc/ssh/sshd_config`を編集
```ssh
PermitRootLogin yes
PasswordAuthentication yes
```

## ホストオンリーネットワーク側のネットワークカード設定
※ `eth0`が`アダプター 1`
※ `eth1`が`アダプター 2`
`/etc/sysconfig/network-scripts/ifcfg-eth1`を作成
```config
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
DEFROUTE=no
BOOTPROTO=static
HWADDR=01:23:45:67:89:ab
NETWORK=192.168.56.0
IPADDR=192.168.56.101
NETMASK=255.255.255.0
```
ここがちょっと不親切。

`HWADDR`は`アダプター 2`のMACアドレス
`NETWORK`は`Host-only network`で指定したIPアドレス・ネットマスクから算出されるネットワークアドレス
`IPADDR`はこのVMに割り当てたいIPアドレス（ただしネットワーク帯は意識）
`NETMASK`は`Host-only network`で指定したネットマスク（`PREFIX`でも可）

ゲストOSから見たホストOSのIPが`Host-only Network`で指定した`IPv4 Address`に、
ホストOSから見たゲストOSのIPがここで設定した`IPADDR`に
なる。

### 一旦終了

```bash
shutdown -h now
```

# VMの設定（2回目）

## ストレージ

`seed.iso`はもう不要なので取り外しする。

# その他設定

## Guest Additions

VMのウィンドウにある`デバイス`→`Guest Additions CDイメージの挿入...`を選択後、
```bash
mount /dev/cdrom /mnt/
/mnt/VBoxLinuxAdditions.run
umount /mnt/
```

これ以降、設定した共有フォルダを以下の書式でマウントできるようになる。
複数ある場合はシェルスクリプト化しておくと楽。
マウント先のディレクトリは先に作っておく必要がある。

```bash
mount -t vboxsf フォルダー名 マウント先パス
```

## AWS CLI入れ直し
なんか古いしV1系統なのなぁぜなぁぜ？
```bash
yum remove awscli
```
以降は[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html)の手順で。

## jq

```bash
curl -L https://github.com/stedolan/jq/releases/latest/download/jq-linux64 -o /usr/local/bin/jq
chmod +x /usr/local/bin/jq
```

## yq

```bash
curl -L https://github.com/mikefarah/yq/releases/latest/download/yq_linux_386 -o /usr/local/bin/yq
chmod +x /usr/local/bin/yq
```

## git
必要なパッケージをインストール
```bash
yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker autoconf gcc
```
[ここ](https://git-scm.com/download/linuxz)の上の方にある`The latest version is x.xx.x.`辺りから`wget`して`make configure`して`./configure`して`make all`して`make install`。

## `**env`

`pyenv`とか`rbenv`とか`goenv`とか。
どのユーザでも使えるように`/usr/local`以下にインストールし、設定する。

例として`pyenv`だけ。
```bash
git clone https://github.com/pyenv/pyenv.git /usr/local/pyenv
```
```bash
cat << EOF > /etc/profile.d/pyenv.sh
export PYENV_ROOT="/usr/local/pyenv"
export PATH="\${PYENV_ROOT}/bin:\${PATH}"
eval "\$(pyenv init -)"
EOF
```