WSL(Windows Subsystem for Linux)はWindows10 21H2以降の64ビット版、およびWindows11には標準装備されているらしい(x86にはインストールされていない)
・インストール
インストールできるディストリビューションの確認
> wsl.exe -l --online
インストールできる有効なディストリビューションの一覧を次に示します。
既定の分布は ' * ' で表されます。
'wsl --install -d 'を使用してインストールします。
NAME FRIENDLY NAME
* Ubuntu Ubuntu
Debian Debian GNU/Linux
kali-linux Kali Linux Rolling
...
(分布というのはdistributionの和訳だろうか?)
以下、プロンプトとして > がある場合はWindowsのコマンドプロンプトから、$ がある場合はWSLのコンソールから実行することを表わす。
・インストールするバージョンを指定する
指定しないとバージョン2になる
バージョン2は仮想マシンのため互換性は高いらしいが、IPアドレスが別のプライベートアドレスとなる。
> wsl.exe --set-default-version 1
・ディストリビューションのインストール
> wsl.exe --install -d Ubuntu
インストール中: 仮想マシン プラットフォーム
仮想マシン プラットフォーム はインストールされました。
インストール中: Linux 用 Windows サブシステム
Linux 用 Windows サブシステム はインストールされました。
ダウンロード中: WSL カーネル
インストール中: WSL カーネル
WSL カーネル はインストールされました。
ダウンロード中: Ubuntu
要求された操作は正常に終了しました。変更を有効にするには、システムを再起動する必要があります。
・Windowsを再起動する
・ユーザーの作成
Windowsの再起動後、Ubuntuを起動するとユーザーの作成が始まる。
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username:ユーザー名(メールを送受信する時の名前になる)
New password:xxxxx
Retype new password:
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
Welcome to Ubuntu 20.04 LTS (GNU/Linux 5.10.16.3-microsoft-standard-WSL2 x86_64)
・状態の確認
$ wsl.exe --status
既定の配布: Ubuntu
既定のバージョン: 1
$ wsl.exe --list --verbose
NAME STATE VERSION
* Ubuntu Running 1
・起動方法
プログラムメニューからUbuntuを起動するか、以下を実行する
%LOCALAPPDATA%\Microsoft\WindowsApps\ubuntu.exe
・終了方法
$ wsl.exe --shutdown
または
> wsl.exe --terminate Ubuntu
・バックアップ
> wsl.exe --terminate Ubuntu
> wsl.exe --export Ubuntu \\Backup\WSL\Ubuntu.tar
・リストア
WSLのバージョンを指定してリストアできる。
リストア前に。以下に.vhdxファイルがあれば削除しておくらしい
%LOCALAPPDATA%\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState
> wsl.exe --terminate Ubuntu
> wsl.exe --list --verbose
> wsl.exe --unregister Ubuntu
> wsl.exe --list --verbose
> wsl.exe --import Ubuntu %LOCALAPPDATA%\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState "\\Backup\WSL\Ubuntu.tar" --version 1
> wsl.exe --list --verbose
デフォルトユーザーを変更
復元後はデフォルトのユーザーがrootになっているので、作成したユーザーをデフォルトのユーザーに変更する
> Ubuntu.exe config –default-user ユーザー名
・初期化の方法
ディストリビューションのインストール直後の状態にすることができる。
Try and Errorしているときに便利。
WSLを終了させる
> wsl.exe –terminate Ubuntu
設定-アプリのUbuntu
詳細オプション-リセット-リセット
この時、タスクバーのピン止めは解除される
・WSLバージョンの変更
WSL2ではWin32側とはプライベートIPアドレスを使ってホストPCのポートと被ることが避けられる
当初はWSL1に変更して同じIPアドレスを使う
> wsl.exe --list --verbose
> wsl.exe --terminate Ubuntu
> wsl.exe --set-version Ubuntu 1
変換中です。この処理には数分かかることがあります…
変換が完了しました。
注意点として、WSL2でポートマップなどを行っていた場合、削除しておかないとマップされたままとなる。
・WSLを起動する
スタートメニュー、または
> %LOCALAPPDATA%\Microsoft\WindowsApps\ubuntu.exe
・WSLディストリビューションの更新
sudo apt update, sudo apt upgradeで行う
$ sudo apt update
$ sudo apt list --upgradable
$ sudo apt upgrade
再度、apt updateで確認する
$ sudo apt update
All packages are up to date.と表示されていれば終了
・追加モジュールのインストール
telnetd
$ sudo apt install inetutils-telnetd
$ sudo vi /etc/inetd.conf
<off># telnet stream tcp nowait root /usr/sbin/tcpd /usr/sbin/telnetd
↓
telnet stream tcp nowait root /usr/sbin/tcpd /usr/sbin/telnetd
$ sudo /etc/init.d/inetutils-inetd start
Windows Defenderファイアウォールの警告が出たら許可する
・WSLの設定
$ sudo vi /etc/wsl.conf
[network]
hostname = ml.mydomain.com
#generateHosts = false
#renerateResolvConf = false
これにより、/etc/hostsが以下のように変わる
127.0.0.1 localhost
127.0.1.1 domain.com PC1.localdomain PC1
↓
127.0.0.1 localhost
127.0.1.1 ml.mydomain.com.localdomain ml.mydomain.com
・システム環境の設定
lessでvキーを押したときにviを起動する
$ sudo update-alternatives --set editor /usr/bin/vim.basic
・ユーザー環境の設定
sudo時に同じvi設定を使う
$ vi ~/.vimrc
;color industry
$ sudo ln -s ~/.vimrc /root/.vimrc
その他、追加エイリアスなど
$ vi ~/.bash_aliases
alias sudo=’sudo ‘ # sudo時もaliasを引き継ぐ
alias sudol=’sudo –user=list ‘ # listユーザーでsudoを起動
alias suvi=’sudo vi ‘
alias lh=’ls -alFH ‘ # -H シンボリックリンク先を表示する
・アンインストール方法
設定-アプリ-アプリと機能で、 ディストリビューション(Ubuntu)を削除する
・バックアップスクリプト
backup_WSL.bat
@echo off
echo backup Ubuntu
setlocal enabledelayedexpansion
rem PROMPTは使用済みの環境変数なので使えない
set PROMPT_MSG="Ubuntu バックアップ"
set FILTER="tar (*.tar)^|*.tar"
set TITLE="保存するファイルを指定してください"
set DATETIME=%DATE%-%TIME: =0%
set ARCHIVE_FOLDER=\\LANDISK\usb3\WSL\%COMPUTERNAME%
set DISTR=Ubuntu
set RUNNING=
set WSL_VER=
for /f "usebackq tokens=1-3 delims=," %%a in (`%~dp0GetWslVersion.bat`) do (
set DISTR=%%a
set RUNNING=%%b
set WSL_VER=%%c
)
if "!WSL_VER!" == "" (
echo WSLのバージョンが取得できませんでした。終了します
goto :EXIT
)
echo DISTR="!DISTR!" RUNNING="!RUNNING!" WSL_VER="!WSL_VER!"
if not exist "%ARCHIVE_FOLDER%" md "%ARCHIVE_FOLDER%"
set DEFAULT=%ARCHIVE_FOLDER%\!DISTR!-!WSL_VER!_%DATETIME:~0,4%%DATETIME:~5,2%%DATETIME:~8,2%-%DATETIME:~11,2%%DATETIME:~14,2%%DATETIME:~17,2%.tar
set BACKUP_FILE=
@echo for /f "usebackq delims=" %%f in (`powershell -file "%~dp0SaveFileDialog.ps1" %PROMPT_MSG% %FILTER% %TITLE% "%DEFAULT%"`) do set BACKUP_FILE=%%f
for /f "usebackq delims=" %%f in (`powershell -file "%~dp0SaveFileDialog.ps1" %PROMPT_MSG% %FILTER% %TITLE% "%DEFAULT%"`) do set BACKUP_FILE=%%f
if "%BACKUP_FILE%" == "" goto :EXIT
echo.
rem 末尾が.tarでなければ.tarを追加する
if /i not "%BACKUP_FILE:~-4%" == ".tar" set BACKUP_FILE=%BACKUP_FILE%.tar
echo BACKUP_FILE="%BACKUP_FILE%"
pause
echo.
echo RUNNING="!RUNNING!"
if "!RUNNING!" == "0" goto :SKIP_TERM
wsl.exe --list --verbose
echo.
echo Ubuntuを停止します。
pause
echo.
wsl.exe --terminate Ubuntu
:SKIP_TERM
wsl.exe --list --verbose
echo.
echo バックアップを開始します。
echo 保存場所:%BACKUP_FILE%
pause
echo.
echo %BACKUP_FILE% にバックアップ中です。
wsl.exe --export Ubuntu %BACKUP_FILE%
wsl.exe --list --verbose
endlocal
echo.
echo バックアップが終了しました。
pause
exit /b 0
:EXIT
endlocal
exit /b 1
GetWslVersion.bat(Windowsにnkfのインストールが必要)
@echo off
setlocal enabledelayedexpansion
set DISTR=
set RUNNING=0
set VER=2
for /f "usebackq tokens=2-4 delims= " %%a in (`wsl.exe --list --verbose ^| nkf -W16L -s ^| findstr /R "^\*"`) do (
set DISTR=%%a
if "%%b" == "Running" set RUNNING=1
set VER=%%c
)
echo !DISTR!,!RUNNING!,!VER!
endlocal
exit /b 0
SaveFileDialog.ps1
Param($InitialDirectory, $Filter, $Title, $FileName)
Add-Type -AssemblyName System.Windows.Forms
$FileBrowser = New-Object System.Windows.Forms.SaveFileDialog
$FileBrowser.InitialDirectory = $InitialDirectory
$FileBrowser.Filter = $Filter
$FileBrowser.Title = $Title
$FileBrowser.RestoreDirectory = $true
$FileBrowser.FileName = $FileName
if($FileBrowser.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK){
return ($FileBrowser.FileName)
}else{
return ("")
}
・復元スクリプト
restore_WSL.bat
@echo off
echo restore Ubuntu
setlocal
set WSL_VER=2
set UBUNTU_FOLDER=%LOCALAPPDATA%\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState
if not exist %UBUNTU_FOLDER% set UBUNTU_FOLDER=%LOCALAPPDATA%\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState
if not exist %UBUNTU_FOLDER% (
echo no Ubuntu folder! Terminate.
pause
exit /b 1
)
set FILTER="tar (*.tar)^|*.tar"
set TITLE="復元するファイルを指定してください"
set ARCHIVE_FOLDER=\\LANDISK\usb3\WSL\%COMPUTERNAME%
set RESTORE_FILE=
@echo for /f "usebackq delims=" %%f in (`powershell -file "%~dp0OpenFileDialog.ps1" "%ARCHIVE_FOLDER%" %FILTER% %TITLE%`) do set RESTORE_FILE=%%f
for /f "usebackq delims=" %%f in (`powershell -file "%~dp0OpenFileDialog.ps1" "%ARCHIVE_FOLDER%" %FILTER% %TITLE%`) do set RESTORE_FILE=%%f
set FILENAME=
for %%f in ("%RESTORE_FILE%") do set FILENAME=%%~nf
if /I "%FILENAME:~0,9%" == "Ubuntu-1_" set WSL_VER=1
if /I "%FILENAME:~0,9%" == "Ubuntu-2_" set WSL_VER=2
echo.
echo RESTORE_FILE="%RESTORE_FILE%" version=%WSL_VER%
pause
echo Ubuntuを停止します。
echo.
if "%RESTORE_FILE%" == "" goto :EXIT
if exist "%UBUNTU_FOLDER%\*.vhdx" (
echo "+.vhdx" exist
echo delete this?
echo start explorer.exe "%UBUNTU_FOLDER%"
start explorer.exe "%UBUNTU_FOLDER%"
pause
echo.
del "%UBUNTU_FOLDER%\*.vhdx"
)
pause
wsl.exe --list --verbose
echo wsl.exe --terminate Ubuntu
wsl.exe --terminate Ubuntu
wsl.exe --list --verbose
echo.
echo Ubuntu画面が開いていれば閉じてください。
pause
echo.
echo Ubuntu を削除しています。
echo wsl.exe --unregister Ubuntu
wsl.exe --unregister Ubuntu
wsl.exe --list --verbose
echo.
echo Ubuntu を復元しています。
echo wsl.exe --import Ubuntu "%UBUNTU_FOLDER%" "%RESTORE_FILE%" --version %WSL_VER%
wsl.exe --import Ubuntu "%UBUNTU_FOLDER%" "%RESTORE_FILE%" --version %WSL_VER%
if errorlevel 1 (
echo ERRORLEVEL=%ERRORLEVEL%
pause
exit /b %ERRORLEVEL%
)
echo Ubuntu.exe config --default-user [user]
Ubuntu.exe config --default-user [user]
wsl.exe --list --verbose
echo.
endlocal
echo.
echo Ubuntu を起動します。
pause
echo.
start Ubuntu.exe
exit /b 0
:EXIT
endlocal
exit /b 1
OpenFileDialog.ps1
Param($InitialDirectory, $Filter, $Title)
Add-Type -AssemblyName System.Windows.Forms
$FileBrowser = New-Object System.Windows.Forms.OpenFileDialog -Property @{
InitialDirectory = $InitialDirectory
Filter = $Filter
Title = $Title
}
if($FileBrowser.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK){
return ($FileBrowser.FileName)
}else{
return ("")
}