bussorenre Laboratory

hoge piyo foo bar

windows subsystem for Linux で 困ったこととその解決法

「この記事は個人の見解であり、所属する組織の公式見解ではありません」

5月8日、4月には結局間に合わなかった Windows 10 Redstone 4 のアップデートが配信されました。Redstone におけるメジャーバージョンアップは従来のService Pack 並の大きな変更ですが、その中でも特に WSL, Windows subsystem for Linux における機能拡張に着目して、WSL で どこまで出来そうか確認します。

Redstone 4 における最も基本的でかつ重要な変更として、パーミッション管理が多少改善された事にあると思っていています。特に(visual studio Code 等でコードを編集するために)、WIndows 側のディレクトリにローカルリポジトリをおいていた場合、今までは ユーザー root, グループ root, パーミッション777  になっていたと思います。これが少しはましになりそうです。

今回利用するのは WSL の中でも Ubuntu 18.04 を利用します。いつになったら RedHat がリリースされるのか。笑

Windows Update を手動チェックし、更新をインストールする

Windows をゲーミング用途以外で触るのは本当に久しぶりです。 早速 Windows Update をかけます。時々アップデートを無視してしまうことがあるので、Cortana で「Windows Update」 と入力し、強制的にアップデートをかけます。ついでにWindows Defender の定義ファイルも更新しましょうね~。結構時間かかります。

終了すると必ず再起動を求められるのでお忘れずに。

古いWSL環境を削除する

必ず CMD.exe から管理者モードで 以下のコマンドを実行します

lxrun /uninstall /full /y

これにより、現存するUbuntu 環境が消えます。もしエラーが実行できない場合は、よくわかりません(※ なんでエラーになったのかわからないのですが、特に気にせず次のステップにすすめました)。 なので、無視して次に進めて大丈夫です

Windows Store から Ubuntu 18.04 をインストールし、普通に起動します。 ユーザー名、パスワードを設定できるので設定します。

umask の設定をする

まず、デフォルトの状態でディレクトリを作ると、パーミッションが 777 になっていると思います。(なっていないならこのステップは無視) vim かなにかで .profile を開き、以下の行のコメントを解除します

#umask 022

コメントアウトしたら source .profile で再度読み込みを

windows 管理下のディスクにLinuxパーミッションを付与できるようにする

Windows が採用しているファイルフォーマットNTFSには、Linuxパーミッションを保存することが出来ないので、アダプターとなるファイルシステム drvfs にメタデータを付与するオプションを付けて、再度マウントする

# C がすでにマウントされているなら、一度アンマウントする
$ sudo umount /mnt/c

# metadata オプションをつけて再度マウントする
$ sudo mkdir /mnt/c
$ sudo mount -t drvfs C: /mnt/c -o metadata

これにより、windows 側のフォルダも、パーミッションが付与できるようになる。やったぜ。 ところがこれ、大きな落とし穴があり、windows 側でファイルを更新すると、なんとパーミッション等のメタデータが破壊されてしまう。なんでやねん!!!笑

というわけで、マウント時にデフォルト値を設定してあげることで、windows 側でファイルをいじっても元通りっぽいパーミッションになることができる。

$ sudo mount -t drvfs C: /mnt/c -o metadata,uid=1001,gid=1001,umask=22,fmask=111

↑の例だとC 全体をマウントしているので、workspace などのみをマウントして利用するのが安全そう

$ sudo mount -t drvfs 'C:\workspace' /mnt/workspace -o metadata,uid=1001,gid=1001,umask=22,fmask=111

その他 windows 環境での作業改善をする

個人的にはMac のctrlキーが Aの左にあるの、すごい気に入っていたので、ctrlキーを A の左のキーに割り当てます。windows 標準JISキーボードは大体左にcapslock があるんじゃないでしょうか。 フリーソフトでいじることも可能ですが、変なソフト入れたくなかったので直接レジストリをいじります。

cortana に regedit.exe と入力します。

細かい方法は参考記事に載っていますが、capslock を 左ctrlに割り当てるには

  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layoutを開く。
  • 右クリックして→「新規」→「バイナリ値」を作成して、名前を「Scancode Map」にする。
  • Scancode Mapを開く。
  • 以下のように値を設定する。
0000 0000 0000 0000 
0200 0000 1D00 3a00 
0000 0000

で実現できます。1d00 というのは、ctrl キー 0x1d のリトルエンディアン2バイト記法のため

さて、これで多少は使えるようになりました。 次は実際に快活環境を入れて、開発動かしてみるか……

参考にした記事とか