rhel系OSのbootstrap
debian系にはdebootstrap,arcn系はarch-bootstrapで、
bootstrap(最小限のインストールやchroot環境用の初期化処理)を行うことができる。
rhel系OSにはこれらと=のものはないが、dnfコマンドでbootstrap作業を行うことができる。
dnfコマンドはrhel系OSでは最初からインストールされており、その他archlinux,manjarolinuxでは
Community repositoryにコマンドがあるので、それをインストールすることで、使うことができる。
例として、chroot環境に対するインストール方法をここに書きます。
最小限のインストールを行いたいときや、ホスト側のスペックが貧弱なときの仮想環境として、
良いと思います。
前提
ホスト側がdnfをインストールできるOSであること。
最近ではrhel系以外のDebian系、arch系、Gentooでも
特に何もしなくてもOS標準のパッケージライブラリでインストールできる。
rhel系以外はdnfをインストールしても、
/etc/yum.repos.dディレクトリが作成されていないので、
手動で作成すること。
dnfをインストールするとrpmも一緒にくるディストロと別々にインストールする必要があるディストロと両方あるので注意。
rpmコマンドはdnfでrpmパッケージをインストールするときにgpgのチェックをするときに内部で使っているので必須になる。
debian系の場合
sudo apt install -y dnf rpm
# gpgキーをインストール用のディレクトリを作っておく。
mkdir -p /etc/pki/rpm-gpg
下準備
以下の構成にしておくこと。
ゲスト側の準備
あらかじめ下のようにパーティションを分けておき、
そこにインストールしていきます。
chrootを使う場合
# 仮想環境用のパーティションを作っておき、フォーマット
mkfs.ext4 /dev/sdxn
# デバイスファイルをマウント。ここにdnfでインストールする
mount /dev/sdxn /mnt/fedora
systemd-nspawnを使う場合
# debian系
sudo apt install -y systemd-container
仮想環境用のディレクトリ作成
sudo mkdir /var/lib/machines/fedora
レポジトリの設定
ホスト側のOSがmanjaro,archlinuxの場合はdnfをインストールしただけでは、dnfコマンドが使えないので下記の設定をしておくこと。
centos, oracle linuxはバージョンによって微妙にパスが違うので注意
fedoraをインストールしたい場合
[fedora]
name=Fedora Server $releasever - Base
baseurl=http://ftp.riken.jp/pub/Linux/fedora/releases/$releasever/Server/$basearch/os
gpgkey=https://getfedora.org/static/fedora.gpg
centos-streamをインストールしたい場合
gpg-keyのインストール。
# gpg keyを指定の場所におく。
sudo curl -o /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial http://ftp.riken.jp/pub/Linux/centos/RPM-GPG-KEY-CentOS-Official
# gpg keyを有効にする。
sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
centos-stream 8
[centos]
name=CentOS-stream $releasever - Base
baseurl=http://ftp.riken.jp/pub/Linux/centos/$releasever-stream/BaseOS/$basearch/os
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
centos-stream 9
[centos]
name=CentOS-stream $releasever - Base
baseurl=http://ftp.riken.jp/pub/Linux/centos-stream/$releasever-stream/BaseOS/$basearch/os
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
ubi(rhel)をインストールしたい場合
ubiは再配布可能なパッケージだけで構成されたrhelです。
最小限のものだけしかないので、ここからrhelのサブスクリプションを追加することで、
とgpgkeyに書かれているが
ちゃんとgpgkeyです。今後変更されるかもですが、頻繁に変わるものでは無いでしょう。
これについてはRedhatのエンジニアの資料に書かれています。
上のcentosのレポジトリも使うことになるので追加して書くこと。
ubiでは後述のNetworkNagerとsystemd-resolvedがレポジトリにないため、Centosのレポジトリにあるパッケージを使わせてもらいます。
Centosはrhelのアップストリームにかつ互換性が強くなったため、ほぼほぼ不具合はないはずです。
gpg-keyのインストール。
# gpg keyを指定の場所におく。
sudo curl -o /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release https://www.redhat.com/security/data/fd431d51.txt
# gpg keyを有効にする。
sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[ubi]
name=Red Hat Universal Base Image $releasever (RPMs) - BaseOS
baseurl=https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi$releasever/$releasever/$basearch/baseos/os
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
# ubiとcentosでパッケージが被った時にubiの方を優先するために書く。
# 別にpriorityが10である必要はなくcentosのレポジトリを優先
# priority が書かれていない場合はデフォルトでpriority=99となる。
priority=10
oracle-linuxをインストールしたい場合
baseurlがbaseos/latestだったり、/latestだったり微妙に違います。注意。
gpgkeyがバージョンごとに異なるのも特徴ですね。(やめてほしいです...)
gpg-keyのインストール。
# gpg keyを指定の場所におく。
sudo curl -o /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle-ol9 https://yum.oracle.com/RPM-GPG-KEY-oracle-ol9
sudo curl -o /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle-ol8 https://yum.oracle.com/RPM-GPG-KEY-oracle-ol8
sudo curl -o /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle-ol7 https://yum.oracle.com/RPM-GPG-KEY-oracle-ol7
# gpg keyを有効にする。
sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle-ol9
sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle-ol8
sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle-ol7
oracle-linux8 または9
[oracle_linux]
name=oracle_linux $releasever - Base
baseurl=https://yum.oracle.com/repo/OracleLinux/OL$releasever/baseos/latest/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle-ol$releasever
oracle-linux7
[oracle_linux]
name=oracle_linux $releasever - Base
baseurl=https://yum.oracle.com/repo/OracleLinux/OL$releasever/latest/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle-ol$releasever
ホストから仮想環境へパッケージのインストール
下記のようにコマンドを叩くとディレクトリにインストールされます。
rhel系は最小インストールするとvimどころかviも入っていないし、
passwdも入っていないため、仮想環境に入った後の作業でつまずきます。
必ず、vimとpasswdは入れましょう。
名前解決にはsystemd-resolvedを使いましょう。
resolvectlが強力なのとsystemd-nspawnを使う場合は
できるだけ、systemdに機能を寄せた方が管理が楽です。
ネットワークの管理については
fedoraはsystemd-networkdをインストールして使ってください。
centos, oracle-linuxもsystemd-networkdを使いたいんですが、
ちょっとトラブル中みたいなので、しばらくはNetworkManagerですね...バージョン8では、入ることはなく、9以降入るかどうか...NetworkManagerよりsystemd-networkdの方がスジがよく、
いい意味で小さい作りになっているのでのちに期待しましょう。
各レポジトリすべてarmでも動くので、ARCH=aarch64とすれば、
raspberry piでもインストールすることができます。
fedoraをインストールしたい場合
ARCH=amd64
version=35
# repoにyum.repoに設定したレポジトリ名(例[fedora])を使う。
dnf install --installroot=/mnt/fedora --repo=fedora --releasever=$version fedora-release-server systemd dnf passwd vim systemd-networkd systemd-resolved
centos-streamをインストールしたい場合
ARCH=amd64
version=8
# repoにyum.repoに設定したレポジトリ名(例[centos])を使う。
dnf install --installroot=/mnt/centos --repo=centos --releasever=$version centos-stream-release systemd dnf passwd vim-minimal vim-filesystem NetworkManager systemd-resolved
ubi(rhel)をインストールしたい場合
ubiにはsystemd-resolvedもNetworkManagerもない。
何?!
と思うかもしれないが、centosのNetworkMangerを使わせてもらおう。
subscription-managerはrhelのサブスクリプションを登録する予定がなければ別にいらないが、
大抵後で欲しくなると思うのでインストールしておく。
dnf install -y --installroot=/media/c9b3ac1d-c148-482a-a544-ab3a765a1820/var/lib/machines/ubi9 --repo=ubi,centos --releasever=$version redhat-release subscription-manager systemd dnf passwd vim-minimal vim-filesystem NetworkManager systemd-resolve
ARCH=amd64
version=8
# repoにyum.repoに設定したレポジトリ名(例[ubi],[centos]両方)を使う。
dnf install --installroot=/mnt/ubi --repo=ubi,centos --releasever=$version redhat-release subscription-manager systemd dnf passwd vim-minimal vim-filesystem NetworkManager systemd-resolved
rhelはreleaseをインストールしても/etc/yum.repos.d/配下にrepository情報を書き込まないみたいなので、
repository情報を直接書き込む。
なんかパッケージインストールしたら、自動で書き込まれるとか知ってたら誰か教えてください。
以下dockerhubにあるubi9の/etc/yum.repos.d/ubi.repoをほぼそのまま引用。
各項目の末尾にpriorityを追加してcentosよりも高くなるように書きました。
またubi-9と具体的に指定されていたものを$releaseverと変更しました。
これを仮装環境の外からvimで書き込んでください。
[ubi-$releasever-baseos-rpms]
name = Red Hat Universal Base Image $releasever (RPMs) - BaseOS
baseurl = https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi$releasever/$releasever/$basearch/baseos/os
enabled = 1
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
gpgcheck = 1
priority = 98
[ubi-$releasever-baseos-debug-rpms]
name = Red Hat Universal Base Image $releasever (Debug RPMs) - BaseOS
baseurl = https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi$releasever/$releasever/$basearch/baseos/debug
enabled = 0
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
gpgcheck = 1
priority = 98
[ubi-$releasever-baseos-source]
name = Red Hat Universal Base Image $releasever (Source RPMs) - BaseOS
baseurl = https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi$releasever/$releasever/$basearch/baseos/source/SRPMS
enabled = 0
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
gpgcheck = 1
priority = 98
[ubi-$releasever-appstream-rpms]
name = Red Hat Universal Base Image $releasever (RPMs) - AppStream
baseurl = https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi$releasever/$releasever/$basearch/appstream/os
enabled = 1
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
gpgcheck = 1
priority = 98
[ubi-$releasever-appstream-debug-rpms]
name = Red Hat Universal Base Image $releasever (Debug RPMs) - AppStream
baseurl = https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi$releasever/$releasever/$basearch/appstream/debug
enabled = 0
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
gpgcheck = 1
priority = 98
[ubi-$releasever-appstream-source]
name = Red Hat Universal Base Image $releasever (Source RPMs) - AppStream
baseurl = https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi$releasever/$releasever/$basearch/appstream/source/SRPMS
enabled = 0
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
gpgcheck = 1
priority = 98
[ubi-$releasever-codeready-builder-rpms]
name = Red Hat Universal Base Image $releasever (RPMs) - CodeReady Builder
baseurl = https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi$releasever/$releasever/$basearch/codeready-builder/os
enabled = 0
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
gpgcheck = 1
priority = 98
[ubi-$releasever-codeready-builder]
name = Red Hat Universal Base Image $releasever (RPMs) - CodeReady Builder
baseurl = https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi$releasever/$releasever/$basearch/codeready-builder/os
enabled = 1
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
gpgcheck = 1
priority = 98
[ubi-$releasever-codeready-builder-debug-rpms]
name = Red Hat Universal Base Image $releasever (Debug RPMs) - CodeReady Builder
baseurl = https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi$releasever/$releasever/$basearch/codeready-builder/debug
enabled = 0
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
gpgcheck = 1
priority = 98
[ubi-$releasever-codeready-builder-source]
name = Red Hat Universal Base Image $releasever (Source RPMs) - CodeReady Builder
baseurl = https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi$releasever/$releasever/$basearch/codeready-builder/source/SRPMS
enabled = 0
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
gpgcheck = 1
priority = 98
NetworkManagerとsystemd-networkdなどcentosのレポジトリも追加します。
これもcentos-releaseとインストールした時のdefaultの設定です。
[baseos]
name=CentOS Stream $releasever - BaseOS
metalink=https://mirrors.centos.org/metalink?repo=centos-baseos-$stream&arch=$basearch&protocol=https,http
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
gpgcheck=1
repo_gpgcheck=0
metadata_expire=6h
countme=1
enabled=1
[baseos-debuginfo]
name=CentOS Stream $releasever - BaseOS - Debug
metalink=https://mirrors.centos.org/metalink?repo=centos-baseos-debug-$stream&arch=$basearch&protocol=https,http
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
gpgcheck=1
repo_gpgcheck=0
metadata_expire=6h
enabled=0
[baseos-source]
name=CentOS Stream $releasever - BaseOS - Source
metalink=https://mirrors.centos.org/metalink?repo=centos-baseos-source-$stream&arch=source&protocol=https,http
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
gpgcheck=1
repo_gpgcheck=0
metadata_expire=6h
enabled=0
[appstream]
name=CentOS Stream $releasever - AppStream
metalink=https://mirrors.centos.org/metalink?repo=centos-appstream-$stream&arch=$basearch&protocol=https,http
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
gpgcheck=1
repo_gpgcheck=0
metadata_expire=6h
countme=1
enabled=1
[appstream-debuginfo]
name=CentOS Stream $releasever - AppStream - Debug
metalink=https://mirrors.centos.org/metalink?repo=centos-appstream-debug-$stream&arch=$basearch&protocol=https,http
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
gpgcheck=1
repo_gpgcheck=0
metadata_expire=6h
enabled=0
[appstream-source]
name=CentOS Stream $releasever - AppStream - Source
metalink=https://mirrors.centos.org/metalink?repo=centos-appstream-source-$stream&arch=source&protocol=https,http
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
gpgcheck=1
repo_gpgcheck=0
metadata_expire=6h
enabled=0
[crb]
name=CentOS Stream $releasever - CRB
metalink=https://mirrors.centos.org/metalink?repo=centos-crb-$stream&arch=$basearch&protocol=https,http
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
gpgcheck=1
repo_gpgcheck=0
metadata_expire=6h
countme=1
enabled=0
[crb-debuginfo]
name=CentOS Stream $releasever - CRB - Debug
metalink=https://mirrors.centos.org/metalink?repo=centos-crb-debug-$stream&arch=$basearch&protocol=https,http
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
gpgcheck=1
repo_gpgcheck=0
metadata_expire=6h
enabled=0
[crb-source]
name=CentOS Stream $releasever - CRB - Source
metalink=https://mirrors.centos.org/metalink?repo=centos-crb-source-$stream&arch=source&protocol=https,http
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
gpgcheck=1
repo_gpgcheck=0
metadata_expire=6h
enabled=0
centosのキーはインストールされないので仮装環境の外からインストールします。
# gpg keyを仮装環境の外から指定の場所におく。
# /var/lib/machines/ubi9に仮想マシンをインストールしている場合
sudo curl -o /var/lib/machinec/ubi9/etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial http://ftp.riken.jp/pub/Linux/centos/RPM-GPG-KEY-CentOS-Official
# systemd-nspawnなりchrootなり入ってからrpm --import
sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
上にあるcentos.repoのmetalinkについてcentos自体をインストールする場合はcentos-releaseがインストールされるので、
$streamが展開されるが、ubiの環境をできるだけ壊したくないのでcentosパッケージをできるだけ入れたくない。
よって$streamを$releaseverとの値で展開できるように書き換える。
systemd-nspawn仮装環境内、または外からgsedを使って下のように変更すれば良い。
# バックアップを取っておく。
cp /etc/yum.repos.d/centos.repo /etc/yum.repos.d/centos.repo.org
# centos.repoを上書き
sed -i 's/\$stream/\$releasever-stream/g' /etc/yum.repos.d/centos.repo
ここでdnfを使うとまだ問題がある。
ubiのrepository名とcentosのレポジトリ名が混ざるため、ややこしい。
よって、centosのレポジトリはcentos-$releasever-と接頭語をつける。
これは下のように変更すれば良い。
sed -i 's/^\[/\[centos-\$releasever-/g' /etc/yum.repos.d/centos.repo
priorityはcentosよりもubiが優先されるようにかければなんでも良いです。
この時点ではまだ再配布可能な状態です。
後にrhelのsubscriptionも入れれるように、
rhel>ubi>centosという順番に優先順位ができるようにしておきます。
oracle-linuxをインストールしたい場合
oracle linux 8, 9の場合
dnf install --installroot=/media/c9b3ac1d-c148-482a-a544-ab3a765a1820/var/lib/machines/oracle_linux9 --repo=oracle_linux --releasever=
ARCH=x86_64
version=8
# repoにyum.repoに設定したレポジトリ名(例[oracle_linux])を使う。
dnf install --installroot=/mnt/oracle_linux --repo=oracle_linux --releasever=$version oraclelinux-release-el${version} systemd dnf passwd vim-minimal vim-filesystem NetworkManager systemd-resolved
oracle linux 7の場合
ARCH=x86_64
version=7
# repoにyum.repoに設定したレポジトリ名(例[oracle_linux])を使う。
# dnf が無いので変わりにyumをインストールする。
# またosを起動させるのに必要なファイルとしてrootfilesというパッケージも必要になる。
# dbusも自動で入らないので追加する必要がある。
dnf install --installroot=/mnt/oracle_linux --repo=oracle_linux --releasever=$version oraclelinux-release-el${version} systemd yum rootfiles dbus passwd vim-minimal vim-filesystem NetworkManager systemd-resolved
oracle linux7は/etc/os-releaseを手動で書いているor linux imageをインストールしないと書き込まないっぽいのでファイルとして追加する。
/etc/os-releaseが無いとmachinectlはosでないと判断するため。必須。
仮想環下で。
NAME="Oracle Linux Server"
VERSION="7.9"
ID="ol"
ID_LIKE="fedora"
VARIANT="Server"
VARIANT_ID="server"
VERSION_ID="7.9"
PRETTY_NAME="Oracle Linux Server 7.9"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:oracle:linux:7:9:server"
HOME_URL="https://linux.oracle.com/"
BUG_REPORT_URL="https://bugzilla.oracle.com/"
ORACLE_BUGZILLA_PRODUCT="Oracle Linux 7"
ORACLE_BUGZILLA_PRODUCT_VERSION=7.9
ORACLE_SUPPORT_PRODUCT="Oracle Linux"
ORACLE_SUPPORT_PRODUCT_VERSION=7.9
必須でないはずだが、一応、/etc/oracle-releaseも追加しておく。
Oracle Linux Server release 7.9
yumはGPGの解決までしないので。gpgの鍵を手動でインストールする必要がある。
# 鍵用のディレクトリ作成
# 仮想環境へのパス
mkdir /mnt/oracle_linux/etc/pki/rpm-gpg
wget http://public-yum.oracle.com/RPM-GPG-KEY-oracle-ol7 -O /mnt/oracle_linux/etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
その他必要なパッケージ
xargsやless, pingは必須級だと思うのでインストールしておきましょう。
dnf install -y findutils less iputils mlocate
名前解決
これらの設定をしないと、sysmted-nspawnを使ってコンテナとして起動させた場合に
名前解決が行われないので、外部ネットワークに到達することができません。
systemd-resolveを使わなくても名前解決はできますが、
相当な理由がない限りsystemd-resolvedを使いましょう。
systemd-resolveを使わない場合
外からvimで/var/lib/machines/machinename/etc/systemd/resolv.confを編集してください。
外からだとホストの設定を参考したりコピペできるので楽だと思います。
DNSの設定だけするなら
DNS=8.8.8.8とするとよい。
systemd-resolvedを使う場合
ネットワークマネージャにsystemd-networkdを使っているか、NetworkManagerを使っているかで変わります。
systemd-networkdを使っている場合は特に設定を行わなくてもsystemd-resolvedが使われます。
ネットワークマネージャにNetworkManagerを使っている場合は名前解決にsystemd-resolvedを使うことを明記する必要があります。
mainセレクションに下記のようにdnsにsystemd-resolvedと書いてください。
...
[main]
dns=systemd-resolved
...
仮想環境内でdnfのコマンドを実行すると--releaseverをつけろと言われる場合
下のようなエラーが出る時があります。
Unable to detect release version (use '--releasever' to specify release version)
systemd-nspawnを使っていて仮想環境に入ると、os-releaseからうまく値を
取得できないのか、仮想マシンのdnfコマンドでエラーがでます。
--releasever 8 のようにバージョンを指定するか
あらかじめ/etc/yum.d//etc/yum.repos.d/*.repoに書かれている$releaseverの値を実際の値に上書きしてください。
下のスクリプトで一括で変更できます。
# fedora 36を使っている場合
ls -1 /var/lib/machines/fedora/etc/yum.repos.d/ | xargs -I {} sed -i 's/\$releasever/36/g' /var/lib/machines/fedora/etc/yum.repos.d/{}
まとめ
あとはchrootか、systemd-nspawnでそれぞれの環境に入り、Linux imageやfirmwareをインストールしたり、osの設定を行ってください。
oracle 21cのインストールの資料を見てもoracle linux7が例に使われているし、
oracle配布のdocker containerもoracle linux7が使われているので、
DB用途で使う場合はまだしばらくはoracle linux7を使うことになると思います。
Discussion