kWatanabe 記事一覧へ

kWatanabe の 技術帖

某企業でOSや仮想化の研究をやっているインフラ系エンジニア。オンプレとクラウドのコラボレーションなど、興味ある技術を綴る。

RHEL互換ディストリの作り方を手探ってみる2(大晦日ハッカソン)

  • 2020年の大晦日に大晦日ハッカソンなるイベントに参加した
  • CentOS のようなRHEL互換ディストリの作り方を1日で出来る範囲で手探ってみた
  • 1日でできる限られた範囲だけど、得られた知見をここで整理する

はじめに

「大晦日ハッカソンとは何ぞや」については、過去記事を参照。

今回は、そのRHEL*1互換ディストリビューションを自製するためには、どうすればいいのかを手探ってみることにしました。

kwatanabe.hatenablog.jp

RHEL互換ディストリビューションとは

過去記事にも書きましたが、RHEL互換ディストリビューションとは、商用ディストリビューションである RHEL から、RedHatの商標や独占的な権限を有するものを削除し、オープンソースライセンスの下に公開されているもののみで再構成したものです。*2

RHEL互換ディストリビューションを作成するための大まかな手順は以下になります。

  1. RHELサブスクリプションを得る
  2. RHEL のリビルド環境を用意する
  3. RHELソースコード (SRPM) を入手
  4. ソースコードの全てから、RedHat に関わる商標やその他権利を有するモノを仕分け・排除
  5. 上記の結果、RHELとの互換性が崩れてしまうものがあれば、それを補填するモノを開発
  6. リビルドする

以下、実際に大晦日ハッカソンで、kWatanabe が取り組んだ内容を整理していきます。

てさぐれ!RHELもの

RHELサブスクリプションを得る

RHELサブスクリプションを得るには以下の方法があります。

  • RedHatから購入する
  • リセラーを介して調達する
  • 評価版を入手する
  • Red Hat Developers に登録して入手する

また、RHELサブスクリプションは、用途や導入するマシンの種別に応じて、多種多様なものがあります。詳細はサブスクリプションガイドに記載があります。

www.redhat.com

Red Hat Enterprise Linux Developer Suite 以外のサブスクリプションは、RedHatもしくはリセラーから調達する必要があります。Red Hat Enterprise Linux Developer Suiteは、開発用途専用で、サポートもありませんが、Red Hat Developers にエントリすることで無償で入手できます。今回はこのサブスクリプションを利用しました*3

なお、Red Hat Developers には以下からエントリできます。

developers.redhat.com

RHEL のリビルド環境を用意する

バージョン齟齬や変な依存関係で悩みたくなかったため、リビルド対象の RHEL 8.3 をそのまま実機にインストールして準備しました。

RedHatカスタマーポータル*4にログインすれば、RHEL のインストールISOを入手できます。9GBを超え、DVD-R DLでも焼けないサイズのため、BalenaEtcher *5 を使って16GBの USB メモリに焼きました。

インストールが終われば、サブスクリプションを認証し、リビルドに必要なパッケージを導入します。この時、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 に関わる商標やその他権利を有するモノを仕分け・排除

RHELCentOSを比較

環境が整えば、実際に手探っていきます。全パッケージを対象にすると、プロジェクトが立ち上がる位の作業量になってしまうので、BaseOS リポジトリに絞って作業します。

まずは RHEL にあって、CentOS にないものを探しました。もちろん、これはチートです。本来は、削除しないとダメなモノを全部自力で調べなければなりません。

f:id:kWatanabe:20210107120056p:plain
RHELCentOSSRPMを比較

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 向けのパッケージと分かります。CentOSIBM z をサポートしないため、含まれていないようです。同様に、libzfcphbaapi、openssl-ibmca、qclib、s390utilsもアーキテクチャ違いによるものでした。

中身からCentOSで削除された理由を調べる

x86_64向けやアーキテクチャ非依存にもかかわらず CentOS に含まれていないものは、RedHatの商用や権利関係で削除された可能性があります。rpm -ivhSRPMを展開し、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 で公開されています。

github.com

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互換ディストリビューション構築で重要かつ困難な所になります。

依存パッケージを調べる

私は以下の流れで作業を進めました。

  1. dnf builddepを試す → 何事も無く完了したら、rpmbuild -baでビルドする
  2. RedHatのマニュアル「RHEL 8 の導入における検討事項」で、RHEL8.0~8.3で統廃合されたパッケージに該当しないか調べる
  3. FedoraやEPELなど、RHELの upstream に含まれていないか調べる
  4. RPM pbone.net などの RPM 検索サイトなどから調べる
  5. Google 検索する

結果としては、大きく以下の4種類(AND/OR含む)となりました。

もしかしたら、RedHat はビルド環境を RHEL ではなく、upstream の Fedora をベースに構築しているのかもしれません。なお、具体的なパッケージ名は当日ツイートした以下の通りです。

なお、調査に使ったリソースは以下からたどれます。

access.redhat.com

getfedora.org

fedoraproject.org

rpm.pbone.net

ここで終了・おわりに

ここまで絞り込めれば、ビルドが通らなかったパッケージで使われているライブラリのバージョンを調べ、ビルドできるように進めていくところですが、ここで2020年が終わりました。

真に難しいところの1歩手前で時間切れとなりましたが、それでも CentOS という先人の成果をフル活用してもかなりパワーを使ったので、世のRHEL互換ディストリビューションの構築がいかに大変かがうかがい知れます。

それでは。

*1:RedHat Enterprise Linux

*2:単なる再構成ではなく、RHEL とソフトウェア的な互換性が担保されている必要があります。RHELエンタープライズディストリビューションとしてデファクトに近い存在であるので、RHEL と同じ機能・品質を持ち、かつ特定の組織にロックインされないディストリビューションを求める人が大勢いるのです。

*3:RHEL互換ディストリビューションの作成が「開発用途」に含まれるかどうかは不明。限りなく黒に近いグレーな気がしますので、このライセンスで用達したソースを元に再構築したディストリビューションの再配布は止めた方がいいとおもいます。

*4:https://access.redhat.com

*5:https://www.balena.io/etcher/

*6:ドライバやパッケージのビルド環境など、開発用途のツールキットを収録した追加リポジトリCentOSでいうところの PowerTools に相当。