1. どこに移行すべきか
各所で話題になっているように、CentOS 8からCentOS 8 Streamへの変更は大きな驚きや落胆をもって迎えられている。筆者自身も驚き、すぐに以下の記事を書いたところだ。
CentOS 7のサポート終了期限2024年6月まで猶予はあるが、CentOS 8は2021年12月31日までだ。あと1年しか猶予がない。そこで考えられるのが以下の選択肢だ。
- CentOS Streamに移行する
- RHELに移行する
- Oracle Linuxに移行する
- Ubuntuに移行する
- 上記以外のLinuxディストリビューションに移行する
どれにするかは、それぞれの考えで選ぶべきだろう。CentOS Streamへの移行方法は、いろいろなところで語られているので、今回は以下のメリットがあるOracle Linuxへの移行方法を解説する。
- 無料で利用できるRHEL互換ディストリビューション
- RHELと同じ期間、アップデートパッケージを無償で利用できる
- 必要に応じてサポート契約でき、Red Hatエンタープライズ契約ほど規約が厳しくない
- 追加料金を払えば、通常より長いExtended Supportもある
1-1. 対象環境
- CentOS 7 / CentOS 8
- オンプレミスとパブリッククラウドの両方
※ 今回使用するcentos2ol.shスクリプトはCentOS 6にも対応しているが、CentOS 6はサポートが切れているので説明しない。
2. Oracle Linuxへの移行方法
移行にはいろいろな方法があり、今回は下記Oracle Linux Blogで紹介しているcentos2ol.shを使用する。
- Need a stable, RHEL-compatible alternative to CentOS? Three reasons to consider Oracle Linux →今回の発表に触発され、2020/12/12にポストされた公式ブログ。
- Switching from CentOS to Oracle Linux: a hands-on example →こちらは2020/12/15にポスト
実際に手を動かす前に「Oracle Linux: A better alternative to CentOS」をサクッと眺めてほしい。また、実際の移行方法はGithubのoracle/centos2olに書かれている。
なお、このスクリプトは急に注目されているので、新しいIssues/Pull requestsが上がっている。そのため今後は、本記事の内容と違いが発生するかもしれない。
移行手順
移行の実行手順は以下のとおり。1から3の事前作業では複数のコマンドを実行する必要がある。しかし、4と5の移行作業は最小限のコマンドで実行できる。
- 制限事項の確認
- システムバックアップ(本文では省略)
- 移行元CentOSの事前準備
- 移行スクリプト実行
- 手動で実施する移行作業
2. 制限事項の確認
このツールの制限事項を確認しよう。英文と合わせて書いているが一部内容を補足している。スクリプトと同様に更新頻度が高いので、原文をチェックすることを推奨する。
Limitations
1.The script currently needs to be able communicate with the CentOS and Oracle Linux yum repositories either directly or via a proxy.
CentOSとOracle LinuxのYumリポジトリに直接もしくはプロキシ経由でアクセスできる必要がある。
2.The script currently does not support instances that are registered to a third-party management tool like Spacewalk, Foreman or Uyuni.
Spacewalkのようなパッケージ集中管理ツールの管理下になっていないこと。
3.Compatibility with packages installed from third-party repositories is expected but not guaranteed. Some software doesn't like the existence of an /etc/oracle-release file, for example.
CentOSの公式リポジトリ以外からインストールしたパッケージがあるときは動作保証しない。例えば、商用パッケージなどは/etc/oracle-releaseがあると動作に支障を来すことがある。おそらくEPELやRemi、ELrepoなどは大丈夫。
4.Packages that install third-party and/or closed-source kernel modules, e.g. commercial anti-virus products, may not work after switching.
サードパーティソフトやクローズドソースのカーネルモジュールを使っていると、移行後に動作しない可能性がある。具体的には、アンチウイルスソフトのリアルタイム監視モジュールや、HWベンダが提供するデバイスドライバなどだ。これらのカーネルモジュールはリリース番号まで完全に一致しないと動作しないことが多い。
5.The script only enables the base repositories required to enable switching to Oracle Linux. Users may need to enable additional repositories to obtain updates for packages already installed (see issue #1).
centos2ol.shはCentOSのベースリポジトリだけが有効になっているシステムを対象にしている。そのため追加リポジトリからパッケージをインストールしている場合は、リポジトリを追加で有効にする必要がある可能性がある。
※PowerToolsはサードパーティーリポジトリではないので有効にしたままでも問題なさそう。
3. 移行元CentOSの事前準備
事前準備では、移行スクリプトを実行する条件を整える。
なお、事前準備作業には管理者権限が必要だ。そのためコマンドの前にsudo
を前につけるか、su
してrootユーザーで実行する必要がある。前者が推奨だが、見た目の簡潔さを重視してsudo
を省略している。運用方法に応じて適宜読み替えてほしい。
また、CentOS 8はyum
ではなくdnf
だが、上位互換性があるのでyum
に統一する。互換性がない部分だけ別に書くことにする。
重要
本文では触れないが、万が一のトラブルに備えて必ずシステムバックアップを取得すること。
3-1. 問題があるパッケージの有無を確認する
上記の**「制限事項4」**に該当するパッケージがインストールされていないことを確認する。なお、RPMを使わずにソースからインストールしているときは、今回説明する方法では判断できない。そのときは構築担当者に聞いてほしい。
注意するパッケージは、CentOSのリポジトリに含まれていないデバイスドライバやアンチウイルスソフトなどのカーネルモジュールだ。
そこで、CentOS以外のリポジトリからインストールしているパッケージを確認する。確認には、おもに次の方法がある。それぞれについて説明する。
- RPMのVendorに着目する
- インストール元リポジトリ名に着目する
- VendorがCentOS以外のパッケージを確認する。
# rpm -qa --qf '%{NAME}-%{VERSION}-%{RELEASE}\t%{VENDOR}\n' | grep -v "CentOS"
次の例ではEPEL(Fedora Project)からインストールしたパッケージがある。しかし、htopはユーザー空間で動作するアプリケーションなので問題ない。問題があるのはデバイスドライバなどのカーネルモジュールだ。
epel-release-8-9.el8 Fedora Project
gpg-pubkey-2f86d6a1-5cf7cefb (none)
gpg-pubkey-8483c65d-5ccc5b19 (none)
htop-2.2.0-6.el8 Fedora Project
ただし**「制限事項3」**にあるように、サードパーティアプリケーションは問題になる可能性がある。
2.CentOS Plusカーネルなど、baseやupdates以外からインストールしてるカーネルがあるときは、yum remove
で削除する。
# rpm -qa kernel* --qf '%{NAME}-%{VERSION}-%{RELEASE}\t%{VENDOR}\n' | grep -v "CentOS"
3.インストール元リポジトリ名に着目し、デフォルト以外のリポジトリからインストールしたものを表示する。ただし、list installed
では、パッケージ名やバージョン番号が長いと、行の途中で折り返され、問題ないパッケージも表示されることがある。基本的には1の方法を信頼してほしい。
yum list installed | grep -v @anaconda | grep -v @base | grep -v @updates | grep -v @extras
dnf list installed | grep -v @anaconda | grep -v @Base | grep -i -v @AppStream | grep -v @extras
4.次にカーネルバージョンに依存したカーネルモジュール(ドライバ類)がインストールされていないか確認する。完璧な方法はないが、今回はカーネルと同じバージョン番号がついたパッケージを調べている。
# uname -r
4.18.0-147.el8.x86_64
以下の例は、いずれもベースリポジトリからインストールしたものなので問題ない。anacondaやupdatesは、いずれもベースリポジトリだ。
# yum list installed | grep 4.18.0-147
kernel.x86_64 4.18.0-147.el8 @anaconda
kernel-core.x86_64 4.18.0-147.el8 @anaconda
kernel-modules.x86_64 4.18.0-147.el8 @anaconda
3-2. ベースリポジトリが有効になっていることを確認する
- ベースリポジトリが有効になっていることを確認する。次のようにリポジトリが表示されれば有効になっている。あとで使うので、有効になっているリポジトリをメモしておくこと。
# yum repolist
repo id repo name status
base/7/x86_64 CentOS-7 - Base 10,072
extras/7/x86_64 CentOS-7 - Extras 448
updates/7/x86_64 CentOS-7 - Updates 778
repo id repo name
AppStream CentOS-8 - AppStream
BaseOS CentOS-8 - Base
extras CentOS-8 - Extras
ヒント
CentOS 8のPowerToolsリポジトリは、Oracle Linux 8のol8_codeready_builderリポジトリに相当する。
2.次のようにrepolist
からrepo id
の間に、「This system is」で始まる文字が表示されたときは、Spacewalkなどのパッケージ管理システムの配下になっている。移行スクリプトは使えないので、無効にするか、スクリプトの利用を断念する。
# yum repolist
...
This system is receiving updates from Red Hat Satellite or Spacewalk server
repo id repo name
3.リポジトリが表示されないときは、リポジトリが無効になっているか、プロキシ等の設定が不足している可能性がある。リポジトリを有効にする方法は次のとおり。プロキシの設定は/etc/yum.conf
を確認してほしい。
# yum-config-manager --enable base updates extras
# dnf config-manager --enable BaseOS AppStream extras
4.CentOS以外のリポジトリが有効になっているときは無効にする。無効にしたリポジトリは移行後に有効にする。次の例ではEPELリポジトリを無効にしている。
# yum-config-manager --disable epel
# dnf config-manager --disable epel
ヒント
ソースを読む限り、以下のリポジトリは有効のままでも自動的に移行してくれそうだ。しかし、十分にテストしていないので、判断はみなさんにお任せする。
CentOSバージョン | リポジトリ |
---|---|
7 | epel base-debuginfo centos-ceph-jewel centos-gluster* entos-nfs-ganesha30 centos-ovirt* centos-sclo-* |
8 | epel HighAvailability PowerTools centos-release-nfs-ganesha28 centos-gluster* |
3-3. 自動アップデートを無効にする
移行作業中に自動アップデートが動作すると正常に動作しないので無効にする。CentOSの自動アップデート機能には次の2種類がある。
- yum-cronやdnf-automaticなど
- デスクトップ環境に組み込まれたPackagekit
デスクトップをインストールしていないときは前者だけを気にすればよい。しかし、デスクトップをインストールしているときは両方を意識する必要がある。
CentOS 7 | CentOS 8 | |
---|---|---|
サービス | yum-cron | dnf-automatic |
GUIデスクトップ | Packagekit | Packagekit |
CentOS 7とCentOS 8について、それぞれ解説する。
3-3-1. yum-cronを無効にする(CentOS 7のみ)
- yum-cronがインストールされているか確認する。インストールされていないときは「3-2-3. Packagekitを無効にする」に進む。
# rpm -qa | grep yum-cron
★何も表示されなければインストールされていない。
2.インストールされているときは起動しているか確認する。次の例では、自動起動が有効で、サービスも起動している。
# systemctl is-enabled yum-cron
enabled ★自動起動有効
# systemctl status yum-cron
● yum-cron.service - Run automatic yum updates as a cron job
Loaded: loaded (/usr/lib/systemd/system/yum-cron.service; enabled; vendor preset: disabled)
Active: ★active (exited) since Tue 2020-12-15 08:38:03 GMT; 5min ago
Process: 18679 ExecStart=/bin/touch /var/lock/subsys/yum-cron (code=exited, status=0/SUCCESS)
Main PID: 18679 (code=exited, status=0/SUCCESS)
Dec 15 08:38:03 centos7 systemd[1]: Starting Run automatic yum updates as a.....
Dec 15 08:38:03 centos7 systemd[1]: Started Run automatic yum updates as a ...b.
Hint: Some lines were ellipsized, use -l to show in full.
3.yum-cronが起動しているときは、サービスを停止して自動起動もオフにする。
# systemctl disable yum-cron --now
3-3-2. dnf-automaticを無効にする(CentOS 8のみ)
- dnf-automaticがインストールされているか確認する。インストールされていないときは「3-2-3. Packagekitを無効にする」に進む。
# rpm -qa | grep dnf-automatic
★何も表示されなければインストールされていない。
2.インストールされているときはタイマーの設定を確認する。次の例では、自動ダウンロードが有効になっている。
# systemctl list-unit-files --type=timer | grep dnf-auto
dnf-automatic-download.timer enabled ★ダウンロードのみ自動
dnf-automatic-install.timer disabled
dnf-automatic-notifyonly.timer disabled
dnf-automatic.timer disabled
3.enableになっているタイマーをすべて無効にする。
# systemctl disable dnf-automatic-download.timer --now
3-3-3. Packagekitを無効にする(CentOS 7/8共通)
GUIデスクトップ環境をインストールしているときは、Packagekitによるアップデートを無効化する。yum-cronやdnf-automaticは自動インストールされないが、デスクトップ環境がインストールされているときはPackagekitはデフォルトで有効化されているので注意が必要だ。
- packagekitのステータスを確認する。
# systemctl status packagekit
● packagekit.service - PackageKit Daemon
Loaded: loaded (/usr/lib/systemd/system/packagekit.service; static; vendor preset: disabled)
Active: active (running) ★起動 since Tue 2020-12-15 09:31:27 GMT; 59s ago
Main PID: 21960 (packagekitd)
Tasks: 3
CGroup: /system.slice/packagekit.service
└─21960 /usr/libexec/packagekitd
Dec 15 09:31:26 centos7 systemd[1]: Starting PackageKit Daemon...
Dec 15 09:31:27 centos7 PackageKit[21960]: daemon start
Dec 15 09:31:27 centos7 systemd[1]: Started PackageKit Daemon.
● packagekit.service - PackageKit Daemon
Loaded: loaded (/usr/lib/systemd/system/packagekit.service; static; vendor preset: disabled)
Active: inactive (dead) ★停止
Dec 15 09:31:26 centos7 systemd[1]: Starting PackageKit Daemon...
Dec 15 09:31:27 centos7 PackageKit[21960]: daemon start
Dec 15 09:31:27 centos7 systemd[1]: Started PackageKit Daemon.
Dec 15 09:33:36 centos7 systemd[1]: Stopping PackageKit Daemon...
Dec 15 09:33:36 centos7 systemd[1]: Stopped PackageKit Daemon.
Unit packagekit.service could not be found.
2.packagekitが起動しているときは、サービスを停止して自動起動もオフにする。
# systemctl disable packagekit --now
3-3-4.スクリプトをダウンロードする
移行スクリプトをダウンロードする方法は複数ある。いずれの場合でも、スクリプトを実行するsudo
が可能なユーザーを使用すること。
A. curlを使う
プロキシ環境では--proxy
オプションやhttps_proxy
環境変数でプロキシサーバを指定すること。
$ curl -O https://raw.githubusercontent.com/oracle/centos2ol/main/centos2ol.sh
B. gitを使う
gitがインストールされていないときは、事前にyum install git
でgitをインストールする。プロキシに関してはgitも同様。
$ git clone https://github.com/oracle/centos2ol.git
C. ブラウザを使う
以下のページからダウンロードして、適正なフォルダに配置する。
3-3-5. 残りの準備作業
- Yumのキャッシュをクリアする。
# yum clean all
2./var/cache
に5GB以上の空き容量があることを確認する。空きがないときはLVMを駆使してなんとかする。
# df -h /var/cache
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 30G 1.7G 28G 6% / ★この例では28GB空いている
4. Oracle Linuxへの移行
すべての準備が整ったのでOracle Linuxへの移行を実施する。
- git cloneしたディレクトリでは、centos2olディレクトリ配下にスクリプトがダウンロードされている。
$ ls -F
centos2ol/
2.centos2ol.sh
がスクリプト本体である。
$ cd centos2ol/
$ ls
centos2ol.sh CONTRIBUTING.md LICENSE.txt README.md SECURITY.md
$ wc -l centos2ol.sh
514 centos2ol.sh ★このときは514行ある
3.移行スクリプトを実行して、CentOSをOracle Linuxに切り替える。なお、実行にかかる時間は、インストールされているパッケージ数や回線速度、マシン性能に依存する。わたしが試した環境では30分から90分くらいだった。
sudo bash centos2ol.sh
4.実行が終了すると、以下の行が表示される。
Switch complete. Oracle recommends rebooting this system.
5.指示通りにシステムを再起動する。
$ sudo systemctl reboot
トラブルシュート
移行スクリプトの初期段階では、移行用repoファイル生成している。そのため途中でスクリプトが異常終了すると、repoファイルが中途半端な状態になる可能性がある。そのときは次のコマンドを実行して修復すること。
cd /etc/yum.repos.d
sudo rm switch-to-oraclelinux.repo
sudo rename repo.disabled repo *disabled
5. 移行後の作業
移行スクリプトのおもな挙動は以下のとおり。いくつか確認してみよう。
- CentOSのパッケージはOracle Linuxのパッケージに置き換えられる
- 置き換えでは、同じバージョンではなく最新のバージョンになる
- UEKカーネルがデフォルトカーネルになる
5-1. 移行後の構成を確認する
- /etc/oracle-releaseが追加され、/etc/centos-releaseは削除されている。
$ cat /etc/oracle-release
Oracle Linux Server release 8.3
$ cat /etc/centos-release
cat: /etc/centos-release: No such file or directory
2.現在のカーネルを確認すると、Oracle Linux専用のUEK(Unbreakable Enterprise Kernel)に変更されている。UEKとRed Hat互換カーネル(RHCK:Red Hat Compatible Kernel)は、ユーザー空間で動作する通常のアプリケーションは互換性がある。
$ uname -r
5.4.17-2036.101.2.el8uek.x86_6
3.VendorがCentOSのパッケージを調べてみた。すると、現在利用していないカーネルだけが表示された。CentOS 8では、このようにほとんど置き換わったが、CentOS 7では半分くらいが置き換わらなかった。glibcやkernelではないので特に問題はないだろう。今後のスクリプトで改良されるかもしれない。
$ rpm -qa --qf '%{NAME}-%{VERSION}-%{RELEASE}\t%{VENDOR}\n' | grep CentOS | sort -n
kernel-4.18.0-147.el8 CentOS
kernel-4.18.0-193.14.2.el8_2 CentOS
kernel-core-4.18.0-147.el8 CentOS
kernel-core-4.18.0-193.14.2.el8_2 CentOS
kernel-modules-4.18.0-147.el8 CentOS
kernel-modules-4.18.0-193.14.2.el8_2 CentOS
4.カーネル関連パッケージとベンダを表示する。ベースリポジトリのパッケージは最新化されるので、RHCKは最新のOracle Linux版と、元のCentOS版がインストールされている。
$ rpm -qa --qf '%{NAME}-%{VERSION}-%{RELEASE}\t%{VENDOR}\n' | grep kernel- | sort -n
kernel-4.18.0-240.1.1.el8_3 Oracle America ★最新のRHCK
kernel-4.18.0-240.el8 CentOS ★元のカーネル
kernel-core-4.18.0-240.1.1.el8_3 Oracle America
kernel-core-4.18.0-240.el8 CentOS
kernel-headers-4.18.0-240.1.1.el8_3 Oracle America
kernel-modules-4.18.0-240.1.1.el8_3 Oracle America
kernel-modules-4.18.0-240.el8 CentOS
kernel-tools-4.18.0-240.1.1.el8_3 Oracle America
kernel-tools-libs-4.18.0-240.1.1.el8_3 Oracle America
kernel-uek-5.4.17-2036.101.2.el8uek Oracle America ★最新のUEK
5.有効になっているリポジトリを確認する。Oracle Linuux用に置き換わっていることが分かる。
# yum repolist
repo id repo name status
ol7_UEKR6/x86_64 Latest Unbreakable Enterprise Kernel Release 6 for Orac 204
ol7_latest/x86_64 Oracle Linux 7Server Latest (x86_64) 21394
repolist: 21598
repo id repo name
ol8_UEKR6 Latest Unbreakable Enterprise Kernel Release 6 for Oracle Linux 8 (x86_64)
ol8_appstream Oracle Linux 8 Application Stream (x86_64)
ol8_baseos_latest Oracle Linux 8 BaseOS Latest (x86_64)
ヒント
Oracle Cloud Infrastructureで移行スクリプトを実行したところ、クラウド用のリポジトリ構成になっていた。
6.リポジトリのrepoファイルを確認すると、CentOSのものは.disable
という接尾辞が付けられ無効になっている。実際には.repo
以外は無視される。
# ls /etc/yum.repos.d
CentOS-Linux-AppStream.repo.disabled
CentOS-Linux-BaseOS.repo.disabled
CentOS-Linux-ContinuousRelease.repo.disabled
CentOS-Linux-Debuginfo.repo.disabled
CentOS-Linux-Devel.repo.disabled
CentOS-Linux-Extras.repo.disabled
CentOS-Linux-FastTrack.repo.disabled
CentOS-Linux-HighAvailability.repo.disabled
CentOS-Linux-Media.repo.disabled
CentOS-Linux-Plus.repo.disabled
CentOS-Linux-PowerTools.repo.disabled
CentOS-Linux-Sources.repo.disabled
oracle-linux-ol8.repo
uek-ol8.repo
5-2. スクリプト対象外の残作業
最後に、スクリプトが実行しない残作業を実施する。
1.「3-2」のリポジトリの確認で、事前にリポジトリを無効にしたときは元に戻す。
# yum-config-manager --enable リポジトリID
# dnf config-manager --enable リポジトリID
CentOSとOracle Linuxのリポジトリ比較表は以下のとおり。CentOSのextrasに相当するリポジトリは無い。
CentOS 7 | Oracle Linux 7 |
---|---|
base updates |
ol7_latest |
centos-ceph-jewel | oracle-gluster-release-el7 |
centos-gluster* entos-nfs-ganesha* |
oracle-gluster-release-el7 |
centos-ovirt* | oracle-ovirt-release-el7 |
centos-sclo-sclo centos-sclo-rh |
oracle-softwarecollection-release-el7 |
CentOS 8 | Oracle Linux 8 |
---|---|
BaseOS | ol8_baseos_latest |
AppStream | ol8_appstream |
HighAvailability | ol8_addons |
PowerTools | ol8_codeready_builder |
centos-release-nfs-ganesha* | oracle-gluster-release-el8 |
centos-gluster* | oracle-gluster-release-el8 |
2.アップデート可能なパッケージがあるか確認する。あるときはアップデートを検討する。
# yum check-update
3.デフォルトカーネルをRHCKに変更するときは、以下のエントリを参考にすること。
6. おわりに
当初の想定より大作になったが、スクリプトの前提条件を満たしたときの移行作業は簡単なことが分かっただろう。現時点では、スクリプトも十分読める範囲の長さだ。不具合があればGithubで報告してみてはどうだろう。
まとめ
- 移行スクリプトcentos2ol.shを使うと、簡単にCentOSをOracle Linuxへ変更できる。
- 移行にかかる時間はサーバ1台当たり30分から90分程度。インストール済みパッケージ数やサーバー性能、回線速度に依存する。
- インターネットのリポジトリに接続可能なこと(プロキシ経由OK)など、スクリプトにはいくつかの制約条件がある。
- オンプレミスのベアメタルサーバーでデバイスドライバを追加している場合や、アンチウイルスソフトを導入しているときは、再起動に失敗する可能性があるので事前に調査する。