忽略了/etc/network/interfaces.d中的文件,但是没有忽略/etc/network/interfaces本身。

对于Ubuntu 16.04 LTS (GNU/Linux 3.10.96-113 armv7l)
当我拥有以下内容时,我的静态配置被忽略:
/etc/network/interfaces
source-directory /etc/network/interfaces.d

/etc/network/interfaces.d/eth0

auto eth0
iface eth0 inet static
        address 192.168.40.112
        netmask 255.255.255.0
        gateway 192.168.40.1
        dns-nameservers 8.8.8.8

然而,以下是具体内容:
/etc/network/interfaces
auto eth0
iface eth0 inet static
        address 192.168.40.112
        netmask 255.255.255.0
        gateway 192.168.40.1
        dns-nameservers 8.8.8.8

source-directory /etc/network/interfaces.d

静态配置在启动时设置(与interfaces.d/中的内容无关)。
如果相关的话,我正在使用udev规则来重命名eth0接口(它以前是"enx001e063110c0")。

我的直觉是与内核版本3.10有关,这个版本可能已经不再得到支持了。 - WinEunuuchs2Unix
对我来说,这听起来并不像是一个内核问题。但是我对网络初始化在迁移到systemd后的工作方式还一无所知——并不是说这是一个systemd的问题。 - Luis de Arquer
只是好奇,为什么你使用的是Linux 3.10而不是最新版本呢? - wjandrea
关于内核的问题是,我以为systemd直到后来的版本才出现,但我现在还在用手机,无法确认。 - WinEunuuchs2Unix
@LuisdeArquer 我已经在下面回答了内核问题。 - WinEunuuchs2Unix
@wjandrea 这是ODROID XU4推荐的稳定内核,我正在使用。虽然有更新的内核可用,但通常它们会遇到各种问题。 - Luis de Arquer
3个回答

我想我找到了。根据手册,问题似乎出在source-directory关键字上。看起来自16.04版本开始,它不再被支持。
所以替换掉
source-directory /etc/network/interfaces.d

使用

source /etc/network/interfaces.d/*

似乎解决了问题。

哈,你做得很好。十分赞赏你的坚持!别忘了两天后回来把你的答案标记为解决问题的答案(点击你的答案旁边的勾号,使其变成绿色)。 - WinEunuuchs2Unix
@WinEunuuchs2Unix 谢谢你的帮助!:) - Luis de Arquer
这似乎也能解决当前(2018年3月)版本的 raspbian 中出现的相同问题。 - jacobq
1非常有趣。Odroid Ubuntu 16.04也受到了这个问题的影响。 - Marcus

我遇到了差不多的问题。原来我的系统支持source-directory,但只包括文件名由字母、数字、破折号和下划线组成的文件。
这就是为什么我的eth0.conf没有被读取,因为它包含了一个点。

就这样吧 - 我已经在14.04和16.04上使用几台机器进行了验证,证实了没有扩展名的文件在/etc/network/interfaces.d目录下能够被/etc/network/interfaces正确引用,使用的是source-directory /etc/network/interfaces.d ... ;) 还值得注意的是,在我们的环境中,网络管理器会从服务器中移除;它过于不可预测 :D - tink

您的内核版本3.10对于 systemd 来说太旧了 如果使用systemd-v230或更新版本

根据在 github 的 systemd 内核要求 (github.com - systemd README),如果您正在使用 systemd-v230 或更新版本,您需要 >= 3.12 版本:

REQUIREMENTS:
        Linux kernel >= 3.12
        Linux kernel >= 4.2 for unified cgroup hierarchy support

第37、38和39行在上面打印出来。
你正在使用ARM架构,对此我实际上知之甚少。根据谷歌搜索,你的armvl7是由树莓派使用的32位内核。
将你的内核更新到现代化时代
如果你想要最新的(2016年10月21日)“Dirty COW”安全保护(什么是“Dirty COW”漏洞,如何保护我的系统?)以及一系列其他安全补丁、错误修复和系统改进(在你的2013版本之后),你应该使用4.4.0-47内核。
不幸的是,我不知道如何为树莓派做到这一点。我已经将这个问题链接给了使用树莓派的人,并请他们对这个答案进行评价。

只是为了确认一下:树莓派中的ARM CPU确实是32位的。 - Nathan Osman
@NathanOsman 谢谢你为我确认这个新的课题领域 :) - WinEunuuchs2Unix
+1 感谢你指出这一点。然而,请查看此链接。Systemd通常支持2年前的内核版本,所以即使你是对的,我也会对这是否是根本原因感到惊讶。我将检查我正在运行的systemd版本。但即使它是一个较新的版本,这难道不更像是用户空间的问题吗?内核怎么可能允许你读取一个文件,却阻止你读取另一个文件呢?而且在第二种情况下,网络配置明显没有问题地应用了。[更多内容请见下一条评论] - Luis de Arquer
通常情况下,我会只是升级内核并进行测试,但在这种情况下可能会有些困难。这个系统运行在一个ODROID XU4上,安全性不是一个问题,但更换内核可能需要一些时间,并且由于稳定性的原因,这可能不是一个长期解决方案。如果没有其他解决方案出现,我可能会出于好奇尝试一下:) - Luis de Arquer
@NathanOsman 实际上,树莓派3的CPU本身是64位的(但通常与32位内核一起使用)。 - Luis de Arquer
@LuisdeArquer 是的,systemd在用户空间运行,但仍然需要与内核进行通信,这是通过ABI(应用程序二进制接口)来实现的,该接口每年左右都会更改,添加新的符号并删除旧的符号。请参见:https://abi-laboratory.pro/tracker/timeline/linux/ - WinEunuuchs2Unix
@WinEunuuchs2Unix 我知道,不是说这肯定不是问题,只是说这可能无关紧要。决定是否读取文件以及打开、读取和处理文件的过程与内核无关,而是使用常规的系统调用。 - Luis de Arquer
@LuisdeArquer 你可以提交一个 systemd 的错误报告,指出你的内核版本是3.10,并询问是否需要使用>=3.12的版本。报告链接:https://github.com/systemd/systemd/issues 这个网页访问量很大,希望你能尽快得到详细的解释。 - WinEunuuchs2Unix
@WinEunuuchs2Unix 幸运的是,我刚刚成功修复了:)(我刚刚为此发布了一个答案)。不知道为什么source-directory关键字会出现在ODROID 16.04镜像上。这并不意味着你在兼容性方面是错的:我刚刚检查了一下,我正在运行2016年发布的systemd 229版本,而当时已经要求使用3.12内核。 - Luis de Arquer
@LuisdeArquer 有点晚来参加这个派对,但是文件/etc/network/interfaces是由服务network读取的(通常是/etc/init.d/network),您应该在那里查找,而不是讨论systemdkernel版本。 - Samveen