【问题标题】:systemd boot: Apply IP address for eth0 from U-Boot environment?systemd boot:从 U-Boot 环境中为 eth0 应用 IP 地址?
【发布时间】:2019-12-07 15:19:28
【问题描述】:

我有一个使用 systemd 的基于 yocto 的嵌入式 Linux 系统。 U-Boot/coreboot 用于引导系统。 U-Boot 环境中存储有 IP 地址 ...

=> printenv ipaddr
ipaddr=192.168.0.100

...以及在 systemd 的 /lib/systemd/network/wired.network 中:

[Match]
Name=eth0

[Network]
Address=192.168.0.100/24

.

为了测试多个设备,我需要更改 IP 地址,因为多个设备同时连接到网络。

每次都更改 systemd 网络文件是不可取的,因为在更新后(使用完整的 rootfs 映像,以及 systemd 配置),它将被重置为默认值。 所以我的想法是通过内核命令行向 Linux 内核提供 U-Boot IP 地址,正如我之前在其他设备上看到的那样。 不幸的是,我无法在 systemd 上找到有关如何执行此操作的信息,我找到的所有示例都在 System V 上。

我的方法是增强原始(本例中为 NFS)启动 cmdline:

# cat /proc/cmdline
console=ttyS4,115200 rootwait rw loglevel=1 macaddress=02:00:00:FF:FF:FF root=/dev/nfs nfsroot=192.168.0.1:/srv/nfs/192.168.0.100,v3 ip=192.168.0.100:192.168.0.1:192.168.0.1:255.255.255.0::eth0:off

通过附加 systemd.setenv=ipaddr=192.168.0.100ipaddr=192.168.0.100 之类的内容,并在 systemd 网络配置中引用此内容:

[Match]
Name=eth0

[Network]
Address=${ipaddr}/24

.

但是,这并没有显示出预期的结果,我所取得的只是一个系统挂起:

[  OK  ] Started System Logger Daemon.
[  OK  ] Started Network Service.
[  OK  ] Started Login Service.
[  OK  ] Started Resetting boot counter.
[  OK  ] Started Bluetooth service.
[  OK  ] Reached target Bluetooth.
[  OK  ] Started Usermode Init Manager for TI Shared Transport line discipline.
         **Starting Wait for Network to be Configured...**
[  OK  ] Started Thermal Daemon Service.
         Starting Hostname Service...

系统版本是: systemd 234 -PAM -AUDIT -SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP -LIBCRYPTSETUP -GCRYPT -GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID -ELFUTILS +KMOD -IDN2 -IDN default-hierarchy=hybrid

谁能告诉我,这是否可能?如果,如何排序?任何提示都会有所帮助。

【问题讨论】:

    标签: systemd boot u-boot


    【解决方案1】:

    找到解决方案:

    正如systemd-networkd(8) 所说:

    任何与 .network 文件之一不匹配的链接都将被忽略。 [...] 当 systemd-networkd 退出时,它通常会留下现有的 网络设备和配置完好无损。这使得可以 从 initramfs 转换并重新启动服务 断开连接。

    正如Xypron 所指出的,内核使用ip= 命令行参数来配置我已经提供的网络接口。 这意味着,通过 systemd 完全不重新配置界面就足够了!

    只需删除网络配置即可。 但是,如果未提供 ip= 参数(在默认的 U-Boot 配置中,从 mmc 启动时),我们应该为 eth0 接口提供默认值。 我们可以通过删除文件来实现这一点,而是设置KernelCommandLine=条件:

    cat <<"EOF" > /lib/systemd/network/wired.network
    [Match]
    Name=eth0
    KernelCommandLine=!ip
    
    [Network]
    Address=192.168.0.100/24
    EOF
    

    这就是大家...

    【讨论】:

      【解决方案2】:

      可以通过Linux内核命令行https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/filesystems/nfs/nfsroot.txt#n82中的ip=参数设置网络地址。

      U-Boot 使用变量 bootargs 来设置内核命令行。

      所以你只需要使用 U-Boot ip-address 来更新 bootargs。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-19
        • 2011-06-02
        • 1970-01-01
        • 2016-08-27
        • 2020-02-20
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        相关资源
        最近更新 更多