🎩

RHEL10 を Windows11 と共存させる

に公開

はじめに

事の発端は、ローカルLLMである。
7年落ち?の Thinkpad 25 で Ollama を動かしたら、動いたんで、これは大変だ。メモリ16GBとかしょぼいこと言わずに、今どきの格安PCで本気でやろうというのである。

タイトルと全然関係ないじゃないか。
それはそうなんだが、新しいPCでハード寄りの設定もして、となると、Windows さまだけで良いのか?という囁きが聞こえて、そうだな。最初から Windows と Linux の二重ブートだ。ということになり、ふつうは ubuntu とかにするんだろうけど、最近使っている環境が(純正ではない)赤帽系でもあり、ネットを眺めていると、Red Hat Developers というのに登録すると、本物が使えるらしく、Red Hat Enterprise Linux 10 も出たばかりということで、やってみた。

やってみた

本当の目標は、ローカルLLMであるが、タイトルのとおり、RHEL10 を Windows11 と共存させるところまで、今回の範囲である。

どこまでやったら共存できたことにするか?
結論から言うと、Windows11 上の VSCode で git 管理するファイル群をデュアルブート先の RHEL10 上の VSCode でも git 管理する。そして、Windows11 上の WSL2 にも RHEL10 を導入して、デュアルブート用の RHEL10 のホームディレクトリのボリュームを自動マウントして共有し、Windows11 の VSCode からリモート接続した WSL2 経由で、デュアルブート先で git 管理しているファイルを共有するのがゴールである。
(何を言っているのだろうか?)

ハードウェア

もう一つトリガーがあって、ちょうど、某A社のPデーがあって、今どきのPCが格安でgetできてしまったのも、この企画が成立した理由である。このPCが、84,500 円で、このSSD(は、PCのネジを外して基盤を確認してから買ったので、Pデーではない)が、16,999 円だったので、ポイントだのなんだので、10万円未満で、8コア16スレッド、64GBメモリ、1TB+2TBのSSDのPCが調達できてしまった。

AMD Radeon 780M は、GPU としても使えるらしいという情報と、だめなら Oculink に増設もできるらしいというのも購入に踏み切ったポイントではあるが、まだ、何もしていない(ので、これを書いている場合ではない)。

Red Hat Developer

ここから登録してください。パスワードが14文字以上で長いので、ブラウザに生成してもらってもよいです。ライセンスは、後述のとおり、Activation Key で行うので、覚えられないパスワードでも大丈夫です。

登録してログインしたら、右上の自分のアバターから以下のメニューを出して、サブスクリプションへ行きます。

(ブラウザ翻訳が失敗したような画面になってますが、無視して)システムのアクティベーションキーへ行きます。

Activation Keys の画面で、Organization ID をメモって、Create activation key を押します。

ここで付けた NameOrganization ID で製品登録をしますので、メモっておいてください。これだけで Red Hat Enterprise Linux が使えるとは良い時代になったものです。(大昔、秋葉原の某所で CD 買って以来かもしれない)

ダウンロードは、ログインした画面から FeaturedRed Hat Enterprise Linux から行くのが良さそうです。適当に画面遷移すると Boot 用の小さい方の ISO イメージのダウンロードが勝手に始まりますが、ずいぶん前から USB メモリは安いので、DVD イメージの方が扱いやすいと思います。

上のリンク先で Download/Sign up タブへ行くと、Latest Red Hat Enterprise Linux version - 10Download ISORHEL for Windows Subsystem Linux(WSL)Download RHEL image for WSL が選べますので、それぞれダウンロードします。

RHEL10 のインストール

rhel-10.0-x86_64-dvd.iso で USB メモリをブートデバイスにします。Fedora Media Writer とかもっともらしいツールが検索でヒットしますが、買ったばかりの PC では動きませんでしたので、Rufus で作成しました。

BIOS で USB Boot を有効にして、USB メモリでブートします。言語は 日本語(日本) にします。

インストール先ですが、お任せにすると、全部 LVM (論理ボリューム)管理になって、WSL2 の mount が物理パーティション単位のファイルシステムを期待しているのでアンマッチになってしまいます(これで半日つぶれました)。なので、/home だけは、標準パーティションで設定します。今回は以下のような設定にしました。

マウントポイント 容量 パーティション種別
/ 80 GiB LVM
/boot 1 GiB LVM
/boot/efi 600 MiB LVM
swap 96 GiB LVM
/var 20 GiB LVM
/home (未指定) 1.67 TiB 標準

あとは、root アカウントは無効のまま。ユーザーの作成で、自分のユーザー(今回は araki)を設定して、あとはインストーラーにお任せします。

インストールが終了したら、USB メモリを抜いて、再起動するのですが、そのままだと、Windows のインストールされている側のSSD のブートローダーが動いてしまうので、BIOS で、RHEL をインストールした側の SSD に RHEL が作ってくれたブートローダーが動くようにします。これで、Windows11 と RHEL10 のデュアルブートは完了です。

インストール後の設定

Register System するか?と聞かれますが、まずは、ネットワークをつなぎます。Registration Method は、Activation KeyOrganizationActivation Key は、上でメモっておいたもので登録します。

ターミナルを開いて、ls すると、日本語ディレクトリがいっぱいで、おいおい。となるのですが、ディレクトリをどうこうしようにも日本語入力モードにもならず、とほほ。となります。

まず、日本語入力ですが、設定 から キーボード日本語(Anthy) を追加します。まだ慣れないので、感想は控えますが、入力はできるようになります。

次に日本語ディレクトリですが、以下のようにしました。(最初のコマンドの後で GUI のダイアログが表示されるので、素直に進めます。)

araki@localhost:~$ LANG=C xdg-user-dirs-gtk-update
Moving DESKTOP directory from デスクトップ to Desktop
Moving DOWNLOAD directory from ダウンロード to Downloads
Moving TEMPLATES directory from テンプレート to Templates
Moving PUBLICSHARE directory from 公開 to Public
Moving DOCUMENTS directory from ドキュメント to Documents
Moving MUSIC directory from 音楽 to Music
Moving PICTURES directory from 画像 to Pictures
Moving VIDEOS directory from ビデオ to Videos
araki@localhost:~$ ls
Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos  work  

ゴールに向けて

いろいろブラウザに覚えさせちゃっているので、Chrome をインストールします。デフォルトでインストールされている Firefox さんのお力で、RPM をダウンロードします。

araki@localhost:~/work$ sudo dnf install ../Downloads/google-chrome-stable_current_x86_64.rpm

次に git をインストールします。まぁ、メールアドレスは、上の方の画像に写っちゃってるので隠さなくてもいいのですが。

araki@localhost:~/work$ sudo dnf install git
araki@localhost:~/work$ git config --global user.name "ARAKI Takeo"
araki@localhost:~/work$ git config --global user.email "xxxxx.xxxxx@xxxxx.xxx"

最後に VSCode をインストールします。VSCode さんは、git さんがいないと SCM が有効にならないのと、GitHub.com 経由で共有しようと思うと、VSCode からブラウザ経由で認証することになるので、Chrome さんも先が良いと思います。手順というかコマンドは、ここに書いてありますので、そのとおりにやります。

araki@localhost:~$ sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\nautorefresh=1\ntype=rpm-md\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" | sudo tee /etc/yum.repos.d/vscode.repo > /dev/null
araki@localhost:~$ dnf check-update
araki@localhost:~$ sudo dnf install code
araki@localhost:~$ code

VSCode が動けば、完了です。

WSL2

上の方で、ダウンロードした RHEL image for WSLhel-10.0-x86_64-wsl2.tar.gz を WSL にインポートします。

C:\Users\araki> mkdir WSL
C:\Users\araki> cd WSL
C:\Users\araki\WSL> wsl --import RHEL-10-PREBUILD .\RHEL-10-PREBUILD ..\Downloads\rhel-10.0-x86_64-wsl2.tar.gz
この操作を正しく終了しました。
C:\Users\araki\WSL> dir /b RHEL-10-PREBUILD
ext4.vhdx
C:\Users\araki\WSL> wsl

最後の wsl コマンドで、RHEL10 が立ち上がっているはずなので、確認して、サブスクの登録をしておきます。

[root@gmk WSL]# more /etc/system-release
Red Hat Enterprise Linux release 10.0 (Coughlan)
[root@gmk WSL]# subscription-manager status
+-------------------------------------------+
    System Status Details
+-------------------------------------------+
Overall Status: Not registered

[root@gmk WSL]# subscription-manager register --org xxxxxxxx --activationkey xxxxxx
The system has been registerd with ID: 14052b83-f26f-4bda-b616-642249e196f6
The registered system name is: gmk
[root@gmk WSL]# subscription-manager status
+-------------------------------------------+
    System Status Details
+-------------------------------------------+
Overall Status: Registered

RHEL10 の /home の共有

WSL2 が動いている Windows11 とは別の SSD にインストールした RHEL10 の /home を WSL2 の RHEL10 でも /home にしたいわけです。まず、WSL2 に Windows11 とは別の SSD を認識させる必要があります。ここの MS さんのドキュメントを見ながら進めます。

まぁ、これもただの食わず嫌いなのですが、ここだけは(仕方なく)パワーシェルを動かします。

PS C:\work> GET-CimInstance -query "SELECT * from Win32_DiskDrive"

DeviceID           Caption              Partitions Size          Model 
--------           -------              ---------- ----          ----- 
\\.\PHYSICALDRIVE1 CT1000P3PSSD8        3          1000202273280 CT1...
\\.\PHYSICALDRIVE0 Predator SSD GM6 2TB 4          2048407280640 Pre...

目的の SSD が何番目の物理ドライブかを確認できます。今回のターゲットは、プレデターなので \\.\PHYSICALDRIVE0 です。Windows で WSL にマウントすることが可能です。が、管理者にならないとできない(ので面倒)です。Windows にも sudo があるので、ここを見て、有効にします。設定システム開発者向け に(隠して)あります。

c:\work> sudo wsl --mount \\.\PHYSICALDRIVE0 --bare

この状態で、wsl に入って、目的のマウントができるか確認します。最初のコマンドの結果のパーティションのサイズの情報から sdd4/home とわかりますから、mount します。

[root@gmk work]# lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda      8:0    0 388.4M  1 disk 
sdb      8:16   0   186M  1 disk 
sdc      8:32   0     8G  0 disk [SWAP]
sdd      8:48   0   1.9T  0 disk 
├─sdd1   8:49   0   600M  0 part 
├─sdd2   8:50   0     1G  0 part 
├─sdd3   8:51   0   196G  0 part 
└─sdd4   8:52   0   1.7T  0 part 
sde      8:64   0     1T  0 disk /mnt/wslg/distro
                                 /
[root@gmk work]# mount /dev/sdd4 /home
[root@gmk work]# df
Filesystem      1K-blocks     Used  Available Use% Mounted on
none             15611996        0   15611996   0% /usr/lib/modules/6.6.87.2-microsoft-standard-WSL2
none             15611996        4   15611992   1% /mnt/wsl
drivers         975618044 89139900  886478144  10% /usr/lib/wsl/drivers
/dev/sde       1055762868   411504 1001647892   1% /
none             15611996       72   15611924   1% /mnt/wslg
none             15611996        0   15611996   0% /usr/lib/wsl/lib
rootfs           15606984     2664   15604320   1% /init
none             15606984        0   15606984   0% /dev
none             15611996     8328   15603668   1% /run
none             15611996        4   15611992   1% /run/lock
none             15611996        0   15611996   0% /run/shm
none             15611996      100   15611896   1% /mnt/wslg/versions.txt
none             15611996      100   15611896   1% /mnt/wslg/doc
C:\             975618044 89139900  886478144  10% /mnt/c
tmpfs                1024        0       1024   0% /run/credentials/systemd-journald.service
tmpfs                1024        0       1024   0% /run/credentials/console-getty.service
tmpfs                1024        0       1024   0% /run/credentials/getty@tty1.service
tmpfs            15611996        4   15611992   1% /run/user/0
/dev/sdd4      1792330684 34359296 1757971388   2% /home

これだとログインしてからホームディレクトリをマウントすることになってしまうので、起動時に systemd さんにやってもらいます。ですが、sudo した時の(うざい)画面は出てしまいます(回避方法をいろいろと調べましたが諦めました)。

WSL 内で、以下のファイルを作成します。

/etc/systemd/system/mount-rhel.service
[Unit]
Description=mount local storage
After=local-fs.target

[Service]
User=root
ExecStart=bash -c "/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -Command 'sudo wsl.exe --mount \\\\.\\PHYSICALDRIVE0 --partition 4 --type xfs'"
Restart=no
Type=simple

[Install]
WantedBy=multi-user.target

で、有効にします。

[root@gmk work]# sudo systemctl daemon-reload
[root@gmk work]# sudo systemctl enable mount-rhel.service
Created symlink '/etc/systemd/system/multi-user.target.wants/mount-rhel.service''/etc/systemd/system/mount-rhel.service'.

これで良いのですが、ホームディレクトリを共有するということは、ユーザー(と UID と GID)を揃えて、WSL にも、そのユーザーでログインできると気持ちいいので、そうします。WSL2 用の RHEL10 には、なぜか一人目のユーザーとして cloud-user さんがいるので、削除して、RHEL10 のインストール時に作った araki を一人目の(UID=1000の)ユーザーとして、WSL2 側にも用意します。

[root@gmk work]# userdel cloud-user
[root@gmk work]# useradd araki
[root@gmk work]# passwd araki
New password: 
Retype new password: 
passwd: password updated successfully
[root@gmk work]# cd /home
[root@gmk home]# rm -rf cloud-user/
[root@gmk home]# rm -rf araki
[root@gmk home]# ln -s /mnt/wsl/PHYSICALDRIVE0p4/araki
[root@gmk home]# usermod --append -G  wheel araki

ここで、/mnt/wsl/PHSICALDRIVE0p4/araki になっているのは、上で systemd に登録したサービスのスクリプトのデフォルトのマウントポイントであるためで、変更できそうではあるのですが、WSL 側から Windows の PowerShell を呼んだりしているので、(ここでしか使わない黒魔法は)ここまでにして、シンボリックリンクで /home/araki にしておきます。

さらに、WSL 内に以下のファイルも設置して、デフォルトのログインユーザーを araki にしておきます。また、予期せぬ動作を防ぐために、Windows のパスは消しておきます。

/etc/wsl.conf
[boot]
systemd = true
                                                                        
[user]                                                                  
default = araki                                                         
                                                                        
[interop]                                                               
appendWindowsPath = false

一つ上のスクリプトの最後の usermod をやっておかないと araki は、sudo できません(sudoers でない。とか言われます)。これをやらずに wsl.conf だけやると詰みます(詰みました)。ですが、書いてある通り、ただの default 指定なので、wsl -u root とやると、wsl.conf を上書きできて助かりました。

ゴールに向けて

WSL2 は、GUI クライアントは Windows に任せることにして、VSCode と Chrome は、Windows 版を使いますので、git だけ導入しておきます。(VSCode から編集するファイルとターミナルは、WSL のもの)

[araki@gmk ~]$ sudo dnf install git
[araki@gmk ~]$ git config --global user.name "ARAKI Takeo"
[araki@gmk ~]$ git config --global user.email "xxxxx.xxxxx@xxxxx.xxx"

Windows11 Pro

いろいろと止められますが、Chrome をインストールします。上と同じ理由で、Git for Windows をインストールします。Windows11 はターミナルが優秀なので、Git bash で以下のようにしておきます。

$ git config --global user.name "ARAKI Takeo"
$ git config --global user.email "xxxxx.xxxxx@xxxxx.xxx"

VSCode は、Windows 環境でも使い、WSL 環境でも使えるように、WSL extension をインストールしておきます。

おわりに

結局、VSCode が使えれば、どこでも開発できるので、VSCode 万歳なのだが、Windows と Linux のデュアルブートだけでなく、WSL を使うと、同じホームディレクトリでファイル共有、共同?編集ができる状態で、同じリソースを使った実験ができたりして便利そうな環境が作れるという記事でした。

ということで、本来の目的のローカルLLMの実験をしていきたいと思います。
(せっかく RHEL だったら Podman もやっとく?という誘惑も無くはないです。)

GitHubで編集を提案
株式会社ROBONの技術ブログ

Discussion