为什么要在windows上安装linux,这个问题当你是研发、测试、运维人员,我相信应该有你使用的场景,特别是部署和测试较大的服务,直接本地模拟线上真实环境操作会更好。
为什么不安装vmware、docker之类的虚拟化应用呢,因为最终跑不掉还是要安装linux系统,所以干脆直接运行一个可交互的双系统来的好,并且vmware使用时间长了莫名其妙的问题和垃圾太多了。
操作系统
必须是windows10(版本不低于1903)或windows11。
可以点击控制面板或我的电脑右键查看属性,参考下图所见内容,如果你是windows10,版本号请保证不低于22H2,否则在接下来的安装过程中会出现非常多错误问题。
系统设置
请打开控制面板 - 程序和功能,点击启用或关闭windows功能
,接下来选中“适用于Linux的Windows子系统”
,点击确定,之后可能需要重启系统。
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
开启虚拟化支持
如果你的windows系统上安装了docker、vmware、模拟器之类的虚拟化软件应该就已经开启了,如果没有需要去开一下,这里只展示命令了,图形化界面还可去控制面板 - 程序和功能 - 启用或关闭windows功能
中去开启。
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
命令行
确保本地有这三个命令行工具任意一个:cmd、powershell、terminal
关于使用wsl1还是wsl2,作为一个研发,初始使用能用新的就别用旧的了,因为按照完毕后,以后不是有问题,不太会考虑去升级的,所以这次尽量选更新点的,下面是2个版本之间的对比,也可以自行选择。
wsl --update
PS C:\Users\pc> wsl -v
WSL 版本: 2.2.4.0
内核版本: 5.15.153.1-2
WSLg 版本: 1.0.61
MSRDC 版本: 1.2.5326
Direct3D 版本: 1.611.1-81528511
DXCore 版本: 10.0.26091.1-240325-1447.ge-release
Windows 版本: 10.0.19045.4780
如果你的wsl版本不是2.x的,说明需要升级,可以执行
接下来查询可选的操作系统
wsl --list --online
确认此步骤查询没问题,我们就进入系统安装环节。
请先确保可见下面命令的执行可见操作系统列表。
wsl --list --online
# 设置默认安装wsl2发行版系统
wsl --set-default-version 2
# 更改最后的名称为前面命令查询到的结果,不明白可以参考下图
wsl --install -d Ubuntu
若只想针对指定版本的系统做1或2版本的设置,默认可以忽略下面的操作
# 替换中间系统名称即可,后面的2就是代表2版本
wsl --set-version Ubuntu-20.04 2
执行安装完毕后会进入操作系统安装界面,如果这一步提示安装失败,注意检查自己是否有开梯子,不然可能会持续失败。同时,失败的原因还存在当前系统版本不支持,windows10请务必升级到1903和22H2之后。
确认完整系统完毕后,请记得确认一下系统安装情况,版本如果是显示的2表示前面的设置完成
PS C:\Users\pc> wsl -l -v
NAME STATE VERSION
Ubuntu Running 2
完成系统安装后,需要创建linux系统的系统管理员,创建过程的标识如下图
PS C:\Users\pc> wsl
Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.153.1-microsoft-standard-WSL2 x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
* Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
just raised the bar for easy, resilient and secure K8s cluster deployment.
https://ubuntu.com/engage/secure-kubernetes-at-the-edge
This message is shown once a day. To disable it please create the
/root/.hushlogin file.
root@DESKTOP-7DNO2OG:/mnt/c/Users/pc#
至此完成系统安装。
wsl2的文件系统是通过windows挂载磁盘中的vhdx实现的,此linux系统默认会安装在C盘中,路径大概是如下,有兴趣可以找找。
C:\Users\${系统用户名}\AppData\Local\Packages\CanonicalGroupLimited.${安装系统临时命名}\LocalState\ext4.vhdx
PS C:\Users\pc> wsl --shutdown
PS C:\Users\pc> wsl -l -v
NAME STATE VERSION
* Ubuntu Stopped 2
系统状态为停止后即可开始迁移文件系统,我们先对目前的文件系统做镜像导出。
# 在管理员命令行窗口执行
# ubunt 表示上述我查询的子系统名称
# D:\wsl\system\ubuntu.tar 表示我需要将子系统镜像导出到哪里存储
PS C:\Users\pc> wsl --export Ubuntu D:\wsl\system\ubuntu.tar
正在导出。
操作成功完成
短暂等待后应该即可导出完成,接下来我们要做的就是卸载当前的系统文件挂载。
PS C:\Users\pc> wsl --unregister Ubuntu
正在注销。
操作成功完成。
# ubunt22 表示新的系统名称是什么
# D:\wsl\ubuntu22\ 表示新的系统文件挂载在哪个目录中
# D:\wsl\system\ubuntu.tar 表示需要导入的是哪个子系统文件
# --version 2 表示使用wsl2还是wsl1版本
wsl --import ubunt22 D:\wsl\ubuntu22\ D:\wsl\system\ubuntu.tar --version 2
导入完毕后直接打开系统,看是否能进入操作系统即可。
wsl -u root
如果需要在非默认分发版中更新忘记的密码,请使用命令:
#将 Ubuntu 替换为目标分发版的名称。
wsl -d Ubuntu -u root
在命令行工具内的根级别打开 WSL 发行版后,可使用此命令更新密码:
# 其中 <username> 是发行版中帐户的用户名,而你忘记了它的密码
passwd <username>
系统将提示你输入新的 UNIX 密码,然后确认该密码。 在被告知密码已成功更新后,请使用以下命令在命令行工具内关闭
exit
更新子系统
# 适用于 Ubuntu 和 Debian
sudo apt update && sudo apt upgrade
在windows系统上直接访问linux,使用terminal已经是看起来最友好的方式了,但并不好用,这里建议使用ssh的方式进行访问,这样我们就能使用xshell之类的应用无缝访问,但初始安装的ubuntu是没有ssh的,好像ubuntu24版本默认自带了,因此我们需要自己安装。
# 尝试启动ssh服务,发现没有这个服务
root@DESKTOP-7DNO2OG:/data# service ssh start
Failed to start ssh.service: Unit ssh.service not found.
# 接着执行安装服务
root@DESKTOP-7DNO2OG:/data# sudo apt-get install openssh-server
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
......
安装完毕后,执行下面命令确认服务状态,我执行完毕后处于active状态了,说明开启sshd服务成功,可以被远程访问了。
root@DESKTOP-7DNO2OG:/data# systemctl restart ssh.service
root@DESKTOP-7DNO2OG:/data# service ssh status
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2024-09-09 14:04:41 CST; 7s ago
Docs: man:sshd(8)
man:sshd_config(5)
Process: 1245 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Main PID: 1246 (sshd)
Tasks: 1 (limit: 19089)
Memory: 1.8M
CGroup: /system.slice/ssh.service
└─1246 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
接着再设置系统启动开启sshd服务
root@DESKTOP-7DNO2OG:/data# systemctl enable ssh
Synchronizing state of ssh.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable ssh
服务启动成功了,但本地可能访问不了,因为端口、ip、账号、是否使用证书等配置还没有做,下面去修改sshd配置,以下为账号密码最小配置方式,由于是本地不考虑安全问题。
# 编辑本页面
vi /etc/ssh/sshd_config
#接下来放开被注释的属性,并设置为自己想要的
# 系统ssh访问端口号
Port 50022
# 许可访问ip
ListenAddress 0.0.0.0
# 开启密码验证方式
PasswordAuthentication yes
# 重启sshd服务
systemctl restart sshd
至此,sshd服务配置完成,通过你自己习惯用的第三方ssh工具连接即可。
若需要开启外部访问,建议关闭账号密码访问方式,配置证书访问,本文最后附一下所有配置证书登录和完整的sshd_config配置。
附:
1.配置证书登录模式,创建证书,修改sshd_config
# 生成证书,建议添加密码,出现在/root/~/.ssh目录下
ssh-keygen -t rsa
# 导入公钥
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# 设置权限
chown -R 0700 ~/.ssh
chown -R 0644 ~/.ssh/authorized_keys
# 设置策略
vi /etc/ssh/sshd_config
RSAAuthentication yes
StrictModes no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
# 重启服务
systemctl restart sshd
# 将id_rsa复制到远程连接的客户端电脑
# 配置通过证书ssh连接
# 连接成功后继续去服务器修改策略
vi /etc/ssh/sshd_config
# 关闭通过密码登录(请先保证使用证书登录成功,再来修改关闭密码登录策略)
PasswordAuthentication no
# 重启服务
systemctl restart sshd
# 完成