🏺

ミニPCでマルチサーバー構築 [OS等インストール]

2024/05/16に公開


ミニPCでマルチサーバー構築シリーズのOS Lubuntu 24.04 LTSインストールとSSH,Docker,Tailscaleインストールの記録メモです。

シリーズ

  1. N100搭載ミニPCでマルチサーバーの構想と構築準備
  2. ミニPCでマルチサーバー構築 [OS等インストール] この記事
  3. ミニPCでマルチサーバー構築 [Sambaコンテナ]
  4. ミニPCでマルチサーバー構築 [PostgreSQLコンテナ]
  5. ミニPCでマルチサーバー構築 [Nginxコンテナ]
  6. ミニPCでマルチサーバー構築 [Immichコンテナ]
  7. ミニPCでマルチサーバー構築 [VaultwardenコンテナとTailscale]
  8. ミニPCでマルチサーバー構築 [AdGuard Homeコンテナ]
  9. ミニPCでマルチサーバー構築 [GUI環境整備]

事前準備

Lubuntu既知の不具合と対応

こちらのKnown Bugs参照。私に関係のあった不具合はInstallerの以下2つ。

  • Calamares automatically creates swapfile with manual partitioning without any warning
    • OSインストール後に代わりにスワップ領域を割り当て、swapfileをマニュアルで削除
  • Calamares fails to install on logical volume on several conditions when using Manual Partitioning
    • 事前にSSDのパーティションを別の方法で作成し、インストール時は割り当てのみ操作

ハードウェア換装

  • SSDの換装
    • 元々のSSDをラズパイで使用していた以下SSDに入れ替え
      • Western Digital 2TB SSD (WDS200T1R0B-EC)
  • Wifi&BT用無線基板無効化
    • SSDを外すと無線基板も取り外せるので省電力化のため取り外す
    • ただしアンテナ線のようなものが簡単に取り外せないため抜くだけ
      • 2本の線が簡単に分解できないところに繋がっている
    • 固定しているネジがプラ板?でシールドされているため一部をカット
    • 取り外した基板がSSDと接触しないよう底面蓋に絶縁テープ等で固定
      • 今後絶対に使用しないならアンテナ線カットが最善
  • 上面吸気ファンのホコリ対策
    • ファン付近は簡単に分解できないため予防
    • 換気口用の粘着フィルタを外側に装着
    • 粘着力は弱めのため、べたつかない気がする

ディスクパーティション

切り分け

どこにどの程度容量が使用されるか大筋を把握するため、パーティションをある程度用途別に切り分けた。容量に偏りが出て容量変更が必要になることが予想されるため論理ボリュームを採用した。

  • Partition Table

    • GPTにしたかったが、結果的にMBRになってしまった
  • Physical Volumes

    • Lubuntuインストール時ESPに300MiB割り当てていないと警告がある
    領域 容量 フォーマット マウント フラグ メモ
    ESP 300MiB fat32 /boot/efi/ boot EFI System Partition
    SWAP 4GiB linuxswap - swap -
    LVPP (max) lvm2 - lvm Logical Volume Physical Partition
  • Logical Volumes

    • Logical Groupは1つだけ
      • extent sizeを100MiBにしたかったが結果的にできなかった
    容量 フォーマット マウント メモ
    30GiB ext4 / システム全体
    5GiB ext4 /var/log ログ用
    50GiB ext4 /var/lib/docker docker肥大化抑制
    20GiB ext4 /srv/pgsql DB
    (max) ext4 /mnt/ssd1 ファイル共有用

作成

  • 以下理由によりdebian-installerで作成
    • 既知の不具合によりCalamaresで作成できない
      • 実際できなかった (突然インストールプロセスが終了する)
    • SSDを外付け化できるケースが余っていない
    • GParted Live on USBの選択画面から先がエラーになった
    • Ubuntuインストールプロセスは試していない
  • debian-installerだと4TB未満は強制でMBRになるぽい
    • 選択項目無しで後から確認した ESP作ったのにパァ
  • LVGのextent sizeは4MiB固定になるぽい
  • 既に何度もやり直していたため妥協でそのままに

OSインストール

Lubuntuインストール

  1. LubuntuのisoイメージをDL
  2. rufusで起動USBメモリ作成
  3. 最小インストールを選択
  4. 上記で作成したパーティションを割り当てる
    • CalamaresはGPT前提で確認される模様
    • MBRなのにESP容量の警告が出た
    • 私と同じ作成方法をとる場合、ESPは301MiBにした方が良いかも?
      • 300MiBで作ったのにCalamaresは299MiBと認識して警告した
      • そもそもMBRなので問題ないはずだがESP無いとどうなるかは不明

ネットワーク設定変更

IPv4アドレスを固定する。

cat << EOF | sudo tee /etc/netplan/99-manual-conf.yaml > /dev/null
network:
  version: 2
  ethernets:
    enp1s0:
      dhcp4: false
      addresses: [192.168.0.0/24]
      routes:
        - to: default  # default gateway
          via: 192.168.0.0
      nameservers:
        addresses: [1.1.1.1, 1.0.0.1]
        search: []
EOF
sudo chmod 600 /etc/netplan/99-manual-conf.yaml

スワップ設定変更

既知の不具合により強制的に作成されたswapfileを削除し、スワップ領域を割り当てる。

sudo cp -p /etc/fstab /etc/fstab.bk
# disable mount of swapfile
sudo sed -i '/\/swapfile/ s:/swapfile:#/swapfile:' /etc/fstab
# enable assign swap partition
echo 'UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX none swap sw 0 0' | sudo tee -a /etc/fstab > /dev/null
# decrease swap frequency
echo 'vm.swappiness = 10' | sudo tee -a /etc/sysctl.conf > /dev/null
sudo systemctl reboot
# remove swapfile
sudo rm /swapfile

スリープ休止無効化

基本的にサーバーとして使用するためスリープ,休止を無効化する。

sudo cp -p /etc/systemd/sleep.conf /etc/systemd/sleep.conf.bk
# disable sleep
sudo sed -i '/#AllowSuspend=/ {s/^\(.\)//;s/yes/no/}' /etc/systemd/sleep.conf
# disable hibernation
sudo sed -i '/#AllowHibernation/ {s/^\(.\)//;s/yes/no/}' /etc/systemd/sleep.conf

ブートオプション無効化

再起動はできるだけ早い方が嬉しいので、起動時に表示されるブートオプションを非表示にする

echo 'set timeout=0' | sudo tee -a /etc/grub.d/40_custom > /dev/null
sudo update-grub

ファイアウォール設定

Dockerの外部ポート開示設定は直接iptablesが変更されるので本来不要だが、わかりやすさのためにそれらを含めて設定する。ここに書いたが私は全ての機能を実現させた後に設定した。

sudo cp -p /etc/default/ufw /etc/default/ufw.bk
sudo sed -i 's/IPV6=yes/IPV6=no/' /etc/default/ufw
sudo ufw default deny incoming
sudo ufw allow from 192.168.0.0 to any port 22
# ...some allow settings...
sudo ufw limit ssh
sudo ufw limit ssh comment 'Limitation of continuous access for ssh server'
# change logging frequency
sudo ufw logging medium
sudo systemctl enable ufw
sudo ufw enable

基本ソフトインストール

アカウント取得

Tailscaleのアカウントがない場合は取得する。

レポジトリ追加

Ubuntu 24.04 LTSからdeb822形式が採用されたので、deb822形式に変換してレポジトリを追加する。現時点でTailscale公式に24.04のインストール方法が書いていないが、Ubuntuコードネーム部分をnobleに置き換えれば24.04でも動作した。

# Add docker repository
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod 644 /etc/apt/keyrings/docker.asc
cat << EOF | sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: noble
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
Architectures: amd64
EOF

# Add tailscale repository
sudo curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/noble.noarmor.gpg -o /usr/share/keyrings/tailscale-archive-keyring.gpg
sudo chmod 644 /usr/share/keyrings/tailscale-archive-keyring.gpg
cat << EOF | sudo tee /etc/apt/sources.list.d/tailscale.sources > /dev/null
Types: deb
URIs: https://pkgs.tailscale.com/stable/ubuntu
Suites: noble
Components: main
Signed-By: /usr/share/keyrings/tailscale-archive-keyring.gpg
Architectures: amd64
EOF

インストール

OpenSSH,Docker,Tailscaleをインストールする。

sudo apt update
sudo apt install -y \
  openssh-server \
  docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin \
  tailscale

SSH鍵登録

パスワード認証を無効にする前に鍵を登録する。

  • Linux
    ssh-keygen -t ed25519 -f ~/.ssh/your_key_name
    ssh-copy-id -i /path/of/pubkey user_name@192.168.0.0
    
  • Windows
    ssh-keygen -t ed25519 -f ${env:USERPROFILE}/.ssh/your_key_name
    

OpenSSH設定

SSHの各種設定を変更する。

sudo cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config.bk
# enable pubkey authentication
sudo sed -i '/#PubkeyAuthentication/ s/^\(.\)//' /etc/ssh/sshd_config
# disable root login
sudo sed -i '/#PermitRootLogin/ {s/^\(.\)//;s/prohibit-password/no/}' /etc/ssh/sshd_config
# disable password login
sudo sed -i '/#PasswordAuthentication/ {s/^\(.\)//;s/yes/no/}' /etc/ssh/sshd_config
# optional
sudo sed -i '/#AuthorizedKeysFile/ {s/^\(.\)//;s: .ssh/authorized_keys2::}' /etc/ssh/sshd_config
# to connect fast, disable GSS API auth and Use DNS
sudo sed -i '/#GSSAPIAuthentication/ s/^\(.\)//' /etc/ssh/sshd_config
sudo sed -i '/#UseDNS/ s/^\(.\)//' /etc/ssh/sshd_config
sudo systemctl enable ssh

Tailscale認証

以下コマンドで認証と接続を実施する。

sudo tailscale up

参考文献

Discussion