CentOS Linux 8のEOLと対応策の検討 (前編)

この記事は、2022年3月11日(金)に行われたオープンソースカンファレンス2022 Online/Springにおける発表を編集部にて記事化したものです。

はじめに

さくらインターネットの前佛と申します。「CentOS Linux 8のEOLと対応策の検討」というテーマで発表させていただきます。補足資料が下記のURLにあります。参考になると思いますので、併せてご覧ください。
https://bit.ly/osc22on-centos

発表の流れ


発表の流れとしては、まず一つ目は「CentOS 8は終わってます」って話です。そして実際どうしたらいいんだろうっていうところで、いくつかの選択肢を考えてみましょうとか、現実的にどうしましょうかっていう話ですね。あと、移行スクリプトが提供されてるものがありますので、それを使って今のCentOS 8の環境を別の環境に延命する方法もご紹介したいと思っています。

後半では、そもそもCentOSは今どんな状況にあるのかとか、第3の道としてコンテナを使った、クラウドネイティブに対応したアプリケーションの移行という話もしたいなと思っています。

CentOS 8はEOL

まずはじめに、CentOS 8はEnd of Life(EOL)になってしまったという話です。

このニュースが出たのは2020年の12月です。突然「CentOS 8が終わりますよ」というアナウンスがCentOSのブログで出まして、その頃も「いやーこれ本当にどうするんだよ」という話がいろんな界隈であって騒がしかったような記憶がありますけども、気がつけばそのEnd of Lifeをとうとう迎えてしまいました。去年、つまり2021年の12月31日で終わっています。

ですので、今現在、このCentOSの環境上で、dnfコマンドとかyumコマンドを使おうとしますと、上の画像のようなエラーが出てしまいます。皆さんのお手元の環境でも、何も対策していないCentOSがあれば、すでにコマンドが使えなくなってしまっています。

とりあえずの対策:リポジトリを書き換える

ではどうするかと言いますと、/etc/yum.respos.d/ 以下に設定ファイルがあります。このファイルの中で、ミラーサイトの参照先が「mirror.centos.org」となっているのを、すべて「vault.centos.org」という、昔からのアーカイブを置いているサイトに変更する必要があります。これは必須の作業です。エディタでファイルを編集してもいいですが、下のようにsedを使って書き換えるのが楽な方法かと思います。その後、dnf updateを実行すると、ひとまずCentOS 8.5相当にバージョンアップされます。

sed -i -r \
    -e 's!^mirrorlist=!#mirrorlist=!' \
    -e 's!^#?baseurl=http://(mirror|vault).centos.org/\$contentdir/\$releasever/!baseurl=https://dl.rockylinux.org/vault/centos/8.5.2111/!i' \
    /etc/yum.repos.d/CentOS-*.repo

dnf update

皆さんのお手元にCentOS 8の環境があったとすると、今はもうどんなアップデートコマンドも受け付けなくなってます。このあとご紹介する移行スクリプトを使うときにも、必ずこちらの作業が必要になります。もしくは何らかの理由があってCentOS 8の環境を今後も使う必要がある場合も、やはり上記のリポジトリ書き換え作業が必須になります。

何はともあれ、ひとまずコマンドが打てなくて詰んだというときは、この手順を実行していただければと思います。

CentOS 8はどうしたらよいか

ここからは、CentOS 8はどうしたらよいかっていう部分をいくつか考えていきたいと思います。

差し迫った課題としては、CentOS 8はもう変えるしかないっていうところですね。こちらにいくつか選択肢を書いてあります。

1つはRed Hat Enterprise Linux 8を導入する方法です。もともと、CentOSはRed Hat Enterprise Linux(RHEL)から派生したものという位置づけですので、仕事で使ってる場合であれば素直にRHELのライセンスを購入するのがいいのかなと個人的には思います。

そこまでじゃないけども、ひとまず今動いているCentOS 8の環境を何とかしたいという方は、2番目にありますCentOS Stream 8、こちらは2024年まで使えますので、いったん今の環境を延命する措置としてCentOS Streamに移行する方法はあると思います。このCentOS Streamとは何かというのは後ほど説明します。

それから、3番目の選択肢として、このCentOS系の流れとは別のRHEL派生ディストリビューションを使う方法もあります。1つはコミュニティ系として出ているAlmaLinuxとかRocky Linuxと呼ばれるものですね。日本語でも情報がちらほら出始めています。もう1つは商用サポートがあるもので、MIRACLE LINUXとかOracle Linuxなどが挙げられると思います。

あとは、この機会にその他のディストリビューションに移行するという方法もあるかもしれません。

それから5番目、これは正直なところハードルが高いとは思うんですけども、この機会にすべての過去の環境を捨て去って、コンテナ化とかクラウドネイティブな環境に移行するのも1つかもしれません。

現実問題と向き合う

とはいえ、現実的にどれを選ぶのがいいかというと、結構選択肢は狭められてくるんですよね。

有償サポートを受ける

1つ目、業務で動いていて、かつそれが仕事で受けて運用しているものであれば、たぶん何らかの形での有償サポートを受けざるを得ないような状況かなと思います。規模感にもよるとは思うんですけども、基本的に仕事で使ってるんだったらこちらを選ばざるを得ないんだろうなと思います。

代替ディストリビューションを検討

一方、そこまでの規模感ではないものの、開発用途とか個人のVPSとかクラウドのサーバ上で動いているのであれば、ひとまずはCentOSの代替ディストリビューションを探すのが手っ取り早いかなと思います。例えばCentOS StreamとかAlmaLinuxとかRocky Linuxとか、これらのディストリビューションにつきましては、すべてCentOSからの移行用スクリプトが公開されています。ですので、インターネットにつながっている環境であれば、ひとまず現在のCentOSの環境をできるだけ温存しつつ転換できるかもしれないという道が残されています。

他のディストリビューションを検討

とはいえ、結局どのディストリビューションもいずれ終わりがきますので、この機会に他のディストリビューションを検討しなくてはいけないっていうのも現実的な課題としてあるかと思います。しかし、これまでCentOS系やRHEL系に慣れた方が別ディストリビューションに移るには新しく勉強するコストが発生しますので、新しいチャレンジをするのか、悩ましいところかなと思います。

ちなみに私も結構悩んでいます。個人的なサーバとしてはCentOSの環境をもう10年以上使ってましたので、いやーどうしようかなと悩みつつあるところです。いくつかのサーバごとに用途を分けてまして、ある環境はCentOS Streamに移行しましたし、特定の環境はAlmaLinuxとかRocky Linuxとか、どのような環境も試せるような余地を残すために、いくつかの環境に分散して動かしているのが現状です。

死んだふりをする

あとは、現実問題としては「死んだふりをする」ってのも、もしかしたらしなきゃいけないのかなと思います。いったん動き始めた環境、特にインターネット上に置いてるものに手を加えるのは結構勇気がいります。

CentOS 8終了の発表があった2021年の頭ぐらいであれば、よーし環境構築するぞっていう時間もあったんですけども、今この時点でもうCentOS 8は使えなくなってしまってますので、どうしましょうかっていう部分は結構皆さん悩ましいのかなと思います。

インターネットに接続してないローカル環境であればCentOS 8のままでもいいかなとは思うんですけども、クラウドとかいわゆるインターネット上の環境に出ているところにつきましては、ちょっとさすがに死んだふりはできないのかなと。何らかの対策は必要かなといったところです。

CentOS 8に対応している移行スクリプト

では移行をどうするかですが、現実的なところとしては、ひとまず何らかの移行スクリプトを使ってCentOS 8から移行するというのが必要かなと思っています。スライドに掲げたディストリビューションについては移行スクリプトが提供されていますので、実際に移行できますよというところを、デモ画面を通してお見せしようと思います。

リポジトリを書き換えてOSをアップデート

上の画面、ホスト名がcentos83になっていますが、/etc/redhat-releaseファイルでバージョンを確認してみると、確かにCentOS 8.3になっています。この環境はOSをインストールした後はまったく手を入れていない環境でして、この環境で例えばdnfでhttpdをインストールしようとしてもダウンロードに失敗しましたとか、dnf updateも何もできない状態になってしまってます。

なぜかと言いますと、先ほども説明したように、/etc/yum.repos.d/ の中にCentOSのリポジトリが記述されていますが、これが古いままだと全然動きません。

sedでリポジトリを書き換えてdnf updateを実行

ではどうするかといいますと、先ほども説明しましたが、リポジトリを書き換えてあげる必要があります。vaultというリポジトリに書き換えるとdnf updateがかかるようになります。dnf updateがかかると、この古かったCentOS8.3の環境もひとまず8.5、つまりCentOS 8系の現時点の最新版までアップデートすることができます。何も知らずにCentOS 8の環境が残ったままになっていると、これは詰んだかなと思うかもしれませんが、ひとまずこんな感じでコマンドが打てるようになりますのでご安心ください。

CentOS Streamへの移行

そして、このアップデートをした後はどうなるかといいますと、上記のようにCentOS 8.5の環境にアップデートされます。そしてこの状態であれば、先ほどご紹介したCentOS Streamへの移行スクリプトとか、AlmaLinuxやRocky Linuxへの移行スクリプトなどを動かすことができます。

どうやるかといいますと、いわゆるCentOS系の流れを汲むものであれば、dnfコマンドを使ってリポジトリを切り替えることができます。

dnfコマンドを使ってリポジトリを切り替え

dnf --disablerepo '*' --enablerepo extras swap centos-linux-repos centos-stream-repos --allowerasing

−−disablerepo '*' でいったんすべてのリポジトリを無効化しつつ、−−enablerepo でいくつかのリポジトリを有効化すると使える感じですね。

リポジトリの切り替え完了。centos-linux-reposを削除してcentos-stream-reposをインストールしている

実行結果をご覧の通り、CentOS Linuxというのをざっくり削除して、CentOS Streamの方に入れ替えるという、結構荒業チックなことをやることができます。コマンドが一瞬で終わるので、本当に変わったのかな?って感じがしますね。

あとは以下のコマンドを打つと、ざっくり換えてくれるそうです。

dnf distro-sync

このコマンドはすでにCentOS Streamの方のリポジトリを見ていますので、コマンドを打った後は放置しておくと、ざっくり環境が切り替わってくれるはずです。

こんな感じで、移行そのものは意外とスムーズに行きます。この手のスクリプトって面倒くさそうな印象があると思いますが、割と簡単に動かすことができます。

AlmaLinuxへの移行

AlmaLinuxへの移行スクリプト実行中

AlmaLinuxやRocky Linuxへの移行も簡単にできますので、画面でご紹介します。同じようなCentOSの環境がここにありますので、これをAlmaLinuxに換えてみましょう。AlmaLinuxの場合も、やはり移行用のスクリプトが準備されています。以下の手順で移行スクリプトをダウンロードして実行すると、勝手に切り替えてくれます。

curl -O https://raw.githubusercontent.com/AlmaLinux/almalinux-deploy/master/almalinux-deploy.sh
bash ./almalinux-deploy.sh

Rocky Linuxへの移行

Rocky Linuxへの移行スクリプト実行中

もうひとつ、Rocky Linuxも同じように動きますというところをお見せします。Rocky Linuxの場合も、やはり同じような移行用スクリプトが用意されています。これも先ほどと同じようにスクリプトをダウンロードして実行します。

curl https://raw.githubusercontent.com/rocky-linux/rocky-tools/main/migrate2rocky/migrate2rocky.sh -o migrate2rocky.sh
chmod +x ./migrate2rocky.sh
./migrate2rocky.sh -r

-rオプションを付けると、キャッシュを消してCentOS 8をRocky Linux 8に移行してくれます。

移行スクリプトが終了したら

移行スクリプトの実行が終わったら、もう一度画面を見てみましょう。

Rocky Linuxへの移行完了後の/etc/redhat-releaseと/etc/os-release

まず1つ目、こちらの画面はRocky Linuxですね。画面にありますように「Complete!」と表示されています。そして、「Please reboot your system」再起動してくださいってなってますよね。この段階で /etc/redhat-releaseの内容を見ると、もともとCentOS 8.3だったのがRocky Linux 8.5になってます。/etc/os-release を見ても、細かな情報もすべてRocky Linuxのものに変わっています。ですので、このようにコマンドをたたくだけで、ひとまずは応急処置的、延命措置的ではあるものの、いったん使えるようになると思います。

AlmaLinuxへの移行完了後の/etc/redhat-releaseと/etc/os-release

画面を切り替えまして、こちらのAlmaLinuxの方も、無事に完了したというふうに出てます。こちらも「セキュアブートに関連するパッケージも適用するためには再起動してください」というメッセージが出ていて、再起動後は完全に切り替わります。/etc/redhat-release はAlmaLinux 8.5に切り替わってます。/etc/os-release の情報も変わってますし、yumの方も今後使用するAlmaLinuxのリポジトリ向けになってますので、やはり延命措置的に使えるかなと思います。

CentOS Streamへの移行完了後の/etc/redhat-releaseと/etc/os-release

もう一つはCentOS Streamですね。こちらも/etc/redhat-release を見るとCentOS Stream 8というふうになっています。こうして、8.xというバージョン番号から逃れて、ずっと8系で流れるように(注釈:CentOS 8 Stream という名前から)生き続けるという方法が選べるかと思います。

移行スクリプトの注意点

こんな感じで移行スクリプトを実行できて非常に便利なんですが、ちょっと注意が必要なんですね。

というのは、やってることとしては、今入っているCentOS 8のパッケージを消して、同じものを入れ直すっていう作業をやってます。ですので、見た目は同じようなパッケージかもしれませんが、実際には差し替わっています。わかりやすい例としては、CentOSに入っているApache(httpd)を起動したときはCentOSのテストページを表示しますが、Apacheのパッケージを入れ替えると、その代わりにAlmaLinux/Rocky Linux/CentOS Stream 8など、それぞれのロゴが出てくるようになります。

AlmaLinuxにおけるApacheのテストページ

あと、これが使える環境は結構限定的かなと思っています。というのはパッケージを入れ替えていますので、何かしら問題があると思うんですよね。どういう問題があるかというと、例えばすでにいくつかバグというか問題が報告されています。それぞれのバグレポートのページやのissueに上がっているのを見ていただければと思うんですけども、例えばRocky Linuxの移行スクリプトではJava系の何かにエラーが出るとか問題が出るといった報告がありました。あと、報告が上がっていなくても、やっぱり入れ替えることによって何らかのリスクはあると思います。

逆に言えば、そういったリスクを許容できないような環境では使うべきでないと思います。私もちょっとこわいですね。実運用しているようなところではやりたくないです。

もうひとつの注意点としましては、パッケージを入れ直すことによってサーバの再起動をかけるシーンもあると思います。そういったときに設定ファイルの記述ミスがあったり、あるいは何らかの条件によっては、サーバの再起動やサービスの再起動をしたときにそれまで動いていたものが何もしていないのに壊れたっていうことも十分あります。

本当に開発用途とか、遊んでいるサーバをざっくりと入れ替えるのであれば非常に楽な方法だとは思いますけども、現用で動いているものを入れ替えるにはいろいろつらいところもあるといったことを頭に入れておいていただければと思います。

こんな感じでざっくりとスクリプトの説明をさせていただきました。今回紹介したものの他にも、サイバートラストさんが提供されてるMIRACLE LINUX用の移行スクリプトですとか、RHELやOracle Linuxなども移行用のスクリプトがありますので、必要に応じてこのあたりもご検討いただくのがいいかなと思います。

つづきは次回

後半の記事では、CentOSに何が起こったのかとか、AlmaLinuxやRocky Linuxはどういうディストリビューションなのかといった話をしていきます。