yamada-hakase’s blog

LinuxなどのOSSやクラウドについて

CentOSからOracle Linuxへスクリプトで簡単に移行する

1. どこに移行すべきか

各所で話題になっているように、CentOS 8からCentOS 8 Streamへの変更は大きな驚きや落胆をもって迎えられている。筆者自身も驚き、すぐに以下の記事を書いたところだ。

CentOS 7は2024年6月まで猶予はあるが、CentOS 8は2021年12月31日までだ。あと1年しか猶予がない。そこで考えられるのが以下の選択肢だ。

  1. CentOS Streamに移行する
  2. RHELに移行する
  3. Oracle Linuxに移行する
  4. Ubuntuに移行する
  5. 上記以外のLinuxディストリビューションに移行する

どれにするかは、それぞれの考えで選ぶべきだろう。CentOS Streamへの移行方法は、いろいろなところで語られているので、今回は以下のメリットがあるOracle Linuxへの移行方法を解説する。

1-1. 対象環境

※ 今回使用するcentos2ol.shスクリプトCentOS 6にも対応しているが、CentOS 6はサポートが切れているので説明しない。

2. Oracle Linuxへの移行方法

移行にはいろいろな方法があり、今回は下記Oracle Linux Blogで紹介しているcentos2ol.shを使用する。

実際に手を動かす前に「Oracle Linux: A better alternative to CentOS」をサクッと眺めてほしい。また、実際の移行方法はGithuboracle/centos2olに書かれている。

https://github.com/oracle/centos2ol

なお、このスクリプトは急に注目されているので、新しいIssues/Pull requestsが上がっている。そのため今後は、本記事の内容と違いが発生するかもしれない。

移行手順
移行の実行手順は以下のとおり。1から3の事前作業では複数のコマンドを実行する必要がある。しかし、4と5の移行作業は最小限のコマンドで実行できる。

  1. 制限事項の確認
  2. システムバックアップ(本文では省略)
  3. 移行元CentOSの事前準備
  4. 移行スクリプト実行
  5. 手動で実施する移行作業

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.

CentOSOracle LinuxYumリポジトリに直接もしくはプロキシ経由でアクセスできる必要がある。

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リポジトリRHELのCodeReady Builder相当)などを有効にしているときは、それに相当するリポジトリを有効にする必要がある。

※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. ベースリポジトリが有効になっていることを確認する

  1. ベースリポジトリが有効になっていることを確認する。次のようにリポジトリが表示されれば有効になっている。あとで使うので、有効になっているリポジトリをメモしておくこと。
# 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のみ)

  1. 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のみ)

  1. 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はデフォルトで有効化されているので注意が必要だ。

  1. 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. ブラウザを使う 以下のページからダウンロードして、適正なフォルダに配置する。 github-centos2ol.png

3-3-5. 残りの準備作業

  1. 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への移行を実施する。

  1. 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.移行スクリプトを実行して、CentOSOracle 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. 移行後の構成を確認する

  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

CentOSOracle 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を使うと、簡単にCentOSOracle Linuxへ変更できる。
  • 移行にかかる時間はサーバ1台当たり30分から90分程度。インストール済みパッケージ数やサーバー性能、回線速度に依存する。
  • インターネットのリポジトリに接続可能なこと(プロキシ経由OK)など、スクリプトにはいくつかの制約条件がある。
  • オンプレミスのベアメタルサーバーでデバイスドライバを追加している場合や、アンチウイルスソフトを導入しているときは、再起動に失敗する可能性があるので事前に調査する。

7. 参考資料