RSS2.0

WSL2 / Windows Terminal / Windows 10 で Ubuntu 環境を構築する

Windows で CUI の Ubuntu 環境を構築するのによいという WSL2 で Linux 環境を作ってみました。
VMPlayer や VirtualBox のように Windows 上で VM として Linux が動く形ですが、Linux カーネルが完全に動く(らしい)わりにめっちゃ軽いのが特徴です。私の環境だと 5 秒くらいで Ubuntu が起動してくれるます。早い。Windows で作業をしている時に、使いたいタイミングで追加で Linux 動かせるのがいいですね。

WSL2 で起動した Linux 内の GUI アプリを Windows 上のウインドウアプリケーションとして動かす(VirtualBox のシームレスモード)こともできますが、今回は WSL2 の CUI ターミナルだけ使っています。

また、WSL2 で起動した Ubuntu の CUI ターミナル(と WSL を起動するのに利用する PowerShell)をよりリッチに使うために、Windows Terminal もインストールしました。
wsl02.png
Windows Terminal を使うとこんな風に WSL2 のターミナルや PowerShell、Git Bash(使うには自分で追加設定が必要)などをまとめて 1 つのターミナルから触れるようになります。

Windows Terminal のインストール

Windows Terminal は Windows のコマンド プロンプト、PowerShell、WSL ターミナル、はては Git Bash などのターミナルの GUI をリッチに使わせてくれるアプリケーションです。
WSL のデフォルトのターミナルもクオリティはコマンドプロンプト同様に微妙な感じなので、入れておくと幸せになれると思います。
ただ変わるのはユーザーインターフェースだけで、中で動いてるのは PowerShell そのままだったりするので、使えるコマンドが統一されるとかではありません。

Microsoft App Store から Windows Terminal をインストールできます。

WSL は PowerShell から起動するのですが、Windows Terminal はデフォルトで PowerShell を動かしてくれるので、WSL を使う分にはインストールするだけでよいです。

捕捉: Windows Terminal で gnome terminal ライクなコピーをする

Windows Terminal はデフォルトでは、テキストを選択して右クリックするとコピー、再度右クリックするとペーストができます。
これを Linux ライクにテキスト選択だけでコピーできるようにするには、Windows Terminal の 設定 > 操作 から 選択範囲をクリップボードに自動でコピーする をオンする必要があります。

※マウスのミドルボタンでペーストする方法はまだわかっていません。

WSL のインストール

Windows Terminal(PowerShell)を起動し、以下を実行します。
> wsl --install

デフォルトでインストールされるのは Ubuntu で、他のディストリビューションを選択することもできます。

インストールにはしばらく時間がかかり、途中 Windows の再起動も求められます。
Windows 再起動後は 自動で Ubuntu のターミナルが表示され、インストールが続行されます。
Ubuntu は既にインストールされています。
Ubuntu を起動しています...
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 のアカウントの作成が行われるので、ユーザー名とパスワードを入力します。
初回はこれで Windows Terminal が Ubuntu にログインした状態になり、そのまま使えるようになります。

WSL2 の Ubuntu は Windows Terminal(PowerShell)から wsl コマンドを実行することでも起動できます。
> wsl
新しく Windows を起動した後などはこれで Ubuntu を起動できるのですが、Ubuntu の起動時間もなかなか早いです。

Windows ショートカットから WSL を起動する

Windows Terminal である wt コマンドをショートカットとして登録すると、Windows ショートカットも作成できます。マウスで WSL の Ubuntu ターミナルが起動するようになるので便利です。
Windows のエクスプローラーで右クリックから 新規作成 > ショートカット でウィザードを実行し、項目の場所として wt wsl --cd ~ を指定します。
wsl01.png
Windows Terminal で wsl コマンドを実行するもので、かつ実行時にホームディレクトリをカレントディレクトリとして指定する wsl の --cd オプションを指定しています。

続いてのショートカットの名前の入力値は任意です。(わかりやすい名前で Ubuntu とか入れておけば良さそう)

あとはショートカットをダブルクリックなどで実行すると、Ubuntu にログインした状態の Windows Terminal が起動します。
私は Windows のスタートにアプリケーションを置いておきたい派なので、このショートカットをスタートにピン留めしてます。

WSL のバージョン確認

インストールした wsl のバージョンは --version オプションで確認できます。
> wsl --version
WSL バージョン: 2.3.26.0
カーネル バージョン: 5.15.167.4-1
WSLg バージョン: 1.0.65
MSRDC バージョン: 1.2.5620
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.26100.1-240331-1435.ge-release
Windows バージョン: 10.0.19045.5073
普通にインストールすれば WSL バージョンは 2 系になっていると思います。

WSL2 の設定ファイル

WSL2 の設定ファイルは以下の 2 種類があり、WSL2 で動かす Ubuntu 等のディストリビューション毎に設定を行うのか、構築したすべてのディストリビューションに対してグローバルに設定するのかで設定ファイルがわかれています。

設定ファイルの内容を変更したあとは、設定値を有効にするために、Windows Terminal(PowerShell)から wsl --shutdown コマンドを実行して一度シャットダウンしてください。

.wslconfig ファイル

すべてのゲストのディストリビューションに対してグローバルに設定を行える設定ファイルです。
ホスト Windows の %UserProfile% ディレクトリに格納されます。おそらくデフォルトでは存在しないので必要な場合に作りましょう。

設定後は wsl --shutdown の実行後に Ubuntu を再起動してください。

/etc/wsl.conf ファイル

ゲストのディストリビューション毎に、それ自身の設定を行える設定ファイルです。
ゲストのファイルシステム内部に置くもので、Ubuntu の場合、パスは /etc/wsl.conf です。

ホスト Windows とのファイルシステムの共有

WSL2 で構築されたゲストでは、デフォルトでホスト Windows 側のファイルシステム(ドライブ)がすべて、ゲスト Ubuntu 側の /mnt 配下にマウントされています。
例えばホスト Windows 側の C ドライブはゲスト Ubuntu 側の /mnt/c からアクセスすることができます。

逆にホスト Windows 側のすべてのドライブをマウントさせたくない場合、まず /etc/wsl.conf で WSL2 の自動マウントを無効化し、次に Ubuntu の fstab でマウントさせたいドライブのみをマウントするよう設定します。

WSL2 の設定ファイル /etc/wsl.conf で以下のように設定します。
[automount]
enabled = false
mountFsTab = true

Ubuntu の fstab は、/etc/fstab で以下のように C ドライブのみマウントするようにします。
C: /mnt/c drvfs defaults 0 0

Ubuntu を再起動すると設定が反映されます。

ホスト Windows 側とのファイル共有はとても便利なのですが、共有されるファイルの所有者やアクセス権の設定などの面から、個人的には共有するファイルシステムは限定させたほうがいいのでは、と思います。

ゲスト Ubuntu のネットワークアクセスが遅い現象

ゲスト Ubuntu からの apt-get 等のネットワークアクセスがものすごく遅いのですが、これはネットワークの名前解決に起因しているようで、パブリック DNS サーバーを利用するようにすると改善しました。

まず Ubuntu の /etc/wsl.conf の network セクションで generateResolvConf を false に設定します。
[network]
generateResolvConf = false

続いて /etc/resolv.conf に Google のパブリック DNS サーバーを設定したいのですが、この resolve.conf が自動生成されるファイルのシンボリックリンクになっていて、このまま編集しても再起動時に戻されてしまいます。
# ll /etc/resolv.conf
lrwxrwxrwx 1 root root 39 Nov  9 11:03 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf

なのでシンボリックリンクを一度削除してからパブリック DNS サーバーを書いた /etc/resolv.conf を改めて作成します。
# rm /etc/resolv.conf
# echo "nameserver 8.8.8.8" > /etc/resolv.conf
# sudo chattr +i /etc/resolv.conf

Ubuntu を再起動すると設定が反映されます。

Windows11 ではネットワークでミラーモードを使える

Windows 11 22H2 以降を実行しているマシンではネットワークをミラーモードにすることで、ネットワーク絡みのいろいろな恩恵が受けられるらしいです。(うちは Windows 10 なので試してません)

こちらは .wslconfig で設定します。
[wsl2]
networkingMode=mirrored

ホスト名を変更する

Ubuntu のホスト名を変更したい場合は /etc/wsl.conf の hostname 値として設定できます。
[network]
hostname = ubunchu

ホスト Windows からゲスト Ubuntu に http アクセスする

ホスト Windows からはゲスト Ubuntu の IP アドレスに対してアクセスできるようになっています。

例えば Apache なら、ゲスト Ubuntu 上で apache2 をインストールし、
# apt-get install apache2
ゲスト Ubuntu の IP アドレスを調べれば、その IP に対して http アクセスできるようになります。
$ ip addr show eth0 した時の IP アドレスで、Windows 側からアクセスできる
apache の構築や IP の確認などは、Ubuntu 一般の話がそのまま通用する形です。
  Linux  コメント (0) 2024/11/13 12:02:23


公開範囲:
プロフィール HN: ももかん
ゲーム作ったり雑談書いたり・・・していた時期が私にもありました。
カレンダー
<<2024, 12>>
1234567
891011121314
15161718192021
22232425262728
2930311234