
2025.02.12
職員一人あたり52時間の残業削減に成功 kintone導入がもたらした富士吉田市の自治体DX“変革”ハウツー
ここが変だよWSL2(全1記事)
リンクをコピー
記事をブックマーク
佐伯学哉氏(以下、佐伯):Kernel/VM online part4ですが、「ここが変だよWSL2」という日本語タイトルで、スライドは英語になっていますが、WSL2(Windows Subsystem for Linux 2)に関するいろいろなことを話します。
アウトラインですが、基本的にはランダムトークで小ネタをたくさん話します。なので、WSLとは何かとか、技術的には興味深いけれど公式のドキュメントがきちんと説明してること、つまりWSLgですね。技術的にはおもしろいのですが、公式が全部説明しているので、ここでは一切触れません。このトークは、僕が個人的に発見したあまり知られてないバグや、事実についてだけ発表していきます。
軽く自己紹介です。ソフトウェアエンジニアの佐伯といいます。趣味もソフトウェアデベロップメントで、「Distrod」というWSL2でSystemdを動かすメタディストロとか、WSL Hello sudoとか、Dbgeeとか、Noahとか、CPU実験のものとかいろいろやってきました。よろしくお願いします。
前回の「Kernel VM online Part3」で、実はWSLは、自分でディストロを作れるんだよとお話ししました。systemdを簡単なコンテナの中で動かして、その下でUbuntuやArchを動かすようなディストロを作って発表したのが2021年8月のことでした。
その時は「あと2週間くらいで公開します」と言ったのですが、この間やっと公開したので、興味ある方はぜひ使ってください。
これもまた未承諾広告ですが、Distrodというものを作りました。これはlinuxcontainers.orgからディストロのイメージを落としてきて、システムで動かしながらそれをWSLインスタントして動かすソフトになっています。便利なので使ってみてください。
これがDistrodの画面です。Distrodをダウンロードすると、それがDistroインストーラになっているのですが、(スライドを示して)こういう画面が出てきます。
インストールできるディストロの一覧が、Linux Containers.orgから引っ張ってこられて、Arch Linuxとかを入れると、どんどんウィザードに従ってインストールされていきます。
Ubuntuなどをインストールをしたことがあればわかるのですが、WSLの最初の起動画面で、こんな感じのウィザードが出るんですね。それがUbuntuではなくて、linuxcontainers.orgのディストロが何でも選べるようになっています。選んでインストールをすると、そのままArch Linuxが動きます。
普通のディストロとは違って、開発したのはsystemdが動いているというものですね。これはArchです。
その開発でいろいろやったことをお話しするのですが、WSLは実はコンテナなんだよという話とか、InterOpの話とか、あとバグの話とかをしようと思います。
1個目です。WSL2は、WSL1と違って、VMになったとよく説明がされるのですが、実はWSL2はVMかつコンテナなんですね。WSL2はLight-weight VMというのは、まあ正しい。さらにDSL2ディストロは、実はコンテナであるという表現も、実は正しいんです。
探せば、公式のドキュメントにも書いてあると思います。たぶんWSLgのアーキテクチャにも書いてあるのですが、これはあまり知られていないので紹介しようと思います。
WSLディストロがコンテナで動いてることの傍証はたくさんあります。例えば普通にWSLを起動して、ps auxを叩いた時に、カーネルスレッドが一切出ていないんですね。Linuxをネイティブで使ってる人からすると違和感があるのですが、これは新しく作られたPID namespaceで、実は全部のディストロが動いているからなんです。
全部のディストロが、実はそれぞれのコンテナで動いているのですが、/mnt/wslという場所があって、全部のディストロで共有して使えるように、たぶんMS_SHAREDでマウントしてあるんですよね。なので、ここで自分が今動いてるディストロの/procをマウントすることができるんです。
そもそもWSLは、複数のディストロを同時に動かせるのですが、これで何ができるかというと、あるディストロからほかのディストロの中に入るという、遊びができます。
今ここで、Arch Linuxがディストロとして動いているのですが、もう片方がUbuntuですね。Arch Linuxの中で、まずproc/self/mountinfoを見ると、/mnt/wslがshared:1されているのが見えます。
ここに対して、新しくディレクトリを1個作ります。/mnt/wsl/archprocという名前を作って、ここにこのArch Linuxの/procをバインドマウントします。
今度はUbuntuに戻ります。このディストロは、僕が普段使いしているディストロですが、ここで/mnt/wslを見ると、archprocが見えているのがわかります。これはシェアドマウントなので、きちんとバインドマウントしたarchprocの中が見えています。
なので、この/procを使ってnsenterとかして、その各namespaceに入ると、今はそのArch Linuxのマウントnamespaceに入ったのですが、rootとしてArch Linuxのfsが見えているという状況ですね。スクリーンフェッチを動かすと、Arch Linuxが出てきたりします。
なので実はWSLの各ディストロは、WSL自体は1個のVMなのですが、その中の各ディストロはコンテナというおもしろい小ネタです。
次にWSLのInterOpについて。WSLは中からexeファイルを動かしたり、外からLinuxのELFを動かしたりできるわけですが、こんな感じでcmd.exeとやるとcmd.exeが動くんですね、Linuxの中から。
これはいったいどうやって動いているかというと、WSLのセッションは、Windowsターミナル1個に対して、タブ1個に対して1個ソケットが生えています。ここに対して、.exeを起動してくれというリクエストをマイクロソフトの/initが通信するんですね。
数字_interopというファイルは、1セッションに対して1個対応するものがあります。それをどうやって探すのか。2パターンあって、あるLinuxがexeを起動する時に、Linux processが環境変数としてWSL_INTEROPというenviroment variableを持っていたら、そのパスがソケットのパスになります。なのでここに出してリクエストが通ります。
一方、それがない状況もあります。例えばsudoを起動すると、環境変数がリセットされてしまうので、WSL_INTEROPがないんですね。どうするかというと、/initはリクエストをたたいたLinux processの親を辿っていきます。やがてそれがWSLのセッション、/initの子どもみたいなものに辿り着くのですが、そのPIDで始まるPID_INTEROPを使うんですね。
なぜそれが動くのか。(スライドを示して)実はこの図のbash、pstree、bashなどの上に、initがいくつも連なっているのが見えると思います。2つ目のinitが、Linuxのsubreaper processとして動いていて、それ以下の子孫のprocessに対して疑似initとして動いているんですね。subreaperという機能があります。
subreaperとは何か。自分のことをsubreaperだと宣言したprocessは、その子孫processに対して本物のPID1の/initのような仕事を代行するという機能があります。WSLはセッションに対して1個1個、そのsubreaperを作っていて、それが必ずそのセッションのサブプロセスの親になっているので、やがてはそこに辿り着いてPID_INTEROPを見つけるという仕組みになっています。
この仕組みを使って、Admin Privilegeも使うことができます。もしWindowsターミナルを管理者権限で立ち上げたのであれば、そのWindowsターミナルだけで動いているLinux processは、そこからexeを起動すると、それは管理者権限のexeプログラムになるという仕組みになっていて、きちんとAdmin権限も使えます。
これは脆弱性ではなくて、セキュリティ上あまり気持ちよくない部分があります。このWSL_INTEROPは、特に認証認可がなくて、勝手に環境変数を変えれば使えるんですよね。
なので、管理者権限のWSL_INTEROPが存在する状況においては、勝手にそのWSL_INTEROPを宣言すると、管理者権限がないターミナル、セッションからでも管理者権限でexeを起動できます。確認済みですが、USCバイパスは脆弱性ではないらしいです。はい、その話はここで終わりです。
あと1分ですね。メッチャ早く話していきます。WSLネットワークはちょっと変です。static IPが振られて、ネットワークnamespaceが共有されるとか、いろいろあるのですが、とりあえずHyper-Vのネットワークと違ってなんか変です。
パフォーマンスがクソ悪いんですよ。今ここに、あなたのWSLのDNSを殺すコマンドがあるのですが、30回連続でdigを叩くだけで、DOSが成立して、WSLのDNSがしばらく死ぬんですね。
30回digを叩くだけでは普通はHyper-VのDNSもWindowsのDSNも死ぬことはないので、なぜかこれはWSLだけで起こる謎のパフォーマンスイシューです。まあ8.8.8.8とかにすると回避できますという感じですね。
バグはほかにもあります。これは誰も書いていないのですが、WSLはWindowsの起動時に起動しようとすると、タスクスケジューラでWindowsスタートアップでWSLを起動するタスクを組むのが定石ですが、どこのサイト見ても「Highest Privlilegesで動かす必要があります」と書いてあるんですね。
ところがこれは嘘で、これはWSLコマンドのバグです。直接WSLのAPIを叩くようなPowershellコマンドを書いて、それを起動時に立ち上げると、管理者権限なしでもWindowsスタートアップ時にWSLを起動できます。先ほどの管理者権限の絡みであまり管理者権限で長いprocess動かしたくないので、こちらのほうが安全です。
最後に。WSLの変な点を話したのですが、基本的にはWSLは便利でクールなので、いろいろ言ったけど僕はWSL大好きです。これからもMSさんにはがんばってほしいなと思っています。はい、以上です。
司会者:ありがとうございます。小ネタ集はやはりおもしろいですね。ちなみにWSL2は開発もオープンなんでしたっけ? コードがオープンになってたような気がするんですけど。
佐伯:開発はオープンではなくて、Linux Kernelだけオープンなんですね。
司会者:ははあ、上物だけなんだ。
佐伯:memory reclaimと言うのですが、メモリをWindowsに返すというKernelモジュールがあります。その部分だけオープンソースで開発されています。GPLですね。
司会者:なるほど。じゃあ改良とか。
佐伯:そうですね。
司会者:改良とか、そういうテクニカルリクエストは、いわゆるプルリクエストみたいなものを自分で直接は送れなくて、よくてリクエストが出せるぐらいですね。
佐伯:そうですね。でもそもそも、そのメモリリクレーム以外のコードは基本的にオープンではなくて、先ほど動いたコンテナとして動いているとか、そのスラッシュユニットとかは全部クローズドソースです。
司会者:ふむふむ。
佐伯:GPLが及んでいない部分に関しては、基本的にコードは公開されていないです。
司会者:なるほど。ありがとうございます。
2025.02.06
すかいらーく創業者が、社長を辞めて75歳で再起業したわけ “あえて長居させるコーヒー店”の経営に込めるこだわり
PR | 2025.02.07
プロジェクトマネージャーは「無理ゲーを攻略するプレイヤー」 仕事を任せられない管理職のためのマネジメントの秘訣
2025.02.06
落合陽一氏や松尾豊氏の研究は社会に届いているか? ひろゆき氏が語るアカデミアの課題と展望
2025.02.05
「納得しないと動けない部下」を変える3つのステップとは マネージャーの悩みを解消する会話のテクニック
2025.01.07
1月から始めたい「日記」を書く習慣 ビジネスパーソンにおすすめな3つの理由
2025.02.10
A4用紙を持ち歩いて殴り書きでアウトプット コクヨのワークスタイルコンサルタントが語る、2種類のメモ術
2025.02.05
エンジニアとして成功するための秘訣とは? ひろゆき氏が語る、自由な働き方を叶えるアプリ開発とキャリア戦略
2025.02.04
日本企業にありがちな「生産性の低さ」の原因 メーカーの「ちょっとした改善」で勝負が決まる仕組みの落とし穴
2025.02.03
「昔は富豪的プログラミングなんてできなかった」 21歳で「2ちゃんねる」を生んだひろゆき氏が語る開発の裏側
PR | 2025.02.04
能登半島地震で自宅は全壊、「これでどうやってDXするねん」 被災したサイボウズ社員と支援者らが語る災害支援のノウハウ
新人の報連相スキルはマネージメントで引きあげろ!~管理職の「他責思考」を排除~
2025.01.29 - 2025.01.29
【手放すTALK LIVE#45】人と組織のポテンシャルが継承されるソース原理 ~人と組織のポテンシャルが花開く「ソース原理」とは~
2024.12.09 - 2024.12.09
『これで採用はうまくいく』著者が語る、今こそ採用担当に届けたい「口説く」力のすべて
2024.11.29 - 2024.11.29
【著者来館】『成果を上げるプレイングマネジャーは「これ」をやらない』出版記念イベント!
2025.01.10 - 2025.01.10
片付けパパ対談【特別編】 整理術×行動術×メモ術で、仕事も人生も自在にデザイン!
2024.12.16 - 2024.12.16