RaspberryPI を最初から設定してWEBサーバとして使う その２ ~OS設定をちょこちょこ~

# その１からの続き
　[前回](https://qiita.com/traumerei/items/14555901f54170a7af71)、SSHで接続する設定および最低限のセキュリティ設定まで実施したので、今回はOSの追加設定をしていこうと思う。

# 設定作業
今回の目標であるOS諸々の設定については、昔なにやらごちゃごちゃやりまくった記憶はあるものの、何をやったかの具体的な記憶がないので、後から追記する可能性高し。（だからこうやって記録に残そうと思ったのだけど）
## OSの基本設定
### 1. ホストネーム設定
ホストネーム（ラズパイのPC名）がデフォルトだと`raspberry`になっている。長いし、複数台使うときには訳分からない状態になったりするので、名前を一意なものに変更しよう。
いつもなら、以下のように~~ctlというコマンドで入れるところだが……。（以下、全般的に`ore-no-hosts`と`ore-no-domain`には自分の運用環境に合わせたホスト名とドメイン名を入れかえて読んで欲しい。）

```console:コマンド確認
# hostnamectl set-hostname ore-no-hosts.ore-no-domain
```

Debian系でこの`hostnamectl`コマンドを使うには１つ落とし穴がある。Debianでは、[hostnameにドメインを入れてはいけないと明言されている](https://www.debian.org/doc/manuals/debian-reference/ch03.en.html#_the_hostname)。
ドメイン込みで`hostnamectl set-hostname`した場合、そのまま`/etc/hostname`に書き込まれてしまうため、Debianの仕様上は正しくない設定になってしまう。（ただし、"恐らく"動作にさほど影響はないはず）
よって、地道に`/etc/hostname`と`/etc/hosts`を変更することにする。

```console:コマンド入力([-]の行を削除、[+]の行を追加)
# vi /etc/hostname
- raspberry
+ ore-no-hosts
```
`/etc/hostname`はホストネームが書かれている１行だけのファイル。現在ある行を削除して、代わりに設定したいホスト名`ore-no-hosts`を入れればOK。

```console:コマンド入力([-]の行を削除、[+]の行を追加)
# vi /etc/hosts
省略
- 127.0.1.1               raspberrypi
+ 127.0.1.1               ore-no-hosts.ore-no-domain ore-no-hosts
```
設定を変更したら、再起動。

```console:コマンド入力
# hostname
ore-no-hosts
# hostname -d
ore-no-domain
# hostname -f
ore-no-hosts.ore-no-domain
```
これでよし。

### 2. 時刻設定
Linuxの時刻設定と言えば`/etc/localtime`が鉄板だが、最近のLinuxには、`timedatectl`というコマンドが用意されている。もちろん、Raspbian Busterの元であるDebian Busterにもある。先のホスト名のような落とし穴もないので、こちらで実行する。

```console:コマンド入力
# timedatectl
               Local time: 木 2020-07-09 04:09:44 BST
           Universal time: 木 2020-07-09 03:09:44 UTC
                 RTC time: n/a
                Time zone: Europe/London (BST, +0100)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
```
デフォルトだと協定世界時（UTC）……かと思いきや、Local timeは英国夏時間（BST）。夏時間採用してんのか。
まあ良い。日本人には関係ないので、日本標準時（JST）に変えてしまおう。

```console:コマンド入力
# timedatectl set-timezone Asia/Tokyo
# timedatectl
               Local time: 木 2020-07-09 12:17:34 JST
           Universal time: 木 2020-07-09 03:17:34 UTC
                 RTC time: n/a
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
# date
2020年  7月  9日 木曜日 12:18:26 JST
```
人を信じられないタイプなので`date`コマンドでも確認。ちゃんとJSTになっているようだ。
時刻同期の設定を確認すると、上記結果の中で、「NTP service」の項目がactiveになっているため、同期が実行されていることが分かる。どこに同期されているかの設定は`/etc/systemd/timesyncd.conf`のファイルに書いてある。

```console:コマンド入力
# cat /etc/systemd/timesyncd.conf
～省略～
 [Time]
 #NTP=
 #FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org
 #RootDistanceMaxSec=5
 #PollIntervalMinSec=32
 #PollIntervalMaxSec=2048
```
今はいずれも`#`でコメントアウトされているが、NTPがメインの同期先で、FallbackNTPが予備の同期先である。日本のNTPサーバに同期した方が良いので、設定を入れよう。
FallbackNTPは、スペースを挟むことで複数入れることができる。

```console:コマンド入力
# vi /etc/systemd/timesyncd.conf
～省略～
 [Time]
NTP=ntp.jst.mfeed.ad.jp
FallbackNTP=ntp.nict.jp ntp1.jst.mfeed.ad.jp ntp2.jst.mfeed.ad.jp ntp3.jst.mfeed.ad.jp
```
[Time]の次に上記２行を追加する。元の設定はどうせコメントアウトされているので、特に消さずともOK。
どんだけmfeed好きなんだよっていう。まあNICTより好きなのでしょうがないです。
NICT好きな人はNTPの行をNICTにして、FallbackNTPを別のNTPサーバにしてね。

設定を変更したら、同期しているサービスを再起動。デフォルトだとntpdは入ってなくて、systemdの中のtimesyncdというサービスが同期をしている。

```console:コマンド入力
# systemctl restart systemd-timesyncd
```
特にエラーも何もなく再起動できれば良し。

### 3. swap無効化
WEBサーバを動かす上ではメモリ不足への緊急対応のためにSWAPがあった方がいいのだが、記憶装置がSDカードであるRaspberry PiでSWAPをされると、SDカードへの負担が半端ない。安定稼働のためには、むしろSWAPしない方が良かろう。
とりま、現在のSWAP領域を確認する。

```console:コマンド入力
# free -h
              total        used        free      shared  buff/cache   available
Mem:          432Mi        34Mi       330Mi       8.0Mi        67Mi       340Mi
Swap:          99Mi          0B        99Mi
```
100MBくらいあるな。usedが0なので、SWAPは全く行われていない（何もしてなから当たり前だが）。
続けてswapサービスの稼働状態を確認。

```console:コマンド入力
# systemctl list-unit-files -t service | grep "swap"
dphys-swapfile.service                 enabled
# systemctl status dphys-swapfile
● dphys-swapfile.service - dphys-swapfile - set up, mount/unmount, and delete a swap file
   Loaded: loaded (/lib/systemd/system/dphys-swapfile.service; enabled; vendor preset: enabled)
   Active: active (exited) since ~~
省略
```
サービスの状態が`enabled`なので、自動起動する設定になっている。また、`systemctl status`で見るとActive: の行に **<font color="Lime">active (exited)</font>** と出てくるので、現在もサービス稼働中である。
上記のように、サービス名が分からない時は`list-unit-files -t service`から`grep`でそれっぽいものを探す。目的のサービス名（今回は`dphys-swapfile`）が分かっているなら、`systemctl is-enabled dphys-swapfile`でも自動起動の状態を確認できる。

というわけでswapを落とす。

```console:コマンド入力
# swapoff --all
# systemctl stop dphys-swapfile
# systemctl disable dphys-swapfile
# rm /var/swap
```
`swapoff`でswapの無効化、`systemctl`でサービス停止と自動起動の無効化をする。最後にswapファイルを削除。
無効化されているかを確認する。

```console:コマンド入力
# free
              total        used        free      shared  buff/cache   available
Mem:         442788       37376      332840        8728       72572      347136
Swap:             0           0           0
# systemctl status dphys-swapfile
● dphys-swapfile.service - dphys-swapfile - set up, mount/unmount, and delete a swap file
   Loaded: loaded (/lib/systemd/system/dphys-swapfile.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
省略
```
ちゃんと無効化されている。
ちなみに、メモリ不足に陥ってswapを使いたくなった場合には、再度サービスを有効化すればよい。`systemctl start dphys-swapfile`でサービスが有効化され、swapも稼働し始める。一時的ではなく長期的にswapを使うなら、加えて`systemctl enable dphys-swapfile`でサービスを自動起動するように設定しよう。

### 4. vim入れ替え
今更だが、vimが使いにくい。もっと使いやすいやつにしたい。
とりあえず今入っているvimを確認してみる。

```console:コマンド入力
# apt list --installed vim*
一覧表示... 完了
vim-common/stable,now 2:8.1.0875-5 all [インストール済み]
vim-tiny/stable,now 2:8.1.0875-5 armhf [インストール済み]
```
`vim-tiny`……だと……？
デフォだとだいたいこれなんだけれど、それ機能的に一番しょぼいやつ。
これではご満足いただけないので、もうちょい良い物を入れ直しましょう。
まずは何が入れられるかを確認。

```console:コマンド入力
# apt list vim*
一覧表示... 完了
vim-addon-manager/stable 0.5.10 all
vim-addon-mw-utils/stable 0.2-1 all
vim-airline-themes/stable 0+git.20180730-6e798f9-1 all
vim-airline/stable 0.10-1 all
vim-asciidoc/stable 8.6.10-3 all
vim-athena/stable 2:8.1.0875-5 armhf
省略
```
結構出てくる。中には明らかに拡張パック（addon）的なものもあるので、選択肢としては

- vim-athena
- vim-gtk
- vim-gtk3
- vim-nox
- vim-tiny
- vim

あたり?
それぞれの違いについては「vim 種類」とか該当のパッケージ名とかでググっておくれ。
`vim-gnome`がないのは、初期のインストールでGUIを入れなかったからかな。
ここでは`vim*`で探索しているのでリストに出てこないが、漢字入力可能な`jvim-canna`ってのも別途あったりする。
クリップボードを使いたいので今回は`vim-athena`を入れましょうかね。GUIがついてきて重いのが難ですが。

まずは`vim.tiny`を削除。`--purge`オプションをつけると、設定ファイルも全部削除してくれるのでゴミが残りにくいぞ！

```console:コマンド入力
# apt remove --purge vim-common vim-tiny
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージは「削除」されます:
  vim-common* vim-tiny*
続行しますか? [Y/n] y
～省略～
vim-tiny (2:8.1.0875-5) の設定ファイルを削除しています ...
vim-common (2:8.1.0875-5) の設定ファイルを削除しています ...
```
続いて`vim-athena`をインストール。

```console:コマンド入力
# apt install vim-athena
以下の追加パッケージがインストールされます:
  fonts-lato javascript-common libice6 libjs-jquery liblua5.2-0 libruby2.5 libsm6 libtcl8.6 libxaw7 libxmu6 libxpm4 libxt6
  libyaml-0-2 rake ruby ruby-did-you-mean ruby-minitest ruby-net-telnet ruby-power-assert ruby-test-unit ruby-xmlrpc ruby2.5
  rubygems-integration vim-common vim-gui-common vim-runtime x11-common zip
続行しますか? [Y/n] y
～省略～
```
68.2MBとか言われて「デカッ！」とかなるけど、インストールは完了。
設定を変更したい場合は、各ユーザの`~/.vimrc`を編集すればよろし。
`set clipboard=unnamedplus`を`~/.vimrc`に入れると、クリップボードが使えるようになるはず。

### 5. ファイアウォール（FW）
前回はほとんどルータ任せにして投げたセキュリティ設定ですが、FWを設定しておくと安心感がある。
ただし、ルータのセキュリティ等々と二重管理になると、通過させたいパケットが通らない時に何が原因か探るのが難しくなるので、特に理由が無ければ一元管理を推奨。

以前はFWと言えば`iptables`を`ufw`で管理する形だったけれど、最近のOSはFirewalldが導入され、こちらでの設定が増えてきていると思う。
Firewalldの使い方についてはこちらの記事が大変詳しいので、お借りします。
　[CentOS 7 firewalld よく使うコマンド](https://qiita.com/kenjjiijjii/items/1057af2dddc34022b09e)
CentOS7の記事だけど、FirewalldのコマンドについてはDebian系も同じなので、そのまま読んで問題ナシ！
あとはこちらも大変勉強になります。
　[How To Install and Configure Firewalld on Debian 10 (Buster)](https://computingforgeeks.com/how-to-install-and-configure-firewalld-on-debian/)

Debian BusterはデフォルトだとFWのパッケージがないので、インストールからスタート。

```console:コマンド入力
# apt install firewalld
```
ちゃんとインストールできたか確認。

```console:コマンド入力
# systemctl status firewalld
```


## おまけの導入物
別に入れる必要があるわけでは全くないのだが、個人的に入れたい。
### 1. screenfetch
ログインした時に、カラフルなロゴを見たい！　と思うアナタ、「screenfetch」を入れましょう。

```console:コマンド入力
# wget --no-check-certificate -O /usr/local/bin/screenfetch https://raw.githubusercontent.com/KittyKatt/screenFetch/master/screenfetch-dev
# chmod 755 /usr/local/bin/screenfetch
```
これで「screenfetch」の導入が完了。
あとは、`/etc/update-motd.d`ディレクトリの中に`/usr/local/bin/screenfetch`を実行させるスクリプトを書いて、属性を755に変更すれば、ログインする時に画面に表示されるようになるぞ！

```bash:/usr/local/bin/screenfetch/00-screenfetch
#!/bin/bash
echo -e "/usr/local/bin/screenfetch

"> /etc/motd
```
最低限のスクリプト。もっと色々表示させたい人はここに追記していこう。
こちらが大変参考になりますよ。
　[「motd」「.bashrc」…LinuxにSSH接続した時のメッセージを動的に変化させる方法](https://orebibou.com/ja/home/201407/20140710_001/)
　[ysaotome/update_motd_by_screenfetch.sh](https://gist.github.com/ysaotome/5997652)