KUSONEKOの見る世界

CentOS Stream 10 構築メモ

少しばかり余暇ができたので、買っておいたM.2 MVNe SSDにCentOS Stream 10をインストールすることにしました。
サーバのパフォーマンスが上がることを期待しています。

サーバ構築は何度やってもハマるもので、今回もメモを残しておきます。
自分専用なのであまり当てにならないと思います。

バックアップは、以前と同様です。

自宅サーバのスペックは以下の通りです。

CPU Intel(R) N100
メモリ 16GB (DDR4 3200MHz)
HDD/SSD SSD : WD BLACK M.2 SSD 2TB NVMe
SSD : Samsung 870 QVO 1TB SATA
HDD : TOSHIBA MG06ACA800E 8TB SATA 7200RPM
LAN オンボード : Realtek RTL8111H 1000BASE-T
拡張カード : Intel 82599EN 10GbE SFP+

インストールメディア作成

以下のURLから CentOS-Stream-10-latest-x86_64-dvd1.iso をダウンロードして、rufusでUSBメモリに書き込みます。
https://www.centos.org/download/

CentOS Stream 10 インストール

USBブートをさせ、Install CentOS Stream 10を選択。

CENTOS Stream 10 へようこそ。で日本語を選択。

時刻と日付で、日本を選択。

ソフトウェアの選択で、最小限のインストールを選択。

インストール先で、標準パーティションを選択し、以下のように指定。

マウントポイント 容量
/boot/efi 2GiB
/boot 10GiB
/ 519.82GiB(残り全て)
/home 1.3TiB

※SSDの書き込み量を減らすため、SWAPパーティションは作成しません。

KDUMPで、KDUMPを無効にする。

ネットワークとホスト名で、IPアドレス等を指定。

rootパスワードで、rootパスワードを入力し、パスワードによるroot SSHログインを許可にチェックを入れる。

ユーザーの作成で、一般ユーザーを作成する。

あとはインストールを開始し、終わるのを待つ。

CentOS Stream 10 構築

インストールが完了し、起動したら以降を実施していく。

ネットワーク設定

インストール時にネットワーク設定をしても、別のインターフェース名が作成されてしまうため、それを削除し、正しいインターフェースに再度設定を行う

# nmtui

シェルのコピペの挙動を変更

従来通りにTeratermでコピペができない問題の対処。追加したらSSHを繋ぎなおす。

# vi /etc/inputrc
以下を末尾に追加。
set enable-bracketed-paste off

SELinux無効化

# grubby --update-kernel ALL --args 'selinux=0'
# reboot

電源ボタン無効化

子供のいたずら防止です。
以下を入れても効いていない。

# vi     
#HandlePowerKey=poweroff
↓
HandlePowerKey=ignore
# systemctl restart systemd-logind

firewalld無効化

nftablesを使用するので、無効化します。

# systemctl stop firewalld
# systemctl disable firewalld

SSD/HDDマウント

Samba用のHDDを/dataにマウントしますが、
対象のHDDのパーティションが5つに分かれているので、統合します。(CentOS 8が入っていたため)

# parted /dev/sdb
(parted) print
(parted) rm 1
(parted) rm 2
(parted) rm 3
(parted) rm 4
(parted) rm 5
(parted) mkpart
パーティションの名前?  []? 
ファイルシステムの種類?  [ext2]? xfs
開始? 0%
終了? 100%
(parted) q
# mkfs.xfs /dev/sdb1 -f


# blkid
(対象のUUIDを控える)
# mkdir /date
# vi /etc/fstab
(Sambaの領域を指定)
UUID=******-****** /data                  xfs     defaults        0 0

あと、旧OSであるCentOS Stream 9の / もマウントしておくとバックアップ忘れがあった際に、ファイルのコピーができて便利です。

# mkdir /old
# vi /etc/fstab
UUID=******-****** /old                  xfs     defaults        0 0

リポジトリ追加

CentOS Stream 8までのPowerToolsが、crbに名前が変わったいます。

# dnf install epel-release
# dnf config-manager --set-enabled  crb

シリアルコンソール有効化

# vi /etc/default/grub
GRUB_CMDLINE_LINUX=""
↓
GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200"
以下を追加。
GRUB_TERMINAL="serial"
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"
# grub2-mkconfig -o /boot/grub2/grub.cfg
# grubby --update-kernel=ALL --args="console=tty0 console=ttyS0,115200"
# reboot

rsyslog

自分用のカスタマイズですが、このような設定をしています。

# vi /etc/rsyslog.conf
以下を#### RULES ####の直後に追加
:programname, isequal, "bluetoothd"                       stop

:programname, isequal, "2chproxy.pl"                     /var/log/2chproxy.log
                                                         & stop

:programname, isequal,"ipsec"                            stop

:programname, isequal, "charon"                         /var/log/ipsec.log
                                                         & stop

:msg, contains, "nft drop"                              /var/log/nftables.log
                                                         & stop

:fromhost-ip, isequal, "192.168.0.254"                 /var/log/ix.log
                                                         & stop

# systemctl restart rsyslog

Tiny Tiny RSS

dockerインストール

# dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# dnf install docker-ce docker-ce-cli containerd.io git
# systemctl start docker
# systemctl enable docker
# curl -L "https://github.com/docker/compose/releases/download/v2.40.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose

Tiny Tiny RSSインストール

最新をインストールしてもbackupが起動せず、データベースがリストアができなかったため、バックアップしておいたdocker-compose.yml で旧版を起動させ、リストアした。

リストア

バックアップしていたデータベースのリストアは、以下の通り実施します。

以下にバックアップしておいたファイルを転送する。

# ls /var/lib/docker/volumes/ttrss-docker_backups/_data/
ttrss-backup-20251030.sql.gz  ttrss-backup-20251030.tar.gz

コンテナ内からリストアする。

# docker-compose exec backups /bin/sh
/ # ls -t /backups/*.sql.gz
/backups/ttrss-backup-20251030.sql.gz
/ # psql -h db -U $TTRSS_DB_USER $TTRSS_DB_NAME -e -c "drop schema public cascade; create schema public"
Password for user postgres: password
/ # zcat /backups/ttrss-backup-20230908.sql.gz | psql -h db -U $TTRSS_DB_USER $TTRSS_DB_NAME
Password for user postgres: password

PHP 8.3

標準のPHP8.3を使用します。

# dnf install php php-bcmath php-cli php-common php-devel php-fpm php-gd php-gmp php-intl php-ldap php-mbstring php-mysqlnd php-opcache php-pdo php-pecl-apcu php-pecl-zip php-process php-xml
# systemctl start php-fpm
# systemctl enable php-fpm

.conf関連は必要に応じて設定する。

Zabbix 7.0 LTS

Zabbix インストール

# rpm -Uvh https://repo.zabbix.com/zabbix/7.0/centos/10/x86_64/zabbix-release-latest-7.0.el10.noarch.rpm
# dnf clean all
# vi /etc/yum.repos.d/epel.repo
(以下を追加)
excludepkgs=zabbix*
# dnf install zabbix-server-mysql zabbix-web-mysql zabbix-nginx-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent zabbix-web-japanese

MySQL インストール

# dnf install mysql8.4-server
# vi /etc/my.cnf.d/mysql-server.cnf
(以下を追加)
character-set-server = utf8
innodb_buffer_pool_size=3G
innodb_io_capacity=100

innodb_log_file_size=384M
innodb_file_per_table=1
join_buffer_size=256K

rootのパスワードは入力し、他は空エンター。

# systemctl start mysqld
# systemctl enable mysqld
# mysql_secure_installation

リストア

# mysql -uroot -p
Enter password: 
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> create user zabbix@localhost identified by 'password';
mysql> grant all privileges on zabbix.* to zabbix@localhost;
mysql> set global log_bin_trust_function_creators = 1;
mysql> quit;
# mysql -u root -p zabbix < zabbix.dump
Enter password:

起動

# ln -s /usr/share/zabbix/ /var/www/html/zabbix
# chmod 777 /etc/zabbix/web/
# systemctl start zabbix-agent zabbix-server
# systemctl enable zabbix-agent zabbix-server

その他

監視に使っている物をインストール。

dnf install python3-pip lm_sensors hddtemp glib2-devel jq openssl
# pip3 install -U setuptools wheel
# pip3 install bluepy
# sensors-detect --auto

NextCloud

# dnf install wget unzip
# wget https://download.nextcloud.com/server/releases/latest.zip
# unzip nextcloud-*.zip
# cp -R nextcloud/ /var/www/html/
# chown -R nginx:nginx /home/nextcloud/
# chown -R nginx:nginx /var/www/html/nextcloud/
# mysql -u root -p
Enter password: 
mysql> CREATE DATABASE nextcloud CHARACTER SET utf8mb4;
mysql> quit;
# mysql -u root -p nextcloud < nextcloud.dump
Enter password: 

バックアップしておいたデータディレクトリをリストアする。(.ncdataファイル等も必須。アプリディレクトリが無いとInternal Serverが出るため注意)

以下のファイルをリストアし、適宜修正する。
/var/www/html/nextcloud/config/config.php

nginxの設定を公式を見て修正する。
{}、""、の数、;の後にスペースが入らないよう気を付ける。(ドはまりしました)

# vi /etc/nginx/nginx.conf
# systemctl restart nginx

valkey、APCu、imagick、Argon2をインストールします。

# yum install valkey php-redis php-pecl-apcu php-pear ImageMagick ImageMagick-devel php-sodium libargon2 libargon2-devel
# systemctl start valkey
# systemctl enable valkey
# pecl install imagick
# echo "extension=imagick.so" > /etc/php.d/20-imagick.ini
# systemctl restart php-fpm

Samba

Sambaの4.23はインストールしてもタイムアウトで起動できなかったため、4.22の最新をインストールしました。

# dnf install docbook-style-xsl gcc gdb gnutls-devel gpgme-devel jansson-devel \
      keyutils-libs-devel krb5-workstation libacl-devel libaio-devel \
      libarchive-devel libattr-devel libblkid-devel libtasn1 libtasn1-tools \
      libxml2-devel libxslt lmdb-devel openldap-devel pam-devel perl \
      perl-ExtUtils-MakeMaker perl-Parse-Yapp popt-devel python3-cryptography \
      python3-dns python3-gpg readline-devel rpcgen systemd-devel \
      tar zlib-devel python3-devel flex bison dbus-devel python3-markdown 
# wget https://download.samba.org/pub/samba/stable/samba-4.22.6.tar.gz
# tar xf samba-4.22.6.tar.gz
# cd samba-4.22.6
# ./configure 
# make -j 2
# make install

バックアップしておいたファイルを格納する。
/usr/local/samba/etc/smb.conf
/usr/local/samba/private/passdb.tdb
/usr/local/samba/private/secrets.tdb
/etc/systemd/system/nmb.service
/etc/systemd/system/smb.service

# systemctl start smb nmb
# systemctl enable smb nmb

nftables

/etc/nftables/main.nftを使用します。

# vi /etc/sysconfig/nftables.conf
#include "/etc/nftables/main.nft"
↓
include "/etc/nftables/main.nft"

日本のグローバルIPのテーブルを作成するスクリプトです。

# vi nft_AcceptCountry.sh
#!/bin/sh

# IPアドレスリスト作成
IP_LIST=/tmp/cidr.txt
if [ ! -f $IP_LIST ]; then
    wget -q http://nami.jp/ipv4bycc/cidr.txt.gz
    gunzip -c cidr.txt.gz > $IP_LIST
    rm -f cidr.txt.gz
fi

# 既存Accept_Countryをflush
nft flush set inet nftables_svc Accept_Country

# 新規Accept_Countryを作成
nft add set inet nftables_svc Accept_Country { type ipv4_addr \; flags interval \; }

# /tmp/cidr.txtのJPのアドレスをAccept_Countryに追加
for addr in `cat /tmp/cidr.txt|grep ^JP | awk '{print $2}'`
do
    nft add element inet nftables_svc Accept_Country { $addr }
done

enp1s0が使用しているインターフェースです。

# systemctl start nftables
# sh nft_AcceptCountry.sh 
# nft add chain inet nftables_svc INPUT { type filter hook input priority filter \; policy drop \; }
# nft add rule inet nftables_svc INPUT type filter hook input priority filter; policy drop;
# nft add rule inet nftables_svc INPUT iifname { "lo", "enp1s0" } accept
# nft add rule inet nftables_svc INPUT ip saddr 192.168.0.0/24 accept
# nft add rule inet nftables_svc INPUT ct state established,related accept
# nft add rule inet nftables_svc INPUT ip saddr @Accept_Country udp dport { 500, 4500 } accept
# nft add rule inet nftables_svc INPUT ip saddr @Accept_Country tcp dport 443 accept
# nft add rule inet nftables_svc INPUT ip saddr @Accept_Country ip protocol esp accept
# nft add rule inet nftables_svc INPUT iifname "enp2s0" counter log prefix \"[nft drop] : \"

# nft add chain inet nftables_svc prerouting { type filter hook prerouting priority 0 \; }
# nft add rule inet nftables_svc prerouting ip saddr 192.168.255.0/24 tcp flags syn tcp option maxseg size set 1334
# nft add chain inet nftables_svc postrouting { type filter hook postrouting priority 0 \; }
# nft add rule inet nftables_svc postrouting ip daddr 192.168.255.0/24 tcp flags syn tcp option maxseg size set 1334
# nft list ruleset > /etc/nftables/main.nft
# systemctl enable nftables

ルールの詳細はこちら。

2chproxy + p2-php(rep2)

以下にバックアップしたディレクトリを格納する。

/usr/local/2chproxy.pl/
/var/www/html/p2-php/

# dnf install perl-HTTP-Daemon perl-libwww-perl perl-YAML-Tiny   
# vi /etc/systemd/system/2chproxy.service
[Unit]
Description = 2ch proxy daemon
Wants=network-online.target
After=network-online.target

[Service]
ExecStart = /usr/local/2chproxy.pl/2chproxy.pl  --config /usr/local/2chproxy.pl/config.yml
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target
# systemctl start 2chproxy
# systemctl enable 2chproxy
# chown nginx:nginx -R /var/www/html/p2-php/

strongSwan

最新の6.0.3を最初にインストールしましたが、起動できなかったため、5.9.14を使用しました。

# dnf install bzip2
# wget https://download.strongswan.org/strongswan-5.9.14.tar.bz2
# cd strongswan-5.9.14
# ./configure --prefix=/usr --sysconfdir=/etc --enable-eap-mschapv2 --enable-openssl --enable-eap-identity --enable-aesni
# make
# make install
# cp init/systemd-starter/strongswan-starter.service /etc/systemd/system/

バックアップしておいたファイルを格納する。
/etc/ipsec.conf
/etc/ipsec.secrets
/etc/ipsec.d/
/etc/strongswan.conf
/etc/strongswan.d/

# systemctl start strongswan-starter
# systemctl enable strongswan-starter

その他必要になるコマンド類

個人的に使用する物をインストールします。
dig nslookup lsusb patch telnet

# dnf install bind-utils usbutils patch telnet

最後に

CentOS Stream 9 と 10では、ほとんど違いがないようですが、マイナーな機能を使おうとすると、ハマる感じでしょうか。

アプリケーションの方は、メジャー、マイナーバージョンが変わってくると、ハマります。特にデータベースを使用するアプリケーションは、OSを変える前にアプリケーションのバージョンを上げてから、データベースのバックアップをして、新しいOSでリストアした方が、ハマる時間が少なかったと思います。