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
を押します。
ここで付けた Name
と Organization ID
で製品登録をしますので、メモっておいてください。これだけで Red Hat Enterprise Linux が使えるとは良い時代になったものです。(大昔、秋葉原の某所で CD 買って以来かもしれない)
ダウンロードは、ログインした画面から Featured
の Red Hat Enterprise Linux
から行くのが良さそうです。適当に画面遷移すると Boot 用の小さい方の ISO イメージのダウンロードが勝手に始まりますが、ずいぶん前から USB メモリは安いので、DVD イメージの方が扱いやすいと思います。
上のリンク先で Download/Sign up
タブへ行くと、Latest Red Hat Enterprise Linux version - 10
の Download ISO
と RHEL 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 Key
に Organization
と Activation 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 WSL
の hel-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 内で、以下のファイルを作成します。
[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 のパスは消しておきます。
[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 もやっとく?という誘惑も無くはないです。)
Discussion