WSL2 に Archlinux をインストールするめも

お仕事で使っている Archlinux が `yay -Syu` で gpg key のエラーが出るようになった、解決方法を調べるの面倒、だいぶ長く使ってる環境、そろそろ VirtualBox やめたいということで、WSL2 に移行した際のめもです。

基本的にはMSの公式ドキュメントに従えばOK。

https://docs.microsoft.com/ja-jp/windows/wsl/use-custom-distro

~~**注意:** どうやらこの手順だとイメージに何かしらの問題がある模様。locale の設定でエラーが出ています。原因わかり次第更新します。~~ [解決しました](#locale設定)

# 前提

- Windows 10
- WSLに Ubuntu 環境導入済み


# Ubuntu 環境に docker install

Docker がまだ入っていなかったので、下記公式に従ってインストール。Ubuntu でなくても Docker が実行できればなんでもいいです。

https://docs.docker.com/engine/install/ubuntu/

# Archlinux の tar イメージ作成

このステップ。
https://docs.microsoft.com/ja-jp/windows/wsl/use-custom-distro#export-the-tar-from-a-container

上記手順は centos なので、その代わりに Archlinux の公式 Docker image を使います。

https://hub.docker.com/_/archlinux

```shell
sudo service docker start
sudo docker run -t archlinux ls / # (1)
dockerContainerID=$(sudo docker container ls -a | grep -i archlinux| awk '{print $1}') # (2)
sudo docker export $dockerContainerID > /mnt/c/temp/archlinux.tar
sudo docker rm $dockerContainerID
```

基本は公式手順通り。ポイントは以下。

- デフォルトでは docker コマンドの実行には要sudo
- centos の手順では (1) で `bash ls /` を指定しているが、archlinux のイメージでは entry point が設定されているので `ls /` のみでOK。`bash` を指定すると `/usr/sbin/ls: cannot execute binary file ` のエラー発生。
- Docker コンテナはデフォルトは終了しても残るので、(1) のコマンドを繰り返すと、(2) で複数のコンテナIDを取得することになってしまうので注意
- 最後に不要になったコンテナを削除。


# WSL に Import

Powershell を起動してtar ファイルをインポートし、起動。

https://docs.microsoft.com/ja-jp/windows/wsl/use-custom-distro#import-the-tar-file-into-wsl

```
wsl --import Arch c:\<path-to-disk-image-dir> .\archlinux.tar
wsl -d Arch
```

パッケージを更新しておく。
```
pacman -Syu
```

# Pacman のミラー設定

https://wiki.archlinux.jp/index.php/%E3%83%9F%E3%83%A9%E3%83%BC

```
pacman -S pacman-contrib # rankmirrors を使うのに必要
cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.backup
curl -s "https://archlinux.org/mirrorlist/?country=JP&country=AU&protocol=https&use_mirror_status=on" | sed -e 's/^#Server/Server/' -e '/^#/d' | rankmirrors -n 5 - > /etc/pacman.d/mirrorlist
```

# ユーザーの作成とデフォルトログインユーザーの変更

ログインユーザーが root になっているので、普段使用する一般ユーザーを追加。

https://docs.microsoft.com/ja-jp/windows/wsl/use-custom-distro#add-wsl-specific-components-like-a-default-user

https://wiki.archlinux.jp/index.php/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%A8%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97

```
useradd -m -G wheel -s /bin/bash <username>
passwd <username> # パスワードを設定
```

sudo を使えるように。
```
pacman -S sudo vim
EDITOR=vim visudo
#  %wheel ALL=(ALL:ALL) NOPASSWD: ALL <-- この行をアンコメント
```

作成したユーザーでログインするよう変更。

```
echo -e "[user]\ndefault=<username>" >> /etc/wsl.conf
```

WSLインスタンスを再起動して、sudo 設定が反映されていることを確認。

```
wsl --terminate Arch
wsl -d Arch
sudo ls
```

# locale設定

`/etc/locale-gen` の `ja_JP.UTF-8 UTF-8` の行をアンコメントして次のコマンドを実行。

```bash
locale-gen
```

しかしエラー発生
```
ja_JP.UTF-8...[error] cannot open locale definition file `ja_JP': No such file or directory 
```

いろいろ調べたところ、どうやら `/locale/lib/locale` に該当のファイルがないらしい。

こちらを参考に glibc のキャッシュから必要なファイルをコピー。
https://zenn.dev/dozo/articles/30b0a292246f92

```bash
# 上記記事から引用
cd 
mkdir glibc
cp /var/cache/pacman/pkg/glibc-2.35-2-x86_64.pkg.tar.zst ./
tar xvf ./glibc-2.35-2-x86_64.pkg.tar.zst -C ./glibc
sudo cp usr/share/i18n/locales/ja_JP /usr/share/i18n/locales/
```

再度 `locale-gen` を実行して完了。

```bash
locale-gen
Generating locales...                                                                                                     ja_JP.UTF-8... done
Generation complete.     
```


以上！