WSL 2でDockerを使う
テキストリンク
WSL 2はHyper-V仮想化に基づくLinuxなので、WSLでDockerを走りたいと思います.Dockerを嬉しそうにインストールした後、PIDが1のプロセスはsystemdではなくinitなので、このチキンを呆然とさせました.検索すると、GitHubで解決策が与えられていることがわかりました.Genieです.Linux namespaceを利用して隔離を実現し、隔離された空間でsystemdを実行することで、systemdのPIDが1になります.
コードを見ていくつかの重要なコマンドを得ました unshare:新しいnamespaceでコマンドを実行します.man page nsenter:あるnamespaceでコマンドを実行します.man page runuser:コマンドを実行するユーザーを切り替えます.man page
私たちのステップは は、 は
GitHubトランスポートゲートというスクリプトが得られます
使用方法:
WSL 2はHyper-V仮想化に基づくLinuxなので、WSLでDockerを走りたいと思います.Dockerを嬉しそうにインストールした後、PIDが1のプロセスはsystemdではなくinitなので、このチキンを呆然とさせました.検索すると、GitHubで解決策が与えられていることがわかりました.Genieです.Linux namespaceを利用して隔離を実現し、隔離された空間でsystemdを実行することで、systemdのPIDが1になります.
コードを見ていくつかの重要なコマンドを得ました
私たちのステップは
pidof
でsystemd
プロセスがあるかどうかをチェックし、ある場合は3にジャンプし、そうでない場合は2にジャンプします.unshare
をsystemd
に動作させ、systemd
の新しいnamespace内のPIDが1である.コマンド全体はdaemonize
コマンドで実行され、作成されたsystemd
以降はステージプロセス形式で実行されます.nsenter
とrunuser
で新しく作成されたnamespaceに入り、あるユーザーとしてshellを実行します.GitHubトランスポートゲートというスクリプトが得られます
#!/bin/bash
systemd_pid=
if [ -z $(pidof systemd) ]; then
daemonize /usr/bin/unshare -fp --propagation shared --mount-proc systemd
fi
while [ -z $systemd_pid ]
do
for pid in $(pidof systemd)
do
systemd_pid=$pid
done
done
if [ -z $WHO ]; then
WHO=root
WD=/
else
WD=/home/$WHO
fi
nsenter -t $systemd_pid -m -p --wd=$WD runuser -m -p -u $WHO zsh
使用方法:
WHO=`whoami` sudo -E ./wslsystemd.sh