Memo/Windows/10/WSL

https://dexlab.net:443/pukiwiki/index.php?Memo/Windows/10/WSL
 

WSL1(Windows Subsystem for Linux)

  • WSL1の感想
    • 良い点
      • GNU系ディストリビューション(Ubuntu)等が使える。macOSのBSD系コマンドにイライラする事が無い。
      • bashが起動するだけなので直ぐに使える。
      • Windowsストアからインストールが楽。初期化も楽。
      • 複数のディストリビューションを使える。
    • イマイチな点
      • I/Oが遅い。VMware上でのファイル操作の方が早いのが体感でわかるくらい。
      • WindowsアプリでLinux上のファイルを触るとパーミッション等が壊れる。
      • タブ式ターミナルが無い。 Windows Terminal で事足りる
  • Ubuntu LTSがサブシステムとしてインストールされるので、bash、apt等で管理できる。
  • 2018-09-16現在: 正式版。windows storeからインストールできる。sshdもデフォルトでは起動していない。
  • 2016-10-14現在、beta版。デフォルトでsshd等が起動し、windowsファイアウォールでもフルオープンになっているので、注意
  • BoW記事

ファイルシステム(VolFs, WslFs, DrvFs)

  • VolFs(lxfs)
    • Linux専用。Linuxディストリビューションがインストールされる。
    • Windowsアプリで編集すると壊れる。
    • WSLのUNIXソケットと通信可能。
  • WslFs
    • VolFsと同じで、Linux専用。
    • Linuxのメタデータの管理をDrvFsと同じにしたもの
    • VolFsからwslconfig.exeでupgradeできるが詳細が不明
  • DrvFs
    • WSLからWindows NTFSへアクセスするため
    • Windowsアプリから編集できる。(Windowsアプリが拡張メタデータに対応していないと、owner/permission等は消える。VScodeは問題なかった)
    • WindowsのUNIXソケットだけ通信可能。sshのControlPathをDrvFsに置くと、「muxclient: master hello exchange failed」エラー。

例: Ubuntu 18.04 LTS. C:\, D:\がある場合

mount

rootfs on / type lxfs (rw,noatime)
...
C:\ on /mnt/c type drvfs (rw,noatime,uid=1000,gid=1000,umask=22,fmask=11,metadata,case=off)
D:\ on /mnt/d type drvfs (rw,noatime,uid=1000,gid=1000,umask=22,fmask=11,metadata,case=off)

tmpreaper: /tmp, /vat/tmpの定期削除

WSL1でUbuntu 18.04 LTSで/tmp, /var/tmpが肥大化している事がある。
crond等が動作していないので自動削除はされないようだ。
Ubuntuでは「tmpreaper」、RedHat系だと「tmpwatch」を使う。

  • Ubuntu 18.04 LTS
    sudo apt-get install tmpreaper
    sudo vim /etc/tmpreaper.conf
    --
    # 自動削除時にwarningを出さないようにコメントアウトする
    # SHOWWARNING=true
    
    # 削除対象ディレクトリ
    TMPREAPER_DIRS='/tmp/. /var/tmp/.'
    
    # 7日アクセスが無いファイルを消す
    TMPREAPER_TIME='7d'
    
    # 手動で実行したいので、ランダムディレイを0に
    TMPREAPER_DELAY='0'
    --
    
    # /etc/cron.daily/tmpreaper に登録される
  • 手動で実行する場合
    sudo /etc/cron.daily/tmpreaper
  • 「~/.bashrc」等に登録すれば、ログイン時に自動実行してくれる。その場合、「TMPREAPER_DELAY='256'」等に戻した方が、遅延実行されるので作業を早く開始できそう。

wslu: 便利なユーティリティ

  • インストール
    • CentOS 7
      sudo yum-config-manager --add-repo https://download.opensuse.org/repositories/home:/wslutilities/CentOS_7/home:wslutilities.repo
      sudo yum install wslu
    • Ubuntu
      sudo apt install ubuntu-wsl
  • ファイルをwindowsアプリで開く
    • Windows側で拡張子に対して関連付けがされていないと、一瞬windowが開いて閉じる。
      wslview <file>

トラブルシューティング


ブルースクリーン:BSoD

  • 環境
    • Win10 pro 64bit 1809
    • WSL:
      • Ubuntu 18.04 LTS
      • ansible 2.7.10
    • VirtualBox 6.0.8
      • CentOS 7 64bit
  • 現象
    • WSL上のansible-playbookから、Vagrant上のCentOS 7に対して実行するとBSoD
    • BSoDのメッセージ: Kernel Security Check Failure
    • minidump有効後、BlueScreenViewの詳細情報 : Vector ソフトを探す! で見ると、「afunix.sys AF_UNIX socket provider」でクラッシュしている。
  • 解決策
    • 不明

rootユーザでログインしたい/sudoが壊れた場合に直したい

  • rootで直接ログインしたい場合
  • sudoファイルが壊れて、sudoが使えなくなった場合
  1. cmdかpowershellを開き、デフォルトユーザをrootに変更
    # Ubuntuの場合
    ubuntu config --default-user root
  2. wslのターミナルを開いてrootに変わったことを確認し、壊れたファイルを修復
  3. デフォルトユーザを元に戻す
    ubuntu config --default-user <user>
  4. 今後を考えると、rootユーザにパスワードを設定しても良い
    sudo passwd

ControlMaster有効時に「muxclient: master hello exchange failed」

  • 環境:
    • Win10 Pro 1809
    • WSL: Ubuntu 18.04 LTS
  • 現象:
    • homeパスを、drvfsでマウントしたディレクトリに変えている。
    • その場合に以下のエラーでsshが失敗する
echo ~
/mnt/c/local/home/<user>

ssh -V
OpenSSH_7.6p1 Ubuntu-4ubuntu0.3, OpenSSL 1.0.2n  7 Dec 2017

cat ssh-config
Host *
  ControlMaster auto
  ControlPersist 60s
  ControlPath ~/.ssh/%C

ssh -F ssh-config <host>

muxclient: master hello exchange failed
Failed to connect to new control master
ssh_exchange_identification: Connection closed by remote host
  • 原因:
    • ControlPath でソケットファイルが作られるが、DrvFs上にあるとWindowsのUNIXソケットだけ通信可能。VolFs上にあるとWSLのUNIXソケットと通信可能。
      # 成功する場合: /home/user01/.ssh/
      srw------- 1 user01 user01    0 Apr  1 10:25 5a46565d0707b05a9615e8cc0cfbf90447fba019
      
      # 失敗する場合: /mnt/c/local/home/user01/.ssh/
      -rwxr--r-- 1 user01 user01    0 Apr  1 10:30 5a46565d0707b05a9615e8cc0cfbf90447fba019
  • 解決:
    • ControlPath のパスを VolFsでマウントされているドライブ(type lxfs)等を指定する。「type drvfs」だとNG。
      vim ~/.ssh/config
      --
      Host *
          IdentityFile               ~/.ssh/id_rsa
          ForwardAgent               yes
          ServerAliveInterval        15
          ServerAliveCountMax        4
          StrictHostKeyChecking no
          ControlMaster auto
          ControlPersist 60s
          ControlPath /home/<user01>/.ssh/%C
      --
    • 環境変数のHOMEを参照するプログラムもある。vagrant, etc
      export HOME=/home/<user01>
    • /home/は「type lxfs」なのでOK
      mount -l
      rootfs on / type lxfs (rw,noatime)
      ...
      C: on /mnt/c type drvfs (rw,noatime,uid=1000,gid=1000,umask=22,fmask=11,metadata,case=off)

突然WSLが起動しなくなったら

  • 症状
    • wslttyが起動後、画面が真っ暗。
    • wslttyが起動後、すぐに終了する。
    • Store版 Ubuntuを起動しようとすると以下のメッセージで起動できない。
      Installing, this may take a few minutes...
      WslRegisterDistribution failed with error: 0x800703fa
      Error: 0x800703fa ????????????????????? ???????????????????????
      
      Press any key to continue...
  • PowerShellから「wslconfig /l」を実行すると、インストールされていない扱い。
    Windows Subsystem for Linux には、ディストリビューションがインストールされていません。
    ディストリビューションは Microsoft Store にアクセスしてインストールすることができます:
    https://aka.ms/wslstore
  • 解決方法:
    • 「services.msc」を実行してサービスで LxssManager の再起動。(これで直った)
    • PowerShell(管理者権限)から実行する場合
      Restart-Service LxssManager
    • LxssManager が再起動できない場合、OSの再起動で直った場合あり。
    • Windows Updateの実施
    • PCの再起動

WindowsアプリでWSL配下のファイルを編集すると壊れる

WSL上のファイルはNTFSの拡張属性で管理されているようで、WindowsアプリはNTFSの拡張属性を考慮しないため、metadataが壊れるようだ。

  • Store版Ubuntu 18.04 LTSのHOMEディレクトリは以下だが、このディレクトリのファイルをWindowsアプリで編集すると壊れる。
    %LOCALAPPDATA%\Packages\CanonicalGroupLimited.UbuntuonWindows_<random>\LocalState\rootfs\home\<user>\
    • 「VolFs」でマウント
    • Windowsテキストエディタで新規ファイルを作ると、WSL上ではパーミッションが「000」になる。
    • WindowsアプリでWSLのファイルを消すと、消えない。また、WSL上でも消せなくなる(Permission denied)。
    • WindowsアプリでWSLのファイルを移動すると、WSL上では移動してないように見える。WSLからファイルを消せなくなる。
  • Windowsアプリでファイルを触りたい場合、「/mnt/c/」以下に置くようにする。
    • 「DrvFs」でマウント
    • 「/mnt/c/」以下に置いたファイルのパーミッションは「0777」になるようだ。デフォルトではmetadata無効でマウントされる。

WLinux Enterprise: RHEL互換


/etc/wsl.conf

  • c,dドライブのマウント先を変えたい場合: 以下の場合、「/mnt/c」が「/c」へ変わる。
    [automount]
    root = /
  1. /etc/wsl.conf を変更して、metadataを有効に。これが無いと、drvfsに作成されたファイルのパーミッションは全て「0777」になる
    sudo bash -c 'cat > /etc/wsl.conf << "EOS"
    [automount]
    options = "metadata,umask=22,fmask=11"
    EOS'
  2. Windows 10 1903+: 指定したdistroを終了
    wsl -l
    ...
    Ubuntu (既定)
    
    wsl -t Ubuntu
  3. PowerShell(管理者権限)からサービスの再起動
    Restart-Service LxssManager
  4. WSLを起動してmetadataが追加されたか確認
    mount -l | grep /mnt
    C: on /mnt/c type drvfs (rw,noatime,uid=1000,gid=1000,umask=22,fmask=11,metadata)

/home/userディレクトリの移動

※2020-08: 色々問題があるのでお勧めはしない。

  • Store版Ubuntu 18.04 LTSのHOMEディレクトリは以下のようにかなり深い。また、Windowsアプリでこのディレクトリを編集すると壊れる。
    %LOCALAPPDATA%\Packages\CanonicalGroupLimited.UbuntuonWindows_<random>\LocalState\rootfs\home\<user>\
    • rootfsはWSLからアクセスできなかった。「sudo ls rootfs」でも「permission denied」
    • 以下コマンドでデータの移動もやってくれるが、カレントユーザの場合はできない。「user user01 is currently used by process 4」
      usermod -d <new home> -m <user>
  1. Memo/Windows/10/WSL#bef978d4の変更を入れる
  2. 新しいhomeディレクトリ作成
    home_path=/mnt/c/local/home/${USER}
    mkdir -p ${home_path}
  3. データのコピー
    rsync -avz /home/${USER}/ ${home_path}/
  4. ユーザのhome変更。パスが間違ってないか十分に注意。間違っているとログインできなくなるかも。
    sudo vipw
    --
    user01:x:1000:1000:,,,:/mnt/c/local/home/user01:/bin/bash
    --
    
    # アクセスできる事を確認
    ls /mnt/c/local/home/user01
  5. bash終了して、起動。homeが変わっている事を確認
    pwd
    /mnt/c/local/home/user01
  • 「ControlPath ~/.ssh/%C」のような使い方をしたい場合。socketファイルをVolFs上に置く必要がある
    mv .ssh .ssh.bak
    ln -s /home/$USER/.ssh .ssh
    rsync -avz .ssh.bak/ .ssh/

コマンド結果をクリップボードへコピー

  • Windows 10 Creators UpdateからWSLからexeを実行できるようになった。
ls | clip.exe

複数のディストリビューション

  • powershellから実行する
  • 確認
    wslconfig.exe /list
  • デフォルトを設定
    wslconfig.exe /setdefault Ubuntu

ターミナル

デフォルトのcmd.exeではさすがに力不足。

  • ssh経由
    • sshdを起動し、localへログインすれば、任意のssh対応ターミナルが使える

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-08-28 (金) 12:30:04 (30d)