アップグレードツールでCentOS 6.5からCentOS 7にバージョンアップしてみた

# 背景
CentOS 6系のサポートが2020年11月30日に終了となりました。
稼働中のプロジェクトでバージョンアップすることになり、 [CentOS Upgrade Tool](https://wiki.centos.org/TipsAndTricks/CentOSUpgradeTool) なるものがあったので試してみました。

# 注意！
上記のリンクから遷移するとわかりますが。。。
 **「現在は使用できない」** と記載されています。

どうもCentOS 6.7以上の場合、ソフトウェアパッケージによってはCentOS 7の同パッケージよりもバージョンが上がってしまうものがあるようで正常にアップデートできないことがあるようです。

試すことがあれば、ご注意ください。。。

もちろん正攻法は新規にCentOS 7（8だろ。。。は置いておく）でサーバを作成して必要なソフトウェアパッケージを追加し、データ移行するだと思います。
ただ、予算やスケジュールなど大人の事情（？）で同じサーバのままバージョンアップしなければ。。。という場合にアップグレードツールというものがあるということを知っておくことも良いのでと思いました。

# アップグレードの流れ
1. アップグレードツールのインストール
1. アップグレード検証ツールの実行
1. 検証結果の確認・対応
1. アップグレードツールの実行
1. CentOSの再起動
1. バージョンアップの確認

# アップグレードする！
それでは上記の流れの通りに作業を進めていきます！
作業を始める前に **バックアップの作成** をお忘れなく。。。

## 1. アップグレードツールのインストール
アップグレードツールをインストールするためのリポジトリを `yum.repos.d` に追加します。

```
# vi /etc/yum.repos.d/upgradetool.repo

（新規作成）
[upg]
name=CentOS-$releasever - Upgrade Tool
baseurl=https://buildlogs.centos.org/centos/6/upg/x86_64/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
```

インストールします。

```
# yum install redhat-upgrade-tool preupgrade-assistant-contents
Loaded plugins: fastestmirror, presto
Determining fastest mirrors
YumRepo Error: All mirror URLs are not using ftp, http[s] or file.
 Eg. Invalid release/repo/arch combination/
removing mirrorlist with no valid mirrors: /var/cache/yum/x86_64/6/base/mirrorlist.txt
Error: Cannot find a valid baseurl for repo: base
```

エラー。。。
CentOS 6は2020年11月30日でサポートが終了となったので mirrorlist のサーバから削除されているようです。
以下の設定の mirrorlist 行をコメントアウトし、 baseurl を追加します。
（必要に応じて、[updates]や[extras]の設定も変更します。）

```
# cp -p /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bu

# vi /etc/yum.repos.d/CentOS-Base.repo

[base]
name=CentOS-$releasever - Base
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os （※←コメントアウト）
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
baseurl=http://vault.centos.org/6.5/os/$basearch/ （※←追加）
```

再度インストールする。

```
# yum install redhat-upgrade-tool preupgrade-assistant-contents
Loaded plugins: fastestmirror, presto
Determining fastest mirrors
base                                         | 3.7 kB     00:00
Not using downloaded repomd.xml because it is older than what we have:
  Current   : Fri Oct 24 22:59:03 2014
  Downloaded: Thu Nov 28 07:08:25 2013
extras                                       | 2.9 kB     00:00
Not using downloaded repomd.xml because it is older than what we have:
  Current   : Thu May 21 00:34:00 2015
  Downloaded: Fri Nov  7 01:15:00 2014
updates                                      | 2.9 kB     00:00
Not using downloaded repomd.xml because it is older than what we have:
  Current   : Thu Jul  2 21:22:31 2015
  Downloaded: Fri Nov  7 01:20:59 2014

（途中は省略。。。）

Error Downloading Packages:
  libxml2-2.7.6-17.el6_6.1.x86_64: failure: Packages/libxml2-2.7.6-17.el6_6.1.x86_64.rpm from updates: [Errno 256] No more mirrors to try.
  openscap-1.0.8-1.0.1.el6.centos.1.x86_64: failure: Packages/openscap-1.0.8-1.0.1.el6.centos.1.x86_64.rpm from base: [Errno 256] No more mirrors to try.
  yum-3.2.29-60.el6.centos.noarch: failure: Packages/yum-3.2.29-60.el6.centos.noarch.rpm from base: [Errno 256] No more mirrors to try.
  libxml2-devel-2.7.6-17.el6_6.1.x86_64: failure: Packages/libxml2-devel-2.7.6-17.el6_6.1.x86_64.rpm from updates: [Errno 256] No more mirrors to try.
```

またエラー。。。
どうもリポジトリを参照したときにダウンロードした最新のものが古いと言われているようです。

今保持している yum のキャッシュを待避させます。

```
# mv /var/cache/yum/x86_64 /tmp/
```

再々度インストールします。

```
# yum install redhat-upgrade-tool preupgrade-assistant-contents
Loaded plugins: fastestmirror, presto
Determining fastest mirrors
base                              | 3.7 kB     00:00
base/primary_db                   | 4.4 MB     00:03
extras                            | 2.9 kB     00:00
extras/primary_db                 |  19 kB     00:00
updates                           | 2.9 kB     00:00
updates/primary_db                | 5.9 MB     00:03
upg                               | 1.9 kB     00:00
upg/primary_db                    |  14 kB     00:00

（途中は省略。。。）

Installed:
  preupgrade-assistant-contents.noarch 0:0.5.14-1.el6.centos                                                                 redhat-upgrade-tool.noarch 1:0.7.22-3.el6.centos

Dependency Installed:
  libgcrypt-devel.x86_64 0:1.4.5-11.el6_4         libgpg-error-devel.x86_64 0:1.7-4.el6      libxml2-devel.x86_64 0:2.7.6-14.el6_5.2                    libxslt.x86_64 0:1.1.26-2.el6_3.1      libxslt-devel.x86_64 0:1.1.26-2.el6_3.1
  openscap.x86_64 0:1.0.8-1.0.1.el6.centos.1      pcre-devel.x86_64 0:7.8-6.el6              preupgrade-assistant.x86_64 0:1.0.2-36.0.1.el6.centos      zlib-devel.x86_64 0:1.2.3-29.el6

Dependency Updated:
  libxml2.x86_64 0:2.7.6-14.el6_5.2                                                                                     yum.noarch 0:3.2.29-43.el6.centos

Complete!
```

成功！！！

## 2. アップグレード検証ツールの実行
アップグレードの検証ツールを実行します。

```
# preupg -s CentOS6_7
Preupg tool doesn't do the actual upgrade.
Please ensure you have backed up your system and/or data in the event of a failed upgrade
 that would require a full re-install of the system from installation media.
Do you want to continue? y/n
y
Gathering logs used by preupgrade assistant:

（途中は省略。。。）

Tarball with results is stored here /root/preupgrade-results/preupg_results-201214042319.tar.gz .
The latest assessment is stored in directory /root/preupgrade .
Summary information:
We found some potential in-place upgrade risks.
Read the file /root/preupgrade/result.html for more details.
Upload results to UI by command:
e.g. preupg -u http://127.0.0.1:8099/submit/ -r /root/preupgrade-results/preupg_results-*.tar.gz .
```

特に問題はなく正常終了しました！

## 3. 検証結果の確認および対応
`/root/preupgrade/result.html` に検証結果が出力されており、読むように言われているので確認します。

```
We have detected that you are using SELinux.
There were changes in policies which require to apply custom command before upgrade process.
In order to have working SELinux on CentOS 7, you <b>HAVE TO</b> run command prior to running redhat-upgrade-tool:semodule -r sandbox
```

アップグレードを実行する前に次のコマンドを実行するようにと書かれているので実行します。

```
# semodule -r sandbox
```

## 4. アップグレードツールの実行
ここまででアップグレードする準備ができました。
いよいよアップグレードを実行します。

```
# redhat-upgrade-tool-cli --network 7 --cleanup-post --instrepo=http://vault.centos.org/centos/7.2.1511/os/x86_64/ --addrepo=CentOS7=http://mirror.centos.org/centos/7/os/x86_64/
setting up repos...
CentOS7                                                 | 3.6 kB     00:00
CentOS7/primary_db                                      | 6.1 MB     00:00
base                                                    | 3.7 kB     00:00
base/primary_db                                         | 4.4 MB     00:03
cmdline-instrepo                                        | 3.6 kB     00:00
cmdline-instrepo/primary_db                             | 5.3 MB     00:03
extras                                                  | 2.9 kB     00:00
extras/primary_db                                       |  19 kB     00:00
updates                                                 | 2.9 kB     00:00
updates/primary_db                                      | 5.9 MB     00:03
upg                                                     | 1.9 kB     00:00
upg/primary_db                                          |  14 kB     00:00
zabbix                                                  |  951 B     00:00
zabbix/primary                                          |  25 kB     00:00
zabbix-non-supported                                    |  951 B     00:00
zabbix-non-supported/primary                            | 3.8 kB     00:00
.treeinfo                                               | 1.1 kB     00:00
Preupgrade assistant risk check found risks for this upgrade.
You can run preupg --riskcheck --verbose to view these risks.
Addressing high risk issues is required before the in-place upgrade
and ignoring these risks may result in a broken upgrade and unsupported upgrade.
Please backup your data.

（途中は省略。。。）

testing upgrade transaction
rpm transaction 100% [========================================================]
rpm install 100% [========================================================]
setting up system for upgrade
Finished. Reboot to start upgrade.
```

成功！！！！！！

## 5. CentOSの再起動
CentOS 7を適用するために再起動します。
が、再起動後の CentOS 7 は `service` から `systemctl` にプロセス起動方式が変わるので、 sshd が起動しないとのこと。。。
再起動後に sshd が起動するように設定します。

```
# vi /etc/rc.d/rc.local

（最後に追加）
systemctl enable sshd && systemctl start sshd.service

# chmod +x /etc/rc.d/rc.local
```

再起動します！

```
# reboot

Broadcast message from hoge
	(/dev/pts/0) at 14:31 ...

The system is going down for reboot NOW!
```

## 6. アップグレードの確認
再起動したらCentOSのバージョンを確認します。

```
$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
```

ちゃんと CentOS 7 になっていました！！

# おまけ
ここからはプロジェクト固有の話となります。
もし関連する内容があればどうぞ。

## タイムゾーンを変更
デフォルトだとタイムゾーンがUTC（協定世界時）に設定されているので、JST（日本標準時）に変更しました。

```
# timedatectl set-timezone Asia/Tokyo
# date
2020年 12月 14日 月曜日 14:38:04 JST
```

## zabbix-agentの自動起動
アップグレード後、自動起動していた zabbix-agent が自動起動しなくなりました。。。
起動時に `/var/run/` に zabbix ディレクトリが作成されないようです。
起動時に `/var/run/zabbix` ディレクトリが自動で作成されるように設定しました。

```
vi /etc/tmpfiles.d/zabbix.conf

（新規追加）
#Type   Path                      Mode    UID       GID     Age  Argument
d       /var/run/zabbix           0755    zabbix    zabbix  -
```

## NTPの同期
バージョンアップ後、自動起動した NTP サービスから他サーバへの時刻同期処理ができなくなりました。。。
（手動で NTP サービスを停止・起動すると同期できるという状況でした。）

NTP サービスの起動時のログを確認します。

```
■自動起動時
12 Oct 07:43:11 ntpd[332]: Listen and drop on 0 v4wildcard 0.0.0.0 UDP 123
12 Oct 07:43:11 ntpd[332]: Listen and drop on 1 v6wildcard :: UDP 123
12 Oct 07:43:11 ntpd[332]: Listen normally on 2 lo 127.0.0.1 UDP 123
12 Oct 07:43:11 ntpd[332]: Listen normally on 3 lo ::1 UDP 123
12 Oct 07:43:11 ntpd[332]: Listening on routing socket on fd #20 for interface updates
12 Oct 07:43:11 ntpd[332]: Deferring DNS for mta01 1
12 Oct 07:43:11 ntpd[332]: Deferring DNS for mta02 1
12 Oct 07:43:11 ntpd[332]: 0.0.0.0 c016 06 restart
12 Oct 07:43:11 ntpd[332]: 0.0.0.0 c012 02 freq_set ntpd 31.109 PPM
12 Oct 07:43:11 ntpd[338]: signal_no_reset: signal 17 had flags 4000000
12 Oct 07:43:13 ntpd[338]: host name not found: mta01
12 Oct 07:43:13 ntpd[338]: host name not found: mta02
12 Oct 07:43:17 ntpd[332]: Listen normally on 4 eth0 10.0.xxx.xxx UDP 123
12 Oct 07:43:17 ntpd[332]: Listen normally on 5 eth0 fe80::4d2:72ff:fede:783b UDP 123
12 Oct 07:43:17 ntpd[332]: new interface(s) found: waking up resolver

■手動起動時
12 Oct 10:00:15 ntpd[2777]: Listen and drop on 0 v4wildcard 0.0.0.0 UDP 123
12 Oct 10:00:15 ntpd[2777]: Listen and drop on 1 v6wildcard :: UDP 123
12 Oct 10:00:15 ntpd[2777]: Listen normally on 2 lo 127.0.0.1 UDP 123
12 Oct 10:00:15 ntpd[2777]: Listen normally on 3 eth0 10.0.xxx.xxx UDP 123
12 Oct 10:00:15 ntpd[2777]: Listen normally on 4 lo ::1 UDP 123
12 Oct 10:00:15 ntpd[2777]: Listen normally on 5 eth0 fe80::4d2:72ff:fede:783b UDP 123
12 Oct 10:00:15 ntpd[2777]: Listening on routing socket on fd #22 for interface updates
```

うーん。。。
自動起動時は `Deferring DNS for mta01` と出力されているので、同期対象のサーバが見えていない模様。

どうも自動起動時は `eth0` の認識が少し遅れているように見えます。
これが原因なのだろうか。。。

`/usr/lib/systemd/system/ntpd.service` の設定を見てみます。

```
# vi /usr/lib/systemd/system/ntpd.service
[Unit]
Description=Network Time Service
After=syslog.target ntpdate.service sntp.service

[Service]
Type=forking
EnvironmentFile=-/etc/sysconfig/ntpd
ExecStart=/usr/sbin/ntpd -u ntp:ntp $OPTIONS
PrivateTmp=true

[Install]
WantedBy=multi-user.target
```

[Unit]の After の設定に `network.target` を追加します。

```
# vi /usr/lib/systemd/system/ntpd.service
[Unit]
Description=Network Time Service
After=syslog.target network.target ntpdate.service sntp.service
                           ↑（追加）

[Service]
Type=forking
EnvironmentFile=-/etc/sysconfig/ntpd
ExecStart=/usr/sbin/ntpd -u ntp:ntp $OPTIONS
PrivateTmp=true

[Install]
WantedBy=multi-user.target
```

変更を反映します。

```
# systemctl daemon-reload
```

自動起動時も時刻同期処理が正常に実行されるようになりました。

```
14 Oct 18:31:40 ntpd[583]: ntp_io: estimated max descriptors: 1024, initial socket boundary: 16
14 Oct 18:31:40 ntpd[583]: Listen and drop on 0 v4wildcard 0.0.0.0 UDP 123
14 Oct 18:31:40 ntpd[583]: Listen and drop on 1 v6wildcard :: UDP 123
14 Oct 18:31:40 ntpd[583]: Listen normally on 2 lo 127.0.0.1 UDP 123
14 Oct 18:31:40 ntpd[583]: Listen normally on 3 eth0 10.0.111.115 UDP 123
14 Oct 18:31:40 ntpd[583]: Listening on routing socket on fd #20 for interface updates
```

おしまい。