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

  • 私たちのステップは
  • pidofsystemdプロセスがあるかどうかをチェックし、ある場合は3にジャンプし、そうでない場合は2にジャンプします.
  • は、unsharesystemdに動作させ、systemdの新しいnamespace内のPIDが1である.コマンド全体はdaemonizeコマンドで実行され、作成されたsystemd以降はステージプロセス形式で実行されます.
  • nsenterrunuserで新しく作成された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