CentOS 7のサーバーをCentOS Streamへ移行する
このスクラップについて
自宅の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
移行先OSの選定
CentOSがアレなことになったので長期運用することを考慮してCentOS Streamにすることに。実際に使ってみることでCentOS Streamの情報収集、情報発信も兼ねて。
CentOSプロジェクトのCentOS Streamへの移行に関するスクラップ
CentOS Streamの新規インストールに関する記事
Apacheの移行
移行元ではデーモンで実行しているが、移行先ではPodmanのコンテナとして実行する。コンテナベースイメージについては別途検討。
Pukiwiki の移行
移行元のバージョンはPukiwiki v1.5.0。PHPのバージョンはv5.4.16。
PHP7.x以上で動かすためにはPukiwiki v1.5.1へアップデートが必要。
FAQ/45 - PukiWiki-official
PukiWiki/Install/Update/1.5.1 - PukiWiki-official
手順通りupdate_pukiwiki_150to151_utf8.patch
を入手してパッチ当てを実行してみたが途中でエラー。個別修正が必要そうだがもはやどこに手を入れているのか覚えていないのでv1.5.0で塩漬けすることに。
コンテナイメージの選択
せっかくの機会なのでPodman + UBIにトライ。
UBIに関するスクラップ
→その後
ubi7にPHP 5.4をインストールしようと思うも、依存関係の解決だ大変なので断念。
無難にCentOSイメージに変更。
→さらにその後
ubi7にPHP 5.4をインストール完了。やはりubi7ベースで進めることに。
- Pukiwikiはubi7 + httpd + PHP 5.4
Softetherはubi8にインストールできたのでubi8で。
新規インストールしたCentOS Stream 8上で、Podman + UBIのテストをしていたらハマったトラブル
Podman v2.1.1のバグでルートレスモードで実行できなかったのでPodmanをアップデートして対応
(解決済み)ルートレスモードで実行したコンテナ内からネットワーク通信ができない
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のネームサーバーを追加設定で解決。
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
UBI ベースのコンテナイメージの構築
RHEL8のドキュメントを参考に実施。
- コンテナーの構築、実行、および管理 Red Hat Enterprise Linux 8 | Red Hat Customer Portal
- 4.5. UBI ベースのイメージの構築
この章では「buildah ユーティリティーを使用して、Dockerfile から、UBI ベースの Web サーバーコンテナーを作成する例」が提示されている。サンプルのDockerfileをベースにPHP 5.4のインストールを追加した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
Pukiwikiコンテンツの移行
移行元サーバーからPukiwikiフォルダをtar
で固めて転送するだけ。
パーミッションを保持したままtar
で圧縮、解凍する。
$ tar cvfp pukiwiki.tar pukiwiki/
$ tar xvfp pukiwiki.tar
PHP7に対応するためにPukiwiki 1.5.1へのアップデートが必要。
今回の移行ではパッチがうまく適用できなかったため、Pukiwiki v1.5.0 + PHP 5.4のままで塩漬け。
コンテナで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が実行できるか確認しておくのもアリ。
<?php phpinfo(); ?>
podman run
時のSELinuxへの対応
コンテナイメージ構築時にトラシューで一時的にSELinuxを無効にしていたのを忘れて有効化するとボリュームがマウントできなくなった。
原因
マウントするボリュームコンテンツに適切なラベルを付与する必要がある。または podman run
時のボリュームマウントオプションに:z
または:Z
を付与する。
参考:下記スライド、P.20
SELinux のタイプづけ
コンテナと共有するディレクトリに SELinux のタイプ container_file_t をつけます podman run のボリューム指定で :Z (1 つのコンテナで占有 ) または :z ( 複数のコン テナで共有 ) オプションを付与すると自動的にタイプづけを行います
参考:Dealing with user namespaces and SELinux on rootless containers | Enable Sysadmin
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
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.
Podman を使用した systemd ユニットファイルの生成
Podmanはデーモンレスのツール。podman generate systemd コマンドを使用して、コンテナーおよび Pod の systemd ユニットファイルを生成できます。
Podman を使用することで、systemd はコンテナープロセスを制御および管理できます。podman generate systemd コマンドを使用して既存のコンテナーと Pod の systemd ユニットファイルを生成できます。
ルートレスで実行しているコンテナを自動起動する
システム起動、停止時に 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
サーバーを再起動して自動的にコンテナが起動するか確認する
CentOSのDockerオフィシャルイメージ
一番古いタグはcentos5
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
Softetherの移行
Softetherをコンテナで実行する
公開済みのコンテナイメージ
- siomiz/softethervpn - Docker Hub
https://hub.docker.com/r/siomiz/softethervpn/
トラブルメモ
サーバーに到達しているのにVPN接続ができない
→原因:VPNクライアントにDHCPでアドレスが割り当てられない状態だった
L2TP VPN クライアントが仮想 HUB に接続しようとする際には、仮想 HUB の Ethernet セグメント上で DHCP サーバーが動作している必要があります。
ルートレスで実行しているPodを自動起動する
単体コンテナの自動起動、停止と要領は同じ。
システム起動、停止時の処理
システム起動、停止時に podman start
podman stop
を自動で行う。
単体のコンテナの時と異なるのはinfraコンテナの起動、停止処理が含まれること。
podman generate systemd --files
に作成されるファイル
ユニットファイルの作成(--name
以下の名前は任意指定)
$ podman generate systemd --files --name wordpress
生成されるファイル(例:Pod内の実行コンテナ名がwptest-web
とwptest-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が起動するか確認する