ぶろとよ

ネットワーク系クラウドエンジニア(AWS)の技術ブログ。自動化に興味があるためAWS CLIを勉強&アウトプット中。

Windows10のVirtualBoxで、Amazon Linux 2を起動する。

f:id:toyokky:20211024113616p:plain


こちらのAWSドキュメントで、Amazon Linux 2 を仮想マシンで実行できるということが記載されていたので、Windows10のVirtualBoxで実際にAmazon Linux 2を起動してみました。

docs.aws.amazon.com

  • 使用できる仮想化プラットフォーム
    • VMWare
    • KVM
    • VirtualBox (Oracle VM) ※本記事で実行
    • Microsoft Hyper-V

なんか、思ってたよりも構築が大変でした・・・。
思う通りに動かなくて、色々読み漁って実践して、またハマっての繰り返し(汗)
Linux・・・ちゃんと覚えよう!っと再認識。
これでLinuxの実践環境ができたので勉強します!!


目次

検証環境

  • 検証日: 2021/10/24
  • PC環境:
    • Windows10 Home Ver21H1
      • VirtualBox: バージョン 6.1.28 r147628 (Qt5.6.2)`
        • ゲストOS: Amazon Linux release 2 (Karoo): 4.14.248-189.473.amzn2.x86_64

注意事項

  • コマンド内の変数やパラメータやは検証で使用したものを記載しています。ご自身の環境に合わせ、書き換えて使用してください。
  • 個人で検証しているため実行結果に責任は持てません。必ずご自身でも検証してから使用してください。
  • 本手順だとIPアドレスはDHCPとなります。固定化を試したのですが再起動でDHCPに戻ってしまいます。今後の課題としています。


1. seed.iso 起動イメージを準備する

AWSドキュメントで記載されている方法では、Linux か Mac でのコマンド実行が必要になります。
Windowsのみで対応したいので、今回はサンプル Seed.iso を使用します。

1.1. サンプル Seed.isoの中身

サンプル Seed.iso の中身は以下内容となっており、「ホスト名」「IPアドレス情報」「ログイン情報」等も含まれています。

  • 初期ホスト名: amazonlinux.onprem
    • 起動後に変更可能
  • IPアドレス情報: DHCPでの取得
    • 問題あり:IPアドレスの変更と固定化を検証しましたが、変更は出来るが再起動でDHCPに戻る。
      • かなり調べたけれど、付け焼き刃の知識では解決できず・・・今後の課題。
      • 固定IPアドレスを使用したい場合は、サンプルじゃないSeed.isoを自作した方が良いのか・・・。
  • 初期ログイン情報:

    • 初期ユーザー名: ec2-user
    • 初期パスワード: amazon
  • サンプル Seed.iso の meta-data

local-hostname: amazonlinux.onprem

# eth0 is the default network interface enabled in the image. You can configure
# static network settings with an entry like below.
#network-interfaces: |
#  iface eth0 inet static
#  address 192.168.1.10
#  network 192.168.1.0
#  netmask 255.255.255.0
#  broadcast 192.168.1.255
#  gateway 192.168.1.254
  • サンプル Seed.iso の user-data
#cloud-config
# vim:syntax=yaml
users:
# A user by the name ec2-user is created in the image by default.
  - default
# Following entry create user1 and assigns password specified in plain text.
# Please not use of plain text password is not recommended from security best
# practises standpoint
  - name: user1
    groups: sudo
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    plain_text_passwd: amazon
    lock_passwd: false
# Following entry creates user2 and attaches a hashed passwd to the user. Hashed
# passwords can be generated with:
# python -c 'import crypt,getpass; print crypt.crypt(getpass.getpass())'
  - name: user2
    passwd: amazon
    lock_passwd: false
  - name: user3
    ssh-authorized-keys:
            - ssh-rsa XXXX~略~XXXX
    lock_passwd: true

chpasswd:
  list: |
    ec2-user:amazon

1.2. サンプル Seed.isoのダウンロード

  1. 以下ページ内のサンプル Seed.isoのリンクからダウンロードページヘ進む
  2. Seed.isoをクリックしてファイルをダウンロードする
    f:id:toyokky:20211024124448p:plain:w450
  3. 通常ならばダウンロードフォルダへファイルがダウンロードされます

    %USERPROFILE%\Downloads
    ※2021/10/24 時点ではファイル名が Seed.iso でした。

  4. ダウンロードしたファイルは任意のフォルダへ移動しておく


2. Amazon Linux 2 VM イメージのダウンロード

  1. 以下ページ内のOracle VirtualBoxのリンクからダウンロードページヘ進む
  2. amzn2-virtualbox-2.0.20211001.1-x86_64.xfs.gpt.vdiをクリックしてファイルをダウンロードする
    f:id:toyokky:20211024131610p:plain
  3. 通常ならばダウンロードフォルダへファイルがダウンロードされます

    %USERPROFILE%\Downloads
    ※2021/10/24 時点ではファイル名が amzn2-virtualbox-2.0.20211001.1-x86_64.xfs.gpt.vdi でした。

  4. ダウンロードしたファイルは任意のフォルダへ移動しておく


3. VirtualBoxでAmazon Linux 2を起動してログインする

  1. VirtualBoxを起動して New (新規) をクリックする
  2. 仮想マシンの作成が開くので、必要なパラメータを入力して次へをクリックする
    • 名前: (自由記載)
    • タイプ: Linux
    • バージョン: Red Hat (64-bit)
      f:id:toyokky:20211024132827p:plain
  3. 仮想マシンに割り当てるメモリ量を指定して次へをクリックする
    f:id:toyokky:20211024133147p:plain
  4. すでにある仮想ハードディスクファイルを使用するをチェックし、右側のフォルダーマークをクリックする
    f:id:toyokky:20211024133809p:plain
  5. 追加をクリックしてダウンロードしたVMイメージを開く
  6. No AttachedへVMイメージが追加されるので選択して選択をクリックする
    f:id:toyokky:20211024134352p:plain
  7. 仮想マシンの作成へ戻るので、作成をクリックする
  8. 作成した仮想マシンを選択して設定(S)をクリックする
    f:id:toyokky:20211024134711p:plain
  9. [ストレージ > コントローラーIDE: 空 > 光学ドライブのCDマーク > ディスクファイルを選択する] と進み、ダウンロードしたSeed.isoを選択する
    f:id:toyokky:20211024135040p:plain
  10. (任意)[ネットワーク > アダプター1 > 割当] へ進み、ネットワーク構成を選択する
    • 本項目は、構築したネットワーク構成に合わせて選択します
      • 画像では、家庭内ネットワークと通信させたかったのでブリッジアダプターを選択してます
        f:id:toyokky:20211024135833p:plain
    • こちらのサイトが各構成を図面で説明しているので解りやすかったです。
  11. OKをクリックして設定を閉じる
  12. VirtualBoxを画面から作成した仮想マシンを選択して 起動 をクリックする
  13. Amazon Linux 2 が起動しました f:id:toyokky:20211024140205p:plain
  14. 初期ログイン情報
    • amazonlinux login: ec2-user
    • Password: amazon
  15. 起動後、Seed.isoを光学ドライブから外す
    • [ストレージ > コントローラーIDE: Seed.iso > 光学ドライブのCDマーク > ディスクファイルを選択する] と進み、仮想ドライブからディスクを除去を選択する
      • 外さないと次回以降もSeed.isoを使用して起動してしまう
        • f:id:toyokky:20211024184907p:plain
      • CLIでsudo ejectでも良い


VirtualBox利用でのメモ

  • VirtualBox画面へ入るとマウスカーソルの自由が奪われる。
    • VirtualBox画面から離れる時はホストキー(デフォルト: Right Ctrl)を押下する。
  • スクリーンショットを取りる場合、VirtualBox画面に入っている時はキャプチャが機能しない。
    • 解決策は「ホストキーを押してVirtualBoxから離れてキャプチャする」。


4. Amazon Linux 2 の初期設定

簡易ですが初期設定をしていきます。

  • Amazon Linux 2のメモ
    • [su -] は正しいパスワードを打っても使えなかった。
    • [sudo su -]は使用できる。ec2-userに戻る時は[exit]。
    • VirtualBoxのGuest Additionsは使えない?インストールは出来たけど解像度の変更等が出来ない。

4.1. 日本語の109キーボードにする

初期状態では英語キーボード配列になっているため記号などで戸惑います。そのため、日本語の109キーボードへ設定変更します。

wikipedia: 109キーボード
106キーボードをベースに、Windowsキー2個とメニューキーを追加したもの。2019年現在はこれが主流。OADGで標準化されている。右Windowsキーを省略した108キーも存在する。

初期状態↓

f:id:toyokky:20211024144741p:plain

# ---- VirtualBoxのコンソールで操作 ----

## 設定
sudo localectl set-keymap jp106
sudo localectl set-keymap jp-OADG109A

## (参考)今回は利用しないが日本語環境にする時は設定する。
sudo localectl set-locale LANG=ja_JP.utf8

## 確認
localectl

4.2. yumのパッケージ更新

# ---- VirtualBoxのコンソールで操作 ----

## 実行
sudo yum -y update
sudo yum -y upgrade

## 確認
uname -r
cat /etc/system-release
bash --version -v
yum check-update

4.3. ホスト名の変更

初期のホスト名はamazonlinux.onpremになっていますので、好きなものへ変更する。

# ---- VirtualBoxのコンソールで操作 ----

## 設定
sudo hostnamectl set-hostname <ホスト名>

## 確認
hostname

4.4. ec2-userのパスワード変更

デフォルト: amazonになっているので、任意のパスワードへ変更します。

# ---- VirtualBoxのコンソールで操作 ----

## 変更
passwd

4.5. SSH接続の設定

# ---- VirtualBoxのコンソールで操作 ----

## viで設定ファイルを開く
sudo vi /etc/ssh/sshd_config

## 変更箇所: 1ヵ所
PasswordAuthentication no
    ↓ yesにする
PasswordAuthentication yes

    ## いつも忘れるviの操作・・・
    #  入力モードに入る==  i
    #  コマンドモードに戻る==  esc
    #  保存して抜ける==  :wq!
    #  保存しないで抜ける==  :q!

## 再起動
sudo shutdown -r now

## SSHするIPアドレスの確認
ip address show eth0

以後、SSH接続が可能。

4.6. (任意)一旦シャットダウンして静止点スナップショットを取る

シャットダウンする

# ---- VirtualBoxのコンソールで操作 ----

## 完全に電源を落とす
sudo shutdown -h now

## 再起動だけなら
sudo shutdown -r now

スナップショットを取る

  • VirtualBoxで対象装置の をクリックし、スナップショットを選択する
    • f:id:toyokky:20211024214217p:plain
  • スナップショットメニューが出るので 作成 をクリックする
    • f:id:toyokky:20211024214517p:plain
  • 名前や説明を入力してOKをクリックする
    • f:id:toyokky:20211024214846p:plain
  • スナップショットが作成される


4.7. Python と AWS CLI の更新

Amazon Linux 2 起動時のAWS CLIとPythonがだいぶ古く、pipも無かったです。

[ec2-user@amz-lin-cli ~]$ aws --version
aws-cli/1.18.147 Python/2.7.18 Linux/4.14.248-189.473.amzn2.x86_64 botocore/1.18.6

[ec2-user@amz-lin-cli ~]$ python --version
Python 2.7.18

[ec2-user@amz-lin-cli ~]$ python3 --version
-bash: python3: command not found

[ec2-user@amz-lin-cli ~]$ pip --version
-bash: pip: command not found

4.7.1. Pythonから先に更新する

今回は Extras library (Amazon Linux 2) から、Python3.8をインストールします。

# ---- SSH接続 または VirtualBoxのコンソールで操作 ----

## Extras library (Amazon Linux 2)のPythonバージョンを確認
amazon-linux-extras list | grep python
>  44  python3.8=latest         enabled      [ =stable ]

## Python3.8のインストール
sudo amazon-linux-extras install -y python3.8

## 確認
python --version
> Python 2.7.18

python3.8 --version
> Python 3.8.5

Python3.8を入れただけだと python --version でPython2.7が使用されます。Python3.8は python3.8 --version と入力しないいけない状態なので、aliasを設定して python --version でPython3.8が使用されるようにします。

# ---- SSH接続 または VirtualBoxのコンソールで操作 ----

## alias設定
echo 'alias python=python3.8' >> ~/.bashrc
source ~/.bashrc

## 確認
python --version
> Python 3.8.5

同様にpipにもalias設定を行います。

# ---- SSH接続 または VirtualBoxのコンソールで操作 ----

## 事前確認
pip --version
> -bash: pip: command not found

pip3.8 --version
> pip 9.0.3 from /usr/lib/python3.8/site-packages (python 3.8)

## alias設定
echo 'alias pip=pip3.8' >> ~/.bashrc
source ~/.bashrc

## 事後確認
pip --version
> pip 9.0.3 from /usr/lib/python3.8/site-packages (python 3.8)

pip3.8 --version
> pip 9.0.3 from /usr/lib/python3.8/site-packages (python 3.8)

4.7.2. AWS CLI v2 をインストールする

AWS CLI は v1 と v2 の選択肢があり、変更点の説明や更新履歴はこちらです。・・・翻訳、破壊的変更って(汗)

自分は以下の理由から v2 を使っています。・・・浅はかな理由ですが(汗)

  • YAML出力ができる
  • 自分の使い方だと、今のとこ使ってて問題無いから


LinuxコマンドでAWS CLI v2をインストールします。手順は公式ドキュメントを参照します。

# ---- SSH接続 または VirtualBoxのコンソールで操作 ----

## 最新版のインストールファイルをダウンロード
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"

## インストーラを解凍
unzip awscliv2.zip

## インストールプログラムを実行
sudo ./aws/install -i /usr/local/aws-cli -b /usr/local/bin

## 確認
aws --version
> aws-cli/2.3.0 Python/3.8.8 Linux/4.14.248-189.473.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off


5. おまけ Teratermマクロ

Teratermで使えるログイン/ログ取りマクロです。
拡張子 .ttl ファイルへコピペして利用できます。
Teratermマクロのコメントアウトが ; なので行頭にいっぱい付いてます。

;# ■ 概要
;# ・Linux機器へSSH接続します。
;# ・ログ取得を自動開始します。
;# ・ログ出力フォルダは「LOG_PATH」で指定。
;# ・ログ名
;#       YYYYMMDD-HHMMSS_HOSTNAME.log
;#
;# ■ 接続情報の設定(環境に合わせて修正してください)
HOSTS_IP = '192.168.0.111'
HOSTNAME = 'amz-lin-cli'
USERNAME = 'ec2-user'
;↓LOGファイルが保存されるフォルダ。
LOG_PATH = 'C:\#temp\teraterm'
;↓ログインPassは下の変数を使わず、初回ログイン時に入力画面から入力し、PAS_PATHへ暗号化して保存されます。
PAS_PATH = 'C:\#temp\teraterm_pass'

;# ~~~~以下は修正不要です。~~~~
;# ■変数等の作成
;## ログファイル名の設定
getdate DATETIME '%Y%m%d-%H%M%S_'
FULLPATH = LOG_PATH
strconcat FULLPATH '\'
strconcat FULLPATH DATETIME
strconcat FULLPATH HOSTNAME
strconcat FULLPATH '.log'

;## プロンプトの作成
PP_LINUX = '^\['
strconcat PP_LINUX USERNAME
strconcat PP_LINUX '.+\]\$'

;## パスワードファイル指定(暗号化)
PASSFILE = PAS_PATH
strconcat PASSFILE '\'
strconcat PASSFILE HOSTNAME
strconcat PASSFILE '_'
strconcat PASSFILE USERNAME
strconcat PASSFILE '_loginpass.dat'

;## パスワード取得
getpassword PASSFILE USERNAME PASSWORD

;## SSH接続コマンド作成
COMMAND = HOSTS_IP
strconcat COMMAND ':22 /ssh /2 /auth=password /user='
strconcat COMMAND USERNAME
strconcat COMMAND ' /passwd='
strconcat COMMAND PASSWORD
strconcat COMMAND ' /nosecuritywarning'


;# ■マクロの実行~終了
;## 「MACRO ダイアログ」ウィンドウを非表示 ※デバッグ時はOFFにする。
show -1

;## ログ保存先のフォルダが無ければ作成。
foldersearch LOG_PATH
if result = 0 then
    foldercreate LOG_PATH
    if result <> 0 then
        messagebox 'A folder could not be made.' 'Making error'
        end
    endif
endif


;## SSH接続
connect COMMAND

;## キーボード入力抑制(誤操作防止)開始
enablekeyb 0

;## 接続判定(接続が出来たか確認)
if result <> 2 then
    messagebox 'It could not be connected.' 'Connection Error'
    end
endif


;## ログの取得開始
;;## Linuxでバイナリするとログに残るプロンプトが変になるため「0 1」。
loginfo logfilename
if result <> -1 then
    ;;## ログが取得中の為、一旦停止してから再度ログ取得を開始
    logclose
    logopen FULLPATH 0 1
else
    ;;## ログは取得はされていないので、そのままログ取得を開始
    logopen FULLPATH 0 1
endif
sendln ''

;## 「Tera Term: ログ」ウィンドウを非表示(今回はOFF)
;showtt 6

;## コマンドの実行
waitregex PP_LINUX
sendln ''
sendln 'date'
mpause 300
sendln ''
sendln 'uname -a'
mpause 300
sendln ''
sendln 'hostname'
mpause 300
sendln ''
sendln 'cat /etc/system-release'
mpause 300
sendln ''
sendln ''

;# キーボード入力抑制(誤操作防止)解除
enablekeyb 1