CentOS8からUbuntu20.04に移行した話 (初期設定や録画環境構築)

[前記事](https://qiita.com/yukarimazedofu/items/dc77db912bdc82a41425)に書いたように、CentOS8 が**晴れてEOLを迎えるため**GWの~~有り余るヒマ時間~~貴重な休日を割いてUbuntuに移行した。~~二度とRHEL系は使わないからな！！バーカ！！~~
将来再度環境構築する際の自分用の備忘録として記載していく。

## お品書き

- Ubuntuのインストールから初期設定まで
- 録画環境の構築（人様の記事を見ながら） 

## Ubuntuのインストール

- 特に言及することはなく、Ubuntu20.04のisoをRufusでUSBに焼きこみ、インストール。
- sdaにOS用のSSD、 sdb, sdcにデータ用のRaid1HDDをつないでいたので、sdaにインストールするよう設定。
- 参考: https://www.yokoweb.net/2020/05/04/ubuntu-20_04-lts-server-install/

## Ubuntuのインストール後作業

### サーバーの完全なシャットダウン・再起動

- Ubuntuの再インストール後、 **「完全に」** シャットダウンする。
- `sudo shutdown`の後電源コードを物理的に抜き、5分放置、再度電源をつなげて起動。
- この作業を行わなかったがためにチューナーがエラーを吐き、1日費やした。

### IPアドレスの固定・DNS設定

- ネットワーク内の別PCから操作するため。
- IP固定は個人的にはルータ側でMACで指定するのが好み。

  ```/etc/netplan/99_config.yaml
  network:
    version: 2
    renderer: networkd
    ethernets:
      eth0:
        dhcp4: false
        dhcp6: false
        addresses: [192.168.xxx.yyy/24]
        gateway4: 192.168.xxx.1
        nameservers:
          addresses: [192.168.xxx.1, 8.8.8.8, 8.8.4.4]
  ```
  ```bash
  sudo netplan apply
  ```
- 参考： https://qiita.com/zen3/items/757f96cbe522a9ad397d

### sshdの設定変更

- セキュリティ向上のため
- 直接sshd_configを設定するのではなく、`/etc/ssh/sshd_config.d/*.conf`を作成。

  ```/etc/ssh/sshd_config.d/my_config.conf
  # 接続ポートの変更
  Port XXXXX 

  # ルートログインの禁止
  PermitRootLogin no

  # 公開鍵認証の有効化
  # パーミッションを .sshは600, authorized_keysは700に設定
  PubkeyAuthentication yes
  AuthorizedKeysFile .ssh/authorized_keys

  # パスワード認証の制限(オプション)
  # PasswordAuthentication no

  # sshバージョンの制限
  Protocol 2
  ```

  ```bash
  sudo service ssh reload
  ```
- クライアント側では固めの鍵を作成しましょう。
  - `ssh-keygen -t ecdsa -b 384 -f [鍵名]` 
- 参考：
  - https://linuxliteracy.com/new-way-to-manage-ssh-options-in-ubuntu-20-04/
  - https://qiita.com/masa0x80/items/ecb692ad93f7d06a07b0
  - https://qiita.com/wnoguchi/items/a72a042bb8159c35d056

### firewall無効化

- より上位のルータで正しく制限されていることを確認の上実施。基本的には非推奨。
- `sudo ufw disable`
- 参考： https://qiita.com/auto_masanori/items/3b4f60eb65d7db8ac48c

### AppArmor無効化

- セキュリティの観点から無効化は非推奨。
- `sudo systemctl disable apparmor`
- 参考： https://goto-linux.com/ja/2019/7/11/ubuntu-20.04-focal-fossa-linux%E3%81%A6apparmor%E3%82%92%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/

### rootのパスワード変更

- Ubuntu初期インストールにおいてrootの初期パスはなし。
- `sudo passwd root`

### パッケージマネージャの更新

- `sudo apt update`
- `sudo apt upgrade`

### PostfixからGmail経由でメールを送信する

- 各種モニタリングの通知用。ウイルスチェック、RAID監視、SMART監視・・・
- 参考： http://www.ckenko25.jp/2019/05/gmail-%E7%B5%8C%E7%94%B1%E3%81%A7%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB-postfix-%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B-for-ubuntu

### ClamAVのインストール

- セキュリティのため。毎日深夜に実行するよう設定

  ```bash
  # インストール
  sudo apt install clamav clamav-daemon

  # ログ関係でエラーが出るので以下を設定
  sudo rm /var/log/clamav/freshclam.log
  sudo touch /var/log/clamav/freshclam.log
  sudo chown clamav:clamav /var/log/clamav/freshclam.log

  # 設定ファイルの書き換え
  #   old: create 640 clamav adm
  #   new: create 640 clamav clamav
  sudo vi /etc/logrotate.d/clamav-freshclam

  # 定義更新
  sudo freshclam

  # サービス起動の確認
  sudo service clamav-freshclam status

  # 定期スキャンスクリプトの作成
  sudo vi /root/script/clam-full.sh
  sudo chmod +x /root/script/clam-full.sh
  sudo mkdir /root/virus

  # 定期スキャン設定
  sudo crontab -e
  # 0 2 * * * /root/script/clam-full.sh >> /var/log/clamav/clamav_scan.log
  ```
  ```/root/script/clam-full.sh
  #!/bin/sh
  echo =========================================
  date
  hostname
  clamscan / \
      --infected \
      --recursive \
      --log=/var/log/clamav/clamscan.log \
      --move=/root/virus \
      --exclude-dir=^/boot \
      --exclude-dir=^/sys \
      --exclude-dir=^/proc \
      --exclude-dir=^/dev \
      --exclude-dir=^/var/log/clamav/virus

  if [ $? = 0 ]; then
    echo "Virus not found."
  else
    echo "Virus found."
    cat /var/log/clamav/clamscan.log | mail -s "Server: Virus found" [RecievedErrorMail]@test.com
  fi
  ```
- 参考: https://www.yokoweb.net/2017/04/15/ubuntu-server-clamav/

### Timezoneの設定

- `sudo timedatectl set-timezone Asia/Tokyo`
- 参考: https://www.server-world.info/query?os=Ubuntu_20.04&p=timezone

### ntpを日本のものに変更

- これをやらないと録画冒頭が10sec程切れて泣きを見る。

  ```/etc/systemd/timesyncd.conf
  [Time]
  NTP=ntp.nict.jp
  FallbackNTP=ntp1.jst.mfeed.ad.jp ntp2.jst.mfeed.ad.jp ntp3.jst.mfeed.ad.jp
  ```
  ```bash
  systemctl restart systemd-timesyncd
  ```
- 参考: https://qiita.com/tukiyo3/items/c847d443a6d977083de9

### PowerTopで省電力化

- 常に起動するサーバーなので省電力化する。

  ```bash
  sudo apt install powertop tlp tlp-rdw
  sudo powertop --auto-tune
  sudo systemctl enable tlp
  sudo systemctl start tlp
  ```
- 参考: https://mumeiyamibito.0am.jp/linux_mint/%E9%AB%98%E5%BA%A6%E3%81%AA%E9%9B%BB%E6%BA%90%E7%AE%A1%E7%90%86

### ファン制御

- サーバーを寝室に設置しているのでファンを制御し静穏化する。

  ```bash
  sudo apt install lm-sensors fancontrol
  sudo sensors-detect

  sudo service fancontrol stop
  sudo pwmconfig
  ```
- 参考： https://kledgeb.blogspot.com/2013/01/ubuntu-pwm-1.html

### mdadmで作成したRaid1ストレージの移行

- [おま環]一度解除し、再度作成してresyncする必要があった??

  ```
  # 一度解除し、再度raid1で設定
  # 通常の環境ならこの作業は必要ないように思う。
  # どうも前環境の時点でデグレ運用していた模様。気づいていなかった…
  mdadm --misc --stop /dev/md0
  mdadm --create /dev/md0 --level=raid1 --raid-devices=2 /dev/sdb1 /dev/sdc1

  # 設定の保存とresyncしているかの確認
  mdadm --detail --scan > /etc/mdadm.conf
  cat /proc/mdstat
  ```
  
- fstabに設定して起動時マウント可能にする
  - `sudo blkid`でuuidを確認

  ```/etc/fstab
  # /etc/fstab
  UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /share auto defaults  0 0
  ```
  - 参考: https://qiita.com/wnoguchi/items/b31e268b6b7236cdf8db

- 異常発生時にメール通知する

  ```/etc/mdadm/mdadm.conf
  ARRAY /dev/md0 metadata= ....
  # メール通知先を設定
  MAILADDR [RecievedErrorMail]@test.com
  ```
- メールのテスト送信
  - `mdadm --monitor --test --oneshot --scan`

### docker, docker-compose インストール

- docker
  - https://docs.docker.com/engine/install/ubuntu/
  - https://qiita.com/tkyonezu/items/0f6da57eb2d823d2611d
- docker-compose
  - https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-compose-on-ubuntu-20-04-ja

### sambaでネットワークファイル共有(Docker, Docker-compose利用)

- dockerで環境を汚さず共有。録画ファイル等を別PCで見るために利用。

  ```docker-compose.yml
  version: '2'

  services:
    samba:
      image: dperson/samba
      container_name: samba
      ports:
        - "139:139"
        - "445:445"
      volumes:
        - /path/to/share:/mnt/pub
      restart: unless-stopped
      command:
        "-s share;/mnt/pub;yes;no;no;samba;samba -u samba;<PASSWORD>"
  ```
  ```Configurations
    # ---Commandの説明---
    # 設定詳細は https://hub.docker.com/r/dperson/samba を確認
    # Windowsからの接続なのでパーミッションで悩まないAdminにする。
    # 共有用のディレクトリを用意し、Ubuntu上のシステムファイル等を共有しない。
    -s "<name;/path>[;browse;readonly;guest;users;admins;writelist;comment]"
    -u "<username;password>[;ID;group;GID]"
  ```
- 参考
   - https://hub.docker.com/r/dperson/samba

### 録画環境構築

[前記事](https://qiita.com/yukarimazedofu/items/dc77db912bdc82a41425)を記載した時点ではサーバーに直でインストールする方法の記事が多かったが、ここ1年でdockerで作成する方法が増えている。そもそもの本家MirakurunもDocker化しており、少し知識があれば誰でも手間なく録画サーバーを作成できるようになった。また、EPGStationもバージョンが上がりかなり使いやすくなっている。特に検索回りは楽になった。素晴らしい。
参考記事で丁寧に紹介されているため、参考記事を選定理由と共に述べるにとどめる。

- こちらで紹介されている方法を使用した。
  - [【完全解説】LinuxとPX-W3U4でEPGStation v2を構築する方法（PX-Q3U4／W3PE4／Q3PE4）](https://komone-life.com/2021/03/07/how-to-install-epgstation-docker-bcas-3/)

  - この方法で動作することを確認。正常に動作している。
- 選定理由
  - px4_drvでmirakurun 3.5を利用可能。 
  - Dockerfileがあり最悪自分での修正が容易、ただしコンテナ作成に結構な時間がかかる。
  - 過去自分が利用していた方法に近い。
- その他の方法
  - tv-recorder | https://github.com/collelog/tv-recorder
  - **たぶんこれが一番楽だと思います。**
  - mirakurun 3.5を試してみたかったので選定から外した。
      - 今回参考にした方法と組み合わせることで少量の改変でtv-recorderでも利用可能になりそう。
  - mirakcやハードウェアエンコが使えそうな雰囲気がある。
      - ラズパイ利用者やハードウェアエンコできる環境ならこちらの方がよい。
      - 自分の場合、厳選したものを録画しCMカットして別のつよつよPCでソフトエンコしてるのでハードエンコの恩恵が薄い。
      - 市販のTVレコーダーのようにとりあえず予約して見たら消すような使い方の人には重宝しそう。

### あとがき

1年ちょっとでこれだけ快適に進化してるというのは驚いた。常に勉強することが一番の省力化なのだなと痛感するところです。
~~あと、[スーパーカブ](https://supercub-anime.com/)の空気感が良い。みんなも録画しよう。~~