Rocky LinuxをWSL2で動かしてみる

本稿では、Rocky LinuxをWindows10のWSL2で動作させる試みを紹介します。

Rocky Linux は、 Red Hat Enterprise Linux (RHEL)と互換性を持つLinuxディストリビューションです。21年6月21日にバージョン8.4が一般向けにリリースされました。
一方、WSL2はWindowsでLinuxを動作させるための仕組みです。

本稿では、すでにWindows PC上でWSL2が動作し、Ubuntuがインストールされている環境があることを前提に説明します。WSL2でUbuntuが使えるようにする手順については、以下のリンクをご参照ください。

本稿では、WSL2のUbuntuを使ってRocky Linuxのファイルシステムを構成します。そのファイルシステムをWindows側に渡して、新たなWSLとしてインポートすることによって、Rocky Linuxを動作させます。

注意事項

ここで紹介する方法では、その構築方法特有の不具合が発生する可能性があります。
確実にRocky Linuxを動作させたいのであれば、ISOファイルをダウンロードして通常の手順でインストールすることをお勧めします。

参考URL

Import Rocky Linux to WSL with WSL and rinse

WSL2のUbuntuでRocky Linuxイメージを作成する

本稿では、すでにWSL2が構成されていてUbuntuにログインできる準備が整っていることが前提です。
Ubuntuを起動してログインします。

「rinse」のインストールと設定

rinseとは、RPM系のディストリビューションを作成するためのperlで作成されたツールです。
rinseをインストールします。

sudo apt-get update
sudo apt-get install rinse -y

rinseをインストールすることにより、/etc/rinse/ に各種ディストリビューションのパッケージファイルが作成されます。

$ ls /etc/rinse
centos-4.packages   fedora-21.packages      opensuse-10.3.packages
centos-5.packages   fedora-22.packages      opensuse-11.0.packages
centos-6.packages   fedora-25.packages      opensuse-11.1.packages
centos-7.packages   fedora-26.packages      opensuse-11.2.packages
centos-8.packages   fedora-27.packages      opensuse-11.3.packages
fedora-10.packages  fedora-28.packages      opensuse-12.1.packages
fedora-12.packages  fedora-7.packages       opensuse-12.3.packages
fedora-13.packages  fedora-8.packages       opensuse-13.1.packages
fedora-14.packages  fedora-9.packages       opensuse-42.2.packages
fedora-15.packages  fedora-core-4.packages  rhel-5.packages
fedora-16.packages  fedora-core-5.packages  rinse.conf
fedora-18.packages  fedora-core-6.packages  slc-5.packages
fedora-19.packages  opensuse-10.1.packages  slc-6.packages
fedora-20.packages  opensuse-10.2.packages

ただし、Rocky Linuxのものはありません。そこで、CentOSのファイルを流用して作成してしまいます。

sudo cp -p /etc/rinse/centos-8.packages /etc/rinse/rocky-8.packages

/etc/rinse/rocky-8.packages をエディタで開きます。ファイルの中身はパッケージが一覧になったテキストファイルです。
まず、文字列 “centos” をすべて “rocky” に変更します。下記は変更後のイメージです。変更対象は3行でした。

# list of packages in official docker container
rocky-release  ← 変更
rocky-gpg-keys  ← 変更
rocky-repos   ← 変更
tzdata

次に、ファイルの最後に以下の行を追加します。

glibc-langpack-en
glibc-langpack-ja
libmodulemd
libzstd
passwd
sudo
cracklib-dicts
openssh-clients
python3-dbus

追加したらエディタをセーブして終了します。

なお、上記リストについては、Rocky Linux公式ページ(参考URL)に記載があったリストに対してさらにパッケージを追加しています。追加したものは「python3-dbus」と「glibc-langpack-ja」です。理由は、私の環境ではdnfコマンドを使用したときにエラーが表示されたためなどです。左記のパッケージを追加することによってエラーは抑止できましたが、この追加が最適解かどうかまでは未検証です。

Rocky Linuxのミラーサイトを記述しよう

次は /etc/rinse/rinse.conf を修正します。
以下のミラーサイトのエントリを追加します。

# Rocky Linux 8
[rocky-8]
mirror.amd64 = http://dl.rockylinux.org/pub/rocky/8/BaseOS/x86_64/os/Packages/

私は先頭にあるコメント行によるヘッダの次に行を挿入しました。
エディタをセーブして終了します。

#
#  /etc/rinse/rinse.conf
#
#  Contains the list of servers to download our initial collection of
# packages from.
#
# Steve
# --
#


Rocky Linux 8
[rocky-8]
mirror.amd64 = http://dl.rockylinux.org/pub/rocky/8/BaseOS/x86_64/os/Packages/

# RedHat Enterprise Linux 5 (RHEL-5)
[rhel-5]
mirror       = http://your.mirror.to.rhel5.repository.here/rhel/5/i386/Server/
mirror.amd64 = http://your.mirror.to.rhel5.repository.here/rhel/5/x86_64/Server/

シェルスクリプトを書き換えよう

今度はCentOS用のシェルスクリプトをコピーして、Rocky Linux用に書き換えます。

sudo cp -pR /usr/lib/rinse/centos-8 /usr/lib/rinse/rocky-8

/usr/lib/rinse/rocky-8/post-install.sh の14行目に以下の行を挿入します。

echo "  Extracting CA certs..."
$CH /usr/bin/update-ca-trust

追加後のイメージです。

#!/bin/sh
#
#  post-install.sh
#  CentOS 8
#  (c) Thomas Lange 2020

prefix=$1
CH="chroot ${prefix}"

if [ ! -d "${prefix}" ]; then
  echo "Serious error - the named directory doesn't exist."
  exit
fi

echo "  Extracting CA certs..." ← 追加
$CH /usr/bin/update-ca-trust     ← 追加

# rpm's can now be removed
rm -f ${prefix}/*.rpm

rinse スクリプトを変更しよう

/usr/sbin/rinse を編集します。
エディタで文字列 “–extract-over-symlinks” をサーチすると、おそらく1248行目に見つかります。この部分を削除します。
さらに次の行(1249行目)の文字列 “centos” を “rocky” に置換します。

        "rpm2cpio $file | (cd $CONFIG{'directory'} ; cpio --extract --extract-over-symlinks --make-directories --no-absolute-filenames --preserve-modification-time) 2>/dev/null >/dev/null";
      if ( $file =~ /(fedora|centos|redhat|mandriva)-release-/ ) {

まとめると、上のイメージから下のイメージに変更されます。

        "rpm2cpio $file | (cd $CONFIG{'directory'} ; cpio --extract --make-directories --no-absolute-filenames --preserve-modification-time) 2>/dev/null >/dev/null";
      if ( $file =~ /(fedora|rocky|redhat|mandriva)-release-/ ) {

rinse を実行しよう

これから作成する、Rocky Linuxのファイルシステムを格納するディレクトリを作成します。名称は任意です。わたしは rocky8_4 としました。

mkdir rocky8_4

ようやくここで rinse コマンドを実行します。
–directory オプションでRocky Linuxのファイルシステムを格納するディレクトリ名を指定します。

sudo rinse --arch amd64 --directory ./rocky8_4 --distribution rocky-8

Rocky Linuxのイメージファイルを作成しよう

rinse の実行が完了すると、rocky8_4 ディレクトリにRocky Linuxのファイルシステムが作成されています。このシステムイメージを tar コマンドでアーカイブにし、tar ファイルをWindows側に送り出します。
そしてWindows側で上記 tar ファイルから新しいWSLにインポートするという手順を踏みます。

まず、WindowsのCドライブ直下に rocky というフォルダを作成しておきます。

mkdir /mnt/c/rocky

次に、Rocky Linux のイメージを tar でアーカイブファイルにします。
私はtarファイルの名称をrocky8_4.tarとしました。

sudo tar --numeric-owner -c -C ./rocky8_4 . -f /mnt/c/rocky/rocky8_4.tar

tar の実行が完了したら、Ubuntuセッションを終了します。

exit

WindowsからWSL2にインポートしよう

ここまで来たらあと少しです。
WindowsからPowerShellを起動します。
続いて、Rocky Linux のWSLイメージを格納するフォルダを作成します。

mkdir C:\rocky\rocky8.4

そして tar ファイルからWSLへのインポートを開始します。

wsl --import rocky8.4 c:\rocky\rocky8.4 c:\rocky\rocky8_4.tar

これでRocky LinuxがWSL2で起動できるようになりました。
ディストリビューションの一覧で、バージョンやステータスを確認します。

PS C:\Users\ms> wsl -l -v
  NAME            STATE           VERSION
* Fedora-34       Stopped         2
  rocky8.4        Stopped         2
  Ubuntu-20.04    Stopped         2

それではRocky Linuxを立ち上げてみましょう。

wsl -d rocky8.4

スーパーユーザのプロンプト “#” が表示されたでしょうか。

最終的なアップデートを行おう

以降でRocky Linuxでの最終的な設定を施します。

dnf update

少し特殊な構築方法を行っているので、passwdコマンドなどで不具合が生じるようです。それを回避するために一部のコマンドを再インストールします。

dnf reinstall passwd sudo cracklib-dicts -y

ユーザを作成しよう

スーパーユーザ(root)以外の、普段使いのユーザが必要です。
新たにユーザアカウントを作成します。sudo が使える特権を有したユーザとします。
ユーザ名を、ここでは linux としました。他のユーザ名に変更するには置き替えをお願いします。

adduser -G wheel linux
echo -e "[user]\ndefault=linux" >> /etc/wsl.conf
passwd linux

Rocky Linuxをログアウトします。

exit

WindowsのPowerShellに戻るので、WSLをいったんシャットダウンして、再度Rocky Linuxを立ち上げます。

wsl --shutdown
wsl -d rocky8.4

さいごに

はたしてRocky LinuxはCentOSのに代わる本命となりえるのでしょうか?
おそらく、Storeアプリも近いうちにリリースされることでしょうが、いち早くWSLで活用でき、皆様のお役に立てればと思います。