新規WSL環境構築

新規WSL環境構築

Intro

以前常用していた5年前のノートPC (NEC PC)が、バッテリーとSSDの交換を経て快適によみがえった。
ついでにそのPC内のWSL環境も一新しておこうと考えた。
そのお話。

TL; DR

  • zsh, prezto, powerlevel10kを導入した
  • shellの設定を追加した
  • WSLのnameserver問題を解決した
  • Ryeを導入した
  • WSLで完結するDocker環境を構築した
  • GPGのSub鍵を移行した
  • SSHの設定を移行した
  • vimの設定を移行した
  • nvmを導入した

Ubuntu 24.04 LTSのインストール

ここではWSL installの詳細な説明は行わない。
WSL自体はすでにinstallされている前提とする。

1
wsl --install -d Ubuntu-24.04

まずはaptで最低限のinstall

1
2
3
4
5
# まずはupdateとupgrade
sudo apt update && sudo apt upgrade -y

# 各installに用いるものを準備
sudo apt install -y git vim curl wl-copy

zsh

参照記事: (WSLにZshとPreztoとPowerlevel10kを導入する - Zenn)[https://zenn.dev/3w36zj6/scraps/3f47210998199e]

zshはPOSIX Shellなので、bashで作成したscrptなどの資源をそのまま利用できる。

zshのinstall

1
2
3
4
sudo apt install -y zsh

# shellをzshに変更
chsh -s $(which zsh)

Tweet

ここ以降、shellはzshを利用している。
ただ、記事のsyntax highlightの都合上、コードブロックの言語欄はbashとなっている。
実際のところ、気にする必要もないと思われる。

preztoのinstall

zshの設定管理ツールとして、preztoをinstallする。
oh-my-zshの方が有名らしいが。preztoはより軽量とのことだ。

1
2
3
4
5
6
git clone –recursive https://github.com/sorin-ionescu/prezto.git "\({ZDOTDIR:-\)HOME}/.zprezto"

setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done

powerlevel10k (shellのtheme)

.zpreztorc
1
2
3
4
# 150行目付近
zstyle ':prezto:module:prompt' theme 'powerlevel10k'

# zstyle ':prezto:load' pmodule \ の部分も必要に応じて追加する

初回読み込み時に、powerlevel10kの設定を行う。
自分好みの設定を選択する。

powerlevel10kの例

なお、フォントとしてはHackGen Console or Consolasを利用した。

HackGen Console
Consolas

.zshrc

zshでは、デフォルトでリダイレクトによるファイルの上書きが禁止されている。
小学生でもあるまいに、さすがに余計な気遣いなので変更する。

.zshrc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# .zshrcの終盤
# Customize to your needs...

# 既存の~/.bash_aliasesを利用する
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi

export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)"

# 上書き禁止を解除
setopt CLOBBER
# rm -rf * などのコマンド実行時の確認を解除
setopt RM_STAR_SILENT

# 以下はpowerlevel10kによって自動で追加される
# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh

# nvmやGPGなどの設定もここに随時追加される

Rust

1
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Rye

Pythonのpyenv+poetryをできるRust製の最高のツール。
Pythonの複数バージョンとプロジェクト環境の管理が簡単にできる。

Tweet

なぜpoetryは--devでのpackage installができなかったのか……

DNS解決の問題

wslは既知の問題として、resolv.confのnameserverが適切でない場合がある。
その場合に生じる問題は環境によってさまざまだが、一般的にはDNSの解決ができないことが多い。
aptwgetすら通らない場合もあれば、ryeにおけるgithubとの通信のみ妨げられる場合もある。

Ubuntu-22.04まで

GoogleのDNSを利用する場合、以下のように設定する。

/etc/resolv.conf
1
nameserver 8.8.8.8

ただし、デフォルトではresolv.confは自動生成されるため、手動で変更しても再起動時に元に戻ってしまう。
これは/etc/wsl.confgenerateResolvConf = falseとして、さらにsudo chattr +i /etc/resolv.confとして変更を禁止することで解決できる。

/etc/wsl.conf
1
2
3
4
5
[boot]
systemd = true

[network]
generateResolvConf = false
1
sudo chattr +i /etc/resolv.conf

Ubuntu-24.04

WSLのUbuntu-24.04ではnameserverがsystemd-resolvedによって管理されるようになった。
その中では/etc/resolv.confの書き換えは再起動の際に強制的に元に戻される。
DNSの設定を変更したい場合は、/etc/systemd/resolved.confを変更する。

/etc/systemd/resolved.conf
1
DNS=8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:

このサービスはsudo systemctl restart systemd-resolved.serviceで再起動できる。

Ryeのinstall

nameserverの問題が解決したら、Ryeをinstallする。
いくつかの質問が出てくるが、全部デフォルトのままで問題ない。

1
curl -sSf https://rye.astral.sh/get | bash

その後のRyeの実際の利用は、別の記事で記す。
便利だよ~!

vimの設定

筆者はGUIのVSCodeで見るほどでもない場合にvimを利用している。

下記ではいくつかのkey mapping、Color ThemeとしてPaperColorの選択を行っている。
特にデフォルトで行番号を表示し、mでtoggleできるようにしている。

Tweet

``でコメントアウトとなる。不思議な言語だ。”

~/.vimrc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
" paste setting
set pastetoggle=<F2>
" no beep
set belloff=all
" show line number
set number

" Color
"" line number
highlight LineNr ctermfg=120
autocmd ColorScheme * highlight LineNr ctermfg=120
"" color theme
syntax enable
set background=dark
colorscheme PaperColor

" key map
noremap <C-a> 0
noremap <C-e> $
nnoremap + <C-a>
nnoremap - <C-x>

noremap j gj
noremap k gk
" toggle line number
nnoremap m :set number!<CR>

Color Themeの本体は~/.vim/colorsに配置する。
~/.vim/colorsPaperColor.vimを配置する。
PapaerColor.vimはNLKNguyen/papercolor-theme - GitHubからダウンロードできる。

Docker

WSLでDockerのinstallとなると、Windows側のDocker Desktopをinstallするのが一般的だ。
だが、わざわざWindows側のGUIを使うのもなんだかなぁという気持ちもあり、WSL内のみで完結する方法を選択する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sudo apt-get install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
# GPGキーをダウンロード。
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# GPGキーの権限を変更。
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# docker groupにユーザーを追加
# 再ログイン以降はsudoなしでdockerコマンドが使える
sudo usermod -aG docker $(whoami)
# dockerが動くかの確認
sudo docker run hello-world

なお、Ryeの問題と同じく、Docker内のインターネット通信においてもDNSの問題は避けて通れない。
該当節を参照して対処せよ。

GPG

以前のMachineからGPGのSub鍵を継承する。

1
2
3
4
5
6
7
# Export
gpg -a -o sub.key --export-secret-subkeys NAME

# scpなどで移行

# Import
gpg --import sub.key

Info

NAMEは鍵の識別子であり、以下のいずれかを用いる。

  • 鍵のID
  • 鍵に紐づいたメールアドレス
  • 鍵に紐づいた名前

これはgpg --list-keysで確認できる。

1
2
3
4
5
6
7
8
❯ gpg --list-keys
/home/USERNAME/.gnupg/pubring.kbx
-----------------------------
pub rsa2048/ABCD1234EF567890 2021-01-01 [SC]
ABCD1234EF5678901234567890ABCDEF12345678
uid [ultimate] Your Name <[email protected]>
sub rsa2048/12345678ABCDEF12 2021-01-01 [E]
sub rsa2048/87654321FEDCBA98 2021-01-01 [A]

上記の場合は、ABCD1234EF5678901234567890ABCDEF12345678Your Name[email protected]がNAMEとして使える。

GPGのphrase保存期間などは、~/.gnupg/gpg-agent.confに記述する。

~/.gnupg/gpg-agent.conf
1
2
3
4
5
use-standard-socket
default-cache-ttl 28800
max-cache-ttl 28800

enable-ssh-support

さらにGPGの認証鍵をSSH通信に用いる方法は別記事参照。

SSH

ssh自体は~/.ssh/*を移行すれば概ね完了だ。
ssh-agentを用いる場合、利用する秘密鍵を改めてssh-add SSH_KET_PATHで登録する。

~/.bash_aliaes

zshはbashと同じくPOSIX Shellなので、~/.bash_aliasesをほとんどそのまま利用できる。

以下に汎用性の高い部分を参考までに記しておこう。

~/.bash_aliases
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

# open explorer at the directory
alias expl="_OpenWindowsExplorer"
function _OpenWindowsExplorer(){
dir_path="${1:-.}"
explorer.exe $(wslpath -w "$dir_path")
}

# less
alias less2="/usr/bin/less -R -N --QUIET"
export VISUAL="vim"
export LESSOPEN="|/usr/bin/lesspipe | /usr/share/source-highlight/src-hilite-lesspipe.sh %s"

alias less="_ViewForLess"
function _ViewForLess(){
input="$@"
if [[ "x${input}" != "x" ]] ; then
view "${input}"
else
view -
fi
}

# docker
alias dockerVolCp="_DockerVolume_Copy"
function _DockerVolume_Copy(){
container_name="tmp_volcp"$(date +%s)

# :が含まれている方がDocker Volumeのpath
if [[ "$1" == *":"* ]]; then
mode="from"
virtual_path="$1"
host_path="$2"
else
mode="to"
host_path="$1"
virtual_path="$2"
fi
volume_name=$(echo $virtual_path | cut -d: -f1)
virtual_dest=$(echo $virtual_path | cut -d: -f2)
host_path="$1"
virtual_path="$2"
# file_name=$(basename $file_path)
docker container create --name $container_name -v $volume_name:/root hello-world
if [[ $mode == "from" ]]; then
docker cp $host_path $container_name:/root/$virtual_dest
else
docker cp $container_name:/root/$virtual_dest $host_path
fi
docker rm $container_name
}

# extension
# chrome extension zip
alias crxzip="rm ~/downloads/src.zip -f && zip ~/downloads/src.zip src -r -x */*Zone.Identifier -x */.*"
# vscode extension pack
alias vscepack='docker run --rm -it -v "$(pwd)":/workspace vsce package'
alias gpgReset="echo UPDATESTARTUPTTY | gpg-connect-agent"

zsh側で読み込むためには.zshrcなどにsource ~/.bash_aliasesを追加する。

nvm

nodeも各softwareのinstallなどで必要なので、あらかじめinstallしておく。

1
2
3
4
5
6
7
8
9
10
11
12
# installs nvm (Node Version Manager)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

source ~/.zshrc
# download and install Node.js (you may need to restart the terminal)
nvm install 20

# verifies the right Node.js version is in the environment
node -v # should print `v20.15.1`

# verifies the right npm version is in the environment
npm -v # should print `10.7.0`

まとめ

以上で、WSL環墋の最低限の構築は完了だ。
他にフォルダ構造の作成や、GitHubのサインイン (and Session保存)、各種ソフトのinstallなどあるが、それはまた別の機会としよう。

コメント