RHEL 9 在 WSL2 中的手动安装笔记

一、环境概述

项目 说明
宿主机 Windows 11 + WSL2
目标系统 Red Hat Enterprise Linux 9
安装方式 官方 WSL2 rootfs → WSL2 导入 → 注册订阅
存储路径 E:\WSL\RHEL9

注意:Microsoft Store 未提供官方 RHEL 发行版,需手动导入 rootfs。本方案使用 Red Hat 官方 WSL2 tarball,导入后通过 subscription-manager 注册为完整 RHEL 9 系统,包含 firewalld / fail2ban 等所有标准包。


二、前置条件

  1. WSL2 已启用
  2. Red Hat 开发者账号(免费):访问 developers.redhat.com 注册
  3. RHEL WSL2 根文件系统:下载官方 WSL2 tarball(标准 RHEL):
    https://developers.redhat.com/content-gateway/file/rhel/Red_Hat_Enterprise_Linux_9.5/rhel-9.5-x86_64-wsl2.tar.gz
    
    下载后保存到本地,例如 E:\WSL-Backup\rhel-9.5-x86_64-wsl2.tar.gz(路径根据实际情况调整)

    此包是标准 RHEL,含 firewalld / fail2ban 等所有标准包


三、获取 RootFS

下载官方标准 rootfs(见第二章下载地址),此为标准 RHEL 9 WSL2 rootfs,可直接导入。

文件迁移:若需将文件移动到其他磁盘(如 E 盘),直接在 Windows 资源管理器中剪切/粘贴即可,后续导入命令指定新路径。


四、导入 WSL2

Windows PowerShell 中执行。将 E:\WSL-Backup\rhel-9.5-x86_64-wsl2.tar.gz 替换为你的实际下载路径。

# 创建存储目录
mkdir E:\WSL\RHEL9

# 导入为 WSL2 发行版(使用官方标准 rootfs)
wsl --import RHEL9 E:\WSL\RHEL9 <下载文件路径>\rhel-9.5-x86_64-wsl2.tar.gz --version 2

# 验证
wsl -l -v

预期输出:

  NAME            STATE           VERSION
* Ubuntu-24.04    Running         2
  RHEL9           Stopped         2

五、注册 Red Hat 订阅

进入 RHEL 9 WSL 环境:

wsl -d RHEL9

5.1 注册系统

使用 Red Hat 开发者账号(不是 Registry Service Account)进行注册:

subscription-manager register --username YOUR_REDHAT_USERNAME --password 'YOUR_REDHAT_PASSWORD'

注意

  1. 请将 YOUR_REDHAT_USERNAMEYOUR_REDHAT_PASSWORD 替换为你在 developers.redhat.com 注册的开发者账号信息。
  2. 若密码包含特殊字符(如 !&*$),必须使用单引号包裹,否则 Bash 会将其解析为历史扩展或通配符。
  3. 出于安全考虑,不要将真实账号写入文档、截图或代码仓库;建议使用环境变量或交互式输入:
    read -rs REDHAT_PASSWORD && \
    subscription-manager register --username "$REDHAT_USERNAME" --password "$REDHAT_PASSWORD"
    

注册成功标志:

The system has been registered with ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
The registered system name is: xxxxxxx

5.2 刷新并验证

# 刷新订阅数据
subscription-manager refresh

# 查看状态
subscription-manager status

预期输出:

+-------------------------------------------+
   System Status Details
+-------------------------------------------+
Overall Status: Registered
Content Access Mode is set to Simple Content Access. This host has access to content, regardless of subscription status.

5.3 验证仓库可用

dnf repolist

预期输出:

repo id                              repo name
rhel-9-for-x86_64-appstream-rpms     Red Hat Enterprise Linux 9 for x86_64 - AppStream (RPMs)
rhel-9-for-x86_64-baseos-rpms        Red Hat Enterprise Linux 9 for x86_64 - BaseOS (RPMs)

5.4 系统更新

dnf update -y

5.5 安装基础工具(可选)

标准 RHEL 9 WSL 镜像已含基础工具,如需补充:

dnf install -y sudo vim wget curl net-tools bash-completion

六、配置用户与 systemd

6.1 创建普通用户

# 创建用户并加入 wheel 组(替换 yourname)
useradd -m -G wheel yourname
passwd yourname

6.2 修改主机名(可选)

WSL2 中改主机名有别于普通 Linux:直接改 /etc/hostname 重启后会失效(WSL 启动时会重写)。持久化做法是写到 wsl.conf[network] hostname(在 6.4 配置 wsl.conf 时一起设置即可,无需单独再写一次文件)。

验证:

hostname          # 应输出 wsl.conf 中配置的主机名
hostname -f       # 应输出同名(短主机名)
cat /etc/hostname # 应输出同名

几个易混点

  • hostnamectl set-hostname xxx 在 WSL2 systemd 下能立即生效,但下次 wsl --shutdown 重启后会被 WSL 重置,不持久wsl.conf 里的 hostname 才是持久化来源。
  • wsl --rename RHEL9 xxx 改的是 Windows 侧的发行版名wsl -l 看到的名字),跟 Linux 内部的主机名是两件事。
  • 若只想临时改一下当前会话主机名:sudo hostname xxx,重启即失效。

6.3 配置 sudo 免密(可选)

echo "yourname ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/yourname
chmod 440 /etc/sudoers.d/yourname

6.4 配置 wsl.conf

sudo tee /etc/wsl.conf > /dev/null << 'EOF'
[user]
default = yourname

[boot]
systemd = true

[interop]
enabled = true
appendWindowsPath = true

[network]
# 主机名:不改注释掉这一行即可(默认随机主机名)
hostname = rhel9-dev
generateHosts = true
generateResolvConf = true
EOF

各段作用:

关键项 作用
[user] default = yourname 默认登录用户,避免每次 wsl -d RHEL9 都进 root
[boot] systemd = true 启用 systemd,让 RHEL 内的服务能用 systemctl 管理
[interop] enabled / appendWindowsPath 允许 Linux 调 Windows 可执行文件;将 Windows PATH 追加到 Linux
[network] hostname / generateHosts / generateResolvConf 持久化主机名;自动维护 /etc/hosts/etc/resolv.conf

6.5 重启生效

exit

PowerShell 中:

# 关闭当前实例并完全重启(改 wsl.conf 后必须用 --shutdown,--terminate 不会重读配置)
wsl --shutdown
wsl -d RHEL9

重启后默认以 yourname 用户进入。

6.6 验证 systemd 已生效

# PID 1 必须是 systemd,输出 "systemd" 才算启用成功
ps -p 1 -o comm=

# 查看 systemd 版本
systemctl --version

# 列出运行级别下的服务(应能看到 firewalld / sshd 等标准服务)
systemctl list-units --type=service --state=running

如果 ps -p 1 -o comm= 输出的是 init 而非 systemd,说明 systemd 未生效。常见原因:WSL 版本过旧(需 Windows 11 22H2+,或手动将 WSL 内核升到 5.15+);或改完 wsl.conf 后只 wsl --terminatewsl --shutdown

6.7 systemd 下管理服务(可选)

systemd 启用后,RHEL 内的服务可像普通 Linux 一样用 systemctl 托管。以自定义服务 myapp.service 为例:

sudo tee /etc/systemd/system/myapp.service > /dev/null << 'EOF'
[Unit]
Description=MyApp
After=network.target

[Service]
Type=simple
User=yourname
WorkingDirectory=/home/yourname/myapp
ExecStart=/home/yourname/myapp/run.sh
Restart=on-failure
RestartSec=10
TimeoutStopSec=30
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp
sudo systemctl status myapp --no-pager

Type=simple 适用于前台常驻进程;若进程会 fork 后台(如 Tomcat),改用 Type=forking 并补 PIDFile=,避免 systemd 误判启动失败。


七、验证安装

# 查看系统版本
cat /etc/os-release

# 验证 systemd(详见 6.6)
systemctl --version
ps -p 1 -o comm=

# 查看当前用户
whoami

# 测试 sudo
sudo dnf repolist

八、常见问题

8.1 为什么不用 registry.redhat.io/rhel9 直接拉取?

Red Hat 容器仓库 (registry.redhat.io) 需要订阅权限同步到 Service Account,新注册开发者账号或新建 Service Account 后,权限下发到容器仓库可能有延迟(15 分钟至数小时),且对个人开发者而言流程繁琐。使用官方 WSL2 tarball + WSL 内 subscription-manager 注册是更可靠的路线。

8.2 syspurpose / subscription-manager 报错需要处理吗?

注册时 subscription-manager 可能会有 syspurpose 相关 warning,不影响使用。SCA(Simple Content Access)模式下,注册成功后自动获得内容权限。如遇仓库报错,先 subscription-manager refresh 再重试。

8.3 订阅过期怎么办?

Red Hat 开发者订阅每年需手动续期。到期前登录 developers.redhat.com 重新激活即可。过期后 dnf 会报错,续期后执行:

subscription-manager refresh

九、常用管理命令

操作 命令
启动 RHEL9 wsl -d RHEL9
设为默认发行版 wsl --set-default RHEL9
关闭 RHEL9 wsl --terminate RHEL9
查看所有发行版 wsl -l -v
完全卸载(数据清空) wsl --unregister RHEL9
查看注册状态 subscription-manager status
刷新订阅 subscription-manager refresh

十、参考链接

posted @ 2026-07-20 16:48  RK5123153  阅读(27)  评论(0)    收藏  举报