VPSにarchlinuxを導入して、GUI環境構築(VNC-ONLY)までやってみた。

# はじめに
※注意: 以下に登場する"鯖"は"server"の略(?)です。

はじめまして、にらんけんです。(初投稿です)
今回はVPS(Virtual Private 鯖)をお借りして、arch-linux入れてVNC(Virtual Network Computing)鯖化した際の設定をまとめます。
僕の性格上、余計なことをぶっこむことが多いので、適宜読み飛ばしてください。
あと、ArchLinux側の設定は基本的に[ArchLinuxのWiki](https://wiki.archlinux.jp/index.php/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89)を順番通りにたどれば問題ないです。
途中から粗雑なメモになってしまった点は、余裕のある時にきれいに修正しますm(_ _)m



# 今回お借りしたVPS鯖について

![lxqt_vnc_server.jpg](https://qiita-image-store.s3.amazonaws.com/0/171582/35fbc626-0198-db36-ca0f-ef76b47da077.jpeg)
client側 (Lubuntu 16.10) <-> server側 (arch-linux)
RemminaというVNC-clientソフトで、arch-linuxのVNC-serverにアクセスしています。

今回使用したVPSは、[お名前.comさんのVPS(KVM)](https://www.onamae.com/server/vps/)のメモリ2GBプランです。
お名前.comさんの方でもいくつかのISOイメージを用意してくれていますが、任意のISOイメージファイルをアップロードできるということなので、色々なlinuxイメージで遊べます。今回arch-linuxのイメージを[こちら](https://www.archlinux.org/download/)から取ってきました。
(※ バージョン古いarch-linuxを用意してくれていますが、そのまま[インストールの手順どおり](https://wiki.archlinux.jp/index.php/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89)に動かすと、pacstrapする際に署名鍵?的な問題に苦しむことになるので、新しいバージョンのISOイメージを用いたほうがよいかと思います。僕の力では解決できなかったので原因教えていただけたら嬉しいです。)

## VPS鯖の設定

お名前.comさんのVPSについて、簡単に初期設定方法。

### sftpでお好きなISOイメージをアップロードする(for Linux)

1: SSH Private Keyを~/.ssh/に保存。

2: 鍵ファイルの権限を変更(他ユーザのアクセスを禁止)

```
$ chmod 600 ~/.ssh/保存したkey名
```

3: 接続情報を設定ファイルに追加
※接続先とユーザー名は下記スクショのようなコンソール画面に移って、ISOファイルアップロード(SFTP)の欄に書いてます。

``` ~/.ssh/config

Host onamae (任意)
Hostname 接続先 (多分"sftpXXXX.myvps.jp"とか)
User ユーザー名
IdentityFile ~/.ssh/保存したkey名
```

4: sftpで上記で記述したHostに接続

```
$ sftp onamae
```

あとはputコマンドでISOファイル置いておけば、下記スクショの"イメージを選択してください"にputしたISOイメージが表示されるはずです。

![Screenshot from 2018-02-22 20-11-39.png](https://qiita-image-store.s3.amazonaws.com/0/171582/5d2a90f7-f533-b712-be61-edb4ab0746a5.png)

なお3,4は、下記でも可です。

```
$ sftp -i ダウンロードしたKeyのパス ユーザー名@接続先
```

5: ISOイメージを挿入して起動すると、VPSのHDDに入ってるOSよりもISOイメージが優先されるので、ISOイメージのインストール手順に従って塗りつぶせばOK.
(たぶん"/dev/vda"とか"/dev/vdb"が与えられているので適当に。lsblkコマンドが使えれば簡単に確認できる。)


# arch-linux のインストールまで。

以降ISOイメージにarch-linuxを選んだ際の手順に少しだけ補足メモ。
基本的にArchWikiのインストール手順にしたがっていれば間違いない。

### 補足1: キーマップ設定(インストールディスク起動後)
最初はUS(?)のkeyboardの設定になっているので、

```
$ loadkeys jp106
```

打ち込む。違う人いたらごめんなさい。

### 補足2: diskに与えられたパーティションテーブルを変更する。(したい人のみ。mkfs.ext4やmkswapの前)

※ この方法はお名前.comで用意してくれていた、既存のLVM(Logical Volume Manager)を塗りつぶして、パーティショニングする方法です。

A. /dev/vda(60GiB)パーティショニング例
にらんけんの設定: vda1 (boot), vda2 (root), vda3 (swap領域)
普通の人(？)はswapに10GiBも使わないと思うので、鯖用途に合わせて適宜変更。
GRUBを入れる場合100MiB弱くらいとっておけばgrub-installで失敗しない。

``` 
$ parted /dev/vda
$ (parted) mklabel msdos
$ (parted) mkpart primary ext4 1MiB 100MiB
$ (parted) mkpart primary ext4 100MiB 50GiB
$ (parted) mkpart primary linux-swap 50GiB 100%
```


B. "/dev/vda 140GiBのパーティショニング(例)"
にらんけんの設定: vdb1 (home)

```
$ parted /dev/vdb
$ (parted) mklabel msdos
$ (parted) mkpart primary ext4 1MiB 100%
```

あとは手順通りパーティションフォーマット&マウント

```
$ mkfs.ext4 /dev/vda1
$ mkfs.ext4 /dev/vda2
$ mkfs.ext4 /dev/vdb1
$ mkswap /dev/vda3
$ swapon /dev/vda3
$ mkdir /mnt
$ mount /dev/vda2 /mnt
$ mkdir /mnt/boot
$ mount /dev/vda1 /mnt/boot
$ mkdir /mnt/home
$ mount /dev/vdb1 /mnt/home
```

### 補足3. mirror serverの変更。(pacstrapの前)

ミラーリストを編集する。(鯖に近いところでないとパッケージダウンロードにかなりの時間がかかる、特にbase-develも入れると)

```
$ vi /etc/pacman.d/mirrorlist
```

一番上にあるmirror鯖が適用されるということなので、
なんでも良いが "# Japan "の下にある、ほにゃららjaist(？)などの適当なアドレスを一番上に置いておく。

### 補足4. GRUB(boot-loader)を入れる。 (arch-chroot時)

```
pacman -S os-prober grub
grub-install --target=i386-pc --recheck /dev/vda
grub-mkconfig -o /boot/grub/grub.cfg
```

# arch-linuxインストール後のVPS鯖の最低限の設定
ユーザーの追加
ネットワークの設定
iptablesの設定
openssh-serverの設定
日本語環境の構築
(※ネットワークとiptablesの設定逆にしたほうが良いかも。)

### ユーザーの追加
はじめはrootになっているので、ユーザ追加する。(以下、_niran_というユーザを作成する例)
※インストール時にbase-develを入れていない場合は、ネットワークの設定をしてから```pacman -S sudo```する。

```
$ useradd -m -g wheel niran
$ passwd niran # loginパスワードの入力.
$ visudo
```

useradd時にshellの指定ご希望の際は、```-s shellのpath(/bin/bashとか)```を引数に追加。
visudoでテキストエディタ開くので、下記のコメントアウトを外しておく。

```
# %wheel      ALL=(ALL) ALL
```

最後に```passwd -l root```にて、rootログイン禁止に。
SSHのrootログインのみを禁止にする場合は、/etc/ssh/sshd.confを設定時にPermitRootLogin=noにしておく。


### ネットワークの設定
初期状態ではネットワークの設定がたぶん何もされてないので、自分で設定する必要がある。基本的に[ArchWiki](https://wiki.archlinux.org/index.php/Network_configuration#Network_managers)に従う。

有線の場合は簡単で、
/etc/netctl/_some-profile_ を作る。/etc/netctl/examples/の中に例が幾つかあるのでそれを参考にして作る。インターフェース名は```ip addr show```等で確認できる。

``` (some-profile)
Description='my static ethernet connection'
Interface=enpXsXX
Conecction=ethernet
IP=static
Address=('123.456.789.101/24')
DNS=('123.456.789.1', '123.654.987.1')
GATEWAY='123.456.789.1'
```

編集後、profileを適用。

```
$ netctl enbable /etc/netctl/some-profile
$ netctl start /etc/netctl/some-profile
```

### iptablesの設定

```
#!/bin/sh

iptables -F # ルール全削除
iptables -P INPUT DROP # default policy
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

##########################################
###        許可・禁止ルールの追加        ###
##########################################
## iptables -A INPUT -i lo -j ACCEPT
## iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
## iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 12345 -j ACCEPT

iptables-save > /etc/iptables/iptables.rules # ルールの更新
systemctl reload iptables.service
```

上記はPort 12345に穴を開けてそれ以外弾くようなファイヤーウォールの設定。
limitやhashlimitなどつけたり、ログ取って弾く等の柔軟な設定を行えるが、長くなるので省略。```iptables -nvL```にてテーブルの確認を行える。(参考資料 [Linux: 25 Iptables Netfilter Firewall Examples For New SysAdmins](https://www.cyberciti.biz/tips/linux-iptables-examples.html) )

サービス開始してシェル実行。

```
$ systemctl enable iptables.service
$ systemctl start iptables.service
$ ./path-to-shellscript
```

### sshdの設定
```pacman -S openssh```でssh-clientとserverを入れる。
/etc/ssh/sshd.conf をいじる。(PermitRootLogin=noにする、PORT変更、鍵関連の設定PubkeyAuthenticationなど)
(sshのPORT変更時) systemctl edit sshd.socket (下記は12345ポートに変更時の設定)

```
[Socket]
ListenStream=
ListenStream=12345
```

```
$ systemctl enable sshd.service
$ systemctl start sshd.service
```


# VNC関連の設定

### @鯖側の設定 (VNC-serverと日本語環境)

VNCサーバ＆日本語環境構築に必要なパッケージを準備
今回、input methodはfcitx-mozcを用いる。
terminal等で日本語を表示するためには[日本語フォント](https://wiki.archlinux.org/index.php/fonts#Japanese)を入れる必要がある。

```
$ pacman -S lxqt xorg-server tigervnc fcitx-im fcitx-configtool fcitx-mozc otf-ipafont
```

port 590Xでサーバたてる。(初回はパスワード設定する)

```
$ vncserver :X
```

port 590Xのサーバ閉じる。

```
$ vncserver -kill :X
```

~/.vnc/xstartupが初回起動時に生成されているので

```
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS="@im=fcitx"
startlxqt &
```
を追加。(上3つは日本語input moduleの環境変数の設定、マシン自身にデスクトップ環境つくる際は.xprofileに追記すればよい。)

```
$ vncserver :1
```

で5901番ポートにVNC鯖をたてる


### @クライアント側の設定

SSHのポートフォーワーディングを利用して接続する。
windowsだとteraterm等、linuxだと適当なターミナルを開いて、鯖にsshする

I. (Linuxの場合)

```
ssh -L XXXX:localhost:5901 鯖IP-address
```

~/.ssh/configの設定をしておくと、IPaddressの手打ちのかわりに下記Hostで設定した名称でsshできる。

```
Host saba
Hostname 鯖IP-address
User username
#IdentityFile ~/.ssh/鍵名
#Port 12345
```

remmina等のVNC-clientソフトを用いて接続。
![Screenshot from 2018-03-08 17-55-12.png](https://qiita-image-store.s3.amazonaws.com/0/171582/89374e5f-6a0f-3c07-6cda-f0104e336083.png)




II. (windowsの場合)
teraterm & ultraVNCを使った方法。

下記のようにポートフォーワーディングの設定をして、鯖にSSHする。
![term.png](https://qiita-image-store.s3.amazonaws.com/0/171582/bfe34823-60cb-4183-eeb2-391ba20d404b.png)


VNC-Viewerソフトでlocalhostの指定したポートXXXXにConnect。
![vnc.png](https://qiita-image-store.s3.amazonaws.com/0/171582/9df08d90-ea85-7167-701e-265a2972af05.png)

※VNC-Viewerで、日本語しか打てない、もしくは英語しか打てない場合
歯車マーク → Mouse and Keyboard のJapanese keyboardにチェック付いてないかも。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/171582/fb685540-020a-1a92-f1b1-8c42929a5f68.png)





## 最後に
まとめてやろうと思ったら、時間があいてしまってうろ覚えで書いてしまいました。アバウトになっているところがいくつかあると思うのですが、ググればすぐ出てくると思います。
基本的にArchLinuxのWikiに従っていればできるかと思うので、それの補足程度に参考になれば嬉しいです。

2019/02/23 (Sat) Vnc-Viewerの記述を追加
2018/03/30 (Fri) GRUBのインストール、日本語環境の設定について追加。