WSL1(Windows Subsystem for Linux) †
- 旧名 BoW(Bash on Windows)
- Windows 10 Fall Creators Updateから「WSL」に変更
- 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ファイアウォールでもフルオープンになっているので、注意
CLIでゲストOSのインストール †
ファイルシステム(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」エラー。
- VirtualBoxの共有フォルダ機能でVM内から参照できる。
例: 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」を使う。
- 「~/.bashrc」等に登録すれば、ログイン時に自動実行してくれる。その場合、「TMPREAPER_DELAY='256'」等に戻した方が、遅延実行されるので作業を早く開始できそう。
wslu: 便利なユーティリティ †
- ファイルをwindowsアプリで開く
- Windows側で拡張子に対して関連付けがされていないと、一瞬windowが開いて閉じる。
wslview <file>
トラブルシューティング †
ネットワークに繋がらない/DNS名前解決ができない †
- 環境
- WSL2, Win10 20H2
- Ubuntu 18.04 LTS
- 現象
- ネットワークに繋がらない。DNS名前解決ができない。ネットワークインタフェースが全てDOWN
ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 16:3e:c5:xx:xx:xx brd ff:ff:ff:ff:ff:ff
3: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether f6:ec:77:xx:xx:xx brd ff:ff:ff:ff:ff:ff
4: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 00:15:5d:xx:xx:xx brd ff:ff:ff:ff:ff:ff
5: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
link/sit 0.0.0.0 brd 0.0.0.0
- 解決
- powershellからWSLの終了
wsl --shutdown
ブルースクリーン:BSoD †
- 環境
- Win10 pro 64bit 1809
- WSL:
- Ubuntu 18.04 LTS
- ansible 2.7.10
- VirtualBox 6.0.8
- 現象
- 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が使えなくなった場合
- cmdかpowershellを開き、デフォルトユーザをrootに変更
# Ubuntuの場合
ubuntu config --default-user root
- wslのターミナルを開いてrootに変わったことを確認し、壊れたファイルを修復
- デフォルトユーザを元に戻す
ubuntu config --default-user <user>
- 今後を考えると、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 のパスを 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が起動しなくなったら †
WindowsアプリでWSL配下のファイルを編集すると壊れる †
WSL上のファイルはNTFSの拡張属性で管理されているようで、WindowsアプリはNTFSの拡張属性を考慮しないため、metadataが壊れるようだ。
- Windowsアプリでファイルを触りたい場合、「/mnt/c/」以下に置くようにする。
- 「DrvFs」でマウント
- 「/mnt/c/」以下に置いたファイルのパーミッションは「0777」になるようだ。デフォルトではmetadata無効でマウントされる。
WLinux Enterprise: RHEL互換 †
/etc/wsl.conf †
- c,dドライブのマウント先を変えたい場合: 以下の場合、「/mnt/c」が「/c」へ変わる。
[automount]
root = /
- /etc/wsl.conf を変更して、metadataを有効に。これが無いと、drvfsに作成されたファイルのパーミッションは全て「0777」になる
sudo bash -c 'cat > /etc/wsl.conf << "EOS"
[automount]
options = "metadata,umask=22,fmask=11"
EOS'
- Windows 10 1903+: 指定したdistroを終了しないと、wsl.confが反映されない。
wsl -l -v
NAME STATE VERSION
* Ubuntu Running 2
wsl -t Ubuntu
- [WSL1] PowerShell(管理者権限)からサービスの再起動
Restart-Service LxssManager
- 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: 色々問題があるのでお勧めはしない。
- Memo/Windows/10/WSL#bef978d4の変更を入れる
- 新しいhomeディレクトリ作成
home_path=/mnt/c/local/home/${USER}
mkdir -p ${home_path}
- データのコピー
rsync -avz /home/${USER}/ ${home_path}/
- ユーザのhome変更。パスが間違ってないか十分に注意。間違っているとログインできなくなるかも。
sudo vipw
--
user01:x:1000:1000:,,,:/mnt/c/local/home/user01:/bin/bash
--
# アクセスできる事を確認
ls /mnt/c/local/home/user01
- bash終了して、起動。homeが変わっている事を確認
pwd
/mnt/c/local/home/user01
コマンド結果をクリップボードへコピー †
- Windows 10 Creators UpdateからWSLからexeを実行できるようになった。
ls | clip.exe
複数のディストリビューション †
- powershellから実行する
- 確認
wslconfig.exe /list
ターミナル †
デフォルトのcmd.exeではさすがに力不足。
- ssh経由
- sshdを起動し、localへログインすれば、任意のssh対応ターミナルが使える