WSL介绍
WSL(Windows Subsystem on Linux),适用于 Windows 的 Linux 子系统,是微软和Canonical(Ubuntu 的母公司)共同开发的,在Windows 10后加入的功能,能够在Windows 10 系统中挂载一个Linux 系统,用起来不像虚拟机那样臃肿、开机缓慢、性能低下,是Windows使用者用来进阶使用Linux系统的一个不错的选择,开发人员可在其上运行GNU/Linux环境(包括大多数命令行工具、实用程序和应用程序)。
WSL的安装
第一步:启用虚拟机平台和 Linux 子系统功能
确保你的windows10系统的内部版本高于或等于16215 (来自官网提示);
在win10的win图标处,右键->管理员权限启动 PowerShell (或者win+r-->PowerShell-->ctrl+shift+enter),出现PowerShell的命令行界面后,接着输入以下命令启用虚拟机平台:
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
命令运行后,等待一段时间,会出现如下结果,代表虚拟平台已经开启:
Running
[ooooooooooooooo ]
Path :
Online : True
RestartNeeded : False
虚拟平台开启后,接着在命令行中输入以下命令开始Linux子系统:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
和开启虚拟平台有一些区别,命令运行结束后,命令行会出现是否重启的界面:
Running
[ooooooooooooooo ]
是否立即重启计算机以完成此操作?
[Y] Yes [N] No [?] 帮助 (默认值为“Y”): n
Path :
Online : True
RestartNeeded : True
当然,上述windows 10的功能的开启也可以通过启用或者关闭windows功能来启用:
win搜索-->控制面板-->程序-->卸载程序-->启用或者关闭 Windows 功能-->勾选虚拟机平台和适用于 Linux 的 Windows 子系统:
完成设置后,记得重启计算机!
第二步:选择一个 Linux 发行版进行安装
windows打开微软应用商店(store),在搜索框中输入Linux进行搜索,在搜索结果中有很多Linux发行版可以选择,开始你的选择,获取该发行版,然后安装:
在这里需要注意,在store中的安装并没有实际上完成 Linux 子系统的安装,还需要运行一次已安装的 Linux 发行版,这样才会完成真正的安装:
一般不愿意折腾的都推荐使用这种方法安装Linux发行版,但是官方也考虑到了其他的情况,如无法(或不想)通过 Microsoft Store 安装 WSL Linux 发行版、可能运行的是不支持 Microsoft Store、系统环境中不允许 Microsoft Store 使用的 Windows Server 等等,当出现以下情况时,可以通过如下的方法下载和安装:
手动下载适用于 Linux 的 Windows 子系统发行版包
有时候,你可能无法(或不想)通过 Microsoft Store 安装 WSL Linux 发行版,比如说,你运行的可能不支持 Microsoft Store 或公司网络策略和/或管理员在你的环境中不允许 Microsoft Store 使用的 Windows Server 或长期服务(LTSC)桌面操作系统 SKU。
在这些情况下,虽然 WSL 本身可用,但如果你无法访问应用商店,如何下载并在 WSL 中安装 Linux 发行版?
浏览器下载发行版
如果 Microsoft Store 应用不可用,则可以在浏览器中通过单击以下链接下载并手动安装 Linux 发行版:
Ubuntu 18.04
Ubuntu 18.04 ARM
Ubuntu 16.04
Debian GNU/Linux
Kali Linux
OpenSUSE Leap 42
SUSE Linux Enterprise Server 12
WSL 的 Fedora Remix
点击链接后,可以下载CanonicalGroupLimited.Ubuntu18.04onWindows_1804.2018.817.0_x64__79rhkp1fndgsc.Appx
这样的以.appx
为后缀的包到浏览器下载文件夹,然后按照下面的安装说明安装下载的发行版。
命令行下载发行版
使用 PowerShell WebRequest下载
下载发行版,也可以通过windows的命令行工具——PowerShell
来操作,命令提示符是Invoke-WebRequest,如下是下载示例:
cd C:\Users\dulun\Downloads
Invoke-WebRequest -Uri https://aka.ms/wsl-ubuntu-1804 -OutFile Ubuntu-1804.appx -UseBasicParsing
来自官方的提示:下载开始的时候可以看到一个进度条,如果预估下载的时间比较长,请通过设置$ProgressPreference = 'SilentlyContinue'
来关闭进度栏
使用 PowerShell curl.exe 下载
Windows 10 春季2018更新(或更高版本)包含可从命令行调用 web 请求(例如 HTTP GET、POST、PUT 等命令)的常用命令行工具——curl.exe,名字是客户端(client)的 URL 工具的意思。使用curl.exe下载的示例:
curl.exe -L -o Ubuntu-1804.appx https://aka.ms/wsl-ubuntu-1804
安装下载的Linux发行版
在Windows10系统中,使用PowerShell
安装已下载的Linux 发行版,但是需要进入到下载的文件的目录,运行Add-AppxPackage \.app_name.appx
,示例:
cd C:\Users\dulun\Downloads
Add-AppxPackage Ubuntu-1804.appx
Windows Server安装WSL
但是有些用户使用的是Windows Server的系统,这和Windows10的安装有一些区别,前面的开启受信用的执行环境是一样的,启用虚拟机平台和适用于 Linux 的 Windows 子系统,然后重启计算机,必须重启。然后按照上面的链接、下载方式选择合适Linux 发行版、下载。
Windows Server提取并安装 Linux 发行版
下载发行版后,请提取其内容,并手动安装发行版,使用PowerShell
提取下载的<distro>.appx
包的内容:
Rename-Item .\Ubuntu-1804.appx .\Ubuntu.zip
Expand-Archive .\Ubuntu.zip .\Ubuntu
cd .\Ubuntu && ls ##进入Ubuntu目录并查看包含的文件
在名为Ubuntu的目标文件夹中运行Linux 发行版启动器应用程序ubuntu1804.exe
以完成安装:
.\ubuntu1804.exe
第三步:初始化、查看和使用 WSL
初始化安装Linux发行版
新安装完WSL后,首次运行新安装的分发版,会打开一个控制台窗口,其中指出需要等待一两分钟时间来完成安装:
这一步是最后的安装阶段,Linux发行版的文件将会被解压缩,然后储存到电脑上供使用,时间的长短取决于电脑存储设备的性能,这一步也只是当Linuxf发行版是初始安装的版本时,才需要执行初始化安装——这也是为什么后期WSL的启动飞速的原因。
初始话安装结束后,系统提示创建新的用户帐户及其密码:
此用户帐户用于启动Linux 发行版时默认登录的非管理员用户。
可根据需要选择任何用户名和密码 - 它们与 Windows 用户名无关。打开此Linux子系统时,系统不需要输入密码,但是如果使用
sudo
权限的时候,这需要输入密码,所以密码还是需要记住的。
在windows中查看安装的WSL
在PowerShell
中使用 wsl -l
可以列出当前系统上已经安装的 Linux 子系统名称。注意这里的 -l
是列表list
的缩写,是字母l
不是其他字符。
如果运行命令的时候,提示wsl
不是内部或外部命令,说明你第一步的“适用于 Windows 的 Linux 子系统”没有设置完整,请先完成第一步。
如果提示没有发现任何已安装的 Linux子系统,说明你没有安装 Linux 发行版,或者只是从商店或者浏览器下载了,没有运行它执行真正的安装,请先完成本文第二步。
在这里如果直接在PowerShell
中输入wsl
,也可以直接进入安装的Linux子系统。
WSL的配置ssh的开机自启动
因为我是在Workstation上安装的WSL,本意是取代原先使用的虚拟机,这里说一下为什么舍弃了虚拟机,我刚开始使用的是VirtualBox,这个软件吧我第一次使用,KI‘s IT部门推荐的,但是除了安装完第一次以后,我就再也没有打开过,IT小哥也不知道怎么办,我只能转投了VMware,这不是我第一次使用了,刚来KI的时候,因为条件艰苦,我使用了办公室老机器打了一个虚拟机用来搭建流程,但是用的只能说还行,毕竟只是前期搭建。
后来新机器来了以后,因为网络驱动器(俗称存储Server)的存在,我没有办法安装Ubuntu,只能先安装KI的windows 10,然后使用实验室博后的账号登录,Server才会出现(人家有access的)。VMware在KI的Software Center居然下不到,想尽了办法安装好,体验了5天左右,缺点出来了,我配的服务器的内存是256g,但是VMware的max memory是64g;机器配了两个cpu,共40个核,但是VMware的max processor数是16,这导致我配置的机器大部分性能根本没法发挥出来,于是我转身就投身了WSL的怀抱,配置起来也是各种奇葩,因为KI安装软件的各种限制。
既然是服务器的使用,肯定需要用到SSH的配置,因为我一般是使用自己的电脑用putty、xshell等软件连接服务器的,但是WSL的ssh不是安装好久开机自启动,需要设置,接下来简单说一下我的设置。
Ubuntu 启用SSH所需设置
#设置root的口令(密码),用作后续登陆使用
sudo passwd root
#安装openssh-server(ubuntu自带已安装,但是我使用有问题,没找到原因)
sudo apt remove openssh-server
sudo apt install openssh-client openssh-server
#备份原始的sshd_config
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo cp /etc/ssh/ssh_config /etc/ssh/ssh_config.bak
#使用vim进行编辑,按i进入insert模式
sudo vim /etc/ssh/sshd_config
在vim中找到对应项并修改,ESC,输入`wq`保存退出:
Port 2222
ListenAddress 0.0.0.0 # 如果需要指定监听的IP则去除最左侧的井号,并配置对应IP,默认即监听PC所有IP
PermitRootLogin no # 如果你需要用 root 直接登录系统则此处改为 yes
PasswordAuthentication yes # 将 no 改为 yes 表示使用帐号密码方式登录
#使用vim进行编辑,按i进入insert模式
sudo vim /etc/ssh/sshd_config
#在vim中找到对应项并修改,ESC,输入`wq`保存退出:
Port 2222
ListenAddress 0.0.0.0 # 如果需要指定监听的IP则去除最左侧的井号,并配置对应IP,默认即监听PC所有IP
#启动ssh,查看status
sudo service ssh start #启动SSH服务
sudo service ssh status #检查状态
sudo systemctl enable ssh #开机自动启动ssh命令,我好想失效了
WSL开机自启动SSH
因为我使用systemctl这个失效了,所以就另想办法开机自启动ssh;
Ubuntu 系统添加启动:
##登录帐号就会启动,写入到bash中
sed -i '/^sudo service ssh --full-restart/ d' ~/.bashrc
##使用sudo开机自启动
echo -e "%sudo\tALL=(ALL) NOPASSWD: /usr/sbin/service ssh --full-restart" | sudo tee -a /etc/sudoers
##检测ssh的状态,也是写入到bash中
cat << 'EOF' >> ~/.bashrc
sshd_status=$(service ssh status)
if [[ $sshd_status = *"is not running"* ]]; then
sudo service ssh --full-restart
fi
EOF
如果大家觉得麻烦,可以使用这个自动安装和配置的脚本,我修改了一下,大家用之前可以看一下大概,这里也会安装一下基础的安装包。
Windows启用SSH端口所需设置
因为在前面设置的ssh端口是2222,22端口在Windows下有其他占用了,所以还需要去防火墙中设置一下这个端口的拨入,win+防火墙,进入防火墙页面,按如下操作:
端口-->TCP-->特点本地端口2222
-->允许连接-->下一步确定;设置完成。
Windows 系统添加自动启动
在ubuntu中添加一个脚本程序,详情如下:
sudo vi /etc/init.wsl
#!/bin/sh
# Filename: /etc/init.wsl
# Usage: sudo /etc/init.wsl [start|stop|restart]
/etc/init.d/ssh $1
/etc/init.d/cron $1
/usr/sbin/rstudio-server $1
mount -t drvfs 'P:\PHA' /mnt/shareP
Windows 中添加自动启动的脚本 startubuntu.vbs;
a. 打开当前用户默认自启动加载文件夹,在 Windows 中,开始-运行(或者win+r),输入:shell:startup
;
b. 在当前用户默认自启动加载文件夹中,添加要加载的VBS脚本文件 startubuntu.vbs 。
Set ws = WScript.CreateObject("WScript.Shell")
ws.run "wsl -d ubuntu -u root /usr/sbin/service ssh --full-restart", vbhide
ws.run "ubuntu run sudo /etc/init.wsl start", vbhide
重启 Windows 系统,验证WSL ssh服务是否自动启动。
至此,我这段时间的折腾就在这里了,还有些有的没的也就没写了,服务器配置好了,还需要去把流程什么的迁移过来,后期再写写WSL中挂在硬盘、移动硬盘、网络驱动器等等再说吧!
References
如何在 Windows 10 中安装 WSL2 的 Linux 子系统
在Windows上舒适地使用Linux子系统(一):WSL的安装及配置
—— dulunar 后记于 2019.10