2020年12月4日星期五

WSL-系统的使用备注

WSL-系统的使用备注

Windows 和 WSL2 文件夹相互访问路径:

1、通过 WSL 安装系统后,可以在资源管理器看见 Linux 文件系统。可以直接访问、操作,这是最简单的方式。
2、选中其中的文件夹,右击查看地址,可以看到访问 URL。
在 win11 中,WSL的访问地址为 “\\wsl.localhost\”;Win10中WSL访问地址为"\\wsl$\")
3. Linux子系统中本地磁盘均挂载在 WSL 系统中的 /mnt 文件夹下,可以直接访问。

手动安装(WSL2)


首先搜索【启用或关闭Winsows 功能】
然后勾选【适用于linux的Windows子系统】和【虚拟平台】
命令行安装WSL,以管理员身份打开 PowerShell 并运行:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
更新到 WSL 2,安装 WSL 2 之前,必须启用“虚拟机平台”可选功能。 以管理员身份打开 PowerShell 并运行:
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

WSL2升级官方帮助链接

安装后,可以通过以下命令进行更新: wsl.exe --update
将 WSL 默认版本设置为2
wsl --set-default-version 2

安装所选的 Linux 分发版 ,打开 Microsoft Store,搜索 Linux
如果 Microsoft Store 应用不可用,可使用以下链接来下载并手动安装 Linux 发行版:
下载了发行版后,在Windows PowerShell中导航到包含下载内容的文件夹,
cd c:\"Users\User\Downloads"

并在该目录中运行以下命令,完成Linux发行版的安装
Add-AppxPackage .\Ubuntu2204-221101.AppxBundle
其中 Ubuntu2204-221101.AppxBundle 是 Linux 发行版的文件名。

常用命令

以管理员权限在命令提示符中运行

net stop LxssManager 停止
net start LxssManager 启动
wsl --shutdown 快速重启所有 WSL Linux发行版
wsl --list --running 检查正在运行的wsl Linux发行版
wsl --list 查看当前的默认wsl
wsl -l -v 查看当前已安装的wsl版本以及状态
wslconfig /u Debian 删除名字为Debian的Linux分发版
wslconfig /u Ubuntu 删除名字为Ubuntu的Linux分发版
wsl -d Debian 启动指定版本为Debian的Linux子系统
wsl -d Ubuntu 启动指定版本为Ubuntu的Linux子系统
wsl -d Debian -u root 启动指定版本为Debian,并指定以root用户操作

若要将分发版设置为受某一WSL 版本支持,请运行:
wsl --set-version <distribution name> <versionNumber>
其中:为你的分发版的实际名称如Ubuntu; 为“1”或“2”,你可以随时更改回 WSL 1,方法是运行与上面相同的命令。示例命令:
wsl --set-version Debian  2
wsl --set-version Ubuntu  2

在 PowerShell 中使用如下命令可以检查发行版是否安装成功:
wsl --list --verbose

获取Linux发行版分配的 IP地址,命令提示符输入:
wsl -- hostname -I 

从 Windows (localhost) 访问 Linux 网络应用:
如果要在 Linux 分发版中构建网络应用,可以使用  localhost  从 Windows 应用(如 Microsoft Edge 或 Chrome Internet 浏览器)访问它(就像往常一样)。

从 Linux(主机 IP)访问 Windows 网络应用:
通过在 Linux 分发版中运行以下命令来获取主机的 IP 地址:cat /etc/resolv.conf
复制以下词语后面的 IP 地址:nameserver。
使用复制的 IP 地址连接到任何 Windows 服务器。

Linux常用命令:

查看运行的Linux的网络信息
ip a
设置root密码
sudo passwd root
输入“su”来切换到root用户,当看到“$”变为“#”说明用户切换成功
更新源
sudo apt-get update
安装网络工具(ifconfig)
sudo apt-get install net-tools
安装openssh-server
sudo apt-get install openssh-server 
安装Vim编辑器
sudo apt-get install vim
修改配置允许root用户登录
sudo vim /etc/ssh/sshd_config
PermitRootLogin yes  
StrictModes yes  
重启sshd服务
sudo service ssh restart
备注:SSH服务可在win10中用127.0.0.1:22地址连接。
将ssh服务设置为开机自启
sudo systemctl enable ssh

Windows11中WSL 2 启用微软官方支持的 systemd

如果需要使用微软官方支持的systmed,在目前(2022/9/30)来说你需要满足这些前置条件: 1. 操作系统为windows 11 
2. wsl 版本为 0.67.6 或以上。
查看wsl版本号命令为: wsl --version,如果此命令未正常回显版本号,或版本号低于0.67.6,那么你安装的wsl还不支持systemd。
安装后,可以通过以下命令进行更新: wsl.exe --update
安装好新版wsl后,在子系统终端中通过以下命令来配置wsl2启用 systemd:
echo -e "[boot]\nsystemd=true" | sudo tee -a /etc/wsl.conf

配置后需要通过wsl --shutdown命令关闭wsl,来进行wsl的完整重启。

如何判断systemd是否启用成功

判断wsl是否已启用systemd,可通过以下命令查看:

ps --no-headers -o comm 1

如果命令返回的是init说明systemd未启用,如果是systemd那么你的systemd已启用成功了。

查看已启用的systemd service

通过systemctl的list-units、list-unit-files命令,都可以很好的查看目前的systemd状态,命令如下:

systemctl list-units --type=service
systemctl list-unit-files --type=service --state=enabled

修改wsl2安装目录

查看WSL分发版本
wsl -l --all -v
回显:
  NAME                 STATE           VERSION
* Ubuntu-22.04    Running         2

导出分发版为tar文件到d盘:
wsl --export Ubuntu-22.04 d:\wsl-Ubuntu-22.04.tar
注销当前分发版:
wsl --unregister Ubuntu-22.04
重新导入wsl-Ubuntu.tar分发版并安装在d:\WSL\Ubuntu目录:
wsl --import Ubuntu-22.04 d:\WSL\Ubuntu d:\wsl-Ubuntu-22.04.tar --version 2
导入后启动默认登录用户名为root,可用以下命令设置默认登陆用户为安装时的用户名:
Ubuntu config --default-user Username
设定root用户密码:
sudo passwd
删除tar文件(可选):
del d:\wsl-Ubuntu-22.04.tar
删除分发版(可选):
wslconfig /u Ubuntu-22.04

系统根文件管理:
若要在 Windows 文件资源管理器中查看所有可用的 Linux 发行版及其根文件系统,请在地址栏中输入:\\wsl$

更新软件源为清华源
源帮助 镜像使用帮助

以Ubuntu 22.04 lts 示例:
在 \\wsl$\Ubuntu\etc\apt 或 \\wsl.localhost\Ubuntu\etc\apt 目录中,
编辑sources.list文件,更新为以下内容

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
如果遇到无法拉取 https 源的情况,请先使用 http 源并安装:
sudo apt install apt-transport-https ca-certificates
更新系统
sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade

WSL2及系统自启动:

方法一(推荐):

创建bat文件快速执行端口映射及通过防火墙端口,并配合启动脚本使用。

复制以下文本另存为 wslnet.bat,编码方式ANSI
@echo off
timeout /T 15 >nul 
for /f  %%i in ('wsl -- hostname -I ') do (set wslip=%%i)

netsh interface portproxy delete v6tov4 listenaddress=:: listenport=88     
netsh advfirewall firewall delete rule name="tcp-88" dir=in protocol=tcp localport=88
netsh interface portproxy add v4tov4 listenport=88 listenaddress=0.0.0.0 connectaddress=%wslip% connectport=88
netsh interface portproxy add v6tov4 listenport=88 listenaddress=:: connectaddress=%wslip% connectport=88
netsh advfirewall firewall add rule name="tcp-88" dir=in protocol=tcp localport=88 action=allow

netsh interface portproxy delete v6tov4 listenaddress=:: listenport=444
netsh advfirewall firewall delete rule name="tcp-444" dir=in protocol=tcp localport=444
netsh interface portproxy add v4tov4 listenport=444 listenaddress=0.0.0.0 connectaddress=%wslip% connectport=444
netsh interface portproxy add v6tov4 listenport=444 listenaddress=:: connectaddress=%wslip% connectport=444
netsh advfirewall firewall add rule name="tcp-444" dir=in protocol=tcp localport=444 action=allow

netsh interface portproxy delete v6tov4 listenaddress=:: listenport=555
netsh advfirewall firewall delete rule name="tcp-555" dir=in protocol=tcp localport=555
netsh interface portproxy add v4tov4 listenport=555 listenaddress=0.0.0.0 connectaddress=%wslip% connectport=555
netsh interface portproxy add v6tov4 listenport=555 listenaddress=:: connectaddress=%wslip% connectport=555
netsh advfirewall firewall add rule name="tcp-555" dir=in protocol=tcp localport=555 action=allow

netsh interface portproxy delete v6tov4 listenaddress=:: listenport=8080
netsh advfirewall firewall delete rule name="tcp-8080" dir=in protocol=tcp localport=8080
netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectaddress=%wslip% connectport=555
netsh interface portproxy add v6tov4 listenport=8080 listenaddress=:: connectaddress=%wslip% connectport=555
netsh advfirewall firewall add rule name="tcp-8080" dir=in protocol=tcp localport=8080 action=allow

netsh interface portproxy delete v6tov4 listenaddress=:: listenport=1113
netsh advfirewall firewall delete rule name="tcp-1113" dir=in protocol=tcp localport=1113
netsh interface portproxy add v4tov4 listenport=1113 listenaddress=0.0.0.0 connectaddress=%wslip% connectport=22
netsh interface portproxy add v6tov4 listenport=1113 listenaddress=:: connectaddress=%wslip% connectport=22
netsh advfirewall firewall add rule name="tcp-1113" dir=in protocol=tcp localport=1113 action=allow

exit
命令注释:

通过IPV6公网远程访问,(需要允许iphlpsvc服务自动启动)

timeout /T 15 >nul   :: 延时15秒
for /f  %%i in ('wsl -- hostname -I ') do (set wslip=%%i)   :: 获取虚拟机IP
netsh interface portproxy delete v6tov4 listenaddress=:: listenport=88    :: 删除端口转发
netsh advfirewall firewall delete rule name="tcp-88" dir=in protocol=tcp localport=88    :: 删除防火墙规则
netsh interface portproxy add v4tov4 listenport=88 listenaddress=0.0.0.0 connectaddress=%wslip% connectport=88   :: 添加v4tov4端口转发
netsh interface portproxy add v6tov4 listenport=88 listenaddress=:: connectaddress=%wslip% connectport=88   :: 添加v6tov4端口转发
netsh advfirewall firewall add rule name="tcp-88" dir=in protocol=tcp localport=88 action=allow     :: 添加防火墙规则
开机自动启动:

创建启动vbs,以下文本另存为linux-start.vbs保证后缀为.vbs即可
Set ws = WScript.CreateObject("WScript.Shell")
ws.run   "wsl -d Debian", vbhide
ws.run   "wslnet.bat", vbhide

推荐使用Bat_To_Exe_Converter把BAT转exe,执行exe启动(方便以管理员权限启动)
注:wslnet.exe为BAT转exe文件,与linux-start.vbs文件放置在同一目录,

创建启动vbs,以下文本另存为linux-start.vbs保证后缀为.vbs即可
Set ws = WScript.CreateObject("WScript.Shell")
ws.run   "wsl -d Debian", vbhide
ws.run   "wslnet.exe", vbhide

按 win+R 输入 shell:startup 打开启动项目录,将以上linux-start.vbs文件的快捷方式放入该目录即可实现开机启动。

方法二

Windows内操作
1.创建txt文件,并输入以下内容(以debian为例子)
Set ws = WScript.CreateObject("WScript.Shell")
ws.run   "wsl -d Debian -u root", vbhide
ws.run   "wsl -d Debian -u root ip addr add  172.21.224.2/24 broadcast 255.255.240.0 dev eth0 label eth0:1", vbhide

注:其中‘Debian’为WSL2子系统的名字;ip网段要与vEthernet (WSL)虚拟适配器网段(172.21.224.1)一致,注意修改

2.保存并重命名,这里为‘linux-start.vbs’,保证后缀为.vbs即可
3.按 win+R 输入 shell:startup 将以上vbs文件放入该目录

方法三:

创建启动vbs,以下文本另存为linux-start.vbs’保证后缀为.vbs即可
Set ws = WScript.CreateObject("WScript.Shell")
ws.run   "wsl -d Debian -u root", vbhide

按 win+R 输入 shell:startup 将以上vbs文件放入该目录

Windows10中的WSL2默认是没有systemd服务的,需要自行去安装

方法一:安装daemonize和fontconfig
sudo apt install -y fontconfig daemonize
编辑/etc/profile脚本,加入如下内容:
sudo nano /etc/profile
SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}')

if [ -z "$SYSTEMD_PID" ]; then
   sudo /usr/bin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
   SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}')
fi

if [ -n "$SYSTEMD_PID" ] && [ "$SYSTEMD_PID" != "1" ]; then
    exec sudo /usr/bin/nsenter -t $SYSTEMD_PID -a su - $LOGNAME
fi
修改/etc/sudoers文件,加入如下内容:
sudo nano /etc/sudoers

%sudo ALL=(ALL) NOPASSWD: /usr/bin/nsenter -t [0-9]* -a su - [a-zA-Z0-9]*
%sudo ALL=(ALL) NOPASSWD: /usr/sbin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
%sudo ALL=(ALL) NOPASSWD: /usr/bin/nsenter -t [0-9]* -a su - [a-zA-Z0-9]*

执行source /etc/profile
source /etc/profile

执行systemctl验证是否能够正常操作。
systemctl --version

方法二:
安装daemonize
sudo apt-get install daemonize

执行以下命令开启
sudo daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
exec sudo nsenter -t $(pidof systemd) -a su - $LOGNAME

方法三:使用Sysvinit命令替代Systemd命令,对照示例:

Sysvinit命令             Systemd命令                          作用/用途
service apache2 start    systemctl start apache2.service     启动apache2服务
service apache2 stop  systemctl stop apache2.service      关闭apache2服务
service apache2 restart  systemctl restart apache2.service   重启apache2服务不管当前是启动还是关闭状态
service apache2 reload  systemctl reload apache2.service    重新载apache2配置信息而不中断服务
service apache2 status   systemctl status apache2.servic     查看apache2服务的运行状态