wsl2 で ubuntu22.04 をインストールする

wsl2 で ubuntu22.04 をインストールする

2023/11/04 21:00:00
Program
Wsl2

前提 #

  • windows10 pro 環境
  • wsl2 を利用する
  • wsl2.0.0 が提供する機能は使わない
  • 事前に windows terminal をインストールしておくこと
    ※windows11 は初期状態からインストール済みである
    ubuntu22.04 インストール後、windows tarminal を再起動すると Ubuntu22.04 のメニューが表示される。
    それを選択するとインストール時に指定したユーザにログインした状態でubuntu22.04が起動する

インストール #

以下の手順でインストールする

  • wsl を最新に更新する
  • インストール可能ディストリビューションを確認
  • ubuntu22.04 インストール

※インストール作業は、管理者権限で実施しなくてもいい。管理者権限で実施しても、インストールされるディストリビューションが管理者関連で問題は発生しないっぽい

wsl を最新に更新する #

powershell or cmd で以下を実行する

# 更新
$ wsl --update
更新プログラムを確認しています。
Linux 用 Windows サブシステムの最新バージョンは既にインストールされています。

# バージョン確認
$ wsl --version
WSL バージョン: 1.2.5.0
カーネル バージョン: 5.15.90.1
WSLg バージョン: 1.0.51
MSRDC バージョン: 1.2.3770
Direct3D バージョン: 1.608.2-61064218
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.19045.3570

インストール可能ディストリビューションを確認 #

powershell or cmd で以下を実行する

$ wsl --list --online
インストールできる有効なディストリビューションの一覧を次に示します。
既定の分布は ' * ' で表されます。
 'wsl --install -d <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
OracleLinux_8_5                        Oracle Linux 8.5
OracleLinux_7_9                        Oracle Linux 7.9
SUSE-Linux-Enterprise-Server-15-SP4    SUSE Linux Enterprise Server 15 SP4
openSUSE-Leap-15.4                     openSUSE Leap 15.4
openSUSE-Tumbleweed                    openSUSE Tumbleweed

$ wsl –install(初期設定) が実施されてない場合、初回に限り -d 指定でディストリビューションを指定できる
-d 指定しない場合、デフォルトとなる Ubuntu がインストールされる(Ubuntu はおそらく Ubuntu22.04 latest 版が指定されてある)

  • ※初回の $ wsl –install は wsl2 有効化とディストリビューションのインストールが実施されることになる
  • ※ちなみに、$ wsl –install を一度でも実施すると -d 指定は不要になる様子
    # ubuntu22.04 インストール後は、以下になる
    $ wsl --list --online
    インストールできる有効なディストリビューションの一覧を次に示します。
    'wsl.exe --install <Distro>' を使用してインストールします。
    ...
    

ubuntu22.04 をインストールする #

powershell or cmd で以下を実行する
ユーザとパスワードは以下の通りとしている

  • user: developer
  • password: abc123!!
# ubuntu22.04 をインストールする
$ wsl --install -d Ubuntu-22.04
Enter new UNIX username: developer
New password: abc123!!
Retype new password: abc123!!

$ wsl --list
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-22.04 (既定)

# --verbose オプションを指定すると version を見れる。2023/11/04 現在 バージョンは2がデフォルトである
# ※ $ wsl -l -v 同じ
$ wsl --list --verbose
  NAME            STATE           VERSION
* Ubuntu-22.04    Running         2

エクスポート/インポート/削除 #

wsl2 イメージをインポート/エクスポートを実施する
特定の環境を構築してエクスポートしておくと、いつでも復旧したり他者に提供できたりするので便利

powershell,cmd,git bash で実施可能

インストール済みのディストリビューション名を確認方法は以下の通り

$ wsl --list
Linux 用 Windows サブシステム ディストリビューション:
ubuntu22.04 (既定)

エクスポート #

# wsl --export [ディストリビューション名] [保存先フォルダ/ファイル名.tar]
$ wsl --export Ubuntu-22.04 .\wsl2images\Ubuntu-22.04.tar

インポート #

# wsl --import [ディストリビューション名] [インストール先] [バックアップしたファイル] --version <wslバージョン>
$ wsl --import Ubuntu-22.04 Ubuntu-20.04_2 .\wsl2images\Ubuntu-22.04.tar --version 2
# vhdx ファイルを直接インポートする方法
wsl --import ubuntu22.04.base ubuntu22.04.base ubuntu22.04.base.ext4.vhdx --version 2 --vhd

削除 #

# wslconfig /unregister [ディストリビューション名]
$ wslconfig /unregister Ubuntu-22.04

ubuntu 設定 #

ubuntu22.04 インストール後、windows tarminal を再起動すると Ubuntu22.04 のメニューが表示される。
それを選択するとインストール時に指定したユーザにログインした状態でubuntu22.04が起動する

wsl2 起動設定を追加する #

設定内容は以下の通り。

  • appendWindowsPath = false … windows path を ubuntu に含めない
  • systemd=true … ubuntu で PID1 を sytemd にする(gui使えるようになる)
  • default=developer … ログインユーザ指定

$ sudo emacs /etc/wsl.conf

[interop]
appendWindowsPath = false

[boot]
systemd=true

[user]
default=developer

ubuntu を最新に更新 #

$ sudo apt update && sudo apt upgrade -y

ubuntu 開発環境構築 #

ubuntu22.04の環境構築は以下を参照すること
https://blog.oya3.net/docs/ubuntu/22.04/ubuntu-settings/

最低限以下を設定するといいと思われる

wsl2.0.0 の機能 #

「WSL」v2.0.0 の追加された機能は、.wslconfig ファイルを編集することで有効化可能。

  • autoMemoryReclaim
    5分間アイドル状態になると、WSLはLinuxにキャッシュされたメモリを徐々に解放し始める。つまり、Windowsホストで利用できるメモリが増える
  • sparseVhd
    有効化すると、WSLの新規仮想ハードディスク(VHD)はスパースVHDになる。サイズが自動で縮小される
  • networkingMode
    NATに代わる新しいネットワーキングアーキテクチャー「Mirrored」を有効化。あくまでも試験的実装のためまだ不具合がある可能性があるが、IPv6対応、LANからWSLへの直接接続、VPNネットワークとの互換性向上、マルチキャストのサポートといったメリットがある。「Windows 11 Insiders Preview」ビルド(Release Previewを含むすべてのチャネル)でのみ利用可能
  • dnsTunneling
    WSL VMからWindowsホストへ送信されるDNSネットワークパケットが、既存のネットワーク構成によってブロックされる問題を解決。「Windows 11 Insiders Preview」ビルド(Release Previewを含むすべてのチャネル)でのみ利用可能
  • firewall
    WSLに適用されるファイアウォール設定とルールを指定。「Windows 11 Insiders Preview」ビルド(Release Previewを含むすべてのチャネル)でのみ利用可能
  • autoProxy
    HTTPプロキシを使用する際のネットワークの互換性を向上。「Windows 11 バージョン 22H2」でのみ利用可能

そのほかにもいくつかの重要な不具合が修正されているとのこと。

参考:

便利コマンドメモ #

tree 表示 #

# install
$ apt install tree

# .gitingore を無視する
$ tree --gitignore

# 階層3まで表示
$ tree -L 3

# ディレクトリのみ
$ tree -d

CRLF 改行ファイルを探す #

# 改行コードがCRLFのファイル一覧を表示する for fish
$ grep -Ilrs (printf "\r\n") .
# for bash
$ find . -type f -exec file {} \; | grep CRLF

文字化けファイルをUTF8に #

# 文字化けconvmvをインストール
$ sudo yum install convmv

# cp932 文字化けをutf8に変換(テストのみ)
$ convmv -rf cp932 -t utf-8 *

# cp932 文字化けをutf8に変換(書き換え実行)
$ convmv -f cp932 -t utf-8 * --notest

ディレクトリ/ファイル一覧作成 #

# ディレクトリ一覧( -Fa とすると隠しディレクトリも表示される)
$ ls -F | grep / 

# ファイル一覧( -Fa とすると隠しファイルも表示される)
$ ls -F | grep -v /

# ディレクトリ/ファイル一覧( -1a とすると隠しファイルも表示される)
$ ls -1

gitlab で clone できない場合の暫定対応 #

# セキュリティ的に問題がある可能性があるので注意
$ git config —global http.sslVerify false

複数バージョンの openssl インストール #

古い openssl をインストールして古い言語をインストールする準備

参考URL:

openssl-1.0.2u #

ruby2.3.1 に必要なopensslをインストール
これはインストールできても動作してないかも。。。

# 古いopensslを導入しておく
$ sudo apt install build-essential checkinstall zlib1g-dev
$ cd ~
$ mkdir tmp
$ wget https://www.openssl.org/source/old/1.0.2/openssl-1.0.2u.tar.gz    
$ tar xf openssl-1.0.2u.tar.gz 
$ cd openssl-1.0.2u
$ ./config --prefix=/opt/openssl-1.0.2u --openssldir=/opt/openssl-1.0.2u shared zlib   
$ make
$ make test
...
CMS consistency test
/usr/bin/perl cms-test.pl
CMS => PKCS#7 compatibility tests
signed content DER format, RSA key: verify error
make[1]: *** [Makefile:344: test_cms] Error 1
make[1]: Leaving directory '/home/developer/work/tmp/openssl-1.0.2u/test'
make: *** [Makefile:472: tests] Error 2
# ↑は1件エラーが発生する
# 有効期限らしい。。。https://www.sgv417.jp/~makopi/blog/archives/611
# とりあえず無視

$ sudo make install
# openssl-1.0.2u にインストールされる
# 念のため既存opensslに影響がないか確認
$ which openssl
/usr/bin/openssl    <---- 変更されてない
$ openssl version
OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)    <--- version3.xのまま

# ruby 2.31 インストール
$ RUBY_CONFIGURE_OPTS=--with-openssl-dir=/opt/openssl-1.0.2u rbenv install 2.3.1 
# インストール失敗する。。。
  • ruby 1.8.7 はインストールできる様子
    $ RUBY_CONFIGURE_OPTS=--with-openssl-dir=/opt/openssl-1.0.2u rbenv install --patch 1.8.7-p249 < (curl -sSL https://git.io/ruby-1.8.7-p249-patch | psub)
    ...
    Hunk #1 succeeded at 90 with fuzz 2 (offset 1 line).
    Hunk #2 succeeded at 591 (offset 178 lines).
    Hunk #3 succeeded at 1220 (offset 409 lines).
    patching file ext/openssl/ossl_ssl.c
    
    WARNING: ruby-1.8.7-p249 is past its end of life and is now unsupported.
    It no longer receives bug fixes or critical security updates.
    
    Installed ruby-1.8.7-p249 to /home/developer/.anyenv/envs/rbenv/versions/1.8.7-p249
    
    Downloading rubygems-1.6.2.tgz...
    -> https://dqw8nmjcqpjn7.cloudfront.net/cb5261818b931b5ea2cb54bc1d583c47823543fcf9682f0d6298849091c1cea7
    Installing rubygems-1.6.2...
    Installed rubygems-1.6.2 to /home/developer/.anyenv/envs/rbenv/versions/1.8.7-p249
    
    
    NOTE: to activate this Ruby version as the new default, run: rbenv global 1.8.7-p249
    
    $ mkdir ruby.187
    $ cd ruby.187
    $ rbenv local 1.8.7-p249
    $ ruby --version
    ruby 1.8.7 (2010-01-10 patchlevel 249) [x86_64-linux]
    

openssl-1.1.1q #

ruby2.7.x をンストールする場合に必要

# 古いopensslを導入しておく
$ sudo apt install build-essential checkinstall zlib1g-dev
$ cd ~
$ mkdir tmp
$ wget https://www.openssl.org/source/openssl-1.1.1q.tar.gz
$ tar xf openssl-1.1.1q.tar.gz
$ cd openssl-1.1.1q
$ ./config --prefix=/opt/openssl-1.1.1q --openssldir=/opt/openssl-1.1.1q shared zlib
$ make
$ make test
../test/recipes/99-test_ecstress.t ................. ok
../test/recipes/99-test_fuzz.t ..................... ok
All tests successful.
Files=158, Tests=2644, 94 wallclock secs ( 1.60 usr  0.16 sys + 94.55 cusr  9.48 csys = 105.79 CPU)
Result: PASS
make[1]: Leaving directory '/home/developer/work/tmp/openssl-1.1.1q'
$ sudo make install
# /opt/openssl-1.1.1q にインストールされる
# 念のため既存opensslに影響がないか確認
$ which openssl
/usr/bin/openssl    <---- 変更されてない
$ openssl version
OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)    <--- version3.xのまま

# ruby2.7.6インストール
$ RUBY_CONFIGURE_OPTS=--with-openssl-dir=/opt/openssl-1.1.1q rbenv install 2.7.6

vmmem のCPU使用率が高くなる問題 #

wsl2 vmmem のCPU使用率が高くなる問題の解決方法は、基本的にはwindowsアップデート(22H2)を実施することで対応できるっぽい それでもダメなら、もしかすると、 wsl2.0.0 の autoMemoryReclaim を有効にすると解決するかもしれない

WSL2によるホストのメモリ枯渇を防ぐ #

こちらも、wsl2.0.0 の autoMemoryReclaim を有効にすると解決するかもしれない

linux キーボードショートカット #

  • Bashを使いこなすための必須コマンド71選
    https://qiita.com/kjm_nuco/items/6a4faf4d026d130e7db1

  • cal カレンダー

    # ubuntu22.04 で cal コマンドを使うためには ncal をインストール
    $ sudo apt install ncal
    # 今年の1月のカレンダー表示
    $ cal -m 1
        January 2023
    Su Mo Tu We Th Fr Sa
     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
    

ubuntu22.04でssh接続でいない #

ssh で

no matching host key type found

が発生した場合
config に以下の設定を追加するだけ。

HostKeyAlgorithms ssh-dss,ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa

$ emacs .ssh/config
ServerAliveInterval 60

Host test.net
  HostName test.net
  Port 22
  User test.net
  IdentityFile ~/.ssh/id_rsa.test.net
  HostKeyAlgorithms ssh-dss,ssh-rsa     <--- ここ追記
  PubkeyAcceptedAlgorithms +ssh-rsa  <--- ここ追記
...

「システムプログラムの問題が見つかりました」が頻発 #

ubuntu22.04 で gui ログインした場合、頻繁に「システムプログラムの問題が見つかりました」が出力される対応

$ sudo rm /var/crash/*
# $ sudo apt update && sudo apt upgrade -y を実施すると以下のパッケージが保留中となるので、強制的にインストールする
# workspaces で発生していた「システムプログラムの問題が見つかりました」は以下の対応で解決している様子(2023/03/30 現在)
$ sudo sudo apt -y install gnome-remote-desktop grub-efi-amd64-bin grub-efi-amd64-signed libcephfs2 librados2 shim-signed

tmux の起動時に状態確認にして、既存のセッションに接続するための設定確認 #

ubuntu に gui ログイン(ex: workspaces) した場合、status —is-login で false となるため、分岐条件が成立しない。
なので、guiログインしている場合は、if 分条件から外す必要がある。
ターミナルログインしている場合(ex: wsl2)、status —is-login は true となる

以下は chatgpt で質問した内容

fish で以下のif文の意味を教えてください。
if test -z $TMUX && status --is-login

このif文は、fishシェルの条件分岐(if文)であり、以下の意味を持ちます。

test -z $TMUX : 変数 $TMUX の値が空であることをテストします。test コマンドは、条件をテストするために使用されます。-z オプションは、文字列が空であるかどうかをテストします。
&& : 前のコマンドが成功した場合に、次のコマンドを実行します。ここでは、前のコマンドが $TMUX の値が空であることをテストするための test コマンドであるため、次のコマンドを実行する条件が満たされる場合は、$TMUX の値が空であることが必要です。
status --is-login : 現在のシェルがログインシェルであるかどうかを判定するための status コマンドを実行します。--is-login オプションは、現在のシェルがログインシェルである場合に真を返します。
つまり、このif文は、「現在のシェルがログインシェルであり、かつ$TMUX の値が空である場合」に真を返します。

statusとやると以下が出力されます。status --is-login の条件をみたしますか?
This is not a login shell
Job control: Only on interactive jobs
はい、status コマンドは、現在のシェルのステータスを表示するためのものです。status --is-login というコマンドを実行すると、現在のシェルがログインシェルであるかどうかを判断するためのステータスが返されます。

一方、status コマンドを単体で実行すると、現在のシェルの状態についての情報が表示されます。たとえば、"This is not a login shell" というメッセージは、現在のシェルがログインシェルではないことを示しています。また、"Job control: Only on interactive jobs" というメッセージは、ジョブコントロールが対話型のジョブにのみ適用されることを示しています。

タイムゾーンでの確認 #

OSのタイムゾーンの違いでpythonでの日付挙動の確認

# wsl2 で動作するアプリの日時(JST)がどうなるか確認する
$ date
Thu Mar 16 08:36:01 JST 2023                               # <--- OSではJSTであることを確認
$ python -V
Python 3.8.9
$ python
Python 3.8.9 (default, May 25 2021, 11:52:34)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2023, 3, 16, 8, 37, 23, 563247)         # <--- OSと同じくJST時刻であることを確認
>>> JST = datetime.timezone(datetime.timedelta(hours=+9), 'JST')
>>> datetime.datetime.now(JST)
datetime.datetime(2023, 3, 16, 8, 37, 38, 347616, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400), 'JST')) # <--- JST時刻のままでtimezoneがJSTとなっていることを確認

# docker で動作するアプリの日時(UTC)がどうなるか確認する
$ docker/app
$ ./build_local_image.sh
$ ./run_local.sh
$ docker ps
CONTAINER ID   IMAGE                          COMMAND                  CREATED         STATUS          PORTS                                                                NAMES
a432a39d874e   oya-amazon            "/usr/sbin/httpd -D …"   4 minutes ago   Up 4 minutes    0.0.0.0:8080->80/tcp, :::8080->80/tcp                                oya-amazon
d7787547c537   localstack/localstack:0.11.3   "docker-entrypoint.sh"   2 weeks ago     Up 37 minutes   4567-4597/tcp, 0.0.0.0:4566->4566/tcp, :::4566->4566/tcp, 8080/tcp   localstack

# oya-amazon がアプリ
$ docker exec -it a432a39d874e /bin/bash
bash-4.2$ pwd
bash-4.2$ python3.8 -V
Python 3.8.16
bash-4.2$ date
Wed Mar 15 23:28:52 UTC 2023                                # <--- OSではUTCであることを確認
bash-4.2$ python3.8
Python 3.8.16 (default, Jan 12 2023, 22:59:08)
[GCC 7.3.1 20180712 (Red Hat 7.3.1-15)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2023, 3, 15, 23, 29, 24, 192581)         # <--- OSと同じくUTC時刻であることを確認
>>> JST = datetime.timezone(datetime.timedelta(hours=+9), 'JST')
>>> datetime.datetime.now(JST)
datetime.datetime(2023, 3, 16, 8, 29, 42, 658199, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400), 'JST')) # <--- JST時刻に変換され、timezoneがJSTとなっていることを確認

参考URL #