在 Ubuntu 自动安装(14.04.3 和 15.04)中似乎无法通过预先配置来配置正确的网络接口。
Ubuntu 有时使用eth0
,有时使用像p2p1
、或这样的界面p1p3
。
我知道这些名称是如何生成的。但是如何在自动安装期间或之前检测这些名称?或者如何自动将p2p1
接口名称重命名为旧eth0
名称?
要设置静态接口设置,我使用d-i preseed/late_command
覆盖/etc/network/interfaces
文件。现在我假设只有一个名为的接口eth0
。
我尝试覆盖/删除/etc/udev/rules.d/70-persistent-net.rules
中的preseed/late_command
。但这没有任何帮助 - 它将会被忽略。
我怎样才能将接口名称更改为eth0
?或者我怎样才能在自动安装期间检测接口名称,以便将正确的名称写入 network/interfaces 文件?
编辑:
替换现在效果很好(感谢“muru”!)
该接口最初将从另一台服务器写入并通过 http wget 在内部提供服务preseed/late_command
:
wget http://{InternalServer}/{path}/interfaces -O /etc/network/interfaces;
在同一行我加载了replaceinterface.sh
具有以下内容的附加脚本:
#!/bin/bash
sDevice=`ip -o link | grep 'link/ether' | grep -oE "^[[:digit:]]:[[:space:]]([[:alnum:]]+)" | cut -d" " -f 2`
sed "s/eth0/$sDevice/g" $1
加载后,i 触发chmod +x
,使用以下命令执行sh /tmp/replaceinterface.sh < /etc/network/interfaces > /etc/network/interfaces;
但是,安装完成后,该/etc/network/interfaces
文件空的(?)...
如果我在安装过程中手动在另一个控制台中执行相同的步骤,我会看到正确的输出/正确的修改文件
但这似乎是 askubuntu.com 的另一个问题。
編輯²:
替换工作现已完美完成 - 再次感谢“muru”!
#!/bin/bash
sDevice=`ip -o link | grep 'link/ether' | grep -oE "^[[:digit:]]:[[:space:]]([[:alnum:]]+)" | cut -d" " -f 2`
sReplaced=`sed s/eth0/$sDevice/g $1`
echo "$sReplaced" > $1
答案1
即使在“late-command”期间,网络接口也不可用。它们在完成自动安装后首次启动时可用。
这就是为什么“ip -o link”如果在预先设定的后期命令期间运行则会为空的原因。
一种方法是创建一个在网络准备就绪后运行的简单 systemd 单元,然后调整接口名称和/或 netplan 配置。
可以放入“/etc/systemd/system”的基本服务示例:
[Unit]
Description=Run Once
After=network-online.target
Requires=network-online.target
[Service]
Type=simple
EnvironmentFile=
ExecStart=/root/runonce.pl
[Install]
WantedBy=multi-user.target
在此示例中,我设置了一个脚本来一次性运行,以便轻松地运行安装后想要运行的一个或多个脚本。相应的 runonce.pl:
#!/usr/bin/perl -w
use strict;
my $folder = "/root/runonce/scripts";
my $donef = "/root/runonce/done";
if( ! -e $donef ) {
mkdir $donef;
}
my $outputf = "/root/runonce/output";
if( ! -e $outputf ) {
mkdir $outputf;
}
opendir( my $dh, $folder );
my @files = readdir( $dh );
closedir( $dh );
for my $file ( @files ) {
next if( $file =~ m/^\.+$/ );
my $full = "$folder/$file";
my $done = "$donef/$file";
my $output = "$outputf/$file";
my $output2 = "$outputf/$file-error";
if( -e $done ) {
unlink $done;
}
chmod "0700", $full;
`$full > $output 2> $output2`;
rename $full, $done;
}
为了从预置中设置所有内容,预置文件的内容如下:
d-i preseed/late_command string \
in-target wget -P /etc/systemd/system/ http://10.0.2.2:8001/kickstart/runonce.service; \
in-target systemctl enable runonce; \
in-target mkdir /root/runonce/scripts; \
in-target wget -P /root/runonce/ http://10.0.2.2:8001/kickstart/runonce.pl; \
in-target chmod +x /root/runonce/runonce.pl; \
in-target wget -P /root/runonce/scripts/ http://10.0.2.2:8001/kickstart/fixnet.pl
您需要调整它以获得获取文件的位置。在此示例中,它查询 Virtualbox 的网关 IP 地址,然后访问在我本地桌面上运行的服务器。
初始安装后运行的示例“fixnet.pl”脚本:
#!/usr/bin/perl -w
use strict;
my @netlines = `ip -o link`;
my $npFile = "/etc/netplan/vbox.yaml";
open( my $npFh, ">$npFile" ) or die "Cannot write to $npFile";
print $npFh "network:\n version: 2\n renderer: networkd\n ethernets:\n";
for my $netline ( @netlines ) {
if( $netline =~ m/(enp[0-9a-z]+)/ ) {
my $interface = $1;
print STDERR "Adding interface $interface to netplan\n";
print $npFh " $interface:\n";
print $npFh " dhcp4: yes\n";
}
}
close $npFh;
`netplan apply`;
exit 0;