前言
snap是一种用于安装和管理Linux应用程序的软件包管理器,它可以让用户轻松地获取最新版本的应用程序,而不用担心依赖问题或系统更新。snap在Ubuntu中是默认的软件商店,但是在Windows 11下WSL的Ubuntu中,snap无法正常工作,因为WSL没有使用systemd作为初始化系统,而snap依赖于systemd来管理服务。本文将介绍如何解决这个问题,让你可以在WSL的Ubuntu中使用snap。
解决方法
要解决这个问题,我们需要使用一个脚本,来让WSL的Ubuntu启动时使用systemd作为初始化系统。这个脚本的地址是:
https://github.com/DamionGans/ubuntu-wsl2-systemd-script
具体的操作步骤如下:
- 在WSL的Ubuntu中,创建一个缓存目录,并进入该目录:
mkdir caches && cd caches
- 克隆脚本仓库到本地:
git clone https://github.com/DamionGans/ubuntu-wsl2-systemd-script.git
- 进入脚本目录,并运行脚本:
cd ubuntu-wsl2-systemd-script/ bash ubuntu-wsl2-systemd-script.sh
- 脚本运行完毕后,重启WSL。在PowerShell中输入:
wsl --shutdown
然后重新打开WSL。
- 在WSL中尝试使用systemctl命令,看是否正常工作:
systemctl
如果没有报错,则说明成功。
验证方法
要验证是否可以使用snap,可以在WSL中输入:
snap version
如果snapd有具体的版本号,则说明正确,如下所示:
snap 2.54.3+20.04.1ubuntu0.2 snapd 2.54.3+20.04.1ubuntu0.2 series 16 ubuntu 20.04 kernel 5.10.102.1-microsoft-standard-WSL2
另一种情况
如果你在WSL中使用systemctl命令时遇到了这样的报错:
System has not been booted with systemd as init system (PID 1). Can't operate.
这可能是因为Linux操作系统没有使用systemd,而是使用了经典的SysV init(sysvinit)系统。这种情况下,需要用SysV init的命令来代替systemd的命令。例如,要重启snapd服务,可以用这个命令:
sudo service snapd restart
而不是这个命令:
sudo systemctl restart snapd.service
你可以用这个命令来查看你的Linux操作系统使用了哪种初始化系统:
ps -p 1 -o comm=
如果输出是systemd,则说明你使用了systemd;如果输出是init,则说明你使用了SysV init。
总结
本文介绍了如何在Windows 11下WSL的Ubuntu中使用snap,通过一个脚本来让WSL使用systemd作为初始化系统,从而解决snap依赖于systemd的问题。同时,也介绍了另一种可能遇到的情况,即Linux操作系统没有使用systemd,而是使用了SysV init系统。这种情况下,需要用SysV init的命令来代替systemd的命令。
希望这篇文章对你有所帮助,如果你有任何问题或建议,请在评论区留言。