- 2020年の大晦日に大晦日ハッカソンなるイベントに参加した
- CentOS のようなRHEL互換ディストリの作り方を1日で出来る範囲で手探ってみた
- 1日でできる限られた範囲だけど、得られた知見をここで整理する
はじめに
今回は、そのRHEL*1互換ディストリビューションを自製するためには、どうすればいいのかを手探ってみることにしました。
RHEL互換ディストリビューションとは
過去記事にも書きましたが、RHEL互換ディストリビューションとは、商用ディストリビューションである RHEL から、RedHatの商標や独占的な権限を有するものを削除し、オープンソースライセンスの下に公開されているもののみで再構成したものです。*2
RHEL互換ディストリビューションを作成するための大まかな手順は以下になります。
- RHEL のサブスクリプションを得る
- RHEL のリビルド環境を用意する
- RHEL のソースコード (SRPM) を入手
- ソースコードの全てから、RedHat に関わる商標やその他権利を有するモノを仕分け・排除
- 上記の結果、RHELとの互換性が崩れてしまうものがあれば、それを補填するモノを開発
- リビルドする
以下、実際に大晦日ハッカソンで、kWatanabe が取り組んだ内容を整理していきます。
てさぐれ!RHELもの
RHELのサブスクリプションを得る
RHEL のサブスクリプションを得るには以下の方法があります。
また、RHEL のサブスクリプションは、用途や導入するマシンの種別に応じて、多種多様なものがあります。詳細はサブスクリプションガイドに記載があります。
Red Hat Enterprise Linux Developer Suite
以外のサブスクリプションは、RedHatもしくはリセラーから調達する必要があります。Red Hat Enterprise Linux Developer Suite
は、開発用途専用で、サポートもありませんが、Red Hat Developers にエントリすることで無償で入手できます。今回はこのサブスクリプションを利用しました*3。
なお、Red Hat Developers には以下からエントリできます。
RHEL のリビルド環境を用意する
バージョン齟齬や変な依存関係で悩みたくなかったため、リビルド対象の RHEL 8.3 をそのまま実機にインストールして準備しました。
RedHatカスタマーポータル*4にログインすれば、RHEL のインストールISOを入手できます。9GBを超え、DVD-R DLでも焼けないサイズのため、BalenaEtcher *5 を使って16GBの USB メモリに焼きました。
特に何をやるか決めてないけど。 #大晦日ハッカソン に向けて、余っているマシンに Red Hat Enterprise Linux 8 をインストール。 pic.twitter.com/CDGGADInq0
— kWatanabe (@WWatchin) 2020年12月29日
インストールが終われば、サブスクリプションを認証し、リビルドに必要なパッケージを導入します。この時、CodeReady Linux Builder リポジトリ*6を一緒に有効化しました。
$ sudo subscription-manager register $ sudo subscription-manager attach $ sudo subscription-manager repos --enable codeready-builder-for-rhel-8-x86_64-rpms $ sudo dnf update $ sudo dnf groupinstall "Development Tools" $ sudo dnf install rpm-utils rpm-build texinfo
RHEL のソースコード (SRPM) を入手
ソースコードもまた、RedHatカスタマーポータルから ISO で入手できます。ISO に含まれるものは BaseOSリポジトリとAppStreamリポジトリのみですが、それでも 20GB ほどあります。
これをマシンにコピーし、loop マウントしておきます。
$ sudo mkdir /media/rhel-source $ sudo vim /etc/fstab /home/kwatanabe/rhel-8.3-source-dvd.iso /media/rhel-source iso9660 ro,nofail,loop 0 0 $ sudo mount -a
なお、通常は不要ですが、手探るうえで必要になり CentOS のソースも入手しました。 CentOS は ソース ISOを配布していないため、rsync でリポジトリをミラーしました。
$ sudo mkdir -p /media/centos-source/ $ sudo rsync -avzP rsync://vault.centos.org/8.3.2011/BaseOS /media/centos-source/
RedHat に関わる商標やその他権利を有するモノを仕分け・排除
RHELとCentOSを比較
環境が整えば、実際に手探っていきます。全パッケージを対象にすると、プロジェクトが立ち上がる位の作業量になってしまうので、BaseOS リポジトリに絞って作業します。
まずは RHEL にあって、CentOS にないものを探しました。もちろん、これはチートです。本来は、削除しないとダメなモノを全部自力で調べなければなりません。
CentOSのリポジトリには過去バージョンも含まれていますが、それ以外で RHEL にあって、CentOS にない SRPM は以下の通りでした。
- libica
- libzfcphbaapi
- memstrack
- openssl-ibmca
- qclib
- redhat-indexhtml
- redhat-logos
- redhat-release
- s390utils
諸元から削除された理由を調べる
アタリが付いたら、rpm コマンドを使って中身を調べていきます。まずは、rpm -p -qi
を使って諸元を調べました。例えば、libica
だと以下の結果となります。
$ rpm -p -qi libica-3.7.0-2.el8.src.rpm Name : libica Version : 3.7.0 Release : 2.el8 Architecture: s390x Install Date: (not installed) Group : System Environment/Libraries Size : 552759 License : CPL Signature : RSA/SHA256, 2020年07月21日 17時52分31秒, Key ID 199e2f91fd431d51 Source RPM : (none) Build Date : 2020年07月20日 21時56分29秒 Build Host : s390-046.build.eng.bos.redhat.com Relocations : (not relocatable) Packager : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla> Vendor : Red Hat, Inc. URL : https://github.com/opencryptoki/ Summary : Library for accessing ICA hardware crypto on IBM z Systems Description : A library of functions and utilities for accessing ICA hardware crypto on IBM z Systems.
Architecture
や、Description
の内容から、これは IBM z 向けのパッケージと分かります。CentOS は IBM z をサポートしないため、含まれていないようです。同様に、libzfcphbaapi、openssl-ibmca、qclib、s390utilsもアーキテクチャ違いによるものでした。
中身からCentOSで削除された理由を調べる
x86_64向けやアーキテクチャ非依存にもかかわらず CentOS に含まれていないものは、RedHatの商用や権利関係で削除された可能性があります。rpm -ivh
でSRPMを展開し、rpmbuild -bp
でパッチ群をマージして、実物を確認します。
$ rpm -ivh redhat-indexhtml $ rpmbuild -bp ~/rpmbuild/SPECS/redhat-indexhtml.spec $ ls ~/rpmbuild/BUILD/redhat-indexhtml
確認の結果、redhat-indexhtml、redhat-logos は RedHat の商標やロゴが含まれており、NGなものでした。redhat-release は、RHEL のリポジトリ登録のためのパッケージで RHEL互換ディストリビューション では置き換えが必要なものです。
一方、memstrack は問題があるパッケージには見えませんでした。また、大元のソースコードも GitHub で公開されています。
CentOS のリポジトリを見直すと、 BaseOS リポジトリから AppStream リポジトリに移動されていました。理由は不明ですが、削除しなければならないパッケージではなさそうです。
これらの結果から、RHEL 8.3 の BaseOS リポジトリでは以下のものを削除し、オリジナルのものに置き換える必要があると分かりました。
パッケージ | 概要 |
---|---|
redhat-indexhtml | RHELのオフラインマニュアル |
redhat-logos | RHELのロゴ・商標の画像集 |
redhat-release | RHELのリポジトリ情報 |
互換性が崩れてしまうものがあれば補填するモノを開発
抽出したモノのうち、redhat-logosとredhat-releaseは代替となる画像データや、リポジトリを用意しないとディストリビューションとして完結しなくなりそうです。
redhat-indexhtmlは、無くても良い気がしますが、未確認です。
リビルド
だいたいの流れ
リビルド’作業そのものは、通常のRPMのリビルドと大きな差はありません。dnf builddep
で依存パッケージを導入して、RPMをビルドしていきます。
しかし、大きな注意点があります。RHELとの互換性を担保するために、RedHatがビルドに使ったライブラリと同じものを使わなければなりません。これはバージョンや適用されているパッチも完全に一致しなければダメです。
REHLのリポジトリに依存パッケージがあればいいですが、無い場合何が使われているのかを調査し、環境を整える必要があります。ここが、RHEL互換ディストリビューション構築で重要かつ困難な所になります。
依存パッケージを調べる
私は以下の流れで作業を進めました。
dnf builddep
を試す → 何事も無く完了したら、rpmbuild -ba
でビルドする- RedHatのマニュアル「RHEL 8 の導入における検討事項」で、RHEL8.0~8.3で統廃合されたパッケージに該当しないか調べる
- FedoraやEPELなど、RHELの upstream に含まれていないか調べる
- RPM pbone.net などの RPM 検索サイトなどから調べる
- Google 検索する
結果としては、大きく以下の4種類(AND/OR含む)となりました。
もしかしたら、RedHat はビルド環境を RHEL ではなく、upstream の Fedora をベースに構築しているのかもしれません。なお、具体的なパッケージ名は当日ツイートした以下の通りです。
#大晦日ハッカソン の成果
— kWatanabe (@WWatchin) 2020年12月31日
RHELクローンを目指して、BaseOSの全リビルドを試みた。素のRHEL8(BaseOS+AppStream+CodeReady)でビルドできないものが57。うち、EPELでビルドが通ったのが6。
残りは、Fedora、RHEL7のrepoで解決できそうだが、RHELの構成を逸脱するのでうまくしないと互換性が壊れそう。 pic.twitter.com/1myqMUSxuM
なお、調査に使ったリソースは以下からたどれます。
ここで終了・おわりに
ここまで絞り込めれば、ビルドが通らなかったパッケージで使われているライブラリのバージョンを調べ、ビルドできるように進めていくところですが、ここで2020年が終わりました。
真に難しいところの1歩手前で時間切れとなりましたが、それでも CentOS という先人の成果をフル活用してもかなりパワーを使ったので、世のRHEL互換ディストリビューションの構築がいかに大変かがうかがい知れます。
それでは。
*2:単なる再構成ではなく、RHEL とソフトウェア的な互換性が担保されている必要があります。RHEL はエンタープライズなディストリビューションとしてデファクトに近い存在であるので、RHEL と同じ機能・品質を持ち、かつ特定の組織にロックインされないディストリビューションを求める人が大勢いるのです。
*3:RHEL互換ディストリビューションの作成が「開発用途」に含まれるかどうかは不明。限りなく黒に近いグレーな気がしますので、このライセンスで用達したソースを元に再構築したディストリビューションの再配布は止めた方がいいとおもいます。
*5:https://www.balena.io/etcher/
*6:ドライバやパッケージのビルド環境など、開発用途のツールキットを収録した追加リポジトリ。CentOSでいうところの PowerTools に相当。