らくがきちょう

なんとなく

vSphere 上に Amazon Linux 2 をインストールする

最近の CentOS7 や Ubuntu16 以降は systemd ベースに移行しました。 しかし、Amazon Linux は CentOS6 ベースである為、Amazon Linux を使う限りは init (SysVinit/Upstart) も利用し続ける必要がありました。 その為、同じアプリケーションを両方で使いたい場合は「SysVinit/Upstart 系での動作テスト」と「Systemd 系での動作テスト」を実施する必要がありました… しかし最近、ついに Systemd ベースに移行した Amazon Linux 2 が発表されました!

しかも、Amazon Linux 2 は従来と同じく『クラウド上での利用』を想定した AMI イメージでの提供だけで無く、『オンプレミスでの利用』を想定した各種ハイパーバイザー向けイメージも提供されることになりました。 今回はオンプレミス環境の vSphere に Amazon Linux 2 をインストールしてみます。 但し、Amazon Linux 2 はまだリリース候補版(Release Candidate)ですので今後、各種の仕様が変更されたり、このメモの内容が使えなく可能性は大いにあります。

vSphere 用のインストールイメージをダウンロードする

Hyper-VVirtualBox、vSphere 等向けの OS イメージは現時点で以下からダウンロード出来ます。 vSphere 向けのイメージ名は amzn2-vmware_esx-2017.12.0.20171212.2-x86_64.xfs.gpt.ova でした。 ディレクトリ名自体に日付が入っている為、今後リリースされる OS イメージは異なる URL で提供される可能性が非常に高いと予想されます。

尚、ひとつ上の Index of /os-images/ にアクセスすると現時点ではエラーになってしまいます…

cloud-init 用の .iso イメージを作成する

Amazon Linux 2 の OS イメージは .ova ファイル形式で提供されます。 ですが、そのままデプロイするとパスワード認証が無効化されており、鍵交換方式でしかログイン出来ない為、不便かも知れません。 そこで、cloud-init を利用して「SSH パスワード認証を有効化」しつつ「初期ユーザにパスワードを設定」します。

0. 作業の流れ

  1. 作業用 Linux に .iso イメージ作成用環境を整える
  2. 必要なファイルを用意する
    • meta-data
    • user-data
  3. .iso イメージを作成する
  4. .iso イメージを vSphere のデータストアにコピーする

1. 作業用 Linux に .iso イメージ作成用環境を整える

.iso イメージを作成する為、作業用の Linux 環境に genisoimage をインストールします。

yum -y install genisoimage

1-1. meta-data を作成する

メタデータを記載する meta-data というファイルを以下の内容で新規作成します。 今回はホスト名だけ、定義しました。

local-hostname: localhost.localdomain

1-2. user-data を作成する

ユーザ情報を記載する user-data というファイルを以下の内容で新規作成します。 デフォルトでは「パスワード認証が無効(鍵交換方式だけが有効)」なので、ssh_pwauth: True を設定することでパスワード認証を明示的に有効化します。 また、パスワードが期限切れにならないようにする為、expire: False を設定します。 ec2-user のパスワードは password としました。

#cloud-config

ssh_pwauth: True
chpasswd:
  expire: False
  list: |
    ec2-user:password

3. .iso イメージを作成する

これで最低限、必要なファイルは揃いました。 genisoimage を使って .iso イメージを作成します。 作成するファイル名は seed.iso としました。 ファイルの作成は数秒もかからず完了するはずです。

genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data

4. .iso イメージを vSphere のデータストアにコピーする

出来上がった .iso イメージは後の工程で仮想マシンからマウントさせます。 その為、仮想マシンから参照出来るようにデータストアへコピーしておきます。

.ova ファイルをデプロイして仮想マシンを作成する

.ova を展開して .ovf を見てみると(※ 本メモ末尾の「参考」に .ovf の中身を記載しておきました)フロッピードライブの定義があります。 しかし実際に vCenter からデプロイすると作成された仮想マシンに以下のような差がありました。 いずれのパターンでも CD/DVD ドライブは無いのですが、Flash 版 WebUI からデプロイした場合のみ、フロッピードライブがありました?

デプロイする環境 フロッピードライブの有無 CD/DVD ドライブの有無
Flash 版の WebUI
HTML5 版の WebUI

.ova ファイルから作成した仮想マシンのスペックの主な点は以下の通りです。NIC は E1000 になっていました。 私の場合は個人的に E1000 なデフォルト NIC を削除し、VMXNET3 な NIC を追加しました。

項目
CPU 1CPU
メモリ 1GB
ディスク 25GB
ネットワーク E1000 x 1

仮想マシンの作成が完了したら電源オンする前に「設定の編集」から以下の変更を加えます。

  1. CD/DVD ドライブを追加する
  2. 追加した CD/DVD ドライブに、予め作成した seed.iso をマウントする

ここまで完了したら、仮想マシンの電源をオンにします。

パスワード認証で SSH ログインしてみる

$ ssh ec2-user@192.168.1.1
Warning: Permanently added '192.168.1.1' (ECDSA) to the list of known hosts.
ec2-user@192.168.1.1's password:

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[ec2-user@localhost ~]$

カーネルのバージョン

カーネルバージョンは 4.9.62-10.57 になっていました。

# uname -a
Linux localhost.localdomain 4.9.62-10.57.amzn2.x86_64 #1 SMP Wed Dec 6 00:07:49 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

system-release

/etc/system-release の内容は以下のようになっていました。 「Amazon Linux release 2.0」と書かれています!(まだ Release Candidate ではありますが…)

# cat /etc/system-release
Amazon Linux release 2.0 (2017.12) LTS Release Candidate

Python のバージョン

デフォルトでインストールされている Python のバージョンは 2.7.5 でした。

# python --version
Python 2.7.5

デフォルトのリポジトリ設定

デフォルトでは amzn2-core.repo というリポジトリ定義ファイルしか、ありませんでした。

# ls -lh /etc/yum.repos.d/
total 4.0K
-rw-r--r-- 1 root root 1003 Dec 12 20:52 amzn2-core.repo

中身は以下のようになっていました。

[amzn2-core]
name=Amazon Linux 2 core repository
mirrorlist=http://amazonlinux.$awsregion.$awsdomain/$releasever/$product/$pointrelease/$basearch/mirror.list
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-amazon-linux-2
enabled=1
metadata_expire=300
mirrorlist_expire=300
report_instanceid=yes

[amzn2-core-source]
name=Amazon Linux 2 core repository - source packages
mirrorlist=http://amazonlinux.$awsregion.$awsdomain/$releasever/$product/$pointrelease/SRPMS/mirror.list
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-amazon-linux-2
enabled=0
metadata_expire=300
mirrorlist_expire=300
report_instanceid=yes

[amzn2-core-debuginfo]
name=Amazon Linux 2 core repository - debuginfo packages
mirrorlist=http://amazonlinux.$awsregion.$awsdomain/$releasever/$product/$pointrelease/debuginfo/$basearch/mirror.list
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-amazon-linux-2
enabled=0
metadata_expire=300
mirrorlist_expire=300
report_instanceid=yes

amazon-linux-extras を使ってリポジトリの追加を行う

Amazon Linux 2 ではリポジトリの追加を amazon-linux-extras で行うそうです。 ちなみに amazon-linux-extras 自体は Amazon Linux 2 の標準リポジトリamazon-linux-extras というパッケージ名で提供されていました。

# rpm -qa amazon-linux-extras
amazon-linux-extras-1.3.1-1.amzn2.noarch

# yum info amazon-linux-extras
Loaded plugins: langpacks, update-motd
Installed Packages
Name        : amazon-linux-extras
Arch        : noarch
Version     : 1.3.1
Release     : 1.amzn2
Size        : 89 k
Repo        : installed
Summary     : Command line tool for managing Amazon Linux Extras
URL         : https://aws.amazon.com/amazon-linux-ami/
License     : GPLv2
Description : A tool for selective enabling of fresh not-as-stable software from specific,
            : topical RPM repositories for Amazon Linux.

利用可能なリポジトリを表示する

amazon-linux-extras list で利用可能なリポジトリを表示出来ます。

# amazon-linux-extras list
  0  ansible2   disabled  [ =2.4.2 ]
  1  emacs   disabled  [ =25.3 ]
  2  memcached1.5   disabled  [ =1.5.1 ]
  3  nginx1.12   disabled  [ =1.12.2 ]
  4  postgresql9.6   disabled  [ =9.6.6 ]
  5  python3   disabled  [ =3.6.2 ]
  6  redis4.0   disabled  [ =4.0.5 ]
  7  R3.4   disabled  [ =3.4.3 ]
  8  rust1   disabled  [ =1.22.1 ]
  9  vim   disabled  [ =8.0 ]
 10  golang1.9   disabled  [ =1.9.2 ]
 11  ruby2.4   disabled  [ =2.4.2 ]
 12  nano   disabled  [ =2.9.1 ]
 13  php7.2   disabled  [ =7.2.0 ]

リポジトリを追加する

実際に amazon-linux-extras を使って Python3 のリポジトリを追加してみます。 リポジトリの追加前は python3 パッケージがありません。

# yum info python3
Loaded plugins: langpacks, update-motd
Error: No matching Packages to list

Python3 リポジトリを有効化してみます。 このコマンドは一瞬で終わるわけでは無く、今回のテスト環境では 8 ~ 10 秒かかっていました。 また、「リポジトリを追加する」だけでなく、同時に python3 パッケージがインストールされていました。

# amazon-linux-extras install python3
  0  ansible2   disabled  [ =2.4.2 ]
  1  emacs   disabled  [ =25.3 ]
  2  memcached1.5   disabled  [ =1.5.1 ]
  3  nginx1.12   disabled  [ =1.12.2 ]
  4  postgresql9.6   disabled  [ =9.6.6 ]
  5  python3=latest  enabled  [ =3.6.2 ]
  6  redis4.0   disabled  [ =4.0.5 ]
  7  R3.4   disabled  [ =3.4.3 ]
  8  rust1   disabled  [ =1.22.1 ]
  9  vim   disabled  [ =8.0 ]
 10  golang1.9   disabled  [ =1.9.2 ]
 11  ruby2.4   disabled  [ =2.4.2 ]
 12  nano   disabled  [ =2.9.1 ]
 13  php7.2   disabled  [ =7.2.0 ]

# python3 --version
Python 3.6.2

(既に python3 パッケージがインストールされてしまっていますが…)再度、yum info で確認すると、今度は表示されます。

# yum info python3
Loaded plugins: langpacks, update-motd
Installed Packages
Name        : python3
Arch        : x86_64
Version     : 3.6.2
Release     : 3.amzn2.0.3
Size        : 38 k
Repo        : installed
From repo   : amzn2extra-python3
Summary     : Version 3 of the Python programming language aka Python 3000
URL         : https://www.python.org/
License     : Python
Description : Python is an interpreted, interactive, object-oriented programming
            : language often compared to Tcl, Perl, Scheme or Java. Python includes
            : modules, classes, exceptions, very high level dynamic data types
            : and dynamic typing. Python supports interfaces to many system calls and
            : libraries, as well as to various windowing systems (X11, Motif, Tk,
            : Mac and MFC).
            :
            : Programmers can write new built-in modules for Python in C or C++.
            : Python can be used as an extension language for applications that
            : need a programmable interface.
            :
            : Note that documentation for Python is provided in the python3-docs package.
            :
            : This package provides the "python3" executable; most of the actual
            : implementation is within the "python3-libs".

参考

amzn2-vmware_esx-2017.12.0.20171212.2-x86_64.xfs.gpt.ovf の中身

.ova の実体は TAR 形式なので tar で展開することが可能です。

# tar xvf amzn2-vmware_esx-2017.12.0.20171212.2-x86_64.xfs.gpt.ova
amzn2-vmware_esx-2017.12.0.20171212.2-x86_64.xfs.gpt.ovf
amzn2-vmware_esx-2017.12.0.20171212.2-x86_64.xfs.gpt.mf
amzn2-vmware_esx-2017.12.0.20171212.2-x86_64.xfs.gpt-disk1.vmdk

.ovf ファイルの中身は以下のようになっていました。

<?xml version="1.0" encoding="UTF-8"?>
<!--Generated by VMware ovftool 4.2.0 (build-5965791), UTC time: 2017-12-13T16:53:56.628203Z-->
<Envelope vmw:buildId="build-5965791" xmlns="http://schemas.dmtf.org/ovf/envelope/1" xmlns:cim="http://schemas.dmtf.org/wbem/wscim/1/common" xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1" xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData" xmlns:vmw="http://www.vmware.com/schema/ovf" xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <References>
    <File ovf:href="amzn2-vmware_esx-2017.12.0.20171212.2-x86_64.xfs.gpt-disk1.vmdk" ovf:id="file1" ovf:size="628276224"/>
  </References>
  <DiskSection>
    <Info>Virtual disk information</Info>
    <Disk ovf:capacity="25" ovf:capacityAllocationUnits="byte * 2^30" ovf:diskId="vmdisk1" ovf:fileRef="file1" ovf:format="http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized" ovf:populatedSize="1407057920"/>
  </DiskSection>
  <NetworkSection>
    <Info>The list of logical networks</Info>
    <Network ovf:name="bridged">
      <Description>The bridged network</Description>
    </Network>
  </NetworkSection>
  <VirtualSystem ovf:id="vm">
    <Info>A virtual machine</Info>
    <Name>vm</Name>
    <OperatingSystemSection ovf:id="1" vmw:osType="otherGuest">
      <Info>The kind of installed guest operating system</Info>
    </OperatingSystemSection>
    <VirtualHardwareSection>
      <Info>Virtual hardware requirements</Info>
      <System>
        <vssd:ElementName>Virtual Hardware Family</vssd:ElementName>
        <vssd:InstanceID>0</vssd:InstanceID>
        <vssd:VirtualSystemIdentifier>vm</vssd:VirtualSystemIdentifier>
        <vssd:VirtualSystemType>vmx-08</vssd:VirtualSystemType>
      </System>
      <Item>
        <rasd:AllocationUnits>hertz * 10^6</rasd:AllocationUnits>
        <rasd:Description>Number of Virtual CPUs</rasd:Description>
        <rasd:ElementName>1 virtual CPU(s)</rasd:ElementName>
        <rasd:InstanceID>1</rasd:InstanceID>
        <rasd:ResourceType>3</rasd:ResourceType>
        <rasd:VirtualQuantity>1</rasd:VirtualQuantity>
      </Item>
      <Item>
        <rasd:AllocationUnits>byte * 2^20</rasd:AllocationUnits>
        <rasd:Description>Memory Size</rasd:Description>
        <rasd:ElementName>1024MB of memory</rasd:ElementName>
        <rasd:InstanceID>2</rasd:InstanceID>
        <rasd:ResourceType>4</rasd:ResourceType>
        <rasd:VirtualQuantity>1024</rasd:VirtualQuantity>
      </Item>
      <Item ovf:required="false">
        <rasd:Address>0</rasd:Address>
        <rasd:Description>USB Controller (EHCI)</rasd:Description>
        <rasd:ElementName>usb</rasd:ElementName>
        <rasd:InstanceID>3</rasd:InstanceID>
        <rasd:ResourceSubType>vmware.usb.ehci</rasd:ResourceSubType>
        <rasd:ResourceType>23</rasd:ResourceType>
        <vmw:Config ovf:required="false" vmw:key="ehciEnabled" vmw:value="true"/>
      </Item>
      <Item>
        <rasd:Address>0</rasd:Address>
        <rasd:Description>SCSI Controller</rasd:Description>
        <rasd:ElementName>scsiController0</rasd:ElementName>
        <rasd:InstanceID>4</rasd:InstanceID>
        <rasd:ResourceSubType>lsilogic</rasd:ResourceSubType>
        <rasd:ResourceType>6</rasd:ResourceType>
      </Item>
      <Item ovf:required="false">
        <rasd:AddressOnParent>0</rasd:AddressOnParent>
        <rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
        <rasd:Description>Floppy Drive</rasd:Description>
        <rasd:ElementName>floppy0</rasd:ElementName>
        <rasd:InstanceID>5</rasd:InstanceID>
        <rasd:ResourceType>14</rasd:ResourceType>
      </Item>
      <Item>
        <rasd:AddressOnParent>0</rasd:AddressOnParent>
        <rasd:ElementName>disk0</rasd:ElementName>
        <rasd:HostResource>ovf:/disk/vmdisk1</rasd:HostResource>
        <rasd:InstanceID>6</rasd:InstanceID>
        <rasd:Parent>4</rasd:Parent>
        <rasd:ResourceType>17</rasd:ResourceType>
      </Item>
      <Item>
        <rasd:AddressOnParent>2</rasd:AddressOnParent>
        <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>
        <rasd:Connection>bridged</rasd:Connection>
        <rasd:Description>E1000 ethernet adapter on &quot;bridged&quot;</rasd:Description>
        <rasd:ElementName>ethernet1</rasd:ElementName>
        <rasd:InstanceID>7</rasd:InstanceID>
        <rasd:ResourceSubType>E1000</rasd:ResourceSubType>
        <rasd:ResourceType>10</rasd:ResourceType>
      </Item>
      <Item ovf:required="false">
        <rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
        <rasd:ElementName>video</rasd:ElementName>
        <rasd:InstanceID>8</rasd:InstanceID>
        <rasd:ResourceType>24</rasd:ResourceType>
      </Item>
      <Item ovf:required="false">
        <rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
        <rasd:ElementName>vmci</rasd:ElementName>
        <rasd:InstanceID>9</rasd:InstanceID>
        <rasd:ResourceSubType>vmware.vmci</rasd:ResourceSubType>
        <rasd:ResourceType>1</rasd:ResourceType>
      </Item>
      <vmw:Config ovf:required="false" vmw:key="cpuHotAddEnabled" vmw:value="true"/>
      <vmw:Config ovf:required="false" vmw:key="memoryHotAddEnabled" vmw:value="true"/>
      <vmw:Config ovf:required="false" vmw:key="powerOpInfo.powerOffType" vmw:value="soft"/>
      <vmw:Config ovf:required="false" vmw:key="powerOpInfo.resetType" vmw:value="soft"/>
      <vmw:Config ovf:required="false" vmw:key="powerOpInfo.suspendType" vmw:value="soft"/>
      <vmw:Config ovf:required="false" vmw:key="tools.syncTimeWithHost" vmw:value="true"/>
    </VirtualHardwareSection>
  </VirtualSystem>
</Envelope>

amazon-linux-extras のヘルプ表示

# amazon-linux-extras help
  help      See list of commands.
  info      See details of a specific package.
  install   Enables specified topics and installs their packages.
  list      Lists topics in the catalog. Some may be enabled.

Amazon Linux Extras software topics give you access to the most-recent
stable software you specifically choose, without the uncertainty of a
wholly new environment.

Best practice is to enable only one or two topics. More than that, and
you lose the benefits of working in a stable environment.