最新のUbuntu24だとPythonのライブラリ管理が面倒だったので
WSL2とUbuntu22.04のインストール
WSL2インストール
Powershellを開き、
wsl --install
するとインストールが始まる。

インストールが完了すると、再起動と言われる。

再起動したら勝手に最新のUbuntu24.04がインストールされてしまっていた。

こいつを消して22.04を入れなおしていく。
インストール済み一覧
PS C:\Users\hoge> wsl -l -v
NAME STATE VERSION
* Ubuntu Running 2
アンインストール
PS C:\Users\hoge> wsl --shutdown
PS C:\Users\hoge> wsl --unregister Ubuntu
登録解除。
この操作を正しく終了しました。
改めて22.04をインストールしていこう。
インストール可能バージョン確認
PS C:\Users\hoge> wsl -l -o
インストールできる有効なディストリビューションの一覧を次に示します。
'wsl.exe --install <Distro>' を使用してインストールします。
NAME FRIENDLY NAME
Ubuntu Ubuntu
Debian Debian GNU/Linux
kali-linux Kali Linux Rolling
Ubuntu-18.04 Ubuntu 18.04 LTS
Ubuntu-20.04 Ubuntu 20.04 LTS
Ubuntu-22.04 Ubuntu 22.04 LTS
Ubuntu-24.04 Ubuntu 24.04 LTS
OracleLinux_7_9 Oracle Linux 7.9
OracleLinux_8_7 Oracle Linux 8.7
OracleLinux_9_1 Oracle Linux 9.1
openSUSE-Leap-15.6 openSUSE Leap 15.6
SUSE-Linux-Enterprise-15-SP5 SUSE Linux Enterprise 15 SP5
SUSE-Linux-Enterprise-15-SP6 SUSE Linux Enterprise 15 SP6
openSUSE-Tumbleweed openSUSE Tumbleweed
Ubuntu 22.04を指定してインストール
PS C:\Users\hoge> wsl --install -d Ubuntu-22.04
インストール中: Ubuntu 22.04 LTS
Ubuntu 22.04 LTS がインストールされました。
Ubuntu 22.04 LTS を起動しています...
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username:
ユーザー名とパスワードを設定すればインストール完了だ。
ちなみにubuntuに入りたいときは、Powershellからwslと打てばいい。
WSL2からインターネットに繋がらなくなる問題
WSLでUbuntuなりを動かしていて、ソフトの追加等でresolv.confが変わってしまうと、それ以降インターネットに繋がらなくなる問題がある。
僕の場合はNordVPNが全く繋がらなくてサポートに連絡しようかと思ったほど。
対応策はこちら
Windows内に「C:\Users\<<ユーザ名>>.wslconfig」ファイルを作成し、以下の内容で保存しておく。
WSLの再起動で反映される。
[wsl2]
dnsTunneling=true
Ubuntu内の環境構築
パスワード無しでsudo
開発環境でsudoのたびにパスワード入力は面倒なので、省略してしまおう。
$ sudo visudo
#hogeはユーザー名。これを任意の場所に配置する。
hoge ALL=NOPASSWD: ALL
zshのインストール
$ sudo apt install zsh
# ついでにログインシェルもzshに変更しておく
$ chsh -s /bin/zsh
これでターミナルやvscodeを再起動すれば、zshで起動できるようになる。
MySQLのインストール
# MySQLのインストール
$ sudo apt update
$ sudo apt install mysql-server
# バージョン確認
$ mysql --version
# 初期設定
$ sudo mysql_secure_installation
# 最初のログインはsudoで
$ sudo mysql -u root
# rootのパスワード設定
$ ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
nginx/php-fpmのインストール
さっそくインストールしていく。
$ sudo apt-get install nginx php-fpm
インストールが完了したら、バージョンを確認しておこう。
2024年10月現在はphp8.1-fpmがインストールされた。
$ nginx -v
nginx version: nginx/1.18.0 (Ubuntu)
$ php -v
PHP 8.1.2-1ubuntu2.19 (cli) (built: Sep 30 2024 16:25:25) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
with Zend OPcache v8.1.2-1ubuntu2.19, Copyright (c), by Zend Technologies
インストールが完了したら、nginxでPHPが動くように設定。
$ sudo vi /etc/nginx/sites-enabled/default
$ sudo vi /etc/nginx/sites-enabled/default
# このPHP関連の箇所がコメントされているので外す。
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# With php-fpm (or other unix sockets):
fastcgi_pass unix:/run/php/php8.1-fpm.sock; # ここをphp8.1に変更
# With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000; # ここはコメントのまま
}
$ sudo service nginx restart
hostsファイルでローカルドメイン
プロジェクトを複数動かす場合は、ローカル専用のドメインを用意しておくと便利。
Windowsなら「C:\windows\system32\drivers\etc\hosts」、WSLのUbuntuなら「/etc/hosts」にそれぞれ以下の形式で書いておけば、hogehogeにアクセスするとlocalhostにアクセスできる。
CURLやpostもこれで動くようになる。
nginxの仮想複数ドメイン運用もこれでOK。
127.0.0.1 hogehoge
次で説明するhostsファイル書き換え禁止の設定も忘れずに。
/etc/wsl.confの設定
このファイルを設定しておくと、WSL特有の動きの制御などができる。
# WSL起動時設定
[boot]
systemd=true # systemctlを使うにはこれが必要
[network]
generateResolvConf = false # /etc/resolv.confが勝手に上書きされないようにする
generateHosts = false # /etc/hostsが勝手に上書きされないようにする
NordVPN for linux が動かない件
nordvpnにはコマンドラインのlinux用のソフトも提供されているのだが、これを使ってVPNに接続しようとすると、失敗するだけでなくネットにもつながらなくなってしまう(再起動で解消)
ちなみにWireGuardでも発生するみたい。OpenVPNでは大丈夫だったので、接続方式に関係してるのかな。
/etc/resolv.confやらiptablesやらIPv6無効やらいろいろと試したが駄目で、サポートやりとりしたりで数日かかってしまったが、最終的な解決策にたどり着いた。
4年前の投稿なのに、Microsoftは直してくれないのかね。
https://www.reddit.com/r/bashonubuntuonwindows/comments/jk4x24/comment/gah860j/
まずはUbuntu内にて、Githubから最新のカーネルをwgetで持ってくる。好きな場所で実行して大丈夫。1.6Gぐらいある。
$ git clone --branch $(uname -r) --depth 1 https://github.com/microsoft/WSL2-Linux-Kernel.git
次にダウンロードしたWSL2-Linux-Kernelディレクトリに入り、今の.configファイルをコピーしていれる。
zcat /proc/config.gz > .config
コピーした.configファイルを開き、以下の行を探す。
似たような行が多いので間違えないように。
# CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set
コメントをはずし、以下のように変更する。
CONFIG_NETFILTER_XT_MATCH_CONNMARK=y
そしたら同じディレクトリ内で、コンパイルのコマンド。
make -j $(nproc)
$(nproc)は、CPUが処理できるスレッド数。何らかの理由でスレッド数を少なくしたい場合は、この値を編集することもできる。
CPUによっては時間がかかる。
コンパイルが終わったら、正しい.configが含まれたイメージファイルを、自分のWindowsユーザーディレクトリにコピー。
$ cp arch/x86/boot/bzImage /mnt/c/Users/hoge
つづいてWindowsにて C:\Users\hoge\.wslconfig を作成し、以下を記入して保存。
これで次回Ubuntu起動時に、作ったカーネルのイメージファイルが使われるようになる。
[wsl2]
kernel=C:\\Users\\hoge\\bzImage
PowerShellを開き、シャットダウンも忘れずに。
wsl --shutdown
NordVPN for linux がアップロードできなくなる件
これはWSLのUbuntu内のDockerで各Linuxを動かす際に発生したのだが、ある日なぜかデータのアップロードだけが出来なくなった。
スピードテストを行っても、ダウンロードは十分にスピードが出るのに対して、アップロードでは止まってしまう。
NordVPN側で何かブロックがかかってしまったのだろうか。
普通のWSLのUbuntuやDebianでは発生しないのだが、Docker内にて発生。
丸一日かけて調査したところ、とりあえずtechnologyをOPENVPNに変更することで対応できた。
nordvpn set technology openvpn
※danteサーバーを使う場合は、/etc/sockd.confのexternalをnordlynxからnordtunに変更を忘れずに。
ip aコマンドで現在の状況を確認できる。