Memo/Windows/10/WSL

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

WSL(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記事

wslu: UbuntuをWSL上で使う場合のパッケージ集

  • インストール
    sudo apt install ubuntu-wsl

ブルースクリーン: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。
        ControlPath /home/<user>/.ssh/%C
    • /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 の再起動。(これで直った)
    • LxssManager が再起動できない場合、OSの再起動で直った場合あり。
    • Windows Updateの実施
    • PCの再起動

WLinux Enterprise: RHEL互換


/etc/wsl.conf

  1. /etc/wsl.conf を変更して、metadataを有効に。これが無いと、/mnt/c/ 以下に作成されたファイルのパーミッションは全て「0777」になる
    sudo bash -c "cat > /etc/wsl.conf << 'EOS'
    [automount]
    options = "metadata,umask=22,fmask=11"
    EOS"
  2. bashを終了、起動して正しくmountされたか確認
    mount -l | grep /mnt
    C: on /mnt/c type drvfs (rw,noatime,uid=1000,gid=1000,umask=22,fmask=11,metadata)

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

  • 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アプリで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無効でマウントされる。

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

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

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

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

sshdの起動

sudo apt install openssh-server
sudo service ssh start

Ubuntuのアップグレード


Ubuntu16.04から18.04へのアップグレード

legacy環境で記事通りに更新した所、約50分かかった。


Ubuntu14.04から16.04へのアップグレード

  • 1時間程度かかるので時間がある時に。
sudo do-release-upgrade
...
 Continue [yN]  Details [d]y
sudo apt update
sudo apt upgrade
sudo apt autoremove
# バージョン確認
lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.4 LTS
Release:        16.04
Codename:       xenial

ターミナル

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

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

インストールパス

  • Storeからインストールされた場合、「C:\Program Files\WindowsApps」に入るようだ
  • Store版 Ubuntu 18.04 LTSの場合
    C:\Program Files\WindowsApps\CanonicalGroupLimited.UbuntuonWindows_1804.2018.817.0_x64__79rhkp1fndgsc
  • Store版 Ubuntu 18.04 LTSの /home/<user>/
    C:\Users\<user>\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\home\<user>

WSLアンインストール

legacy版とstore版で方法が違う

  • store版: Ubuntu 18.04 LTS: store画面から消すか、以下のコマンド
    powerwhell
    Get-AppxPackage *ubuntu* | Remove-AppxPackage
  • legacy版: Ubuntu 16.04 LTS
    powerwhell
    lxrun /uninstall /full

WSLインストール

なるべくコマンドでインストールしたい。

  • 記事
  • 環境
    • Windows 10 Pro 1803
  • Ubuntuの場合、legacy版とstore版がある
    • store版: Ubuntu 18.04 LTS
      • お勧め: opensshのincludeが使えるのが7.3以上。dockerもそのまま使えるため。
      • OpenSSH: 7.6p1
    • legacy版: Ubuntu 16.04 LTS
      • Bash on Ubuntu on Windowsと呼ばれていた頃のバージョン
      • OpenSSH: 7.2p1
  1. デフォルトshellをPowerShell?へ変更
    powershell
    New-ItemProperty -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced -Name DontUsePowerShellOnWinX -PropertyType DWord -Value 0 -For
    Stop-Process -Name explorer
  2. Win10 1803では不要: 開発者モードの有効化: Windowsキー + Xキー > Aキー (Windows PowerShell? (管理者))
    New-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock -Name AllowAllTrustedApps -PropertyType DWord -Value 1 -Force
    New-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock -Name AllowDevelopmentWithoutDevLicense -PropertyType DWord -Value 1 -Force
  3. WSLの有効化
    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
  4. OS再起動が必要な時は再起動する。
  5. https://aka.ms/wslstore からUbuntuをインストールし、起動。
  6. Windowsキー + Xキー > Aキー (Windows PowerShell?)
    bash
    cd ~/
    
    # ストア版Ubuntuでは不要。sudo時に「ホスト <hostname> の名前解決ができません」メッセージ解決
    sudo perl -p -i -e "s/127.0.0.1 localhost/127.0.0.1 $(hostname) localhost/g" /etc/hosts
    
    # リポジトリをjpへ変更
    sudo perl -p -i -e "s/archive/jp.archive/g" /etc/apt/sources.list
    # デフォルトumask 000(ファイルを作ると0666)なので、022(ファイルを作ると0644)へ変更
    echo 'umask 022' >> ~/.bashrc
    source ~/.bashrc
    
    # パッケージのアップグレード
    sudo apt-get update
    sudo apt-get upgrade
    
    # 必要なパッケージをインストール
    sudo apt install make git
    
    # バージョン確認: legacy版。ストアからインストールした場合は18.04 LTS
    lsb_release -a
    No LSB modules are available.
    Distributor ID: Ubuntu
    Description:    Ubuntu 14.04.5 LTS
    Release:        14.04
    Codename:       trusty
  • 日本語用パッケージ追加
    sudo apt install language-pack-ja manpages-ja manpages-ja-dev
  • 言語の変更: 英語の場合はen_US.UTF-8
    sudo update-locale LANG=ja_JP.UTF-8
    exit
    # 再度bash起動
    echo $LANG
    ja_JP.UTF-8
  • タイムゾーンの変更: デフォルトがDSTなので、JSTへ変更
    # sudo timedatectl: Failed to create bus connection: No such file or directory
    echo "Asia/Tokyo" | sudo tee /etc/timezone
    sudo dpkg-reconfigure --frontend noninteractive tzdata
    # dateで確認
  • rootユーザにパスワードを設定すると、sudoが壊れても「su -」でrootになって直せる。
    sudo passwd
  • visudoのエディタをvimへ変更
    sudo update-alternatives --set editor /usr/bin/vim.basic
  • sudoでパスワードを要求しないようにしたい場合
    sudo visudo -f /etc/sudoers.d/user01
    --
    user01 ALL=(ALL) NOPASSWD: ALL
    --

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