WSL2でArchLinuxを使う
DockerでArchLinux環境を構築して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の原本は後書きへ
ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪
------------------- ↓ 本題はここから ↓-------------------
Docker Desktopをインストール
Windows上に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の更新は尋常じゃなく遅い。
原因はミラーリストが全部海外サーバーを向いてるからだそうで、
最初にミラーリストを更新する記述を追加する
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
パッケージリストの更新
ミラーサーバーのリストを調整したので、
パッケージリストを更新する。
ついでにいくつかパッケージを入れておく
RUN pacman -Sy\
&& pacman -Syu --noconfirm --needed git sudo wget nano
WSLユーザーを追加
rootで使うのはアレなので、
WSLで使用するユーザーを追加する。
あと、wsl設定ファイルにデフォルトユーザーを追加しておく
sudoも何かと使うのでその調整もしておこう。
ユーザー名を dozo
とすると
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