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

Joe*_*Joe 11 linux debian openvpn

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

建议的修复如下所示。似乎 /dev/net 不会自动创建,当然会在每次重新启动时消失。

mkdir -p /dev/net
mknod /dev/net/tun c 10 200
chmod 600 /dev/net/tun
Run Code Online (Sandbox Code Playgroud)

Yar*_*ron 8

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
Run Code Online (Sandbox Code Playgroud)

这是升级后的状态:

5.15.32-1-MANJARO  *5.16.18-1-MANJARO*  extramodules-5.15-MANJARO  extramodules-5.16-MANJARO
Run Code Online (Sandbox Code Playgroud)

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

modprobe: FATAL: Module tun not found in directory /lib/modules/5.16.14-1-MANJARO
Run Code Online (Sandbox Code Playgroud)

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


nat*_*njo 6

debian wheezy 自 2018 年 5 月起就不再支持 ( https://www.debian.org/releases/wheezy/ ),您不应该在 2020 年再使用它进行生产。

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

因此,在文件系统中的某个位置创建一个 bash 脚本,如下所示:

#!/bin/bash

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

/etc/init.d/openvpn restart
Run Code Online (Sandbox Code Playgroud)

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

# crontab -e
Run Code Online (Sandbox Code Playgroud)

至少有这个内容

@reboot /path/to/where/you/saved/the/script
Run Code Online (Sandbox Code Playgroud)

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

  • 作为替代方案,可以将代码片段写入“/etc/default/openvpn”文件中,该文件由“/etc/init.d/openvpn”脚本获取。 (3认同)

And*_*mes 3

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

# echo tun >> /etc/modules
Run Code Online (Sandbox Code Playgroud)

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

我希望它有帮助。


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

devtmpfs文件系统在 initramfs 时挂载。/usr/share/initramfs-tools/init一旦grub将 initramfs 提取到内存,该文件就会被执行,它提供将devtmpfs文件系统安装到 中的代码/dev,如果不成功,则回退到标准tmpfs文件系统。

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