Open17

CentOS 7のサーバーをCentOS Streamへ移行する

Shion TanakaShion Tanaka

このスクラップについて

自宅のCentOS 7サーバー(仮想マシン)をCentOS Streamへ移行する作業メモ。

移行元情報

  • OS:CentOS 7
  • バージョン:CentOS Linux release 7.1.1503 (Core)
  • ハードウェア:ESXi 上の仮想マシン
  • 仮想ハードウェア
    • CPU:4vCPUs
    • Memory:512MB
    • HDD:10GB(Thin)
    • NIC:2

主なアプリケーション

  • Apache + PHP + Pukiwiki
  • Softether VPN
Shion TanakaShion Tanaka

移行先OSの選定

CentOSがアレなことになったので長期運用することを考慮してCentOS Streamにすることに。実際に使ってみることでCentOS Streamの情報収集、情報発信も兼ねて。

CentOSプロジェクトのCentOS Streamへの移行に関するスクラップ
https://zenn.dev/tnk4on/scraps/661f9a78713fc0

Shion TanakaShion Tanaka

Apacheの移行

移行元ではデーモンで実行しているが、移行先ではPodmanのコンテナとして実行する。コンテナベースイメージについては別途検討。

Pukiwiki の移行

移行元のバージョンはPukiwiki v1.5.0。PHPのバージョンはv5.4.16。
PHP7.x以上で動かすためにはPukiwiki v1.5.1へアップデートが必要。

FAQ/45 - PukiWiki-official
https://pukiwiki.osdn.jp/?FAQ/45

PukiWiki/Install/Update/1.5.1 - PukiWiki-official
https://pukiwiki.osdn.jp/?PukiWiki/Install/Update/1.5.1

手順通りupdate_pukiwiki_150to151_utf8.patchを入手してパッチ当てを実行してみたが途中でエラー。個別修正が必要そうだがもはやどこに手を入れているのか覚えていないのでv1.5.0で塩漬けすることに。

Shion TanakaShion Tanaka

コンテナイメージの選択

せっかくの機会なのでPodman + UBIにトライ。

UBIに関するスクラップ
https://zenn.dev/tnk4on/scraps/d9b849be9360af

→その後
ubi7にPHP 5.4をインストールしようと思うも、依存関係の解決だ大変なので断念。
無難にCentOSイメージに変更。

→さらにその後
ubi7にPHP 5.4をインストール完了。やはりubi7ベースで進めることに。

  • Pukiwikiはubi7 + httpd + PHP 5.4

Softetherはubi8にインストールできたのでubi8で。

Shion TanakaShion Tanaka

(解決済み)ルートレスモードで実行したコンテナ内からネットワーク通信ができない

CentOS Stream上でルートレスモードで起動した内でdnfコマンドを使用してエラーになった。どうもコンテナ内からネットワーク 接続自体ができない模様。

$ podman run --rm ubi8 dnf search php
Updating Subscription Management repositories.
Unable to read consumer identity
Subscription Manager is operating in container mode.

This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.

Red Hat Universal Base Image 8 (RPMs) - BaseOS  0.0  B/s |   0  B     00:00
Errors during downloading metadata for repository 'ubi-8-baseos':
  - Curl error (6): Couldn't resolve host name for https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi8/8/x86_64/baseos/os/repodata/repomd.xml [Could not resolve host: cdn-ubi.redhat.com]
Error: Failed to download metadata for repo 'ubi-8-baseos': Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried

$ podman run --rm ubi8 curl https://cdn-ubi.redhat.com
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0curl: (6) Could not resolve host: cdn-ubi.redhat.com

他のOS上では問題ない

  • RHEL8:Podman 1.4.2-stable3
  • Fedora 33:Podman v2.2.1
  • Fedora CoreOS:v2.2.1

対処

今のところ原因が不明なのでルートモードで検証作業の継続をする。
下記にて解決済み

原因と対処

CentOS Streamホストの参照先ネームサーバーがIPv6のサーバーになっていたため。
ホスト上のネームサーバーをIPv4のネームサーバーを追加設定で解決。

Shion TanakaShion Tanaka

RHEL7へPHP5.4をインストール

PHP 5.4のインストールにサードパーティのレポジトリRemi's RPM repositoryを使用。

Configration Wizardを使用すると実行コマンドを表示してくれる。あとはそのまま実行するだけ。

PHP 5.4のインストール

Configration Wizardの結果を元にコマンド実行

# yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
# yum install -y yum-utils
# subscription-manager repos --enable=rhel-7-server-optional-rpms
# yum-config-manager --disable 'remi-php*'
# yum-config-manager --enable remi-php54
# yum update -y
# yum install -y php54

PHPコマンドの動作確認

Configration Wizardではphp --version php --modulesを実行するようになっているが、phpコマンドはインストールされず、代わりにphp54がインストールされる。

# php --version
bash: php: command not found
# whereis php
php:
# php54 --version
PHP 5.4.45 (cli) (built: Oct 22 2019 13:23:07)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
# whereis php54
php54: /usr/bin/php54

PHPパッケージ追加の注意

  • Configration Wizardの結果ではyum install php-xxxとなっているが、正解はyum install -y php54
  • ApacheでPHPの実行に必要なPHPモジュール(libphp5.so)はphp54-php に含まれる
  • 実際のインストールコマンドは下記
# yum install -y php54 php54-php
Shion TanakaShion Tanaka

UBI ベースのコンテナイメージの構築

RHEL8のドキュメントを参考に実施。

  • コンテナーの構築、実行、および管理 Red Hat Enterprise Linux 8 | Red Hat Customer Portal
    • 4.5. UBI ベースのイメージの構築

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html-single/building_running_and_managing_containers/index#building-an-ubi-based-image_adding-software-to-a-running-ubi-container

この章では「buildah ユーティリティーを使用して、Dockerfile から、UBI ベースの Web サーバーコンテナーを作成する例」が提示されている。サンプルのDockerfileをベースにPHP 5.4のインストールを追加したDockerfileが下記。

Dockerfile
FROM registry.access.redhat.com/ubi7/ubi
USER root
LABEL maintainer="Shion Tanaka"
# Update image
RUN yum update --disableplugin=subscription-manager -y && rm -fr /var/cache/yum
RUN yum install --disableplugin=subscription-manager httpd -y && rm -rf /var/cache/yum
RUN yum install --disableplugin=subscription-manager -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm \
 && yum install --disableplugin=subscription-manager -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm \
 && yum-config-manager --disable "remi-php*" \
 && yum-config-manager --enable remi-php54 \
 && yum install --disableplugin=subscription-manager -y php54 php54-php \
 && rm -fr /var/cache/yum
# Add default Web page and expose port
RUN echo "The Web Server is Running" > /var/www/html/index.html
EXPOSE 80
# Start the service
CMD ["-D", "FOREGROUND"]
ENTRYPOINT ["/usr/sbin/httpd"]

buildahを使ってイメージをビルド。

$ buildah bud -t tnk4on/pukiwiki .
$ podman images tnk4on/pukiwiki
REPOSITORY                 TAG     IMAGE ID      CREATED        SIZE
localhost/tnk4on/pukiwiki  latest  4d17eb71abb8  9 minutes ago  286 MB
Shion TanakaShion Tanaka

Pukiwikiコンテンツの移行

移行元サーバーからPukiwikiフォルダをtarで固めて転送するだけ。

https://pukiwiki.osdn.jp/?PukiWiki/Install/パーミッション設定

パーミッションを保持したままtarで圧縮、解凍する。

移行元
$ tar cvfp pukiwiki.tar pukiwiki/
移行先
$ tar xvfp pukiwiki.tar

PHP7に対応するためにPukiwiki 1.5.1へのアップデートが必要。
https://pukiwiki.osdn.jp/?PukiWiki/Install/Update/1.5.1

今回の移行ではパッチがうまく適用できなかったため、Pukiwiki v1.5.0 + PHP 5.4のままで塩漬け。

Shion TanakaShion Tanaka

コンテナでPukiwikiを実行する

Podmanで作成したコンテナイメージを使ってコンテナ起動。移行したコンテンツをボリュームマウント。
SELinuxが有効なため、ボリュームマウントオプションに:Zを付与する

$ podman run -d --name test -v $(pwd)/pukiwiki:/var/www/html/pukiwiki:Z -p 8080:80 tnk4on/pukiwiki

firewallのポート解放

$ sudo firewall-cmd --add-port=8080/tcp --permanent
$ sudo firewall-cmd --reload

コンテナ起動後、ブラウザでhttp://ホストのIPアドレス:8080/pukiwiki/でアクセスできればOK。
事前にphpinfoでPHPが実行できるか確認しておくのもアリ。

phpinfo.php
<?php phpinfo(); ?>
Shion TanakaShion Tanaka

podman run時のSELinuxへの対応

コンテナイメージ構築時にトラシューで一時的にSELinuxを無効にしていたのを忘れて有効化するとボリュームがマウントできなくなった。

原因

マウントするボリュームコンテンツに適切なラベルを付与する必要がある。または podman run時のボリュームマウントオプションに:zまたは:Zを付与する。

参考:下記スライド、P.20
https://speakerdeck.com/moriwaka/kontenanidemonru-rete-dot-servicehua?slide=20

SELinux のタイプづけ
コンテナと共有するディレクトリに SELinux のタイプ container_file_t をつけます podman run のボリューム指定で :Z (1 つのコンテナで占有 ) または :z ( 複数のコン テナで共有 ) オプションを付与すると自動的にタイプづけを行います

参考:Dealing with user namespaces and SELinux on rootless containers | Enable Sysadmin
https://www.redhat.com/sysadmin/user-namespaces-selinux-rootless-containers

The container engine, Podman, launches each container with a unique process SELinux label (usually container_t) and labels all of the container content with a single label (usually container_file_t). We have rules that state that container_t can read and write all content labeled container_file_t.

参考:NAME — Podman documentation
http://docs.podman.io/en/latest/markdown/podman-run.1.html

Labeling Volume Mounts

Labeling systems like SELinux require that proper labels are placed on volume content mounted into a container. Without a label, the security system might prevent the processes running inside the container from using the content. By default, Podman does not change the labels set by the OS.

To change a label in the container context, you can add either of two suffixes :z or :Z to the volume mount. These suffixes tell Podman to relabel file objects on the shared volumes. The z option tells Podman that two containers share the volume content. As a result, Podman labels the content with a shared content label. Shared volume labels allow all containers to read/write content. The Z option tells Podman to label the content with a private unshared label.

Shion TanakaShion Tanaka

Podman を使用した systemd ユニットファイルの生成

Podmanはデーモンレスのツール。podman generate systemd コマンドを使用して、コンテナーおよび Pod の systemd ユニットファイルを生成できます。

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/building_running_and_managing_containers/porting-containers-to-systemd-using-podman_building-running-and-managing-containers

Podman を使用することで、systemd はコンテナープロセスを制御および管理できます。podman generate systemd コマンドを使用して既存のコンテナーと Pod の systemd ユニットファイルを生成できます。

Shion TanakaShion Tanaka

ルートレスで実行しているコンテナを自動起動する

システム起動、停止時に podman start podman stopを自動で行う

  • ディレクトリの作成
$ cd ~/
$ mkdir -p .config/systemd/user/
  • ユニットファイルの作成(コンテナは起動済み)
$ podman generate systemd --name pukiwiki > ~/.config/systemd/user/pukiwiki.service
  • ユーザーログイン時のサービスの登録
$ systemctl --user enable pukiwiki.service
  • システムの起動時にサービスを起動し、ログアウト後もそのまま起動した状態を保つ(root権限必要)
$ sudo loginctl enable-linger $USER

サーバーを再起動して自動的にコンテナが起動するか確認する

Shion TanakaShion Tanaka

CentOSのDockerオフィシャルイメージ

https://hub.docker.com/_/centos?tab=description&page=1&ordering=last_updated

一番古いタグはcentos5
https://hub.docker.com/layers/centos/library/centos/centos5/images/sha256-1ae98b2c895d1ceeba8913ff79f422f005b7f967a311da520a88ac89180b4c39?context=explore

CentOS6,7,8は細かくバージョン(タグ)がある。
特定のマイナーバージョンタグを使用する場合の注意

Additionally, images with minor version tags that correspond to install media are also offered. These images DO NOT receive updates as they are intended to match installation iso contents. If you choose to use these images it is highly recommended that you include RUN yum -y update && yum clean all in your Dockerfile, or otherwise address any potential security concerns.

サポートバージョンにはDockerfileへのリンクがある

  • latest, centos8, 8, centos8.3.2011, 8.3.2011
  • centos7, 7, centos7.9.2009, 7.9.2009
  • centos6, 6
  • centos6.10, 6.10
Shion TanakaShion Tanaka

Softetherの移行

Softetherをコンテナで実行する

公開済みのコンテナイメージ

https://github.com/siomiz/SoftEtherVPN/blob/master/Dockerfile

トラブルメモ

サーバーに到達しているのにVPN接続ができない
→原因:VPNクライアントにDHCPでアドレスが割り当てられない状態だった

https://ja.softether.org/4-docs/2-howto/L2TP_IPsec_Setup_Guide/1

L2TP VPN クライアントが仮想 HUB に接続しようとする際には、仮想 HUB の Ethernet セグメント上で DHCP サーバーが動作している必要があります。

Shion TanakaShion Tanaka

ルートレスで実行しているPodを自動起動する

単体コンテナの自動起動、停止と要領は同じ。

システム起動、停止時の処理

システム起動、停止時に podman start podman stopを自動で行う。
単体のコンテナの時と異なるのはinfraコンテナの起動、停止処理が含まれること。

podman generate systemd --filesに作成されるファイル

ユニットファイルの作成(--name以下の名前は任意指定)

$ podman generate systemd --files --name wordpress

生成されるファイル(例:Pod内の実行コンテナ名がwptest-webwptest-dbの場合)

  • container-wordpress-wptest-db.service
  • container-wordpress-wptest-web.service
  • pod-wordpress.service

infraコンテナのユニットファイルはpod-
Pod内の実行コンテナのユニットファイルはcontainer-

実装作業

  • ユニットファイルの作成(Podと実行するコンテナは作成済み)
$ podman generate systemd --files --name wordpress
$ cp *.service ~/.config/systemd/user/
  • ユーザーログイン時のサービスの登録
    pod-のユニットファイルを指定
$ systemctl --user enable pod-wordpress.service
  • システムの起動時にサービスを起動し、ログアウト後もそのまま起動した状態を保つ(root権限必要)
$ sudo loginctl enable-linger $USER

サーバーを再起動して自動的にPodが起動するか確認する