Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

任意のLinuxディストリビューションをWSL2で動かす Clear Linux OSを動かすまで

f:id:espio999:20210424121632p:plain
WSLを使い始めるうちに、Windowsコンテナを調べ始めた。
Windowsにコンテナ技術が搭載された。WindowsでもLinuxでもゲストとして動作させることができるのだが、Microsoftはその運用管理ツールを提供していない。運用管理にはDockerを用いることになっている。

そこでDockerについて調べ始めたところ、Dockerコンテナをエクスポートして、それをWSLへインポートできることを知った。それを試してみたところ、本当にWSL上で動作しているのだ。
これを確認したときは、一周回って、螺旋を一段上がったような気分だった。

この方法を利用することで、Microsoft Storeでは提供されていないディストリビューションでも、WSL上に環境構築することができる。例えばDocker Hubで公式イメージが配布されている、archlinux、alpine、CentOSのようなディストリビューションだ。そして、もちろんClear Linux OSも。

環境、前提条件など

この投稿では、次の環境を用いてる。

  • Windows 10 Pro 20H2 19042.928
  • Docker Desktop for Windows 3.3.1 (63152)

以降の記述内容は、すでにDockerとWSL2が導入され、稼働済みであることを前提にしている。

WSLへインポートするディストリビューションはClear Linux OSとしているが、インポートまでの操作は、どのディストリビューションでも共通に機能するはずだ。


また記述内容の設定は、参照資料が指し示すものとは異なる場合がある。例えば、私はDockerのWSL Integrationを利用していない。
また、WSLへインポートするまでのコマンド操作は全てPowerShellから行っており、Microsoft Storeから導入したディストリビューションからの操作も行っていない。つまり、ここで紹介する作業を実施するに際し、Microsoft StoreからUbuntuなどをインストールする必要もない。

Docker > Settings > WSL Integration
f:id:espio999:20210422204730p:plain

Dockerコンテナからのファイル・システム取得、tarファイルのエクスポート

ここでは次の手順を経る。全ての操作はコマンドだけで完結できるし、一部ではGUI操作を取り入れても良い。
また出力するtarファイル名は任意でよい。

  1. Docker Hubから目的のディストリビューション・イメージを取得
  2. 取得したイメージを起動
  3. コンテナ名(NAMES)を確認
  4. コンテナ名を指定して、tarファイルへエクスポート

コマンド

docker pull clearlinux
docker run clearlinux
docker container ls -a
docker export --output="clearlinux.tar" angry_bhabha


出力
f:id:espio999:20210422205157p:plain

WSLへのtarファイルのインポート

出力したtarファイルを、WSLへインポートする。インポートの前に、WSL上でのディストリビューション名、ディストリビューションの導入フォルダを特定しておく。
ここでは、次のように定義している。

ディストリビューション Clear
導入フォルダ D:\user temp\wsl\clear

Microsoft Store以外から任意のディストリビューションを導入する場合、導入イメージの初期化やアンインストールは、全てWSLコマンドで行うしかない。
本来、ディストリビューションはCドライブに導入することになっているのだが、長時間稼働、安定運用を想定しているわけでもなく、作って壊す管理の容易さを優先して、ここではDドライブにインストールしている。

The Windows Subsystem for Linux only runs on your system drive (usually this is your C: drive). Make sure that distributions are stored on your system drive:

Install WSL on Windows 10 | Microsoft Docs

次のコマンドでインポートすると、Clear LinuxディストリビューションClearとして、WSLへ登録される。

コマンド

wsl --import Clear "D:\user temp\wsl\Clear" .\clearlinux.tar
wsl -l -v


出力
f:id:espio999:20210422205511p:plain

Clear Linux OSの初期導入作業

ここからの作業はWSLのディストリビューション上で行う。作業環境として引き続きWSLを利用しても良いし、目的のディストリビューションに繋がりさえすれば、好みのターミナルを用いても良い。

Microsoft Storeから導入するディストリビューションと同様に、導入直後のディストリビューションは、ユーザーなどが定義されていない。Clear Linux OSの場合はsudoすら導入されていない。

Clear Linux OSではパッケージ群のことをバンドル(bundle)と呼ぶ。これは依存関係のあるパッケージ一式をまとめたもので、swupdを用いて管理する。

ここでの作業は次の手順を経る。

wsl.confには、ディストリビューション接続時のデフォルト・ユーザーを定義する。次回接続時からは、指定ユーザーで自動的にログインできる。

コマンド

useradd wsluser
passwd wsluser
usermod -G wheel -a wsluser
cat << EOF > /etc/wsl.conf
[user]
default=wsluser
EOF
swupd bundle-add sudo
exit


コマンド

sudo swupd update
exit


出力
f:id:espio999:20210422210702p:plain

環境を作って壊すたびに、上記作業を繰り返すのは効率が悪い。ある程度作業を進めた状態のディストリビューションを保存しておき、再利用すれば、効率が良い。
最低限の環境が整った状態で、WSLディストリビューションをエクスポートしておく。今後は、このWSLから出力したtarファイルをインポートすることで、最低限の環境が整ったディストリビューションを手間なく用意することができる。

後はご自由に。

コマンド

wsl -t Clear
wsl -l -v
wsl --export Clear E:\WSL\clearlinux.tar

バンドルについての詳細は、投稿末尾の資料を参照してほしい。ここでは、典型的なものを2つ挙げておく。

desktop デスクトップ環境一式
sysadmin-basic 運用環境一式

冒頭の画面は、Clear Linuxの標準デスクトップ(GNOME)を立ち上げたところだ。