In the Spica (Satellite)

気になることを書いていた日記のレスキュー版です

ConoHaでArchLinuxのサーバーを建てよう

この記事はNomuken氏の手作業による優しい気持ちで復元されました

この記事について

この記事は,美雲このはちゃんで有名なConoHaアドベントカレンダー13日目の記事です.

昨日は,naoto_gohkoさんによる「ConoHaのVMでUbuntu 14.04を使ってs3qlでSwift Object Storageをマウントする」でした.

明日は,tisiharaさんによる「ConoHaでNetBSDのサーバーを建てよう」です.

そうだArchLinuxでサーバーを建てよう

と,思っている皆さんも極めて多いと存じます.

ArchLinuxの詳しい概念等を知りたいのであれば公式の「The Arch Way」が参考になります. 軽快かつ,シンプル,柔軟という点に置いてArchLinuxはサーバに利用するメリットは大きいのではないでしょうか.

特に,VPSサービスの中でISOイメージをアップロードせずにArchLinuxを利用できるのはConoHaだけ!!(おそらく.クラウドは除く) これは,ConoHaでArchLinuxを利用するしかないですね!!

ArchLinuxをサーバ用に選ぶメリット・デメリット

ArchLinuxをサーバに選択するメリットとしては以下の物が上げられるでしょう.

  1. 設定ファイルがシンプル(勝手な設定が行われていない)
  2. ユーザの判断でしか動作しない(勝手にサービスを立ち上げて有効化しない)
  3. 常に最新版
  4. 軽い

逆にデメリットとしては以下のものが上げられるでしょう,

  1. 自分で設定しなければいけない(よくある設定はされない)
  2. インストールしてもすぐには動かない(自分で設定しなくてはいけない)
  3. 互換性を考慮せずに常に最新版が降ってくる(不用意にバージョンアップすると設定ファイルが互換性が無くて起動しない)
  4. インストールが大変(自分でインストールするパッケージを選ばなくてはいけない)

これらに対して,多くの議論があるとは思いますがこの記事では触れません.

実際にArchLinuxをサーバとして使えるのかという質問があれば,今見ているこのサーバ(spica.bz)はArchLinuxで動いています. ArchWikiでは,ArchLinuxをサーバ用途に利用することに対して次のように述べています.(ArchWiki - サーバー

次のような批評または主張を見たことがあるかもしれません: Arch Linux はサーバーのオペレーティングシステムには全く向いていない!。これは真実です: サーバーのインストールディスクというものは存在していません。他のディストリビューションでは用意されているようなディスクのことです。これは Arch Linux には最小限の (しかしながら堅実な) ベースシステムしか含まれていないためで、初めからインストールされているデスクトップまたはサーバーとしての機能は、ほんのわずかしかありません。ただし、このことは Arch Linux をサーバーとして使うべきでないということを意味しません。むしろ正反対です。

実際のところ考えは人によると思いますが,ArchLinuxをサーバ用OSとして選択することは全くありえない選択では無いと思います.

ConoHaにインストール

ConoHaでは旧・新の両方ともArchLinuxを利用することが出来ます. ただ,まだ私の場合は旧ConoHaにクーポンが残っておりますので,今回はそちらを利用してArchLinuxのインストールを行いたいと思います. (旧ConoHaにクーポンが残っていて,そちらにArchLinuxをインストールして試してみたいという方も多いと思うので……)

もちろん,新ConoHaの手順も解説していこうと思います.

インストール

今回の目的はサーバとして最小限の役割をする単純なsshサーバを構築しましょう.

1.ArchLinuxのISOイメージから起動する

旧ConoHaの場合

適当なプランでひとまずCentOS仮想マシンを作成します. 作成したら,仮想マシンのラベルをクリックし,開いた画面のその上のメニューから,ArchLinuxのISOイメージを選択します.

f:id:nmkn:20151216191355p:plain

これですね.

f:id:nmkn:20151216191327p:plain

こちらを選択すると,起動がArchISOから行われるようになります.

また,旧ConoHaではディスクが20GB + 80GBになってしまっているのでVMのメニューからVM設定を選択し,ディスクの構成変更を行います.

f:id:nmkn:20151216191412p:plain

新ConoHaの場合

左側のメニューから,仮想マシンの追加を選び,仮想マシンを作成します.

新ConoHaでは新しい絵柄のこのはちゃんもいるので可愛いですね. 以下のところからArchLinuxを選択します.

f:id:nmkn:20151216191448p:plain

ただ,このはちゃんが白で切れてしまうので,これを半透明とかにすればよりこのはちゃんが近くて良いかなぁと思います.

2.起動

今頃,32bitをArchLinuxを使っている人でわざわざ選択する必要が無いと思うので,64bitでブートします.

f:id:nmkn:20151216191429p:plain

一番上の,Boot ArchLinux (x86_64) を選択(Enter)して起動しましょう.

以下のような画面になるまで待ちましょう.

f:id:nmkn:20151216191512p:plain

もし,他のLinuxをお使いの方はお気づきかもしれませんが,archisoではzsh + grml-zsh-configがデフォルトで装備されています. それではArchLinuxをインストールしていきましょう.

3. インストール

インストールはArchLinux公式ドキュメントのBeginners' guideを参照しながら以下の記事を読むと良いと思います.

3.0.インストールその前に (旧ConoHaのみ)

旧ConoHaは,旧ということでArchLinuxのインストールイメージがメンテナンスされていません.つまり何がいいたいかというと,異常にarchisoが古いです.2014-08-01のバージョンです.

あまりにも古い場合,以下のようなエラーで後述のpacstrapでパッケージのインストールに失敗します.

downloading required keys...
:: Import PGP key 4096R/, "Seblu <seblu@seblu.net>", created: 2011-11-11? [Y/n] y
error: key "Seblu <seblu@seblu.net>" could not be imported
:: Import PGP key 2048R/, "Christian Hesse (Arch Linux Package Signing) <arch@eworm.de>", created: 2011-08-12? [Y/n] y
error: key "Christian Hesse (Arch Linux Package Signing) <arch@eworm.de>" could not be imported
:: Import PGP key 4096R/, "Antonio Rojas <arojas@us.es>", created: 2014-10-21? [Y/n] y
error: key "Antonio Rojas <arojas@us.es>" could not be imported
error: required key missing from keyring
error: failed to commit transaction (unexpected error)
Errors occurred, no packages were upgraded.

これは,パッケージの信頼性を検証するための署名が古すぎるために起きるトラブルです. このスレでも述べられていますが,archlinux-keyringの再インストールで回避することができます. 以下のコマンドを試してみてください.

# pacman -S archlinux-keyring
# pacman-key --populate archlinux

(実はarchlinux-keyringをインストール時に,自動的にもうひとつのコマンドが実行されるので,本当は必要ないのですが今後どうなるかわからないため,一応記載しました)

3.1. パーティションを決める

今回は話をシンプルにするため,以下のようにしたいと思います.GPT/BIOSで構築を行います.

  • /dev/sda1 (100M) : BIOS boot Part
  • /dev/sda2 (その他全て) : /

それでは,gdiskを用いて設定を行いましょう.

 # gdisk /dev/vda
GPT fdisk (gdisk) version 0.8.10

Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: not present


***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory. THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by
typing 'q' if you don't want to convert your MBR partitions
to GPT format!
***************************************************************


Warning! Secondary partition table overlaps the last partition by
33 blocks!
You will need to delete this partition or resize it in another utility.

Command (? for help): o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): y

Command (? for help): n
Partition number (1-128, default 1):
First sector (34-41943006, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-41943006, default = 41943006) or {+-}size{KMGTP}: +100M
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): ef02
Changed type of partition to 'BIOS boot partition'

Command (? for help): n
Partition number (2-128, default 2):
First sector (34-41943006, default = 206848) or {+-}size{KMGTP}:
Last sector (206848-41943006, default = 41943006) or {+-}size{KMGTP}:
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/vda.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.

以上では以下のような操作をしていました.

  • GPTでパーティションテーブル再度作成 (Command: o)
  • BIOS boot partitionの作成 (Command: n -> Enter -> +100M -> ef02)
  • /パーティションの作成 (Command: n -> Enter -> Enter -> Enter)
  • パーテョンテーブルの書き込み

あとは大幅にパーティションテーブルを改変してしまったので,再起動してカーネルに現在のパーティションを再度認識してもらいましょう.

# reboot
3.2. SSHからの操作に変える

再起動を終えたら,今後の操作を楽にするためSSH経由でのインストールに変更します. 以下の操作を行います.

以下のコマンドを打ち込みます.

# passwd
Enter new UNIX password: <パスワードを入力し,Enter>
Retype new UNIX password:<再度パスワードを入力>
passwd: password updated successfully

# systemctl start sshd

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether                   brd ff:ff:ff:ff:ff:ff
    inet                 brd 157.7.53.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6                                      scope global noprefixroute dynamic
       valid_lft 1291898sec preferred_lft 82298sec
    inet6                             scope link
       valid_lft forever preferred_lft forever
    inet6                              scope link
       valid_lft forever preferred_lft forever

あとは,設定どおりにSSHに接続を行えば大丈夫です.

ちなみに,LinuxもしくはMacユーザならTerminalで以下のコマンドをSSHで入力すれば接続が可能です.

$ ssh root@<ConoHaサーバのIP>
3.3.新環境にパッケージをインストールする

ここから,ArchLinuxの基本システムとその他使うでしょというソフトウェアのインストールを行います.

……の前に,インストールの高速化のため日本のミラーサーバからのダウンロードを行います. お好きなエディタで,pacmanのmirrorサーバリストを開き,日本のサーバを最上位にコピペします. 私は,vim以外のエディタを知らないのでvimを用いて編集します.(旧ConoHaのarchisoではvimが無かったためviで編集)

# vi /etc/pacman.d/mirrorlist
# head /etc/pacman.d/mirrorlist
##
## Arch Linux repository mirrorlist
## Sorted by mirror score from mirror status page
## Generated on 2014-08-01
##

Server = http://ftp.tsukuba.wide.ad.jp/Linux/archlinux/$repo/os/$arch

## Score: 0.5, Germany
Server = http://mirror.k42.ch/archlinux/$repo/os/$arch

それでは,ローカルにインストールしていきましょう.以下のような作業を行います.

# lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sr0              11:0    1   559M  0 rom  /run/archiso/bootmnt
vda             254:0    0   100G  0 disk
├─vda1          254:1    0   100M  0 part
└─vda2          254:2    0  19.9G  0 part
loop0             7:0    0 241.3M  1 loop /run/archiso/sfs/airootfs
loop1             7:1    0    32G  1 loop
└─arch_airootfs 253:0    0    32G  0 dm   /
loop2             7:2    0    32G  0 loop
└─arch_airootfs 253:0    0    32G  0 dm   /

# mkfs.ext4 /dev/vda2
Proceed anyway? (y,n) y

# mount /dev/vda2 /mnt

# pacstrap -i /mnt base base-devel vim zsh grml-zsh-config grub
Enter a selection (default=all): <Enter>
Enter a selection (default=all): <Enter>

Total Download Size:    239.54 MiB
Total Installed Size:   854.49 MiB

:: Proceed with installation? [Y/n] y<Enter>
...skip

見やすさの都合上,必要最低限の場所以外は省略しました.これで,ArchLinuxが動作する最小環境(と,使いやすくする各種ツール郡)のインストールが行われます.

3.4.新環境へのchroot

ArchLinuxは自分で設定しない限り有効になりません.ですので,ブートの設定やパスワード等も自分で行わなければなりません. 現在インストールしただけでは,ブートも出来ないのでarch-chrootと呼ばれるコマンドで新環境に入り設定を行っていきます.

ここでは以下のことを行います.

  • genfstabでfstabの内容を生成する
  • arch-chrootコマンドで新環境に移動
  • システム全体のロケールの設定
  • タイムゾーンの設定
  • ハードウェアクロックの設定
  • ホスト名の設定
  • ネットワークの設定
  • rootのパスワードを設定
  • grubブートローダ)を設定

今回は動作が多いので,補足しながら説明します. この章だけコマンドプロンプトroot@archiso ~ #と表現します.

・fstabの自動生成
root@archiso ~ # genfstab -p /mnt > /mnt/etc/fstab

・新環境に移動
root@archiso ~ # arch-chroot /mnt /bin/zsh

・ロケールの設定
root@archiso / # vim /etc/locale.gen

<以下の箇所を変更>
163行目あたり 
#en_US.UTF-8 UTF-8
↓(コメントを外す)
en_US.UTF-8 UTF-8
288行目あたり
#ja_JP.UTF-8 UTF-8
↓(コメントを外す)
ja_JP.UTF-8 UTF-8

root@archiso / # locale-gen
Generating locales...
  en_US.UTF-8... done
  ja_JP.UTF-8... done
Generation complete.
root@archiso / # echo "LANG=ja_JP.UTF-8" > /etc/locale.conf

・タイムゾーンの設定
root@archiso / # ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

・ハードウェアクロックの設定
root@archiso / # hwclock --systohc --localtime

・ホスト名の設定,ここではホスト名を「conoha-chang-prpr」とする
root@archiso / # echo "conoha-chang-prpr" > /etc/hostname

・ネットワークの設定,ConoHaではIPアドレスがDHCPで落ちてきてくれるので自動設定にする
root@archiso / # systemctl enable dhcpcd

・rootのパスワードの設定
root@archiso / # passwd
Enter new UNIX password: <パスワード入力してEnter>
Retype new UNIX password: <再度パスワード入力してEnter>
passwd: password updated successfully

・grubの設定
root@archiso / # grub-install --recheck /dev/vda
Installing for i386-pc platform.
Installation finished. No error reported.
root@archiso / # grub-mkconfig -o /boot/grub/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-linux
Found initrd image: /boot/initramfs-linux.img
Found fallback initramfs image: /boot/initramfs-linux-fallback.img
done

以上で,セットアップ完了です.

余談ですが,ハードウェアクロックの設定をArchLinuxが推奨しているutcではなくlocaltimeに設定している理由は,ConoHaのホストマシンの時刻設定との兼ね合いです. 非推奨で気持ち悪いかもしれませんが,今後もlocaltimeという設定は無くならないので,このように設定しましょう.

3.5.OpenSSHのインストール

それでは,一応今回の目的であるOpenSSHのインストールを行いましょう. ArchLinuxではpacmanと呼ぼれる最強なパッケージマネージャによってパッケージが管理されています. 以下のように打ち込んでみましょう.

root@archiso / # pacman -S openssh
error: failed to initialize alpm library
(database is incorrect version: /var/lib/pacman/)
error:   try running pacman-db-upgrade

ああっと,忘れてました.pacmanのデータベースを初期化し,アップデートするのを忘れていました. 以下のコマンドを打ち込んでみてください.

・データベースのアップグレード
255 root@archiso / # pacman-db-upgrade
==> Pre-4.2 database format detected - upgrading...

・データベースの更新
root@archiso / # pacman -Syy
:: Synchronizing package databases...
 core                                                                                                                                       121.2 KiB   148K/s 00:01 [######################################################################################################] 100%
 extra                                                                                                                                     1774.7 KiB   932K/s 00:02 [######################################################################################################] 100%
 community                                                                                                                                    3.1 MiB  1924K/s 00:02 [######################################################################################################] 100%

これで,大丈夫.再度打ち込んでみましょう.

root@archiso / # pacman -S openssh
resolving dependencies...
looking for conflicting packages...

Packages (4) dnssec-anchors-20150403-1  ldns-1.6.17-3  libedit-20150325_3.1-2  openssh-7.1p1-1

Total Download Size:   1.19 MiB
Total Installed Size:  6.21 MiB

:: Proceed with installation? [Y/n] y
:: Retrieving packages ...

(省略)

Optional dependencies for openssh
    xorg-xauth: X11 forwarding
    x11-ssh-askpass: input passphrase in X

root@archiso / # vim /etc/ssh/sshd_config

<今回は都合上以下を修正>
(44行目辺り)
#PermitRootLogin prohibit-password
↓以下のように修正
PermitRootLogin yes

root@archiso / # systemctl enable sshd

今回は,再起動後にユーザを作成しようと考えているため,sshでrootのログインを許可しようと思います. 後で,必ず修正を行ってください.

ArchLinuxにおけるトラブルシューティングの半分くらいは,表示されたエラーメッセージを理解することで修正することが出来ます. なので,トラブルが発生したらまず一度エラーメッセージを確認しましょう.

3.6.chrootから脱出,再起動

それでは,chroot環境下から脱出して再起動しましょう.

root@archiso / # exit
root@archiso ~ # umount -R /mnt
root@archiso ~ # poweroff

再起動コマンドはrebootですが,poweroffを利用しているところに注意してください. これは,ConoHaにおいてISOイメージが残っている場合に再起動してもそのISOイメージからまたブートしてしまうためです. (少なくとも,旧ConoHaの場合,新ConoHaは忘れちゃいました ;P)

ISOイメージを排出していることを確認したら,再度起動しましょう.旧ConoHaでは上のメニューから行えます. レッツ強制排出☆ システムがシャットダウンしているなら,強制の方を選択しても構いません.

3.7.IYH

f:id:nmkn:20151216191607p:plain

これで,インストールは完了です. OpenSSHの設定も行ったので,ちゃんとSSHで入れるかも確認しましょう.

$ ssh root@<ConoHaサーバのIP>
3.8. インストールのその後

一応,ここまででインストールが完了しました.が,流石にこれでは使い物にならないので,更に最低限これくらいは……という設定を行います.

  • nomukenユーザの追加
  • githubからsshで使う公開鍵のダウンロード
  • sshdの設定変更
・ユーザの追加
[root@conoha-chang-prpr ~]# useradd -m -g users -G wheel -s /bin/zsh nomuken

・作成したユーザのパスワードを変更
[root@conoha-chang-prpr ~]# passwd nomuken
新しい UNIX パスワードを入力してください: <パスワードを入力してEnter>
新しい UNIX パスワードを再入力してください: <再度パスワードを入力してEnter>
passwd: パスワードは正しく更新されました

・sudoを使えるようにする
[root@conoha-chang-prpr ~]# visudo

<以下を編集>
(82行目あたり)
# %wheel ALL=(ALL) ALL
↓(コメントを外す)
%wheel ALL=(ALL) ALL

・nomukenユーザに切り替える
[root@conoha-chang-prpr ~]# su nomuken
/etc/zsh/zshrc:cd:1630: 許可がありません: /root

・sshの鍵をインストールする
nomuken@conoha-chang-prpr ~ % mkdir .ssh
nomuken@conoha-chang-prpr ~ % curl https://github.com/nomuken.keys > .ssh/authorized_keys
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   381    0   381    0     0    459      0 --:--:-- --:--:-- --:--:--   463
nomuken@conoha-chang-prpr ~ % chmod 700 -R .ssh

・sshの設定を正しく設定する
nomuken@conoha-chang-prpr ~ % sudo vim /etc/ssh/sshd_config
[sudo] nomuken のパスワード: <nomukenのパスワードを入力してEnter>

<以下を編集>
(44行目辺り)
PermitRootLogin yes
↓以下のように修正
PermitRootLogin no

(72行目辺り)
#PasswordAuthentication yes
↓以下のように修正
PasswordAuthentication no

nomuken@conoha-chang-prpr ~ % sudo systemctl restart sshd

以上で設定は,完了ですお疲れ様でした!!

まとめ

ArchLinuxのインストールいかがだったでしょうか?おそらく相当面倒くさく,時間もかかったものと思います. 最後に,私が何故ArchLinuxをサーバで利用しているかポエムを書いて終わりたいと思います.

ArchLinuxは何度も言うように,自分で設定しないと,何も動かない性質を持つディストリビューションです. 他のLinuxでは,インストールした瞬間に「よくある設定」がなされ,それがデーモンとして動くものなら「即座に有効化され起動」します. 個人的に,この挙動はあまり好きではありません.何故ならばそのよくある設定が自分の環境に適するものであるとは限らないからです.

ArchLinuxでは,面倒くさく,相当量調べることを要求されることとなりますが,ユーザに本当の意味でのコントロールが与えられます. そういう意味でも,個人的にセキュアなOSだと思っています.

ともあれ,お疲れ様でした.以上でConoHaアドベントカレンダー13日目の記事とさせていただきます.ありがとうございました.

P.S. このはちゃん,遅くなってごめんなさい