"convert2rhel"ツールでCentOSをRHELに変換する

## 1. はじめに
本エントリでは、EOLを迎えるCentOSをツールを利用してRHEL(Red Hat Enterprise Linux)に変換する方法について紹介します。特に環境には依存しませんが、検証のためAzure環境上で稼働するCentOS7に対してツールを実行した結果も共有します。
最後に参照URLなどまとめていますので、そちらもぜひ合わせてご確認ください。

### 1-1. CentOS EOLについてのおさらい
2020年末ごろ発表されて話題にもなった[CentOSのEOL](https://www.centos.org/centos-linux-eol)ですが、CentOS8はすでに2021/12/31にEOLとなっており、CentOS7も来年2024/06/30にEOL予定です。(CentOS9はリリースされません）
代わりに新しく[CentOS Stream](https://blog.centos.org/2020/12/future-is-centos-stream/)というプロジェクトが開始されることになりましたが、これは従来のCentOSとは少し位置づけが異なる点に注意が必要です。

RHELとの関係で言うと、これまでのCentOSはいわばdownstream cloneでした。つまり、RHELのリリースサイクルに後追いする形で同一リリースバージョンのソースを再構成して提供されており、RHEL同様に比較的安定して長期間運用することが可能でした。

一方、CentOS Streamはupstream branch、つまり開発用ブランチとしての位置づけとなります。随時最新パッケージのローリングリリースが行われるために、日常的に最新パッケージへ更新できる（更新しても問題のない）ユーザー向きのOSと捉えるのがよいでしょう。たとえば、従来CentOSでシステムを運用しており、一定のマイナーバージョンで入念に動作検証を行ってからデプロイしていたような利用者からすれば、リリースモデルの変更はリスク許容の点から懸念があるかもしれません。

## 2. 移行について
CentOSから移行をするにあたり、移行先のOS選定や移行方式についても簡単に整理します。

### 2-1. 移行先OSの選定
CentOSの移行先については、CentOS Stream以外にも要件に応じていくつかの選択肢があります。
1つには、もともとのupstreamとして位置づけられていたRHELがあげられます。本エントリではこの選択肢に基づき、実際にRHELへ移行する方法をこの後紹介していきます。

他にもAlma Linux/Rocky Linuxなどのコミュニティ系Linuxや、RHEL系以外でもUbuntu/Debianなどがあります。また、単純移行とはなりませんが、これを機にアプリケーションをコンテナ化してdocker/k8sなどのコンテナ環境へ移行するといった案も考えられます。

### 2-2. 移行方式の選択肢
移行の方式は大きく分類して２種類あり、１つは環境の再デプロイ、もう１つはツールを利用したin-place移行となります。

前者の再デプロイは、手動でOS設定やパッケージ導入などを行う方式です。移行先のOSがRHEL系であればOS構成での共通点も多いため、比較的容易に再構成ができると言えます。さらに、もともとの移行元OSがAnsible等で自動的に構成されていれば、手順の多くがAnsibleに委任できるため、この方法でも十分合理的です。

後者の、ツールの支援を活用したin-place移行についても考えていきます。移行先OSがRHEL系であれば、移行先OSのリポジトリやそこから提供されるパッケージをダウンロード・構成してkernelやgrub構成を切り替えて新しいOSに移行する、というのがツールを用いたin-place移行方式となります。2-1.で前述した移行先OSの例で言うと、[Rocky Linux](https://docs.rockylinux.org/guides/migrate2rocky/)、[Alma Linux](https://github.com/AlmaLinux/almalinux-deploy)、そして[RHEL](https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux/migration-process/convert2rhel-how-to-convert-from-centos-linux-to-red-hat-enterprise-linux)などでそれぞれ移行ツールが提供されています。本エントリでも、RHELにin-place移行を実行するツール"convert2rhel"を利用するお話をしていきます。

### 2-3. convert2rhelツールとは？
Red Hatが提供するOS移行ツールで、移行元の稼働中OSにツールをダウンロードして実行することで、RHEL用リポジトリへの切り替え、パッケージダウンロード、kernel/grub再構成を経て、最終的にはin-placeで（OSを稼働させたままで）RHELに変換が行われます。
ツールが適用できる移行元OSはCentOSだけではなく、Alma Linux, Rocky Linux, Oracle Linuxにも適用できます。

https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux/migration-process/convert2rhel-how-to-convert-from-centos-linux-to-red-hat-enterprise-linux

個人的に興味があったのでconvert2rhelパッケージの中のファイル構成を軽く見てみたのですが、主にpythonプログラムで構成されており、内部的にrpmモジュールなどを利用したりしているようでした。

後述もしますが、このツールで変換されないものも存在しますので注意してください。例として、OS管理ではない3rd partyパッケージやユーザが配置・作成したファイルやディレクトリはツールでの変換対象とはならずにskipされます。これはツール実行中にも表示されてskipすることの同意を求められます。これらについては、必ずしも移行先OSでも動作が保証されるとは限りませんので、移行後のテストはしっかり行う必要があるでしょう。

## 3. ツールの利用手順
以下では実際にconvert2rhelツールを使ってCentOSをRHELに変換する手順を紹介します。現状CentOS8はEOLになっているため、CentOS7.9をAzure上に展開しておいて、これをRHEL7.9に移行したいと思います。

### 3-1. 前提条件・事前準備
いくつか重要な前提条件をまとめておきます。詳細は[convert2rhelツールのドキュメント](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html-single/converting_from_an_rpm-based_linux_distribution_to_rhel/index)も合わせて参照ください。

- 移行元OSのマイナーバージョンは固定で、CentOSは7.9もしくは8.5のみが対象
- インターネットへの接続環境(ツール本体およびリポジトリからパッケージをダウンロードするため)
- RHELサブスクリプション

最後のRHELサブスクリプションの必要性について少し補足します。
移行先のOSがRHELの場合、当然ですがRHELのサブスクリプションが必要となります。convert2rhelツールの実行時にこのサブスクリプション情報を入力することになります。
開発・検証目的であれば評価版サブスクリプションやRed Hat Developer Subscriptionが利用可能ですので、事前に準備しておきましょう。Developer Subscriptionについては[こちらのブログ](https://rheb.hatenablog.com/try_products)がよくまとまっているので一読をおすすめします。

後は、言わずもがなですが、システムのバックアップはきちんと取得しておきましょう。転ばぬ先の杖、ですね。

### 3-2. 検証環境の情報
今回はAzure上の以下の環境で検証を行いました。convert2rhelはAzure以外でも実行可能ですが、Azure環境で実行した場合に固有の注意点もありますので後述したいと思います。
| product | version | note |
|---------|---------|--------|
| CentOS | 7.9 | Rogue Wage (旧OpenLogic) 提供のVMイメージ|
| convert2rhel | 1.5.0-2.el7.noarch | |

### 3-3. ツール実行手順

#### 1. 実行前のバージョンの確認
記録のため、実行前のOS/kernelのバージョン情報を確認しておきます。

```bash
$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
$ uname -r
3.10.0-1160.83.1.el7.x86_64
```

#### 2. VMを更新する
convert2rhelでは移行元のCentOSバージョンが7.9あるいは8.5である必要があります。また、それぞれのバージョンでkernelのバージョンも最新であることがツール実行時にチェックされますので、必要に応じてyum updateおよびrebootを実行してください。
以下の実行例では、kernelバージョンが3.10.0-1160.83.1だったものが、yum update & rebootにより3.10.0-1160.102.1の最新バージョンに更新されています。
```bash
$ sudo yum clean all
$ sudo yum –y update
$ sudo reboot
...
$ uname -r
3.10.0-1160.102.1.el7.x86_64
```

#### 3. Red Hat GPGキーとconvert2rhelリポジトリをインストール
convert2rhel用のリポジトリとRed Hat GPGキーをインストールします。
```bash
$ sudo curl -o /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release https://www.redhat.com/security/data/fd431d51.txt
$ sudo curl -o /etc/yum.repos.d/convert2rhel.repo https://ftp.redhat.com/redhat/convert2rhel/7/convert2rhel.repo
```

#### 4. convert2rhel のインストールとiniファイルの構成
リポジトリが設定されたのでyum installでツールをインストールしましょう。
ツールの実行前に移行後のRHELサブスクリプションの情報をini設定ファイルに構成しておきます。（ツール実行時にオプションで情報を渡すことも可能ですが、iniファイルに記載する方がより安全でしょう。）
```bash
$ sudo yum -y install convert2rhel
$ sudo vi /etc/convert2rhel.ini
```

iniファイルにサブスクリプションマネージャの情報を記載しておきます。アカウントに応じて以下２種類のうち、いずれかの記載をしておきます。
```bash
[subscription_manager]
org = <organization_ID>
activation_key = <activation_key>
``` 
こちらはRed Hatアカウント情報を記載する場合の例です。どちらかの方法で記載すればOKです。
```bash
[subscription_manager]
username = <username>
password = <password>
```

#### 5. convert2rhelツールの実行前診断(analyze)
移行を実行に移す前に変換前分析をすることができます。RHELに変換できるかどうかを判断するためテストが実行されて、分析レポートが出力されます。これを確認することで事前に移行が失敗する要因をチェックすることが可能です。
```bash
$ sudo convert2rhel analyze
```

#### 6. convert2rhelツールの実行
ここまで準備ができたら、いよいよツールを実行します。
3.のようにiniファイルにサブスクリプションマネージャの情報を記載せずに、ここで直接オプションに指定する方法も可能です。詳細は"convert2rhel -h"でオプション情報を確認してください。
```bash
$ sudo convert2rhel
```

途中で何度かユーザ確認が必要となりますので、適宜入力をしてください。また、ツール実行時のログは"/var/log/convert2rhel/convert2rhel.log"ファイルに出力されており、別途確認することが可能です。

以下はツール実行開始直後にデータ収集に関する承諾について聞かれたものです。ここでは y を入力して継続しています。
```bash
...
[2023-11-14T07:57:01+0000] TASK - [Prepare: Inform about telemetry] **********************************
The convert2rhel utility uploads the following data about the system conversion to Red Hat servers for the purpose of the utility usage analysis:
- The Convert2RHEL command as executed
- The Convert2RHEL RPM version and GPG signature
- Success or failure status of the conversion
- Conversion start and end timestamps
- Source OS vendor and version
- Target RHEL version
- Convert2RHEL related environment variables

To disable the data collection, use the 'CONVERT2RHEL_DISABLE_TELEMETRY=1' environment variable.

Continue with the system conversion? [y/n]:
```

Azure環境で実行している場合には、しばらくすると3rd partyパッケージのskipに関する警告が表示されます。これは、Azure環境ではいくつかの管理用エージェントが最初からインストールされているためです。

前述したように、これらの3rd partyパッケージは変換の対象外(CentOSからもRHELからも提供されないパッケージですので当然ですが）となります。ここでは y を押して変換作業を続行します。

```bash
...
[2023-11-14T08:49:48+0000] TASK - [Pre-conversion analysis report] ***********************************

========== Warning (Review and fix if needed) ==========
(WARNING) LIST_THIRD_PARTY_PACKAGES::THIRD_PARTY_PACKAGE_DETECTED_MESSAGE - Third party packages detected
     Description: Third party packages will not be replaced during the conversion.
     Diagnosis: Only packages signed by CentOS Linux are to be replaced. Red Hat support won't be provided for the
following third party packages:
    auoms-2.5.2-52.x86_64, omi-1.7.3-0.x86_64, scx-1.7.3-0.x86_64, omsconfig-1.3.0-0.x86_64,
WALinuxAgent-2.7.3.0-1_ol001.el7.noarch, omsagent-1.17.2-0.x86_64, azure-repo-svc-1.0-0.el7.centos.noarch
     Remediation: N/A

WARNING - ********************************************************
WARNING - The tool allows rollback of any action until this point.
WARNING - By continuing all further changes on the system will need to be reverted manually by the user, if necessary.
WARNING - ********************************************************

Continue with the system conversion? [y/n]:
```

変換作業が最終的に完了すると以下のような画面となります。
```bash
...
[2023-11-14T09:08:37+0000] TASK - [Final: Update GRUB2 configuration] ********************************
Backing up /boot/grub2/grub.cfg.
Backing up /boot/grub2/grubenv.
Successfully updated GRUB2 on the system.

[2023-11-14T09:08:40+0000] TASK - [Final: Remove temporary folder /var/lib/convert2rhel/] ************
Temporary folder /var/lib/convert2rhel/ removed

[2023-11-14T09:08:40+0000] TASK - [Final: Check kernel boot files] ***********************************
Checking if the '/boot/vmlinuz-3.10.0-1160.102.1.el7.x86_64' file exists.
Checking if the '/boot/initramfs-3.10.0-1160.102.1.el7.x86_64.img' file is valid.
The initramfs and vmlinuz files are valid.
Writing breadcrumbs to '/etc/migration-results'.
Writing RHSM custom facts to '/etc/rhsm/facts/convert2rhel.facts'.

[2023-11-14T09:08:42+0000] TASK - [Final: Update RHSM custom facts] **********************************
Updating RHSM custom facts collected during the conversion.
RHSM custom facts uploaded successfully.

Conversion successful!

WARNING - In order to boot the RHEL kernel, restart of the system is needed.
```

指示に従って一度OSをrebootします。
```bash
$ sudo reboot
```
OS起動後に、redhat-releaseファイルの内容を確認してみます。正しくRHEL7.9になっていることが確認できました。
興味があれば、この他に各種パッケージについてもRHEL用のものが導入されていることをyumコマンドで確認してもよいでしょう。
```bash
$ sudo cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.9 (Maipo)
```

#### 7. AzureのライセンスモデルをBYOSからPAYGに変更する(option)
この手順はAzure固有です。
AzureではVMの利用料金は原則的に従量課金モデル(PAYG: Pay As You Go)となりますが、ゲストOSがWindowsやRHELなどの場合にそのライセンス料についてもVMの料金に付加してPAYGで支払うことが可能です。

一方で、convert2rhelツールでは基本的に移行先RHELは利用者が所有する（持ち込みの）RHELサブスクリプション(BYOS: Bring Your Own Subscription)での稼働を前提としています。

ただし、Azureにおいてはこのライセンスモデル選択はVMデプロイ時あるいはデプロイ後にも変更が可能です。今回は最終的にRHELのサブスクリプション料金についても従量課金モデルに含めるようにしたいと思います。このため、[公式ドキュメント](https://learn.microsoft.com/ja-jp/azure/virtual-machines/linux/azure-hybrid-benefit-linux?tabs=ahbNewPortal%2CahbExistingPortal%2Clicenseazcli%2Crhelpaygreqs%2CrhelAzcliByosConv%2Cpaygclisingle%2Crhelpaygconversion%2Crhelcompliance#byos-to-payg-conversions)に記載の手順に従って、BYOSからPAYGモデルへの変更を実施していきます。

https://learn.microsoft.com/ja-jp/azure/virtual-machines/linux/azure-hybrid-benefit-linux?tabs=ahbNewPortal%2CahbExistingPortal%2Clicenseazcli%2Crhelpaygreqs%2CrhelAzcliByosConv%2Cpaygclisingle%2Crhelpaygconversion%2Crhelcompliance#byos-to-payg-conversions

PAYGモデルへ変換するためには、最初に仮想マシンに拡張機能(VM Extension)の導入が必要となります。以下の手順でAHBForRHEL拡張機能を仮想マシンに導入します。
なお、ここで実行するコマンドはRHELではなく仮想マシン自体を操作しますので、RHEL上ではなく外部から実行する点に注意してください。az CLIは事前にシェル実行環境にインストールしておくのも良いですが、本手順のみであればAzure PortalからのCloud Shellで実行する方が簡単ですのでおすすめです。

```bash
### 本コマンドは移行対象OSの外から実行します
$ resource_group="xxx" ## VMが属するリソースグループ名
$ vm_name="xxx" ## VM名
$ az vm extension set \
    --resource-group $resource_group \
    --vm-name $vm_name \
    --publisher Microsoft.Azure.AzureHybridBenefit \
    --name AHBForRHEL
```
 
次にライセンスモデルを変更します。ライセンスモデルの選択は[こちら](https://learn.microsoft.com/ja-jp/azure/virtual-machines/linux/azure-hybrid-benefit-linux?tabs=ahbNewPortal%2CahbExistingPortal%2Clicenseazcli%2Crhelpaygreqs%2CrhelAzcliByosConv%2Cpaygclisingle%2Crhelpaygconversion%2Crhelcompliance#operating-system-instructions-1)のドキュメントを参考にしてください。以下では例として、ベースリポジトリを表す"RHEL_BASE"を指定しています。
```bash
### 本コマンドは移行対象OSの外から実行します
$ az vm update \
    --resource-group $resource_group \
    --name $vm_name \
    --license-type RHEL_BASE
```

ライセンスモデル変更後、しばらくすると（手元の環境では5分程度）/etc/yum.repos.d/ディレクトリにリポジトリ情報が自動で追加されていることが確認できました。
※この追加されたリポジトリは[RHUI(Red Hat Update Infrastructure)](https://learn.microsoft.com/ja-jp/azure/virtual-machines/workloads/redhat/redhat-rhui)と呼ばれる、AzureでのRHEL PAYGイメージ用に提供されるリポジトリを指すものです。

```bash
$ ls -l /etc/yum.repos.d
total 416
-rw-r--r--. 1 root root   1900 Mar  7  2023 CentOS-Base.repo.rpmsave
-rw-r--r--. 1 root root   1359 Mar  7  2023 CentOS-CR.repo.rpmsave
-rw-r--r--. 1 root root    699 Mar  7  2023 CentOS-Debuginfo.repo.rpmsave
-rw-r--r--. 1 root root    682 Mar  7  2023 CentOS-Media.repo.rpmsave
-rw-r--r--. 1 root root   1531 Mar  7  2023 CentOS-Sources.repo.rpmsave
-rw-r--r--. 1 root root  10765 Mar  7  2023 CentOS-Vault.repo.rpmsave
-rw-r--r--. 1 root root    364 Mar  7  2023 CentOS-fasttrack.repo.rpmsave
-rw-r--r--. 1 root root    716 Mar  7  2023 CentOS-x86_64-kernel.repo.rpmsave
-rw-r--r--. 1 root root    332 Mar  7  2023 OpenLogic.repo
-rw-r--r--. 1 root root   2030 Mar  7  2023 OpenLogicCentOS.repo
-rw-r--r--. 1 root root    242 Oct 30 06:58 convert2rhel.repo
-rw-r--r--. 1 root root 351476 Nov  8 18:00 redhat.repo
-rw-r--r--. 1 root root  16474 Jul 31 14:47 rh-cloud-base.repo　★追加されたリポジトリファイル
```

#### 8. CentOSレポジトリの無効化
RHEL切り替え後はCentOSリポジトリは不要のため、無効化しておきます。以下はRogue Wave(旧OpenLogic)のCentOSの例ですが、実際にはyum.repos.dディレクトリ配下のrepoファイルの内容を参照しながら適宜repo_idを引数に指定してください。

```bash
$ sudo yum-config-manager --disable "openlogic base-openlogic updates-openlogic extras-openlogic"
```


## 4. まとめ
CentOSのEOLに際して、RHELへのin-place移行ができる"convert2rhel"ツールについて紹介しました。Azure環境の場合は、RHELのBYOS/PAYGライセンスモデルについても留意しましょう。適宜、以下の参考情報も確認ください。
EOLで困っている方に本エントリの内容が少しでも参考になれば幸いです。


## Appendix. 参考URL
https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux/migration-process/convert2rhel-how-to-convert-from-centos-linux-to-red-hat-enterprise-linux

https://techcommunity.microsoft.com/t5/linux-and-open-source-blog/how-to-convert-centos-linux-to-red-hat-enterprise-linux-on-azure/ba-p/3960735

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html-single/converting_from_an_rpm-based_linux_distribution_to_rhel/index