Windows に Linux を入れる(WSL + Ubuntu)導入メモ
概要
WindowsとMac両方持っていて、どちらでも開発を行うことがあるのだが、開発体験がWindowsとMacで異なることが多いため困っていた。
WindowsとMacではOSもシェルも異なるため、コマンドに差異があったり入れることができるツールにも差が出てくる。
そのため、少しでも開発体験を同じにできるようにWindowsにLinuxを入れることにした。
MacはUnixであるためLinuxともかなり体験が近くなる。
今回はUbuntu(諸々必要なものが入ってるディストリビューション)を入れて、WSLでLinuxを動かしてみた。
前提
OS / カーネル
カーネル
OS の中核となるソフトウェアでOSの一部である。アプリとOSの仲介役のような役目を持つ。
CPU・メモリ・ストレージ・ネットワークなどのハードウェア資源を管理してアプリケーションに使わせる。
- Windows → NT カーネル(Unix/Linux とは別系統)
- macOS → XNU(Mach + BSD)
- Linux → Linux カーネル(多数のディストリで配布されている)
ターミナル(PowerShell / Terminal.app)は OS に命令を出す窓口で内部で シェル(zsh, bash など)が動く。流れはこう。
ユーザー入力↓ターミナル↓シェル (bash, zsh, PowerShell…)↓カーネル↓ハードウェアを制御 or アプリを起動WSL とは
WSL1
Linux のシステムコールを Windows に翻訳する役目を持つ。
WSL2
軽量 VM(仮想マシン)上の本物の Linux カーネルが動く。互換性・再現性が高く現在の主流。
Ubuntu は WSL で選べる代表的な Linux ディストリビューションのひとつ(他に Debian/Alpine など)。
VM上で動いてるので、直接WIndowsとのやり取りはできない。
そのためWindowsへ指示を出したい場合は引き続きPowerShellを通じて行う必要がある。
※ 仮想マシンは、CPU・メモリ・ディスクなどを仮想的に分割して“別のPC”を作り出している。その中にLinuxが入ってる。(ホストマシンのリソースに依存している)
- WSL2 の役割
- WSL2は仮想マシンを作成する仕組み。その仮想マシンにUbuntuなどのディストリビューション(日常的に使うパッケージマネージャやユーティリティがそろったLinuxOS)を入れる。
- シェルとターミナルの関係 ※ Windows Terminal などの「ターミナルアプリ」は単なる“窓”であり、実際に OS に命令を出すのはシェル。- PowerShell ターミナルは シェルが PowerShell なので、Windows にしか命令できない。- Linux に命令を出すには、WSL 上で bash や zsh といった Linux シェルを使う必要がある。
- Windows ↔ Linux の橋渡し
- カーネルが異なるため、直接の命令はできない。
- ただし Microsoft が ファイル共有機構(
/mnt/cなど)や 相互呼び出し(Linux からnotepad.exe、Windows からwsl lsなど)を実装しているため、異なる OS 間でも一部のリソース共有・参照が可能。- ただし、
/mnt/cと WSL の境界越え I/O が遅いのでプロジェクトは/home側に置くことを推奨。
- ただし、
dotfilesの取り組みの中で.zshrc を管理してたりするが、Mac では zsh を使っているので、WSL2 + Ubuntu でも zsh を入れることで .zshrc を共通管理できるようになったのは大きい。
導入手順(WSL2 + Ubuntu)
インストール
PowerShell(管理者):
wsl --installwsl --set-default-version 2wsl --update確認:
wsl -l -vVERSION が 2 なら WSL2。
Ubuntu 起動
- スタートメニューから Ubuntu を起動(初回はユーザー/パスワードを設定)。
- 以後は PowerShell からも起動可:
wsl -d Ubuntu初回アップデート
sudo apt update && sudo apt -y upgrade開発環境の基本セットアップ
zsh の導入と既定シェル化
sudo apt updatesudo apt install -y zshchsh -s "$(which zsh)"反映には wsl --shutdown → 再起動。シェル確認:
echo $SHELLVS Code / Cursor で WSL を開く
- VS Code に Remote - WSL を入れる。
- WSL 側でプロジェクトディレクトリへ移動し:
code .# またはcursor .chezmoi(dotfilesで使用)
インストール:
sh -c "$(curl -fsLS get.chezmoi.io)"PATH(例):
echo 'export PATH="$HOME/.local/bin:$HOME/bin:$PATH"' >> ~/.zshrcsource ~/.zshrcテンプレートで OS 分岐する場合(例): {{ if eq .chezmoi.os "linux" }} ... {{ end }}
ghq
Go製なのでGoをまずは導入する
sudo apt install -y golang-goGoでビルドして導入
go install github.com/x-motemen/ghq@latestecho 'export PATH="$HOME/go/bin:$PATH"' >> ~/.zshrcsource ~/.zshrcghq --versionzsh設定
次のコマンド入力を待っているときに表示される文字列が、デフォルトだと {マシン名}% なので、~/{path} のように変更する(好みによる)。
echo 'export PS1="%~ %# "' >> ~/.zshrcsource ~/.zshrcpeco の文字化け対策
apt 版 peco(古いビルド)を入れたらターミナルが文字化けしたので、削除してLinuxbrew を導入して peco を入れ直した。
Linuxbrew 導入:
/bin/bash -c "$(curl -fsSL <https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh>)"# brew の PATH 追加(出力の指示に従う)peco を brew で再インストール:
sudo apt remove -y pecobrew install pecowhich peco # /home/linuxbrew/.linuxbrew/bin/peco が望ましい任意:クリップボード
- 「Ubuntu アプリ(WSL コンソール)」を管理者権限で開き、左上のUbuntuアイコンクリック後にプロパティを選択し、コピーペースト許可を有効化しておく。
SSH 鍵の移行
WindowsOS側で使用していたSSH kyeをそのままコピペして移動した。
chmod 700 ~/.sshchmod 600 ~/.ssh/id_rsachmod 644 ~/.ssh/id_rsa.pubNode/asdf(mise)
開発は基本devcontainerで行うため、nodeはホスト側に不要なケースが多くなるが、簡易的なWebアプリやSSGなどはホストで実行したいため、一応入れておく。
Linuxbrewでasdfの導入
asdf plugin add nodejs <https://github.com/asdf-vm/asdf-nodejs.git># mise の場合mise use -g nodejs@ltsNode.jsインストール
asdf install nodejs latestasdf global nodejs latest# mise の場合mise use -g nodejs@ltsよくある
- PATH が反映されない →
source ~/.zshrcまたはexec zsh -l。 chshの反映 →wsl --shutdown後に再起動。- I/O が遅い → プロジェクトは
/home/<user>直下に置く(/mnt/cは避ける)。 - Windows ⇔ Linux パス変換 →
wslpathを使う。 - VS Code で WSL 上のフォルダが重い → Remote-WSL で開いているか確認。
基本コマンド
# PowerShellwsl -l -v # ディストリとバージョン確認wsl --update # WSL 更新wsl --shutdown # WSL を停止# Ubuntu (WSL)lsb_release -a # ディストリ情報uname -a # カーネル情報wslpath <path> # パス変換 (Win ⇔ WSL)