前言

本文根据chatgpt的答案进行整理发布。


问题描述

在无头debian系统上装了qbittorrent-nox并设置了开机启动,启动脚本如下:

[Unit]
Description=qBittorrent-nox service for user %I
Documentation=man:qbittorrent-nox(1)
Wants=network-online.target
After=local-fs.target network-online.target nss-lookup.target

[Service]
Type=simple
PrivateTmp=false
User=%i
ExecStart=/usr/bin/qbittorrent-nox
TimeoutStopSec=1800

[Install]
WantedBy=multi-user.target

在防火墙中也放行了ipv6的端口(有ipv6的公网地址)。

[ 6] 12345 (v6)                 ALLOW IN    Anywhere (v6)

但发现在系统重启之后,qbit中的下载任务无法匹配到ipv6的用户,如果此时手动重启qbit,下载任务就可以立即匹配到ipv6用户。

初步判断是系统重启之后,在获取到网络获取到ipv6公网地址之间存在一个时间差,但qbit在这个时间差中间启动了,导致qbit无法获取到ipv6公网地址。


问题解决

方法一:修改qbit的systemd启动脚本,增加对host是否获取到ipv6公网地址的判断逻辑

首先用ip addr命令获取系统网卡设备的名称

然后在qbit的启动脚本中添加一段ExecStartPre代码,其它部分不需要修改。

[Unit]
Description=qBittorrent-nox service for user %I
Documentation=man:qbittorrent-nox(1)
Wants=network-online.target
After=local-fs.target network-online.target nss-lookup.target

[Service]
ExecStartPre=/bin/bash -c 'until ip -6 addr show dev enp6s18 | grep "inet6 .*global"; do sleep 1; done'
Type=simple
PrivateTmp=false
User=%i
ExecStart=/usr/bin/qbittorrent-nox
TimeoutStopSec=1800

[Install]
WantedBy=multi-user.target

参数释疑:

  • ExecStartPre=/bin/bash -c 'until ip -6 addr show dev enp6s18 | grep "inet6 .*global"; do sleep 1; done':在服务启动之前,这行命令会持续检查你的网络接口(此处假设接口是 enp6s18)是否已经获取了一个有效的 IPv6 公网地址。直到获取到全局 IPv6 地址,服务才会继续启动。
  • ip -6 addr show dev enp6s18:列出 enp6s18 接口的所有 IPv6 地址。
  • grep "inet6 .*global":确保找到全局 IPv6 地址。

修改之后保存,然后重新加载服务让配置生效

sudo systemctl daemon-reload
sudo systemctl restart qbittorrent-nox@user.service

方法二:设置qbit延迟启动

依然是编辑qbit的启动脚本,非常简单暴力的设置延迟30s启动。

[Unit]
Description=qBittorrent-nox service for user %I
Documentation=man:qbittorrent-nox(1)
Wants=network-online.target
After=local-fs.target network-online.target nss-lookup.target

[Service]
ExecStartPre=/bin/sleep 30
Type=simple
PrivateTmp=false
User=%i
ExecStart=/usr/bin/qbittorrent-nox
TimeoutStopSec=1800

[Install]
WantedBy=multi-user.target

修改之后保存,然后重新加载服务让配置生效

sudo systemctl daemon-reload
sudo systemctl restart qbittorrent-nox@user.service

Tips:我用的方法二,实测解决了问题,缺点就是每次重启系统或者手动重启qbit服务都要等30s。

🎉


喝杯奶茶