WSL2默认不支持systemd,因其init进程为微软实现的/init,跳过传统启动流程,未初始化dbus、cgroup v2等systemd依赖项;Oracle 21c需改用oracle-xe-21c自带init.d脚本手动管理服务。
wsl2 默认不支持 systemd,而 oracle database 21c(尤其是企业版或需要完整服务管理的安装)严重依赖 systemd 启动监听器、数据库实例和 oraagent 等守护进程。直接在默认 wsl2 ubuntu 上执行 sudo systemctl start oracle-database 会报错:failed to connect to bus: no such file or directory —— 这不是配置问题,是架构限制。
为什么 WSL2 没有 systemd?
WSL2 的 init 进程是 /init(由微软实现),而非 Linux 发行版标准的 systemd 或 sysvinit。它跳过传统 Linux 启动流程,直接启动用户 shell,因此 systemd 无法初始化 dbus socket、cgroup v2 挂载点等前置条件。
常见误操作包括:
- 盲目运行
sudo apt install systemd—— 安装成功但无法启动,systemctl命令始终报错 - 修改
/etc/wsl.conf加init = true—— 此选项仅控制是否启动/init,与systemd无关(WSL2 当前版本不支持该参数) - 尝试挂载 cgroup2 —— WSL2 内核虽支持 cgroup v2,但未暴露必要接口,
mount -t cgroup2 none /sys/fs/cgroup会失败
绕过 systemd 运行 Oracle 21c 的可行路径
Oracle 21c 在 WSL2 中可运行,但必须放弃 systemctl 管理,改用手动服务脚本 + 进程保活。关键前提是:使用 Oracle Express Edition(XE)或手动配置无依赖模式的企业版。
实操要点:
-
oracle-xe-21c官方 DEB 包自带/etc/init.d/oracle-xe-21c脚本,它不调用systemd,而是用start-stop-daemon管理进程 —— 这是唯一推荐的起点 - 安装前必须在
/etc/wsl.conf中启用swap和localhostForwarding:[wsl2] swap=2GB localhostForwarding=true
否则 Oracle 监听器无法绑定127.0.0.1:1521 - 安装后首次配置必须用
sudo /etc/init.d/oracle-xe-21c configure,不能跳过;它会生成/opt/oracle/product/21c/dbhomeXE/network/admin/listener.ora并启动监听器 - 数据库实例需手动启动:
sudo -u oracle /opt/oracle/product/21c/dbhomeXE/bin/sqlplus / as sysdba
监听器与数据库的持续可用性保障
WSL2 关机时所有进程被强制终止,没有 shutdown hook。若希望每次打开 WSL2 就自动拉起 Oracle,需在用户 shell 初始化文件中添加保活逻辑:
- 编辑
~/.bashrc(或~/.zshrc),末尾追加:if ! pgrep -f "tnslsnr" > /dev/null; then sudo /etc/init.d/oracle-xe-21c start &>/dev/null fi if ! pgrep -f "pmon.*XE" > /dev/null; then sudo -u oracle /opt/oracle/product/21c/dbhomeXE/bin/sqlplus /nolog
- 注意:上述命令依赖
sudo免密配置。需提前运行sudo visudo,添加:%sudo ALL=(ALL) NOPASSWD: /etc/init.d/oracle-xe-21c, /opt/oracle/product/21c/dbhomeXE/bin/sqlplus - 不要用
nohup或screen启动 Oracle —— WSL2 不保留后台会话,关闭终端即 kill 进程
图形界面与 Oracle Enterprise Manager 的访问限制
Oracle 21c XE 自带 EM Express(https://localhost:5500/em),但在 WSL2 中无法直接打开浏览器访问,因为:
- WSL2 使用虚拟网络,
localhost:5500绑定在 WSL2 内部 IP(如172.xx.xx.xx),Windows 主机无法直连 - 即使配置端口转发,EM Express 默认只监听
127.0.0.1,需手动修改$ORACLE_HOME/network/admin/tnsnames.ora和监听器配置,并重启监听器 - 更现实的做法是:用 SQL Developer(Windows 客户端)连接
localhost:1521/XE,它通过 Windows 主机网络栈自动路由到 WSL2
真正麻烦的是 Oracle Database Configuration Assistant(DBCA)这类 GUI 工具 —— 它们依赖 X11 转发,而 WSL2 对 X Server 支持不稳定,容易卡死或黑屏。建议全程使用命令行 dbca -silent 创建数据库。











