🥈

AmazonLinux2022 on wsl2 を試す

2022/08/25に公開

この記事の概要

最近はWSLをいじいじするのにハマっています。

前提条件

  • ubuntu等、既に何かしらのWSLディストリビューションが入っている
  • WSLのバージョンが2になっている
  • WSL上でdockerが動く(docker desktopが入っている 等)

前置き

wslにはimport機能があり、コンテナのtar等を取り込んで
カスタムプラットフォームとして使うことができます。


インポート編

AL2022のtarファイルを探したんですが、公式がtarとして配布してる様子がないので
dockerイメージを起動してからtarとしてエクスポートします。

AL2022のコンテナイメージ(tar)を抽出

イメージ出力用のディレクトリを作ります。

mkdir -p /mnt/c/wslimage

まずはdocker pullでAL2022のコンテナイメージを持ってきます。

docker pull amazonlinux:2022

イメージからdocker runで起動していきます。

[boomkun@laptop:~]$ docker images
REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
amazonlinux   2022      9bea335b6ed0   2 weeks ago   159MB

[boomkun@laptop:~]$ docker run 9bea335b6ed0

コンテナIDを特定してエクスポート

[boomkun@laptop:~]$ docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED              STATUS                          PORTS     NAMES
8e1c8b042faf   9bea335b6ed0   "/bin/bash"   About a minute ago   Exited (0) About a minute ago             dreamy_babbage  

[boomkun@laptop:~]$ docker export 8e1c8b042faf > /mnt/c/wslimage/AL2022_wsl.tar

tarをWSL2にインポートする

windowsアイコンを右クリックし、Windows PowerShell(管理者)を起動
wsl --importディストリビューション名, 保存場所, tarファイルの場所 の順に指定して実行します。

PS C:\WINDOWS\system32> wsl --import al2022 C:\wslimage\al2022 C:\wslimage\AL2022_wsl.tar

wsl -l -v で一覧を確認。(-l-vが逆だと動かない)

PS C:\WINDOWS\system32> wsl -l -v
  NAME                   STATE           VERSION
* AlmaLinux-8            Running         2
  al2022                 Stopped         2

セットアップ編

AL2022にログインする

wsl -d al2022

もしくはターミナルクライアントから、先程作成したディストリビューションに入ります。
rootユーザーで入れるはずです。

PS C:\WINDOWS\system32> wsl -d al2022
[root@PC-296 ~]#

resolv.confの自動生成をやめる

初期状態だと/etc/resolv.confが変な値で自動生成され
リポジトリの名前解決が出来ないなど、使用上支障をきたします。
/etc/wsl.confの作成と/etc/resolv.confの修正で防げるのでこれを実施します。

既にあるファイルの削除
unlink /etc/resolv.conf
wsl.conf + resolv.confの設定
echo "[network]" >> /etc/wsl.conf && \
echo "generateResolvConf = false" >> /etc/wsl.conf && \
echo "nameserver 8.8.8.8" > /etc/resolv.conf

※↑そのままコピーして実行でいけるはずです。

要りそうなパッケージを入れる

初期状態だとsudouseraddなどの当たり前に使うコマンドが入っていないので
入れていきます。

アップデート
yum update -y
インストール
yum install tar xz zip unzip sudo shadow-utils procps wget openssh-server openssh-clients which iproute less rsyslog bind-utils jq findutils util-linux-user yum-utils -y

awscliのインストール(スキップ可)

私はawscliを使うので、最新版を入れます。

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
unzip awscliv2.zip >> /dev/null && \
./aws/install

ログインユーザの作成 + デフォルトとして設定

初期状態だとrootユーザしかいないので、作業用のユーザを作ります。

useradd "wsl-user" && echo "wsl-user ALL=NOPASSWD: ALL" >> /etc/sudoers && \
echo "[user]" >> /etc/wsl.conf && \
echo "default = wsl-user" >> /etc/wsl.conf
この時点でこうなっていればOK

ユーザがいる

[root@laptop ~]# grep "wsl-user" /etc/passwd
wsl-user:x:1000:1000::/home/wsl-user:/bin/bash

resolv.conf生成がオフ + デフォルトユーザが定義されている

[root@laptop ~]# cat /etc/wsl.conf
[network]
generateResolvConf = false
[user]
default = wsl-user

WSL2上でsystemdを利用可能にする

現在の状態だと、systemdPID 1以外で起動しているため使えない状態にあると思います。

[root@laptop ~]# systemctl status
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

そこで、Distrodを入れてこれを有効化していきます。

curl -L -O "https://raw.githubusercontent.com/nullpo-head/wsl-distrod/main/install.sh" && \
chmod +x install.sh && \
./install.sh install && \
sudo /opt/distrod/bin/distrod enable

[Distrod] Distrod has been enabled. Now your shell will start under systemd.が出ればOK

PC再起動

わかる方はwslの再起動コマンドでも構いません。
これをしないとdistrodの有効化とresolv.conf自動生成の無効化ができません。


削除編

ディストリビューションの登録解除

powershell@管理者から以下のコマンドを実行して下さい。

wsl --unregister al2022

import時に指定したディレクトリからディスクイメージファイルが消えるはずです。

バックアップしておきたい場合

こちらのコマンドでバックアップが取れます。

wsl --export al2022 C:\wslimage\AL2022_custom.tar

Discussion