WSL 教程:使用 Systemd 配置服务自动启动(SSH frpc)
如何在新版本的 WSL (Windows Subsystem for Linux) 中,利用 Systemd 来设置 OpenSSH 服务器和 frpc(FRP 客户端)在每次启动时自动运行。
适用条件: 此方法适用于支持 Systemd 的 WSL 版本(通常在较新的 Windows 11 版本中提供)。
第 1 步:启用 Systemd
首先,你需要在 WSL 的配置中显式启用 Systemd。
-
编辑 wsl.conf 文件
在你的 WSL 终端中,使用 vim 编辑器创建或打开/etc/wsl.conf
文件:sudo vim /etc/wsl.conf
-
添加配置
按i
进入插入模式,然后将以下内容添加到文件中:[boot] systemd=true
按
Esc
退出插入模式,然后输入:wq
并按Enter
保存文件并退出。
第 2 步:重启 WSL
为了让上述配置生效,你必须完全关闭并重启 WSL 实例。这是一个关键步骤。
-
打开 Windows 的 PowerShell 或 命令提示符 (CMD)。
-
运行以下命令来关闭所有正在运行的 WSL 实例:
wsl --shutdown
-
等待几秒钟,然后重新打开你的 WSL 终端。WSL 将会以启用 Systemd 的模式重新启动。
第 3 步:使用 systemctl 管理 SSH 服务
现在 WSL 已经由 Systemd 管理初始化过程,你可以像在标准的 Linux 服务器上一样,使用 systemctl
命令来控制服务。
-
设置 SSH 服务开机自启
这个命令会让 SSH 服务在每次 WSL 启动时自动运行:sudo systemctl enable ssh
-
立即启动 SSH 服务
如果你想立即启动服务而无需再次重启,请运行:sudo systemctl start ssh
-
停止 SSH 服务
如果你需要临时停止服务,可以运行:sudo systemctl stop ssh
-
检查服务状态
你可以随时使用以下命令来验证 SSH 服务是否正在运行:sudo systemctl status ssh
状态检查成功案例与解读
当你运行 sudo systemctl status ssh
后,你会看到一段详细的输出。下面是一个成功运行的实际案例:
(base) yuuu@DESKTOP-M32KRCT:~$ sudo systemctl status ssh
● ssh.service - OpenBSD Secure Shell serverLoaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)Active: active (running) since Wed 2025-10-08 15:25:16 CST; 8min ago
...
Oct 08 15:25:16 DESKTOP-M32KRCT sshd[226]: Server listening on 0.0.0.0 port 22.
Oct 08 15:25:16 DESKTOP-M32KRCT systemd[1]: Started OpenBSD Secure Shell server.
-
Loaded: ... enabled; ...
:表示已成功设置开机自启。 -
Active: active (running)
:表示服务正在正常运行。
第 4 步:(可选)配置 frpc 自动启动
如果你的 frpc
和其配置文件 frpc.toml
是手动放置在某个目录(例如 /home/yuuu/frp/
),而不是通过包管理器安装的,你需要手动创建一个 systemd
服务文件来管理它。
-
创建 systemd 服务文件
使用 vim 在/etc/systemd/system/
目录下创建一个名为frpc.service
的文件。sudo vim /etc/systemd/system/frpc.service
-
编写服务配置文件
按i
进入插入模式,将以下内容复制并粘贴到frpc.service
文件中。!!!重要: 你需要根据你的实际情况,修改
User
和ExecStart
这两行中的 用户名 和 文件绝对路径。[Unit] Description=FRP Client Service After=network.target[Service] Type=simple # 请将 'yuuu' 替换为你的 WSL 用户名 User=yuuu # 请将下面的路径替换为你的 frpc 程序和 frpc.toml 配置文件的实际绝对路径 ExecStart=/home/yuuu/frp/frpc -c /home/yuuu/frp/frpc.toml Restart=on-failure RestartSec=5s[Install] WantedBy=multi-user.target
按
Esc
退出插入模式,然后输入:wq
并按Enter
保存文件并退出。
frpc.service 文件字段详解
-
[Unit]
:定义了服务的基本信息和依赖关系。-
Description
: 服务的简短描述。 -
After=network.target
: 确保在网络连接就绪后才启动本服务。
-
-
[Service]
:定义了服务的核心行为。-
Type=simple
: 服务类型,simple
表示ExecStart
的进程就是主进程。 -
User=yuuu
: 运行此服务的用户名,请务必修改。 -
ExecStart=/home/yuuu/frp/frpc -c ...
: 启动服务时要执行的命令,必须使用绝对路径。 -
Restart=on-failure
: 当进程异常退出时,自动重启。 -
RestartSec=5s
: 重启前等待 5 秒。
-
-
[Install]
:定义了服务如何被“启用”(enable)。WantedBy=multi-user.target
: 使服务在系统进入多用户模式时自动启动。
-
管理 frpc 服务
-
重新加载 systemd 配置:
sudo systemctl daemon-reload
-
设置 frpc 开机自启:
sudo systemctl enable frpc
-
立即启动 frpc 服务:
sudo systemctl start frpc
-
停止 frpc 服务:
sudo systemctl stop frpc
-
检查 frpc 服务状态:
sudo systemctl status frpc
-
实战排错:解决 frpc 启动失败
在配置过程中,你可能会遇到服务启动失败的情况。下面是一个非常典型的失败案例及其解决方案。
失败状态输出:
(base) yuuu@DESKTOP-M32KRCT:~/app/frp$ sudo systemctl status frpc
● frpc.service - FRP Client ServiceLoaded: loaded (/etc/systemd/system/frpc.service; enabled; vendor preset: enabled)Active: activating (auto-restart) (Result: exit-code) since Wed 2025-10-08 16:13:42 CST; 4s agoProcess: 1829 ExecStart=/home/yuuu/app/frp/frpc -c /home/yuuu/app/frp/frpc.toml (code=exited, status=203/EXEC)Main PID: 1829 (code=exited, status=203/EXEC)CPU: 1msOct 08 16:13:42 DESKTOP-M32KRCT systemd[1]: frpc.service: Failed with result 'exit-code'.
错误分析与解读:
-
Active: activating (auto-restart)
: 这表示systemd
正在不断尝试启动服务,但服务立即失败,于是systemd
根据Restart=on-failure
的策略准备再次重启它。 -
Process: ... (code=exited, status=203/EXEC)
: 这是最关键的错误信息!status=203/EXEC
是一个标准的systemd
错误码,它明确指出执行ExecStart
定义的命令时发生了错误。这通常意味着:-
ExecStart
中的可执行文件路径不正确。 -
指定路径下的文件没有执行权限。
-
解决方案:
-
检查路径:
仔细核对你在frpc.service
文件中ExecStart
字段填写的frpc
程序路径是否完全正确。 -
检查并赋予执行权限:
203/EXEC
错误最常见的原因是文件缺少执行权限。# 将路径替换为你的实际路径 ls -l /home/yuuu/app/frp/frpc
如果输出的权限部分开头没有
x
,就使用chmod
命令为其添加执行权限:# 将路径替换为你的实际路径 sudo chmod +x /home/yuuu/app/frp/frpc
-
重新加载并重启服务:
在修改完权限后,需要重新加载配置并重启服务:sudo systemctl daemon-reload sudo systemctl restart frpc
-
再次检查状态:
最后,再次检查服务状态,此时应该会变为Active: active (running)
。sudo systemctl status frpc
更新 frpc 配置文件
当你需要修改 frpc
的配置(例如,添加或更改代理规则)时,你需要让正在后台运行的服务重新加载这些设置。systemd
使这个过程非常简单。
-
编辑配置文件
首先,使用 vim 编辑你的frpc.toml
文件并保存更改。# 将路径替换为你的实际路径 vim /home/yuuu/app/frp/frpc.toml
-
重启 frpc 服务
编辑并保存配置文件后,只需重启frpc
服务,它就会加载最新的配置。sudo systemctl restart frpc
这个命令会安全地停止当前的服务进程,然后立即使用更新后的配置重新启动它。
-
(建议)检查服务状态
重启后,最好检查一下服务的状态,确保它在加载新配置后没有出现错误,并且仍在正常运行。sudo systemctl status frpc