Windows+WSL2でGithubで配布されてるものを試す環境構築

2023-06-21(水)

※この情報は古いです。wikiの方にまとめました

1. WSL2のインストール

Microsoftのサイトの説明に従いWSL2を入れる。

PowerShellを管理者権限で起動して

wsl --install

ここでWSLは既に入っていてディストリビューションがどうこうと出てきたら ```PowerShell! wsl --install -d Ubuntu

としてUbuntuを入れる

```bash
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:

のようにWSL2上でのユーザー名を聞いてくるのでスペース無しの半角英字でユーザー名を入れる。 その後パスワードも聞かれるので2回パスワードを入れる(あとでしょっちゅう使うので忘れないように)

Enter new UNIX username: momma
New password:
Retype new password:
passwd: password updated successfully
この操作を正しく終了しました。
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.90.1-microsoft-standard-WSL2 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage


This message is shown once a day. To disable it please create the
/home/momma/.hushlogin file.
momma@ASUS2022-0:~$

みたいな感じでUbuntuが使える状態になる。

次回以降はWindowsのメニューからUbuntuを選択すれば使える。

Error: 0xc004000dが出た場合

コントロールパネルの「プログラム」で「プログラムと機能」の中に「Windowsの機能の有効化または無効化」があるのでそれを選んでから「仮想マシンプラットフォーム」にチェックを入れる(要再起動)。その後WSL2を再度インストールする。

WSL2上でX11アプリの確認

sudoコマンドをそのセッションで初めて使うときはパスワードを聞かれるのでsudoの行だけコピペする。

sudo apt install -y x11-apps mesa-utils
xeyes

でマウスカーソルを目玉が追うxeyesのウィンドウが開いたらGUIアプリケーションの実行は成功。

glxgears

で、ギアが回るアプリケーションが起動したらOpenGL関係のアプリケーションも使える。

2. Ubuntu上でpyenvを使えるようにする

sudo apt update; sudo apt upgrade -y; sudo apt install -y build-essential git \
python3-setuptools python3-pip libssl-dev libffi-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget llvm \
libncurses5-dev xz-utils tk-dev libxml2-dev \
libxmlsec1-dev liblzma-dev python3-venv
curl https://pyenv.run | bash
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc

で.bashrcに設定が書き込まれるので、WSL2(というかWindowsメニューにUbuntuと出てくる)を開き直すか、

source ~/.bashrc

を実行する。これで

pyenv

を実行すると実行時オプションが表示される。

※Windows版のpyenvをインストールしていると、PATHの共有化でかなりややこしい話になるので、Windowsの方はPATHから外しておいた方が良い

3. 特定バージョンのPythonのインストール

pyenv versions

と打つと最初は" * system "しか出てこない。

pyenv global

pyenv local

でも"system"しか表示されない。これはUbuntuでインストールされるPythonを使う(というかそれしか存在していない)状態で、

pyenv install --list

とするとインストール可能なPythonのバージョン、配布形態の一覧が表示されるので、そこから選んで追加してから使うのがpyenvでのバージョン制御になる。例えば古いPython3.8を使いたい場合はその中で一番マイナーバージョンの数字が大きい3.8.17を入れることになる。(セキュリティパッチのタイミングでバージョンは更に上がる可能性があるのでちゃんと自分で確認すること)

pyenv install 3.8.17

でインストールが始まる。

インストールが終わったらまた

pyenv versions

を実行すると今入れた3.8.17が増えているので、

  • pyenv global バージョン: システム全体で使うPythonのバージョンを指定(非推奨)
  • pyenv local バージョン: 今いるディレクトリ以下で使うPythonのバージョンを指定
  • venvで仮想環境のときにバージョンを指定 (推奨)

のいずれかで扱うことになる。DockerのコンテナであるPythonのバージョン=その環境、という状況ならこれで問題ないが、Dockerを使わない場合には何かやるたびに環境が壊れるので注意。

4. venvとpyenvで特定バージョンの仮想環境を作る

用途としてはGithubで配布されているソースを試したいときが多い。 無視リストの.gitignoreには

# pyenv
.python-version

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

が書かれている場合が殆どなので、

  1. githubからcloneして持ってくる
  2. そのディレクトリに移動
  3. pyenv local 特定バージョン
  4. venvで仮想環境を作成
  5. activateして環境構築
  6. 終わったらdeactivate

のような流れになる。venvで環境構築をする場合に、上のリストのどれかを使うとよい(ここではENV)。

ここでは特定環境として https://github.com/atb033/multi_agent_path_planning を試してみる。

条件はPython3.8.x だが色々入ったり別のソフトを使おうとしたときに環境が壊れるのを防ぐために仮想環境を使う。

git clone https://github.com/atb033/multi_agent_path_planning
cd multi_agent_path_planning

でソースの場所に移動してから

pyenv local 3.8.17

でこのディレクトリでのPythonのバージョンを指定する。

pyenv versions

とすると今度は3.8.17にアスタリスクが付いている。

続けて

python3 -m venv ENV
source ./ENV/bin/activate

とすればプロンプトの頭に(ENV)が付いて仮想環境になったことを教えてくれる。

あとはrequirements.txtをインストールして実行するなり不足パッケージをpipで入れるなりすればよい。

python3 -m pip install -r requirements.txt
python3 -m pip install pyyaml

(pyyamlがrequirements.txtで指定されていないので入れてる)

あとは説明の通り

cd ./centralized/sipp
python3 multi_sipp.py input.yaml output.yaml

でデモを試せる。

WLS2上のファイルはWindowsのエクスプローラでLinuxというペンギンアイコンのネットワークドライブが見えるようになっているのでそこから\\wsl.localhost\Ubuntu\home\momma\multi_agent_path_planning\centralized\sipp\resultsのように辿るとそのまま開ける。(mommaは各自のユーザー名に置き換える)

試し終えたら必ず

deactivate

を実行して仮想環境から抜ける。

次回以降使いたい場合には、WSL2で先程の場所のactivateを実行(source)すれば良い。

cd multi_agent_path_planning/
source ./ENV/bin/activate

またはダイレクトに

source multi_agent_path_planning/ENV/bin/activate

でもよい。

5. WSL2上でDockerを使う (非Docker Desktop)

Ubuntuの流儀で入れるだけなので公式ドキュメントの通りに入れる

(Docker Desktopを使いたい場合は 公式ドキュメントに従ってWSLバックエンドを有効化すればこのインストール作業無しで使えた筈なのでここは飛ばして良い)

DeepLearning系のものを試したいときかつNVIDIAのグラボを積んでいるマシンの場合には,Dockerを入れた後でNVIDIA CUDAも入れる。(やりかたはググると出てくる)

sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli \
 containerd.io docker-buildx-plugin docker-compose-plugin
sudo docker run hello-world

として

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

な表示が出ればコンテナの起動は成功。

続けて

sudo usermod -a -G docker 自分のユーザー名

としてdockerグループに自分を加えておくと、dockerの実行にsudoコマンドが不要になる。

6. WSL2のDockerでGUIアプリケーションを使う

WSL2上でGUIアプリケーションをそのまま実行するだけならWSLgがいい感じにWindowsで表示できるよう扱ってくれているが、Dockerコンテナ上のGUIアプリケーションを起動するには、Dockerのホスト(WSL2)に別ホスト(ここではコンテナ)のアプリケーションを表示させる細工が必要で、具体的には設定ファイルと環境変数の共有が必要となる。具体的なやりかたはあちこちで紹介されているがDockerやWSLのアップデートによって変わることが多々あるので、極力新しい情報を参考にする。(英語だが公式サイトを見るのが正解)

一旦Ubuntuを閉じて再度開いてから

docker run -it --rm \
    --mount type=bind,source=/tmp/.X11-unix,target=/tmp/.X11-unix \
    --mount type=bind,source=/mnt/wslg,target=/mnt/wslg \
    --env DISPLAY=${DISPLAY} --env WAYLAND_DISPLAY=${WAYLAND_DISPLAY} \
    --env XDG_RUNTIME_DIR=${XDG_RUNTIME_DIR} \
    ubuntu:22.04

とすると

Status: Downloaded newer image for ubuntu:22.04
root@f4e906a0f041:/#

のような感じでコンテナが起動する。--itでインタラクティブな状態(コマンドを実行する場合)、--rmで使い終えたコンテナを削除することを意味するので、残したければ--rmは外して実行する。

デフォルトだとユーザーはrootで動くのでsudoコマンドの付与は不要だが、ホストのアプリケーションのインストールは無関係な素の状態なのでアプリケーションは入れ直すか、諸々インストール済みのディスクイメージを探して使うか、環境構築のためのDockerfileを書くかになる。(Dockerfileを使う例はこっちを参照)

このままですんなりxeyesは入れれば動くのだがjammyにOpenGL関係のバグがあるらしいのでglxgearsは動かないため、jammyを使いたい場合は一部パッケージをholdする。

apt update
apt install -y libglapi-mesa=22.0.1-1ubuntu2
apt install -y libgbm1=22.0.1-1ubuntu2
apt install -y libegl-mesa0=22.0.1-1ubuntu2
apt install -y libgl1-mesa-dri=22.0.1-1ubuntu2
apt install -y libglx-mesa0=22.0.1-1ubuntu2
apt-mark hold libglapi-mesa libgbm1 libegl-mesa0  libgl1-mesa-dri libglx-mesa0 
apt install -y mesa-utils
glxgears

で歯車が周るアプリケーションが起動すれば成功。

アプリケーションを閉じて

exit

コンテナを終了させる。--rmオプションを付けずに起動したコンテナは停止状態で保持される。プロセスは圧迫しないがディスクは圧迫するので

docker container ls -a

で時々確認すると良い。

古いROSのコンテナを使う

古い環境でも構築可能なのがDockerの利点だが、追加で何か入れようとするとapt関係がミラーサイトにもなく、apt updateだけでも結構遅い状態になるので、何か試すにしてもよく吟味してから選ぶとよい。

https://github.com/hasauino/rrt_exploration を試してみる。環境としてはkineticなので今から素で入れるのは面倒。

公式のコンテナを使う。

docker pull ros:kinetic-robot-xenial

でDocker Imageをpullしたらrunで起動。今度は--rmは付けずに--name foxyTestと名付けて起動する(exitしてもコンテナが残る)。

docker run -it --name foxyTest \
    --mount type=bind,source=/tmp/.X11-unix,target=/tmp/.X11-unix \
    --mount type=bind,source=/mnt/wslg,target=/mnt/wslg \
    --env DISPLAY=${DISPLAY} --env WAYLAND_DISPLAY=${WAYLAND_DISPLAY} \
    --env XDG_RUNTIME_DIR=${XDG_RUNTIME_DIR} \
    ros:kinetic-robot-xenial

でコンテナが起動するのでros[TAB][TAB]とするとROS周りが既にインストールされているのがわかる。 ひとまずexitして

docker container ls -a

とするとfoxyTestが一覧に出てくる。

再開するには

docker start -i foxyTest

でコンテナが起動するのでドキュメントの通り

apt update
apt install -y ros-kinetic-gmapping ros-kinetic-navigation python-opencv python-numpy python-scikits-learn

で準備ができたら、catkinなWSを作る

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make

WSのsrcにソースをcloneする

cd src
git clone https://github.com/hasauino/rrt_exploration.git
cd ~/catkin_ws/
catkin_make
source devel/setup.bash

でインストール完了。続けてTutorialsを試す。

apt install -y ros-kinetic-kobuki ros-kinetic-kobuki-core ros-kinetic-kobuki-gazebo 
cd ~/catkin_ws/src
git clone https://github.com/hasauino/rrt_exploration_tutorials.git
cd ~/catkin_ws/
catkin_make
source devel/setup.bash
roslaunch rrt_exploration_tutorials single_simulated_house.launch

で一応Gazeboも一部透明だったりUIが表示されなかったりするが起動して動いてそうな画面が出てくる。

Category: Memo Tagged: Python Ubuntu WSL2 Github