自宅サーバー更改
自宅サーバーをZen2環境からRaptor Lake-S Refresh環境に移行したので再インストールの手順メモ
スペック
- OS: Arch Linux
- CPU: Intel Core i3 14100
- マザーボード: MSI PRO B760M-A DDR4 II
- メモリ: crucial PC4-25600 CL22 8GBx2(現サーバーから流用)
- システムストレージ: KIOXIA EXCERIA 1TB(メインPCで使っていたものを流用)
- データストレージ: WD Red 3TB(現サーバーから流用)
- 外付けNIC: 玄人志向 GBE2.5-PCIE(現サーバーから流用)
NICは外付けがネットワーク用、オンボードが外部からのSSH接続用として使い分け
再インストール
Arch Wikiのインストールガイドを参考に設定を進める
基本設定
-
日本語キーボードレイアウトに設定
loadkeys jp106 -
システムクロック更新
timedatectl status
パーティション設定
間違ってデータストレージをフォーマットしないように最初は外した状態で進めていく
-
システムストレージのパーティション
下記内容でパーティションを分ける
領域名 デバイス名 サイズ EFI領域 /dev/nvme0n1p1 1024MiB スワップ領域 /dev/nvme0n1p2 4096MiB ルートディレクトリ /dev/nvme0n1p3 残りすべて # パーティション分け parted /dev/nvme0n1 --script \ mklabel gpt \ mkpart ESP fat32 1MiB 1025MiB \ set 1 esp on \ mkpart swap linux-swap 1025MiB 5121MiB \ mkpart root btrfs 5121MiB 100% # 確認(1:ESP/2:swap/3:rootがあればOK) parted /dev/nvme0n1 print -
システムストレージのフォーマット
# EFI領域のフォーマット mkfs.fat -F 32 -n EFI /dev/nvme0n1p1 # スワップ領域のフォーマット mkswap -L swap /dev/nvme0n1p2 # root領域はBtrfsでフォーマット mkfs.btrfs -L root /dev/nvme0n1p3 -
システムストレージのマウント
# root領域の一時マウント mkdir -p /mnt/btrfs mount /dev/nvme0n1p3 /mnt/btrfs # サブボリューム作成 btrfs subvolume create /mnt/btrfs/@ btrfs subvolume create /mnt/btrfs/@snapshots # 確認 btrfs subvolume list /mnt/btrfs # 一時マウントを解除 umount /mnt/btrfs # @ を /mnt にマウント mount -o subvol=@,noatime,compress=zstd /dev/nvme0n1p3 /mnt # @snapshots をマウント mkdir -p /mnt/.snapshots mount -o subvol=@snapshots,noatime,compress=zstd /dev/nvme0n1p3 /mnt/.snapshots # EFI領域のマウント mkdir -p /mnt/boot mount /dev/nvme0n1p1 /mnt/boot # スワップを有効化 swapon /dev/nvme0n1p2 -
データストレージを接続するため一旦シャットダウン
umount -R /mnt poweroff -
システムストレージ、データストレージのマウント
データストレージを接続後、電源投入
システムストレージのマウント状態はリセットされているのでこちらも再度設定する# @ を /mnt にマウント mount -o subvol=@,noatime,compress=zstd /dev/nvme0n1p3 /mnt # @snapshots をマウント mkdir -p /mnt/.snapshots mount -o subvol=@snapshots,noatime,compress=zstd /dev/nvme0n1p3 /mnt/.snapshots # EFI領域のマウント mkdir -p /mnt/boot mount /dev/nvme0n1p1 /mnt/boot # データストレージのHDDパーティションを /mnt/home にマウント mkdir -p /mnt/home mount /dev/sda1 /mnt/home # スワップを有効化 swapon /dev/nvme0n1p2
インストール
-
必須パッケージと必要そうなパッケージのインストール
pacstrap -K /mnt base linux linux-firmware intel-ucode btrfs-progs networkmanager grub efibootmgr openssh git neovim
システム設定
-
fstabの生成
genfstab -U /mnt >> /mnt/etc/fstab -
chroot
arch-chroot /mnt -
タイムゾーン設定
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime hwclock --systohc -
ロケール設定
sed -i '/^# *en_US.UTF-8 UTF-8/s/^# *//g' /etc/locale.gen sed -i '/^# *ja_JP.UTF-8 UTF-8/s/^# *//g' /etc/locale.gen locale-gen printf 'LANG=en_US.UTF-8\n' > /etc/locale.conf printf 'KEYMAP=jp106\n' > /etc/vconsole.conf -
ネットワーク設定
# ホスト名設定 hostnamectl set-hostname ホスト名 # NewworkManagerサービスの有効化 systemctl enable NetworkManager -
Initramfs
mkinitcpio -P -
Rootパスワード設定
passwd -
ブートローダー
GRUBを使う
# GRUB のインストール grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB --removable # 設定ファイル(grub.cfg)の自動生成 grub-mkconfig -o /boot/grub/grub.cfg -
インストール完了
-
chroot 環境を抜ける
exit -
マウントしていたパーティションをすべて解除する
umount -R /mnt -
インストールディスクを抜いてシャットダウン
poweroff
-
各種サービス有効化
電源再投入後、設定したパスワードでrootにログイン
-
ネットワーク有効化
-
enp4s0設定enp4s0(外付け)を通常通信用として使用するように設定-
コネクション設定作成
nmcli connection add \ type ethernet \ ifname enp4s0 \ con-name main \ ipv4.method auto \ ipv4.route-metric 100 \ ipv6.method auto \ ipv6.route-metric 100 -
NICとゾーンの紐づけ
nmcli connection modify main connection.zone home
-
-
enp3s0設定enp3s0(オンボード)はリモートからのSSH接続用として使用するように設定
なお、前提条件は下記の通り- ルーター側で
enp3s0のMACアドレスに固定IPアドレスが割り当てられている状態 - 割り当てられているIPアドレスのサブネットは外部接続用(
192.168.101.0/24)
-
DHCPとルーティングテーブルの設定
nmcli connection add \ type ethernet \ ifname enp3s0 \ con-name management \ ipv4.method auto \ ipv4.route-table 101 \ ipv6.method link-local -
DHCPから自動取得するDNSサーバ情報を無効化
enp3s0のDHCPからDNS情報を受け取る必要は基本的にないと思うので無視するようにするnmcli connection modify management \ ipv4.ignore-auto-dns yes -
Source policy routing
外部接続用サブネットを送信元とする通信はtable 101を使わせる
nmcli connection modify management \ ipv4.routing-rules \ "priority 100 from 192.168.101.0/24 table 101" -
外部接続用サブネットをmain tableにも追加
ipv4.route-table=101にするとDHCP由来のconnected routeもtable 101へ入るため、main tableにも明示的に追加nmcli connection modify management \ +ipv4.routes \ "192.168.101.0/24 0.0.0.0 1002 table=254" -
NICとゾーンの紐づけ
nmcli connection modify management connection.zone public
- ルーター側で
-
接続を有効化
nmcli connection up main nmcli connection up management
-
-
パッケージインストール
共通で使うパッケージを入れておく
pacman -S base-devel ethtool curl logrotate bash-completion less man-db man-pages usbutils -
firewalld
-
インストールと有効化
pacman -S firewalld systemctl enable --now firewalld -
設定されているか確認
NetworkManager側でNICとゾーンの紐づけはされているはずなので確認
firewall-cmd --get-active-zones firewall-cmd --list-all --zone=public firewall-cmd --list-all --zone=home
-
-
ログインユーザー作成
既存
/homeに合わせてユーザーを再作成する-
ユーザーが使うパッケージのインストール
pacman -S zsh ghostty-terminfo sheldon starship zoxide bat eza ripgrep skim zellij github-cli mise -
前の環境で使用していたGID/UIDが空いていることを確認
今回作るユーザーはGID/UIDが共に1000なのでこんな感じ
getent passwd 1000 getent group 1000新規環境なので通常は何も表示されないはず
-
ユーザー作成
確認したGID/UIDを使ってユーザーを作成
groupadd -g 1000 ユーザー名 useradd -u 1000 -g 1000 -d /home/ユーザー名 -s /usr/bin/zsh -M ユーザー名 passwd ユーザー名 -
sudoを使えるようにする
usermod -aG wheel ユーザー名 EDITOR=vi visudovisudoで%wheel ALL=(ALL:ALL) ALLを有効化する
-
-
OpenSSH
-
デフォルト設定をオーバライドする
mkdir -p /etc/ssh/sshd_config.d cat > /etc/ssh/sshd_config.d/10-local.conf <<'EOF' PermitRootLogin no PasswordAuthentication no AllowTcpForwarding no AllowAgentForwarding no X11Forwarding no PermitTunnel no EOF -
設定を検証して問題なければ有効化する
sshd -t systemctl enable --now sshd.service
-
-
Samba
-
インストール
SambaをWindowsから検出させたいのでwsddも入れる
pacman -S samba wsdd -
デフォルトの設定ファイルをダウンロード
Arch Linuxではパッケージを入れてもSambaの設定ファイルが生成されないのでダウンロード
curl "https://git.samba.org/samba.git/?p=samba.git;a=blob_plain;f=examples/smb.conf.default;hb=HEAD" -o /etc/samba/smb.conf -
設定ファイルの編集
/home/publicをパスワードなしでアクセスできるようにしたいので/etc/samba/smb.confを編集する47a48 > server min protocol = SMB2 51a53 > map to guest = Bad User 55c57 < log file = /usr/local/samba/var/log.%m --- > log file = /var/log/samba/%m.log 202,207c204,209 < ;[public] < ; path = /usr/somewhere/else/public < ; public = yes < ; only guest = yes < ; writable = yes < ; printable = no --- > [public] > path = /home/public > public = yes > guest only = yes > writable = yes > printable = no -
サービスの有効化と起動
sudo systemctl enable --now smb.service sudo systemctl enable --now wsdd.service -
firewalldの設定更新
homeゾーンでSambaとwsddの通信を許可
firewall-cmd --permanent --zone=home --add-service=wsdd --add-service=samba firewall-cmd --reload firewall-cmd --list-all --zone=home -
Sambaパスワード設定
WindowsやMacからユーザーのホームディレクトリへアクセスできるようにしたいのでSambaパスワードを設定
smbpasswd -a ユーザー名
-
-
Avahi
-
インストール
pacman -S avahi -
enp4s0のみ有効にするsed -i 's/#allow-interfaces=eth0/allow-interfaces=enp4s0/' /etc/avahi/avahi-daemon.conf -
Samba用設定ファイルを追加
SambaをmDNSでMacから検出できるようにしたいので下記設定を追加
cat > /etc/avahi/services/smb.service <<'EOF' <?xml version="1.0" standalone='no'?> <!DOCTYPE service-group SYSTEM "avahi-service.dtd"> <service-group> <name replace-wildcards="yes">%h</name> <service> <type>_smb._tcp</type> <port>445</port> </service> <service> <type>_device-info._tcp</type> <port>0</port> <txt-record>model=Xserve</txt-record> </service> </service-group> EOF -
サービスの有効化と起動
systemctl enable --now avahi-daemon.service
-
-
Podman
-
インストール
pacman -S podmanoci-runtimeとしてどれを使うか聞かれたらデフォルト値の
crunを設定
-
-
Minimserver
-
Podman Quadlet構成ファイル作成
cat > /etc/containers/systemd/minimserver.container <<'EOF' [Unit] Description=MinimServer Wants=syslog.service After=network.target remote-fs.target nss-lookup.target [Container] Image=docker.io/minimworld/minimserver:2.2 Network=host Environment=TZ=Asia/Tokyo Mount=type=bind,src=/home/public/Music,dst=/Music,readonly Mount=type=bind,src=/var/lib/minimserver,dst=/opt/minimserver/data [Service] Restart=always [Install] WantedBy=multi-user.target EOF -
一回起動させる
mkdir -p /var/lib/minimserver systemctl daemon-reload systemctl start minimserver.service -
enp4s0のサブネットを使いたいので設定して再起動subnet=$(ip -4 route show dev enp4s0 scope link | awk '{sub(/\/.*/, "", $1); print $1; exit}') podman exec systemd-minimserver /opt/minimserver/bin/mscript -c "prop ohnet.subnet=$subnet" systemctl restart minimserver.service -
firewalldのminimserver用のサービスを追加
cat > /etc/firewalld/services/minimserver.xml <<'EOF' <?xml version="1.0" encoding="utf-8"?> <service> <short>MinimServer</short> <description>MinimServer is a UPnP music server with a number of innovative features that make it easier to organize and explore your music collection.</description> <include service="ssdp"/> <port protocol="tcp" port="9790"/> <port protocol="tcp" port="9791"/> </service> EOF firewall-cmd --reload -
firewalldの設定更新
homeゾーンでminimserverの通信を許可
firewall-cmd --permanent --zone=home --add-service=minimserver firewall-cmd --reload firewall-cmd --list-all --zone=home
-
-
UPS/Time/Sensorsの有効化
-
インストール
pacman -S apcupsd chrony lm_sensors -
サービスの有効化と起動
systemctl enable --now apcupsd.service systemctl enable --now chronyd.service systemctl enable --now lm_sensors.service -
/etc/conf.d/lm_sensorsの生成sensors-detect
-
-
MyDNS
定期的にMyDNSのIPアドレス通知を実行したいのでスクリプトをsystemdで自動実行するようにしておく
-
認証情報作成
MyDNSのユーザー名/ログインパスワードを記述する
mkdir -p /root/.config/mydns chmod 700 /root/.config/mydns cat > /root/.config/mydns/credentials <<'EOF' MYDNS_USER='xxxxx' MYDNS_PASSWORD='xxxxx' EOF chmod 600 /root/.config/mydns/credentials -
IPアドレス通知スクリプト作成
mkdir -p /root/.local/bin cat > /root/.local/bin/mydns_update.sh <<'EOF' #!/bin/sh . /root/.config/mydns/credentials #curl --interface enp3s0 --user "$MYDNS_USER:$MYDNS_PASSWORD" --silent -o /dev/null http://www.mydns.jp/login.html curl --interface enp3s0 --user "$MYDNS_USER:$MYDNS_PASSWORD" --silent -o /dev/null http://ipv4.mydns.jp/login.html EOF chmod +x /root/.local/bin/mydns_update.sh -
systemd用設定ファイルを追加
IPアドレスの通知を自動的に毎日行うようにしたいので設定
cat > /etc/systemd/system/mydns.service <<'EOF' [Unit] Description=MyDNS dnsinfo update After=network.target remote-fs.target nss-lookup.target [Service] Type=oneshot ExecStart=/root/.local/bin/mydns_update.sh EOF cat > /etc/systemd/system/mydns.timer <<'EOF' [Unit] Description=MyDNS dnsinfo update Wants = multi-user.target After = multi-user.target [Timer] OnCalendar=daily RandomizedDelaySec=5s Persistent=true [Install] WantedBy=timers.target EOF chmod +x /root/.local/bin/mydns_update.sh -
サービスの有効化と起動
systemctl daemon-reload systemctl enable --now mydns.timer
-