Bootstrap

从零开始学习 sg200x 多核开发之 eth0 自动使能并配置静态IP

前文提到 sophpi 默认没有使能有线网络,需要手工配置:

[root@sg200x]~# ifconfig eth0 up
[root@sg200x]~# udhcpc -i eth0
[root@sg200x]~# ifconfig 
eth0      Link encap:Ethernet  HWaddr EA:BD:18:08:1E:87  
          inet addr:192.168.188.142  Bcast:192.168.188.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:175 errors:0 dropped:97 overruns:0 frame:0
          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:51162 (49.9 KiB)  TX bytes:684 (684.0 B)
          Interrupt:21 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

本文将介绍如何通过配置文件启动自动使能有线网络。

/etc/inittab 文件

在 buildroot 文件系统目录 /etc/inittab 文件中,定义了系统启动后执行的脚本程序。文件内容如下:

# /etc/inittab
#
# Copyright (C) 2001 Erik Andersen <[email protected]>
#
# Note: BusyBox init doesn't support runlevels.  The runlevels field is
# completely ignored by BusyBox init. If you want runlevels, use
# sysvinit.
#
# Format for each entry: <id>:<runlevels>:<action>:<process>
#
# id        == tty to run on, or empty for /dev/console
# runlevels == ignored
# action    == one of sysinit, respawn, askfirst, wait, and once
# process   == program to run

# Startup the system
::sysinit:/bin/mount -t proc proc /proc
::sysinit:/bin/mount -o remount,rw /
::sysinit:/bin/mkdir -p /dev/pts /dev/shm
::sysinit:/bin/mount -a
::sysinit:/sbin/swapon -a
null::sysinit:/bin/ln -sf /proc/self/fd /dev/fd
null::sysinit:/bin/ln -sf /proc/self/fd/0 /dev/stdin
null::sysinit:/bin/ln -sf /proc/self/fd/1 /dev/stdout
null::sysinit:/bin/ln -sf /proc/self/fd/2 /dev/stderr
::sysinit:/bin/hostname -F /etc/hostname
# now run any rc scripts
::sysinit:/etc/init.d/rcS

# Put a getty on the serial port
# console::respawn:/sbin/getty -L  console 0 vt100 # GENERIC_SERIAL
console::respawn:/sbin/getty -L  console 115200 vt100 -n -l /usr/local/bin/autologin

# Stuff to do for the 3-finger salute
#::ctrlaltdel:/sbin/reboot

# Stuff to do before rebooting
::shutdown:/etc/init.d/rcK
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount -a -r

可以看到,系统启动后会执行 /etc/init.d/rcS 脚本程序,该脚本程序会执行 /etc/init.d/ 目录下的所有脚本程序。

/etc/init.d

在系统目录 /etc/init.d/ 下的脚本用于管理系统服务的启动和停止,而 /etc/profile.d/ 目录下的脚本用于配置用户的环境变量和初始化,它们会在用户登录时被执行。

因此,在系统启动过程中,/etc/init.d/ 目录下的脚本会比 /etc/profile.d/ 目录下的脚本先执行。/etc/init.d/ 中的脚本用于启动、停止、重启系统服务,而 /etc/profile.d/ 中的脚本用于配置用户环境。

/etc/init.d/ 目录下有两个脚本程序 rcS 和 rcK。

  • rcS 是系统开机后执行的脚本,名称中的 S 是 Start 的意思。
  • rcK 是系统收到关机命令后执行的脚本,名称中的 K 是 Kill 的意思。

/etc/init.d/rcS 脚本程序内容如下:

#!/bin/sh


# Start all init scripts in /etc/init.d
# executing them in numerical order.
#
for i in /etc/init.d/S??* ;do

     # Ignore dangling symlinks (if any).
     [ ! -f "$i" ] && continue

     case "$i" in
        *.sh)
            # Source shell script for speed.
            (
                trap - INT QUIT TSTP
                set start
                . $i
            )
            ;;
        *)
            # No sh extension, so fork subprocess.
            $i start
            ;;
    esac
done

查看 /etc/init.d/rcS 里面会执行启动脚本,文件里面的数字 number 决定执行的顺序 .S 后面的数字表示启动的顺序,数字小的先启动。比如 “S20urandom” 会比"S40network" 先启动。

S40network

在 buildroot 文件系统目录 /etc/init.d/ 下的 S40network 脚本程序用于启动网络服务,文件内容如下:

#!/bin/sh
#
# Start the network....
#

# Debian ifupdown needs the /run/network lock directory
mkdir -p /run/network

case "$1" in
  start)
        printf "Starting network: "
        /sbin/ifup -a
        [ $? = 0 ] && echo "OK" || echo "FAIL"
        ;;
  stop)
        printf "Stopping network: "
        /sbin/ifdown -a
        [ $? = 0 ] && echo "OK" || echo "FAIL"
        ;;
  restart|reload)
        "$0" stop
        "$0" start
        ;;
  *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
esac

exit $?

ifup 和 ifdown

ifup/ifdown 是一个用于管理网络接口的工具,它可以在系统启动时自动启动网络接口,并在系统关机时自动停止网络接口,可以通过配置文件来指定哪些网络接口需要启动,以及启动时的参数。

ifup/ifdown 的配置文件通常位于 /etc/network/interfaces 文件中。

ifup/ifdown 的使用方法如下:

ifup [interface]  # 启动指定的网络接口
ifdown [interface]  # 停止指定的网络接口
  • 启动指定的网络接口
$ ifup eth0
  • 启动所有网络接口
$ ifup -a
  • 停止指定的网络接口
$ ifdown eth0
  • 停止所有网络接口
$ ifdown -a
  • 可以使用 -v 选项来查看详细的启动/停止过程
$ ifup -v eth0
$ ifdown -v eth0

/etc/network/interfaces

/etc/network/interfaces 文件包含了网络接口的配置信息,例如接口的名称、IP 地址、子网掩码、网关等。ifup和ifdown命令会根据这些配置来启动或关闭接口。
在 sophpi 系统中,/etc/network/interfaces 文件内容如下:

# interface file auto-generated by buildroot

auto lo
iface lo inet loopback

在这个例子中,lo 接口被配置为回环接口,并指定了 inet loopback 类型。这里没有配置其他网络接口,因此系统启动后只有一个回环接口可用。

[root@sg200x]~# ifconfig
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

配置 eth0 静态IP

在 sophpi 系统中,可以通过修改 /etc/network/interfaces 文件来配置 eth0 接口的静态IP地址。

auto eth0
iface eth0 inet static
    address 192.168.188.190
    netmask 255.255.255.0
    gateway 192.168.188.1

重新系统后,再次使用 ifconfig 命令查看网络接口信息,可以看到 eth0 接口已经配置为静态IP地址。

[root@sg200x]~# ifconfig
eth0      Link encap:Ethernet  HWaddr D6:16:B6:DA:30:3C  
          inet addr:192.168.188.190  Bcast:0.0.0.0  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:21 errors:0 dropped:6 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:2584 (2.5 KiB)  TX bytes:0 (0.0 B)
          Interrupt:21 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

在这个例子中,eth0 接口被配置为静态IP地址,并指定了子网掩码、网关和DNS服务器。此时可以是用 ping 命令测试网络连接是否正常。

[root@sg200x]~# ping 192.168.188.1
PING 192.168.188.1 (192.168.188.1): 56 data bytes
64 bytes from 192.168.188.1: seq=0 ttl=64 time=1.081 ms
64 bytes from 192.168.188.1: seq=1 ttl=64 time=0.965 ms
64 bytes from 192.168.188.1: seq=2 ttl=64 time=0.890 ms

--- 192.168.188.1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.890/0.978/1.081 ms

下面是对常用网络接口配置参数的详细解读:

  • auto
    含义:指定系统在启动时是否自动激活该网络接口。
    用法:通常在配置文件中为每个网络接口定义一行 auto 语句,接着是相应的网络接口名称。如果设置为 auto ,则表示在系统启动时会自动激活该网络接口;如果设置为 allow-hotplug ,则表示仅在接口插入时才激活。

  • iface
    含义:定义一个网络接口的配置块。
    用法:以 iface 关键字开始,后跟网络接口的名称(如 eth0、enp0s3 等),然后是接口的配置信息。

  • address
    含义:设置接口的IP地址。
    用法:在 iface 配置块中使用 address 关键字,后跟要分配给接口的IP地址。可以是IPv4地址或IPv6地址。

  • netmask
    含义:设置接口的子网掩码。
    用法:在 iface 配置块中使用 netmask 关键字,后跟接口的子网掩码。子网掩码用于确定IP地址中哪些位用于网络标识,哪些位用于主机标识。

  • gateway
    含义:设置接口的默认网关。
    用法:在 iface 配置块中使用 gateway 关键字,后跟接口的默认网关的IP地址。默认网关用于将非本地网络的数据包转发到 Internet 或其他网络。

;