在 Windows Subsystem for Linux (WSL) 上安装 Fedora 37 或更早版本
使用 Windows Subsystem for Linux (WSL),我们可以选择 Windows 应用商店中提供的 Linux 发行版,例如 Ubuntu、Kali、Debian 等。
除此之外,使用 WSL 2,安装自定义发行版相当简单,即使它们不在 Windows 应用商店中:
- 找到发行版的根文件系统
wsl --import
在 Windows Powershell 或命令提示符中安装
最近我依赖 WSL 2 中的 Fedora,并且对这个发行版非常满意。本文详细介绍了我在 WSL 上启动和运行 Fedora 的步骤。顺便说一句,如果您更喜欢良好的开箱即用体验,可以看看 Whitewater Foundry 的Fedora Remix for WSL 的精彩作品。但如果您觉得“需要一些组装”很诱人,请继续阅读。
如果您已经在 WSL 2 上安装了旧版本的 Fedora,只想升级到最新版本?我在另一篇文章中记录了相关步骤,欢迎随时查看。
先决条件:WSL 2
请注意,这些步骤需要 WSL 2(而不是版本 1)。
要运行 WSL 2,需要 Windows 1903 或更高版本,并运行 Build 18362 或更高版本。您很可能已经拥有比此版本高得多的版本。要了解您正在运行的版本,请
winver
在 Powershell 或 CMD 中运行,或者只需按下 Win 键和 R (⊞-r) 打开“运行”对话框,然后输入winver
。希望您能看到类似“版本 21H2。操作系统版本 19044.1503”的内容。如果您使用的是 Windows 11,则完全不必担心,但版本应该类似于“版本 21H2。操作系统版本 22000.1165”。
要检查您是否正在运行 WSL 2,请尝试以下命令:
wsl --set-default-version 2
这会将默认版本设置为 WSL 2,如果您仍使用第一个版本,则会失败。
如果它没有提供任何内容而是提供了安装说明,那么这可能是您第一次在此系统上使用 WSL。
微软提供了有用的安装说明,包括有关如何升级到 WSL 2 的分步说明。
简而言之,如果您愿意安装其他 Linux 发行版,运行wsl --install
将安装默认的最新 Ubuntu,或者您可以从列表中选择,wsl -l -o
然后安装一个wsl --install -d Debian
,如果不是 Debian,则安装您想要的任何发行版。
如果您使用的是旧版本的 Windows 10 或使用 WSL 版本 1,那么以下 Powershell 命令应该可以让您到达所需的位置(可能需要重新启动)。
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux,VirtualMachinePlatform -All
最有可能的是,该wsl
命令将指示您安装一个新内核,因此请继续访问https://aka.ms/wsl2kernel并按照那里的说明进行操作。
再次,请参阅Microsoft 的说明以获取当前详细版本。
获取 Fedora 的 rootfs 镜像
首先,我们需要一个 rootfs(即 Linux 发行版(本例中为 Fedora)的基础文件系统)。获取 rootfs 的方法有很多种。
从 Fedora Container Base 获取 rootfs
Fedora Container Base项目中嵌入的 rootfs似乎运行良好,并且是我的首选方法,因为它提供了很大的灵活性。我首先从自动成功构建的最新稳定版 Fedora 开始。如果您想使用最新版,可以下载已成功构建的最新 Rawhide 镜像,但我目前使用的是最新的 Fedora 37。“状态”列表示构建成功。请选择带有绿色复选标记的最新版本。
找到适合您平台的“xz”文件(可能是x86_64
)。例如:
按照您喜欢的方式解压Fedora-Container-Base-*.tar.xz
文件。您可以尝试使用7-zip进行解压,先解压 .tar 文件,然后再提取 .tar 文件的内容。但是,这不是您的 rootfs。您还需要进一步的操作。
解压后,您将看到一个带有长十六进制名称的文件夹。该文件夹中应该有一个layer.tar
文件。这就是您的根文件系统 (rootfs)。将该文件复制layer.tar
到一个合理的位置,例如您的“下载”文件夹。您甚至可以将其重命名为类似fedora-33-rootfs.tar
.
替代方案:从 docker-brew-fedora 项目下载 rootfs
docker -brew-fedora项目导入“在Fedora Koji (Fedora 的构建系统)中构建的官方 Fedora Docker 基础镜像,以便可以将它们提交到Docker Hub的官方镜像存储库”。
要下载,首先从活动分支中选择所需的 Fedora 版本。例如,您可以选择Fedora 37,然后找到一个名为的文件fedora-37-x86_64.tar.xz
。或者使用Fedora 36并查找fedora-36-x86_64.tar.xz
。或者选择Fedora 35并找到fedora-35-x86_64.tar.xz
。下载该文件。
按照你喜欢的方式解压fedora-3?-x86_64.tar.xz
文件。你可以尝试使用7-zip,解压 .tar 文件,然后根据需要将其重命名为 .tar 文件fedora-36-rootfs.tar
。
另一个 rootfs 替代方案:使用 docker 或 podman 并导出
虽然这需要额外的工具,但如果你已经有docker或podman,那么你可以拉取你选择的 Fedora 镜像并导出 rootfs。接下来,如果你有一个带有 podman 的 Linux 发行版,你可以podman
用代替docker
。
docker run --name fedora37 fedora:37
docker export -o fedora-37-rootfs.tar fedora37
首先,我们创建一个容器,命名为“fedora37”,然后将根文件系统导出为“fedora-37-rootfs.tar”。之后,你当然可以docker rm fedora37
进行清理。
您可能对我关于在 WSL 上配置 podman或在 WSL 上设置 Docker 的文章感兴趣。
为您的 WSL 发行版创建一个文件夹。
一旦我们有了 rootfs,我们就可以准备导入它。
wsl
我喜欢在主目录中使用,所以在本例中,我创建了该文件夹及其fedora
下的一个文件夹。在 Powershell 中,如下所示:
mkdir $HOME\wsl\fedora
安装新的 WSL Fedora 发行版
在 Powershell 中,假设您想将发行版命名为“fedora”,文件夹为 \$HOME\wsl\fedora,rootfs 位于下载中,名为“fedora-37-rootfs.tar”:
wsl --import fedora $HOME\wsl\fedora $HOME\Downloads\fedora-37-rootfs.tar
查看已安装的发行版
如果这是您现在拥有的唯一 WSL 发行版,则执行wsl -l
应该如下所示:
PS C:\Users\me> wsl -l
Windows Subsystem for Linux Distributions:
fedora (Default)
以 root 身份启动 Fedora
wsl -d fedora
或者,如果 Fedora 是默认的,则wsl
应该只产生一个 BASH 提示符。
如果您安装了多个发行版,并希望将 Fedora 设置为默认发行版,则应该执行以下操作:
wsl -s fedora
确保 DNS 正常运行(如果网络功能良好,请跳过此部分)
WSL 中的 DNS 很有意思。默认情况下,WSL 会自动设置 DNS 服务器,并动态配置/etc/resolv.conf
。如果你的 DNS 解析正常(sudo dnf upgrade
对你来说有效吗?),那么你可以跳到下一节。看起来它对大多数人来说都有效。
然而,对我来说,这个动态功能/etc/resolv.conf
一直不太稳定。我需要关闭它,然后resolv.conf
手动配置。
方便的是,WSL 提供了一种方法/etc/wsl.conf
来设置一些特定于 WSL 的配置设置。
为了使 DNS 正常工作,我们将创建自己的 resolv.conf,但首先我们创建一个新的 wsl.conf 文件并禁用 resolv.conf 的自动生成:
echo -e "[network]\ngenerateResolvConf = false" > /etc/wsl.conf
现在退出 WSL,然后使用以下命令终止它
wsl -t fedora
然后再次输入
wsl -d fedora
现在我们可以持久化自定义 DNS 配置了。首先, 。这涵盖了链接到 systemd-resolved 或 resolvconf 生成的文件unlink /etc/resolv.conf
的情况。然后,使用您选择的名称服务器创建一个新的:/etc/resolv.conf
/etc/resolv.conf
unlink /etc/resolv.conf
echo nameserver 1.1.1.1 > /etc/resolv.conf
为什么不立即通过系统升级来测试网络设置:
dnf upgrade
如果存储库已同步,则表示您成功了!
缺少mount
命令?
如果您首次登录新的 Fedora 实例时看到 ,An error occurred mounting one of your file systems
则表明您缺少该util-linux
软件包,其中包含mount
以及其他必要的命令。根据您安装的根文件系统,您可能不会收到任何错误,在这种情况下,您可以继续下一部分。
但是如果您确实需要安装,请安装util-linux
(或者,如果您想要极简主义,只需安装util-linux-core
)。
dnf install -y util-linux
然后退出并终止您的 Fedora 实例(这实际上会导致重新启动):
wsl -t fedora
以非特权用户身份启动 Fedora
只想说:root
你永远不应该成为默认用户。我们来创建一个普通用户吧。
我们需要passwd
这个,并且我们也可以获取用于密码检查的 cracklib dicts。启动 Fedora 后,安装这两个:
dnf install -y passwd cracklib-dicts
现在,创建一个新用户;当我们这样做时,让我们将他们添加到wheel
组中,以便用户可以sudo
(不要忘记用对您有意义的内容替换“myusername”):
useradd -G wheel myusername
然后为该用户创建密码:
passwd myusername
现在,退出 WSL 或启动一个新的 Powershell 窗口,然后使用新的用户名重新启动 WSL:
wsl -d fedora -u myusername
成功?
$ whoami
myusername
有用嗎sudo
?
sudo cat /etc/shadow
如果您看到用户列表,包括底部您最近添加的用户,那么一切正常!
设置默认用户
最好以刚刚创建的用户身份而不是以 root 身份进入 Fedora 实例。
要启用此功能,假设您拥有 Windows 版本 18980 或更高版本:只需向/etc/wsl.conf
.
如果您还没有该文件或[user]
其中的某个部分,那么类似这样的操作将会很有效:
printf "\n[user]\ndefault = myusername\n" | sudo tee -a /etc/wsl.conf
然后退出并终止您的 fedora 实例,以便下次重新启动。
wsl -t fedora
再次启动 WSL,不指定用户,您应该是该用户,而不是 root。
如果成功,则继续下一部分。
但如果在 Windows 版本 18980 之前的版本上,则需要编辑注册表来设置默认用户。
在 Fedora 中,你创建的用户 ID 可能是 1000,不过你可以使用 来检查id -u
。记住这个数字。
回到 Powershell,您可以通过编辑 Windows 注册表来设置默认用户,将“fedora”和“1000”分别更改为您的 WSL 发行版和用户 ID:
Get-ItemProperty Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\*\ DistributionName | Where-Object -Property DistributionName -eq fedora | Set-ItemProperty -Name DefaultUid -Value 1000
微调
如果您进行容器工作,特别是在用户空间中,您可能需要重新安装 shadow-utils,以修复 rootfs 中未正确设置的粘滞位:
sudo dnf reinstall -y shadow-utils
如果您想 ping 服务器以查看它们是否启动,则可能需要执行以下两个步骤:
sudo dnf install -y procps-ng iputils
sudo sysctl -w net.ipv4.ping_group_range="0 2000"
第二个选项允许所有 2000 以内的组 ID 都能 ping 通。您可以使用 检查组 ID,getent group
或者使用 查看您的主组 ID,id -g
并确保它包含在上面的范围内。
但是,要使上述操作永久生效,需要在 Windows 中$HOME\.wslconfig
创建或修改该文件,而不是在 Linux中。将以下内容添加到该文件中,即使重启后 ping 仍然有效:
[wsl2]
kernelCommandLine = sysctl.net.ipv4.ping_group_range=\"0 2000\"
您可能还会发现,我们安装的稀疏根文件系统中缺少一些您常用的命令。您可能需要安装iproute
、findutils
、ncurses
和其他命令,如下所示:
sudo dnf -y install iproute findutils ncurses
虽然内置的vi
文本编辑器很实用,但你可能需要更强大或用户界面更适合你的编辑器。不错的选择包括vim
、micro
或nano
。选择一个并安装,例如:
sudo dnf install -y micro
从这里,您可以继续安装软件包、编辑配置并根据自己的喜好定制新的发行版!
一些好的手册页
你想要文档?你根本处理不了文档!
但是,如果您能够处理它们,并且能够承受它们占用的额外存储空间,那么您很可能会需要手册页。感谢Martin Hinze就如何最好地添加手册页功能提出的宝贵建议。这是一个增强功能,而不是内置功能,因为我们之前获得了一个精简的 rootfs。
首先,确保 nodocs 选项未在 中设置/etc/dnf/dnf.conf
。您可以自行删除该tsflags=nodocs
行,或使用以下命令:
grep -v nodocs /etc/dnf/dnf.conf | sudo tee /etc/dnf/dnf.conf
然后man
安装man-pages
:
sudo dnf install -y man man-pages
这将确保您将来能获得每个软件包的手册页dnf install
;但是,为了事后添加它们,您需要将其添加到dnf reinstall
任何需要手册页的软件包中。例如,man dnf
现在不会有任何结果。但之后再试一次sudo dnf reinstall -y dnf
,您应该会得到不错的结果。
要重新安装所有已安装的软件包,请尝试以下操作:
for pkg in $(dnf repoquery --installed --qf "%{name}"); do sudo dnf reinstall -qy $pkg; done
不要重复自己
一旦你拥有了一个完美且符合你需求的基础系统,不妨导出一个 tarball,以便以后导入。如果你愿意再次阅读这篇文章并一步步遵循,我深感荣幸。但如果你想让事情变得更轻松一些,可以尝试以下方法。
首先,清理 Fedora 中下载的软件包等:
sudo dnf clean all
然后,退出 WSL 并将整个安装导出到 tarball:
wsl --export fedora $HOME\Downloads\fedora-wsl.tar
您可能需要一个不同的文件夹Downloads
;请指定您想要的位置。
根据你安装的软件包,它可能只有四分之一 GB。如果你希望存储空间更小,可以使用 gzip 压缩。下次你想重新开始时,可以这样做:
mkdir $HOME\wsl\freshfedora
wsl --import freshfedora $HOME\wsl\freshfedora $HOME\Downloads\fedora-wsl.tar
持续升级
即使你使用的是预发布版本,也无需重新安装。只需继续升级即可;整个过程非常流畅:
sudo dnf upgrade
例如,如果您决定使用 Fedora 37(您是冒险家!),请使用上述命令随意升级,最终(大概在 2022 年 11 月)您将获得发布。
有兴趣进一步了解 WSL 2 吗?
我在 WSL 上写的其他文章:
文章来源:https://dev.to/bowmanjd/install-fedora-on-windows-subsystem-for-linux-wsl-4b26