📚

WSL2でArchLinuxを使う

2021/07/26に公開

DockerArchLinux環境を構築してWSLにインポートする

------------------- ↓ 前書はここから ↓-------------------

ArchLinuxという名称をよく見かける。
筆者自身各ディストリビューションに明るいわけではないので、
違いはよくわかってない。

ただ、以前MSYS2を扱ったときにパッケージマネージャーのpacmanを使ったので、
そういえばArchLinuxもpacman使ってたよなぁと。

(゚_゚) ちょっと触ってみる?

A simple, lightweight distribution
You've reached the website for Arch Linux, a lightweight and flexible Linux® distribution that tries to Keep It Simple.
Currently we have official packages optimized for the x86-64 architecture. We complement our official package sets with a community-operated package repository that grows in size and quality each and every day.
Our strong community is diverse and helpful, and we pride ourselves on the range of skillsets and uses for Arch that stem from it. Please check out our forums and mailing lists to get your feet wet. Also glance through our wiki if you want to learn more about Arch.
https://archlinux.org

実際使ってみたら軽量でもシンプルでもなかったけど。

配布形式はiso。
つまりCDからインストールするということになるわけだが。
WSLはそれができない。

調べてみるとUnsquashFSからインポートする方法があったのだが、
そのためにはUbuntuがいるとか。。。

(^_^;) 二度手間だなぁ

なのでDocker経由でやってみようかと。
筆者はWSLは基本debian-slim、
このときもDockerで環境作ってインポートしている。
同じ要領でいけるやろ。

Dockerfileの原本は後書きへ

ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪

------------------- ↓ 本題はここから ↓-------------------

Windows上にDocker Desktopをインストール

Windows上にDocker Desktopをインストールする。
Windows10を最新にしておくのが前提

ストアページからアプリ インストーラーをインストールする
PowerShellを起動し以下のコマンドを実行

winget install Docker.DockerDesktop

DockerHubより公式のイメージをpull

先にpullしておくとキャッシュしてくれるので。

docker pull archlinux:latest

Dockerfileの作成

とりあえずFROMだけ入れとくか

printf "FROM archlinux:latest\n"| tee Dockerfile

公式ミラージェネレータからミラーリストを作成

さて、作業に当たって一つ困ったことがある。

(゚Д゚) ダウンロードおせーよ!!!

aptにしてもyumにしても導入したら一番最初にリストの更新をすると思うが、
pacmanの更新は尋常じゃなく遅い。

原因はミラーリストが全部海外サーバーを向いてるからだそうで、
最初にミラーリストを更新する記述を追加する

Dockerfile
ARG LOCATE=JP 

RUN cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.backup\
 && curl -fsSL "https://archlinux.org/mirrorlist/?country=${LOCATE}&protocol=http&protocol=https&ip_version=4"\
  | sed 's/^#Server/Server/g' | tee /etc/pacman.d/mirrorlist

パッケージリストの更新

ミラーサーバーのリストを調整したので、
パッケージリストを更新する。
ついでにいくつかパッケージを入れておく

Dockerfile
RUN pacman -Sy\
 && pacman -Syu --noconfirm --needed git sudo wget nano

WSLユーザーを追加

rootで使うのはアレなので、
WSLで使用するユーザーを追加する。
あと、wsl設定ファイルにデフォルトユーザーを追加しておく
sudoも何かと使うのでその調整もしておこう。

ユーザー名を dozoとすると

Dockerfile
ARG UID=1000
ARG GID=1000
ARG USERNAME=dozo

RUN groupadd -g ${GID} ${USERNAME} \
 && useradd -u ${UID} -g ${GID} -G wheel -m ${USERNAME} \
 && passwd -d ${USERNAME}\
 && printf "%%wheel ALL=(ALL) NOPASSWD:ALL\n" | tee -a /etc/sudoers.d/wheel\
 && printf "[user]\ndefault=${USERNAME}\n" | tee /etc/wsl.conf

ビルドしてコンテナを作成

Dockerfileが準備できたのでビルドしてみよう
コンテナを起動してコンテナIDを取得

docker build . -t archlinux:1.0
docker run -t archlinux:1.0 test
docker ps -a
CONTAINER ID   IMAGE            COMMAND  
822d65cf26cb   archlinux:1.0   "test"   

コンテナをエクスポートしてWSLにインポート

コンテナが完成したので、
WSLに受け渡すtarを作成

インストール先を C:\Programs\ArchLinuxとすると

docker export -o archlinux.tar 822d65cf26cb
wsl --import Arch C:\Programs\ArchLinux archlinux.tar --version 2
wsl -l -v
  NAME                   STATE           VERSION
  Arch                   Stopped         2

WSLログインしてみる

ではログインしてみよう

wsl -d arch
$ passwd
New password:
Retype new password:
passwd: password updated successfully

(・∀・) でけた!

------------------- ↓ 後書はここから ↓-------------------

Dockerfile

本題では細切れで記述したが、
原本へのリンクも貼っておく。
内容はその後いろいろ調整しちゃったけど。。。

Dockerfile for ArchLinux

locale設定に失敗する

locale設定をしようとすると

sudo localectl set-locale LANG=ja_JP.UTF-8
Failed to issue method call: Failed to generate locale: Protocol error

Protocol errorとは?

localectl list-locales
 en_US.UTF-8

日本語無いな

sudo locale-gen
 Generating locales...
  en_US.UTF-8... done
  ja_JP.UTF-8...[error] cannot open locale definition file `ja_JP': No such file or directory

(?_?) ん?

よくわからんけどlocaleファイルがないらしい。
ダメだ。調べよう。

紆余曲折の末、どうやら /usr/share/i18n/locales/ にlocaleファイルがないのが原因らしい

ls -la /usr/share/i18n/locales/ | grep -i jp

(・ω・) どないしよ

localeファイルがあるglibcパッケージ内には存在してるっぽいから、
そこから持ってくるか。
パッケージのキャッシュは残っていたのでそれを使用。
無ければネットから引っ張ってくるしかない。

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/

再度local-genしてみる

sudo locale-gen
Generating locales...
  en_US.UTF-8... done
  ja_JP.UTF-8... done
Generation complete.

(・∀・)通った!

sudo localectl set-locale LANG=ja_JP.UTF-8
localectl
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: jp106
      X11 Layout: jp
       X11 Model: jp106
     X11 Options: terminate:ctrl_alt_bksp

いけたいけた。
あとは起動プロセスに追加するだけ

export LANG="ja_JP.UTF-8"

Discussion