クラウド環境でArchLinuxを使う (Vultr編)

# はじめに
今まで自作PCにArchLinuxを入れて使ってきましたが、突然PCが故障してしまいました。
そこで、今度はクラウドでArchLinuxを使おうと思い試してみました。

# ArchLinuxとクラウド
ArchLinuxをインストールOSとしてデフォルトで選択できるクラウド環境は稀なようです。
しかし、ISOインストールが可能なら、当たり前ですがArchLinuxも入ります。

国内VPSへのインストール手順はいろいろな記事で紹介されていますので、

- [ConoHaにArchLinuxをインストールした時の手順 - Linuxとかネットワーク関連の備忘録](http://blog.hnron.net/entry/2015/06/06/204837)
- [さくらVPSにArchLinuxをインストールする (新インストール手順)](http://opamp.hatenablog.jp/entry/20121103/1351924889)

今回は海外VPSの[Vultr](http://www.vultr.com/?ref=6863518)へのインストール手順を紹介したいと思います。

…とはいっても、手動インストールの手順は環境非依存なので、どこでもほぼ一緒です。
(もちろんデバイス名やネットワークカード名は違いますが)

# Vultrの特徴
- ArchLinuxがインストール可能
- 安い
- 最安プランの搭載RAMが他より少し多い (768MB)
- [クーポン](https://www.vultr.com/coupons/)を活用すれば2カ月程度試用可能
- [海外拠点](https://www.vultr.com/locations/)が豊富(特にヨーロッパ)。東京リージョンあり
- 2段階認証あり (YubiKey OTPも使える)
- [API](https://www.vultr.com/api/)あり
- [DDOS対策オプション](https://www.vultr.com/ddos/)あり

※2016/4/20追記、最近以下の機能が追加されました。

- [ブロックストレージ](https://www.vultr.com/docs/block-storage) <br>
SSDボリュームを10GBあたり$1/月で好きな時に追加(マウント)可能。今はまだβ期間なので無料、ただしNewJerseyのみ。

安さの点では国内VPSサービスと比較すると負けている気もしますが、[海外拠点](https://www.vultr.com/locations/)が多い・[クーポン](https://www.vultr.com/coupons/)があり気軽に試用できるのは良いですね。

## 料金プランについて追記
ホームページのデザイン改変で見えなくなってしまいましたが、メモリ512MB, HDD 125GBで月$5というプランもあります。
例えば、ブロックチェイン系の開発をする時には、HDDが大きい方が良いですね。
[vultrコマンド](https://github.com/JamesClonk/vultr)を利用してAPI経由で料金プラン一覧を取得した結果です。

```shell-session
nirvana% vultr plans|sort -n
VPSPLANID       NAME                                    VCPU    RAM     DISK    BANDWIDTH       PRICE
29              768 MB RAM,15 GB SSD,1.00 TB BW         1       768     15      1.00            5.00
87              512 MB RAM,125 GB SATA,1.00 TB BW       1       512     125     1.00            5.00
88              1024 MB RAM,250 GB SATA,2.00 TB BW      1       1024    250     2.00            10.00
89              2048 MB RAM,500 GB SATA,3.00 TB BW      1       2048    500     3.00            20.00
90              3072 MB RAM,750 GB SATA,4.00 TB BW      2       3072    750     4.00            30.00
91              4096 MB RAM,1000 GB SATA,5.00 TB BW     2       4096    1000    5.00            40.00
93              1024 MB RAM,20 GB SSD,2.00 TB BW        1       1024    20      2.00            10.00
94              2048 MB RAM,45 GB SSD,3.00 TB BW        2       2048    45      3.00            20.00
95              4096 MB RAM,90 GB SSD,4.00 TB BW        4       4096    90      4.00            40.00
96              8192 MB RAM,150 GB SSD,5.00 TB BW       6       8192    150     5.00            80.00
97              16384 MB RAM,300 GB SSD,6.00 TB BW      8       16384   300     6.00            160.00
98              32768 MB RAM,600 GB SSD,10.00 TB BW     16      32768   600     10.00           320.00
100             65536 MB RAM,700 GB SSD,15.00 TB BW     24      65536   700     15.00           640.00
115             8192 MB RAM,110 GB SSD,10.00 TB BW      2       8192    110     10.00           60.00
116             16384 MB RAM,110 GB SSD,20.00 TB BW     4       16384   110     20.00           120.00
117             24576 MB RAM,110 GB SSD,30.00 TB BW     6       24576   110     30.00           180.00
118             32768 MB RAM,110 GB SSD,40.00 TB BW     8       32768   110     40.00           240.00
```


# 手動インストール (概要)

いつものArchLinuxインストールと変わりません。いつものように不便ですw
まあ、ArchLinuxユーザなら慣れたやり方だと思いますが、こつこつとコマンドを打っていきます。

ところで、一通りインストールと基本的な設定が終わったら、「スナップショット」を取るのがお勧めです。2台目からはインストールの際にスナップショットを元にサーバを構築出来るので、長いコマンド入力作業が不要になります。

# 手動インストール (手順)

## 方針
 - [AUR](https://aur.archlinux.org/)を使うため、[yaourt](https://wiki.archlinuxjp.org/index.php/Yaourt)を入れる
 - カーネルはlinuxではなく[linux-lts](https://www.archlinux.org/packages/core/x86_64/linux-lts/)。linuxは更新頻度が高すぎるため。LTSはLong-term supportの略で長期サポート版の意味です。

## ArchLinuxが選べないんだけど
VultrでもArchLinuxはデフォルトのメニューの選択肢に存在しません。
ではどうすれば良いかというと、OSに「Custom」を選択して、ISOからインストールします。

## ISOの指定
アカウントを登録してログインした後、上部のタブから「Deploy」を選択します。
Operating SystemにCustomを選択すると、ISOをアップロードするためのリンクが出現するのでクリックします。
![](https://raw.githubusercontent.com/dseg/dseg.github.io/master/img/qiita/09-arch-on-vultr/09-arch-on-vultr/upload-iso-link.png)
ISOにはURLを指定できるので、~~設定しているサーバに一番近い~~アメリカのミラーのURLをフォームに貼り付けます。

 - [ArchLinux ミラー一覧](https://www.archlinux.org/download/)

![](https://raw.githubusercontent.com/dseg/dseg.github.io/master/img/qiita/09-arch-on-vultr/09-arch-on-vultr/upload-iso.png)

例:

```bash
http://mirror.rackspace.com/archlinux/iso/2016.01.01/archlinux-2016.01.01-dual.iso
```
又は、[自分でインストール用のISOを作る](http://qiita.com/tukiyo3/items/5f55484f955b8a785b4d)ことも出来るそうです。
余談ですが、ArchLinuxのCDイメージにはいろいろなパッケージが入っておりかなり便利です。レスキュー用ブートCDとしてもバリバリ使えます。

 - [Arch Linux のライブ起動イメージに入っているパッケージ (2015年12月版)](http://qiita.com/polamjag/items/7ec4012a4c34dffabdc5)

Uploadボタンをクリックして、少し待ちます。

ダウンロードが完了したら、先ほどのデプロイ画面に戻り、
「My ISOs」に指定したISOが出てくる事を確認して下さい。

サーバータイプ、ロケーション、サーバーサイズ、オプションを選択して、「Place Order」を押すとサーバが起動します。
起動まで3分位掛かりました。

## ブート画面をブラウザで確認する
起動が完了すると、サーバのリストの右側に「Manage」というリンクが出てきますのでクリックして下さい。
管理画面で「View Screen」を押すと、ブラウザ上でVNCクライアント([noVNC](https://kanaka.github.io/noVNC/))が起動し、サーバの画面が見えるはずです。

![](https://raw.githubusercontent.com/dseg/dseg.github.io/master/img/qiita/09-arch-on-vultr/novnc.png)

ブートメニューで止まっているはずですので、ENTERキーを押して起動させます。
起動するとルートでログインされた状態です。
既にネットワークにつながっており、名前解決も出来ます。確認してみます。

## ネットワーク疎通確認
```bash
$ ping -w 3 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=54 time=9.49 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=54 time=9.68 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=54 time=9.51 ms

--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 9.490/9.563/9.682/0.116 ms

$ nslookup gnu.org
Server:         108.61.10.10
Address:        108.61.10.10#53

Non-authoritative answer:
Name:   gnu.org
Address: 208.118.235.148
```

## rootのパスワード設定
```bash
echo root:root1234567890 | chpasswd
```

## SSHD起動
noVNCではコピペが出来ず作業しずらいので、SSHDを立ち上げた方が楽です。
今立ち上げたサーバのIPアドレスは My Serversの一覧の所に表示されています。

```bash
systemctl start sshd
```

## クライアントからSSH接続
```bash
ssh root@サーバのIPアドレス
```

## パーティション作成

|デバイス|容量|ファイルシステム|マウント先|
|---|--:|:-:|:--|
|/dev/vda1|128MB|ext4|/boot|
|/dev/vda2|2GB|swap|スワップ|
|/dev/vda3|残り全部|ext4|/|

```bash
parted /dev/vda --script mklabel msdos
```

```bash
# Make partitions
parted /dev/vda --align optimal\
 --script\
 mkpart primary ext4 2048s 128MB\
 unit MB\
 mkpart primary linux-swap 128MB 2GB\
 unit GB\
 mkpart primary 2GB 100%\
 set 1 boot on\
 align-check opt 1 align-check opt 3
```

## パーティション確認
```bash
parted /dev/vda p

Model: Virtio Block Device (virtblk)
Disk /dev/vda: 16.1GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system     Flags
 1      1049kB  128MB   127MB   primary  ext4            boot
 2      128MB   2000MB  1872MB  primary  linux-swap(v1)
 3      2000MB  16.1GB  14.1GB  primary  ext4
```

## ファイルシステムのフォーマット
```bash
# Format the partitions and mount it
mkswap /dev/vda2
swapon /dev/vda2
mkfs.ext4 /dev/vda1
mkfs.ext4 /dev/vda3
```

## ファイルシステムのマウント
```bash
mount /dev/vda3 /mnt
mkdir /mnt/{boot,etc}
mount /dev/vda1 /mnt/boot
```

## fstab生成
```bash
# Generate the /etc/fstab
genfstab -p /mnt > /mnt/etc/fstab
```

## fstab確認
```bash
cat -n /mnt/etc/fstab
     1  # UUID=0511c0d9-2e1a-47ea-bdaf-2ac0dd0f771b
     2  /dev/vda3               /               ext4            rw,relatime,data=ordered        0 1
     3
     4  # UUID=51b42fd0-e7d6-4795-b11c-cbf950cae57a
     5  /dev/vda1               /boot           ext4            rw,relatime,data=ordered        0 2
     6
     7  # UUID=d659fbc3-66e0-4a9c-b0c2-fb2134fdb477
     8  /dev/vda2               none            swap            defaults        0 0
     9
```

## 各種設定
パッケージの取得先を設定します。
手でやるなら一番地理的に近いミラーサイト一つ、又は二つだけ残して残りは削除。
rankmirrorsコマンドを使えば自動でやってくれますが、5～10分程の時間がかかりますので手で設定。

```bash
# Find the nearest mirror automatically
mkdir /mnt/etc/pacman.d

cat <<'MIRRORS' >/mnt/etc/pacman.d/mirrorlist
Server = http://ftp.tsukuba.wide.ad.jp/Linux/archlinux/$repo/os/$arch
Server = http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/$repo/os/$arch
MIRRORS

# 自動で生成しても良いけど10分前後時間が掛かる
# rankmirrors -n 3 /run/archiso/sfs/airootfs/etc/pacman.d/mirrorlist >/mnt/etc/pacman.d/mirrorlist
```

## 基本パッケージのインストール
```bash
# サーバ用途なので、頻繁に更新されるlinuxパッケージではなく、より更新が少ないlinux-ltsを入れます
pacstrap /mnt base netctl sudo shadow openssh linux-lts
```

## 環境に入る
```bash
arch-chroot /mnt bash
```

## Localeの設定
```bash
# locale設定
echo en_US.UTF-8 UTF-8 >/etc/locale.gen
#echo ja_JP.UTF-8 UTF-8 >/etc/locale.gen

locale-gen
#Generating locales...
#  en_US.UTF-8... done
#Generation complete.

# 言語設定
echo "LANG=en_US.UTF-8" > /etc/locale.conf
```

## ホスト名設定
```bash
echo vultr-server-01 > /etc/hostname
```

## タイムゾーン設定
```bash
ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

## ネットワーク設定

### ネットワーク設定ファイル作成
ネットワークインターフェース名はens3だと思いますが、念のため確認して下さい。

```bash
ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 56:00:01:55:66:65 brd ff:ff:ff:ff:ff:ff
```

インターフェース名と同じ名前のファイルを作成して、内容を記述します。

```bash
cd /etc/netctl
cp examples/ethernet-static ens3
nano ens3
```
**(※IPアドレス、ネットマスク、DNS、Gatewayの値は置換して下さい)**
[My Servers]の[IPv4]タブに移動し、「network configuration」リンクをクリックすると設定すべき値が表示されます。
(CentOS / RHEL の所に表示されている値を使えばOK)

```text:/etc/netctl/ens3
Description='A basic static ethernet connection'
Interface=ens3
Connection=ethernet
IP=static
Address=('111.112.113.114/255.255.254.0')
Gateway='111.112.113.1'
DNS=('108.61.10.10')

## For IPv6 autoconfiguration
#IP6=stateless

## For IPv6 static address configuration
#IP6=static
#Address6=('1234:5678:9abc:def::1/64' '1234:3456::123/96')
#Routes6=('abcd::1234')
#Gateway6='1234:0:123::abcd'
```

### ネットワーク有効化
```bash
netctl enable ens3
# ln -s '/etc/systemd/system/netctl@ens3.service' '/etc/systemd/system/multi-user.target.wants/netctl@ens3.service'
```
### 時刻同期設定
```bash
cat <<TIME >>/etc/systemd/timesyncd.conf
NTP=asia.pool.ntp.org
FallbackNTP=0.arch.pool.ntp.org 1.arch.pool.ntp.org 2.arch.pool.ntp.org 3.arch.pool.ntp.org
TIME

timedatectl set-ntp true
timedatectl status|grep NTP
# NTP synchronized: yes
```
## 特権ユーザの設定
```bash
echo '%wheel ALL=(ALL) ALL' >> /etc/sudoers
```

## ブートローダ設定
```bash
# Setting up the boot loader
pacman -S grub --noconfirm

grub-install --recheck --target=i386-pc /dev/vda

grub-mkconfig -o /boot/grub/grub.cfg

# 結果
# Generating grub configuration file ...
# Found linux image: /boot/vmlinuz-linux-lts
# Found initrd image: /boot/initramfs-linux-lts.img
# Found fallback initramfs image: /boot/initramfs-linux-lts-fallback.img
```

## 特権ユーザ追加 (ログイン用)
*※user01 は適切なアカウント名に置換して下さい*

```bash
useradd -m -g users -G wheel user01
# 初期パスワード追加
echo user01:password | chpasswd
```

## SSHDのパスワード認証を無効化
クラウド上なので、SSHDのパスワード認証を無効にする必要があります。
有効のままだと、例えば寝ている間に総当たり攻撃が来て知らないうちにクラックされてしまうかもしれません。
パスワードではなく公開鍵・秘密鍵を使ってログインするようにしましょう。
公開鍵はSFTPなどでアップロードしても良いですが、一番手軽なのはGithubに登録しているものをそのまま使うことだと思います。curlで普通に取得できます。

### GitHubに登録している公開鍵を取得 (確認)
```bash
curl -s https://github.com/<<ユーザー名>>.keys

# 例:
curl -s https://github.com/dseg.keys
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIAnJSEJG1MVYf2BrRSAWw+DhDvswo3Bv1g3MO+dCBoI
```

### GitHubに登録している公開鍵をSSHに登録
```bash
su - user01
[ -d ~/.ssh ] || mkdir ~/.ssh
curl -s https://github.com/<<ユーザー名>>.keys >> ~/.ssh/authorized_keys
```

### SSHDの設定ファイルを更新
秘密鍵でSSHのログインが出来るか確認し、OKならSSHのパスワード認証を無効化してしまいます。 
もし秘密鍵でログインできないままSSHのパスワード認証を無効化すると、PCにログインできず何もできなくなる(⇒インスタンス破棄しかない)ので注意して下さい。

```text:/etc/ssh/sshd_config
PasswordAuthentication no
```

この程度なら手で編集した方が良いかもしれませんが、一応スクリプトを張っておきます。

```bash
sudo -i
F=/etc/ssh/sshd_config
# コメント行のPasswordAuthentication...は無視する
if [[ `grep -P '^(?<!#)PasswordAuthentication yes' "$F"` ]]; then
  sed -ie 's/^PasswordAuthentication yes/PasswordAuthentication no/g' "$F"
fi
```
## SSHDをブート時に起動させる
```bash
systemctl enable sshd
```

## ISOイメージの取り外し
管理ツールの[My Servers] - [Custom ISOタブ]でRemove ISOボタンをクリックします。

![](https://raw.githubusercontent.com/dseg/dseg.github.io/master/img/qiita/09-arch-on-vultr/removeiso.png)

## 再起動

```bash
exit

# Unmound drives
umount /mnt/{boot,}

reboot
```

もし全てが順調なら、ネットワーク及びSSHDが起動しており、SSHクライアントでアクセス可能なはずです。
うまくいかない場合は、ManageリンクからView ConsoleボタンをクリックしてVNCを起動し、rootでログインしてから修正します。

```bash
ssh user01@IPアドレス -i 秘密鍵ファイル
```

## 起動直後のメモリ使用量確認
```
$ free -h
              total        used        free      shared  buff/cache   available
Mem:           745M         20M        666M        296K         58M        705M
Swap:          2.0G          0B        2.0G
```
20M! いいですね。


## base-devel追加
開発用のパッケージ群、base-develをインストールします。

```bash
sudo pacman -S base-devel
```

## yaourt追加
```bash
# /etc/pacman.conf の 末尾に追記
cat <<EOL | sudo tee -a /etc/pacman.conf

[archlinuxfr]
SigLevel = PackageOptional
Server = http://repo.archlinux.fr/\$arch
EOL

```

```bash
sudo  pacman --sync --refresh --noconfirm yaourt
```

あとは、AURから好きなパッケージをインストール出来ます。
nkfを入れてみます。

```bash
yaourt -S --noconfirm nkf
```

## 不要パッケージ、pacmanのキャッシュ削除
```bash
# 不要パッケージ削除
sudo pacman -R linux --noconfirm
# pacmanのキャッシュ削除
sudo pacman -Sc --noconfirm
```

## Vultrのスナップショット機能を活用する
以上で完了です。お疲れさまでした!

最後にこの状態でスナップショットを取ることをお勧めします。
次のインスタンスを作る時、このスナップショットから構築可能となるため、作業時間とデータ転送量の節約になります。

トップの[My Servers]で「Snapshots」タブを開き、フォームにスナップショット名を入力して「Take Snapshot」ボタンをクリックすればOKです。
数分でスナップショットが作成されます。

![](http://shield.jp/qiita/09-arch-on-vultr/snapshot.png)

スナップショットから復元した時は、ネットワーク設定が古いままなため、設定を更新しないとネットワークに繋がらないので注意。

```bash
sudo vi /etc/netctl/ens3
# AddressとGatewayの値を更新
```

# 参考
- [Installing Arch Linux On a Vultr Server](https://www.vultr.com/docs/installing-arch-linux-on-a-vultr-server)
参考になるものの若干内容に誤りあり。それでこのエントリを書く気になりました。

- [ArchLinuxのインストール(3つのブート方式ごとの設定)](http://qiita.com/Gen-Arch/items/da296b7cbe5d87abc5a4)

# 最後に
Vultrには[API](https://www.vultr.com/api/)があるため、対応した[コマンドラインツール](https://github.com/JamesClonk/vultr)や[Terraformのプロバイダ](https://github.com/rgl/terraform-provider-vultr)を使ってインスタンスの操作ができるとの事です。
近々試してみる予定です。