wsl2 で ubuntu22.04 をインストールする
2023/11/04 21:00:00
前提 #
- 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/
最低限以下を設定するといいと思われる
- git 設定
https://blog.oya3.net/docs/ubuntu/22.04/ubuntu-settings/#git-%E8%A8%AD%E5%AE%9A - fish インストール
https://blog.oya3.net/docs/ubuntu/22.04/ubuntu-settings/#fish-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB - anyenv インストール
https://blog.oya3.net/docs/ubuntu/22.04/ubuntu-settings/#anyenv-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
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」でのみ利用可能
そのほかにもいくつかの重要な不具合が修正されているとのこと。
参考:
- 「Windows Subsystem for Linux」がv2.0.0に、多数の試験機能を追加
https://forest.watch.impress.co.jp/docs/news/1532311.html
便利コマンドメモ #
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 公式
https://www.openssl.org/source/
https://www.openssl.org/source/old/1.0.2/ - Install Openssl 1.0 Ubuntu 20.04
https://www.w3schools.blog/install-openssl-1-0-ubuntu-20-04 - OpenSSL のビルド時に CMS => PKCS#7 compatibility tests で verify error により終了してしまう件について
https://www.sgv417.jp/~makopi/blog/archives/611
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 を有効にすると解決するかもしれない
- Windows11でVmmemWSLのCPU使用率が高くなる
https://tech.buty4649.net/entry/2022/10/28/190543
WSL2によるホストのメモリ枯渇を防ぐ #
こちらも、wsl2.0.0 の autoMemoryReclaim を有効にすると解決するかもしれない
- WSL2によるホストのメモリ枯渇を防ぐための暫定対処
https://qiita.com/yoichiwo7/items/e3e13b6fe2f32c4c6120
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 <--- ここ追記
...
- ssh 接続で no matching host key type found エラー
https://qiita.com/nanbuwks/items/47248b6ed2d37086e40d
「システムプログラムの問題が見つかりました」が頻発 #
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 #
-
インストール(旧インストール方法の記載がある
https://oya3.net/redmine/projects/study_group/wiki/Wsl2#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
インストールが成功しない場合は、旧インストール設定を参照すること -
Bashを使いこなすための必須コマンド71選
https://qiita.com/kjm_nuco/items/6a4faf4d026d130e7db1 -
systemd failed service on Ubuntu 22.04 #8853
https://github.com/microsoft/WSL/issues/8853 -
WSL2のUbuntu 22.04でSystemdでDockerを起動させる
https://level69.net/archives/31296 -
WSLでsystemdのPID=1に対応したらしいので試してみた
https://level69.net/archives/31767 -
Linuxのローカライゼーション系LANG変数:langについて
https://eng-entrance.com/linux-localization-lang -
fishでLC_ALLとLANGを設定する
https://blog.kytiken.com/entry/2018/06/03/150225 -
fish にて export で PATH を通せるのは何故か調べた
https://blog.ojisan.io/fish-export-set/ -
Pythonにおけるデバッガ: pdb, ipdb
https://qiita.com/Kobayashi2019/items/98e74110d74e4c60f617 -
いろんな言語でbinding.pry
https://ja.algonote.com/entry/binding-pry -
[Emacs] 選択範囲をクリップボードに送る
https://qiita.com/maue