Memo/Windows/10/WSL

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

WSL(Windows Subsystem for Linux)

  • 旧名 BoW(Bash on Windows)
  • Windows10 Anniversary Updateから搭載
  • Ubuntu LTSがサブシステムとしてインストールされるので、bash、apt等で管理できる。
  • 2018-09-16現在: 正式版。windows storeからインストールできる。sshdもデフォルトでは起動していない。
  • 2016-10-14現在、beta版。デフォルトでsshd等が起動し、windowsファイアウォールでもフルオープンになっているので、注意
  • BoW記事

/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

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で確認

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-11-28 (水) 18:14:36 (17d)