Ubuntu Server 20.04下systemd启动脚本无法初始化TAP网桥问题求助
Ubuntu Server 20.04下systemd启动脚本无法初始化TAP网桥问题求助
嗨,我来帮你捋捋这个问题哈!从你给出的日志能看出来,核心问题很明确:systemd启动脚本的时候,tap0设备还压根不存在,所以才会报错“Cannot find device 'tap0'”。手动跑脚本没问题,估计是你手动执行前已经通过其他方式创建过tap0了,但开机时这个设备还没被生成出来。
我给你整理几个关键的修复步骤:
1. 先修正你的启动脚本
你的脚本只做了启动tap0和添加到网桥的操作,但完全没创建tap0设备!这就是开机报错的核心原因。另外脚本里的&和wait其实没必要,反而可能打乱执行顺序,建议去掉。修改后的脚本如下:
#!/bin/bash # 先创建tap0设备(如果不存在的话) ip tuntap add dev tap0 mode tap # 启动tap0接口 ip link set tap0 up # 将tap0添加到br0网桥 brctl addif br0 tap0 echo "finish"
记得给脚本加上执行权限:
chmod +x /usr/local/bin/tap.sh
2. 调整systemd服务的启动时机和配置
systemd默认启动服务的时机可能太早,导致br0网桥或者网络环境还没准备好。你需要修改/etc/systemd/system/tap.service文件,确保服务在网络就绪后再启动,并且拥有足够权限:
[Unit] Description=TAP Interface # 确保在网络服务完全启动后再执行脚本 After=network.target # 依赖网络目标,确保网络环境就绪 Requires=network.target [Service] # 执行ip、brctl需要root权限,指定以root运行 User=root Group=root # 指向你的脚本路径 ExecStart=/usr/local/bin/tap.sh # 这是一次性任务,执行完就退出 Type=oneshot # 即使脚本退出,也标记服务为活跃状态 RemainAfterExit=yes [Install] # 绑定到多用户目标,确保开机时启动 WantedBy=multi-user.target
如果你的br0是通过netplan配置的,建议把After改成netplan-wpa@*.service或者对应的netplan服务,确保br0已经完全创建后再执行脚本。
3. 重新加载配置并测试
完成上面两步后,执行以下命令让systemd生效:
# 重新加载systemd配置 systemctl daemon-reload # 重启服务测试 systemctl restart tap.service # 查看服务状态 systemctl status tap.service
如果没有报错,再确认开机自启:
systemctl enable tap.service
这样应该就能解决开机时无法初始化TAP网桥的问题啦!
备注:内容来源于stack exchange,提问作者Adsuporte
相关产品推荐
相关产品推荐

