OpenVPN - 错误:无法打开 TUN/TAP dev /dev/net/tun:没有此文件或目录(errno=2)

OpenVPN - 错误:无法打开 TUN/TAP dev /dev/net/tun:没有此文件或目录(errno=2)

有很多问题与此错误有关,并且有一个建议的手动修复方法,效果很好,但没有永久的解决方案。我该如何永久解决这个问题?我在 Debian wheezy 服务器上遇到了这个问题,使用 OpenVPN 客户端连接到 OpenVPN 服务器。

建议的修复方法如下。看来 /dev/net 不会自动创建,而且每次重启后都会消失。

mkdir -p /dev/net
mknod /dev/net/tun c 10 200
chmod 600 /dev/net/tun

答案1

在 Arch/Manjaro 中也会发生这种情况。

我设法弄清楚了问题所在,显然内核升级只是移动模块目录,因此尝试从已知位置访问模块是不可行的,当前运行的内核仍在运行,但我似乎无法modprobe(加载)任何尚未加载的模块(例如tunOpenVPN 连接所需的模块)。

例如,/lib/modules/升级之前目录有以下目录(我有多个内核,注意 5.16 系列):

5.15.32-1-MANJARO  *5.16.14-1-MANJARO*  extramodules-5.15-MANJARO  extramodules-5.16-MANJARO

这是升级后的状态:

5.15.32-1-MANJARO  *5.16.18-1-MANJARO*  extramodules-5.15-MANJARO  extramodules-5.16-MANJARO

尝试加载tun模块显示以下消息:

modprobe: FATAL: Module tun not found in directory /lib/modules/5.16.14-1-MANJARO

这完全说得通,因为这个目录不存在。
那么,在这种情况下我建议的解决方案是什么?重新启动。

答案2

Debian wheezy 自 2018 年 5 月起不再受支持(https://www.debian.org/releases/wheezy/),您不应再在 2020 年将其用于生产。

现在,解决了这个问题,您可以添加一些命令来暂时解决问题,将这些命令添加到使用@reboot昵称(man 5 crontab)的根 crontab 中的 bash 脚本中。

因此,请在文件系统的某个地方创建一个 bash 脚本,内容如下:

#!/bin/bash

mkdir -p /dev/net
mknod /dev/net/tun c 10 200
chmod 600 /dev/net/tun

/etc/init.d/openvpn restart

以755权限保存,并修改root crontab:

# crontab -e

至少有这个内容

@reboot /path/to/where/you/saved/the/script

重启后它应该已经成功启动 openvpn。

答案3

我认为一个可能的解决方案是将系统配置为tun在启动时加载内核模块。为此,请在文件中列出tun模块名称:/etc/modules

# echo tun >> /etc/modules

udev是根据加载的内核模块和连接的硬件设备在文件夹中创建和维护设备节点的系统组件。我相信通过在启动时加载内核模块,系统将在每次启动时创建设备节点。/devtun/dev/net/tun

我希望它有帮助。


编辑:我有点过时了。在启动 Debian Wheezy 镜像后,Vagrant Cloud 网站,我发现它实际上处理有关现有设备节点的权限、所有权和符号链接。设备节点实际上是由内核本身创建的,并通过伪文件系统udev向用户空间公开。devtmpfs

devtmpfs文件系统在 initramfs 时挂载。文件会在将 initramfs 提取到内存/usr/share/initramfs-tools/init后执行,它提供将文件系统挂载到 的代码,如果不成功,则返回到标准文件系统。grubdevtmpfs/devtmpfs

此外,为了使devtmpfs文件系统可用,Debian Wheezy 内核在交付时就已CONFIG_DEVTMPFS=y启用。

相关内容