ubuntu 自动安装界面名称

ubuntu 自动安装界面名称

在 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;

相关内容