제임스딘딘의
Tech & Life

개발자의 기록 노트/Embedded Linux

[임베디드/판다보드] Networking Interface Initialize

제임스-딘딘 2017. 1. 10. 21:33


문제현상

판다보드에서 리눅스를 부팅한 후, ifconfig로 확인해보면 'lo' 라고 표시되는 loopback interface (127.0.0.1) 만 bring up되고, eth0(ethernet)과 wlan0(Wi-Fi interface)는 자동으로 bring up되지 않는다.

'ifconfig up wlan0', 'ifconfig up eth0' 을 사용해서 커맨드라인에서 수동으로 bring up 을 해보면, 정상적으로 bring up 되는 것을 확인했다.


부팅시퀀스에서 bring up 되도록 하는 방법이 있을 텐데 비활성화 되어 있는 것 같다.

어느 부분을 수정해야 하는지 내가 모르고 있는 것 같아서, 찾아보았다.


해결


우선 판다보드의 네트워크 인터페이스를 확인해보았다.


root@arm:~# ls -l /sys/class/net/

total 0

lrwxrwxrwx 1 root root 0 Feb 11 16:28 eth0 -> ../../devices/platform/44000000.ocp/4a064000.usbhshost/4a064c00.ehci/usb1/1-1/1-1.1/1-1.1:1.0/net/eth0

lrwxrwxrwx 1 root root 0 Feb 11 16:28 lo -> ../../devices/virtual/net/lo

lrwxrwxrwx 1 root root 0 Feb 11 16:28 wlan0 -> ../../devices/platform/44000000.ocp/480d5000.mmc/mmc_host/mmc1/mmc1:0001/mmc1:0001:2/wl12xx.2.auto/net/wlan0




wlan0와 eth0는 존재하는걸 확인했다.

Wi-Fi를 위한 firmware는 rootfs만드는 과정에서 미리 /lib/firmware/ti-connectivity 에 받아 두었으므로 따로 준비할 필요는 없는 상황이다.


root@arm:~# ls -l /lib/firmware/ti-connectivity/

total 8792

-rw-r--r-- 1 root root  48909 Sep 18  2016 TIInit_7.2.31.bts

-rw-r--r-- 1 root root 194180 Apr 25  2016 wl1251-fw.bin

-rw-r--r-- 1 root root    752 Apr 25  2016 wl1251-nvs.bin

-rw-r--r-- 1 root root 273880 Sep 18  2016 wl1271-fw-2.bin

-rw-r--r-- 1 root root 272836 Sep 18  2016 wl1271-fw-ap.bin

-rw-r--r-- 1 root root 271832 Sep 18  2016 wl1271-fw.bin

lrwxrwxrwx 1 root root     14 Jul 21  2016 wl1271-nvs.bin -> wl127x-nvs.bin

-rw-r--r-- 1 root root 280388 Sep 18  2016 wl127x-fw-3.bin

-rw-r--r-- 1 root root 260852 Apr 25  2016 wl127x-fw-4-mr.bin

-rw-r--r-- 1 root root 261892 Apr 25  2016 wl127x-fw-4-plt.bin

-rw-r--r-- 1 root root 276684 Apr 25  2016 wl127x-fw-4-sr.bin

-rw-r--r-- 1 root root 354600 Apr 25  2016 wl127x-fw-5-mr.bin

-rw-r--r-- 1 root root 352588 Apr 25  2016 wl127x-fw-5-plt.bin

-rw-r--r-- 1 root root 370996 Apr 25  2016 wl127x-fw-5-sr.bin

-rw-r--r-- 1 root root 267496 Sep 18  2016 wl127x-fw-plt-3.bin

-rw-r--r-- 1 root root    912 Jul 21  2016 wl127x-nvs.bin

-rw-r--r-- 1 root root 284784 Sep 18  2016 wl128x-fw-3.bin

-rw-r--r-- 1 root root 264904 Apr 25  2016 wl128x-fw-4-mr.bin

-rw-r--r-- 1 root root 269424 Apr 25  2016 wl128x-fw-4-plt.bin

-rw-r--r-- 1 root root 284156 Apr 25  2016 wl128x-fw-4-sr.bin

-rw-r--r-- 1 root root 359140 Apr 25  2016 wl128x-fw-5-mr.bin

-rw-r--r-- 1 root root 360452 Apr 25  2016 wl128x-fw-5-plt.bin

-rw-r--r-- 1 root root 378988 Apr 25  2016 wl128x-fw-5-sr.bin

-rw-r--r-- 1 root root 265460 Sep 18  2016 wl128x-fw-ap.bin

-rw-r--r-- 1 root root 273324 Sep 18  2016 wl128x-fw.bin

-rw-r--r-- 1 root root 271932 Sep 18  2016 wl128x-fw-plt-3.bin

-rw-r--r-- 1 root root   1113 Jul 21  2016 wl128x-nvs.bin

lrwxrwxrwx 1 root root     14 Jul 21  2016 wl12xx-nvs.bin -> wl127x-nvs.bin

-rw-r--r-- 1 root root 639276 Apr 25  2016 wl18xx-fw-2.bin

-rw-r--r-- 1 root root 673328 Apr 25  2016 wl18xx-fw-3.bin

-rw-r--r-- 1 root root 745228 Dec 31  2016 wl18xx-fw-4.bin

-rw-r--r-- 1 root root 413860 Sep 18  2016 wl18xx-fw.bin




우선 interface 파일을 확인해보았다.


root@arm:~# ls -l /etc/network/interfaces

-rw-r--r-- 1 root root 261 Feb 11 16:32 /etc/network/interfaces

root@arm:~# cat /etc/network/interfaces

# interfaces(5) file used by ifup(8) and ifdown(8)

# Include files from /etc/network/interfaces.d:

source-directory /etc/network/interfaces.d


auto lo

iface lo inet loopback




'lo' 인터페이스에 대해서만 설정되고 있는 것이 보인다.

이 파일을 열고 eth0와 wlan0에 대한 내용을 추가했다.


root@arm:~# cat /etc/network/interfaces

# interfaces(5) file used by ifup(8) and ifdown(8)

# Include files from /etc/network/interfaces.d:

source-directory /etc/network/interfaces.d


auto lo

iface lo inet loopback


allow-hotplug eth0

iface eth0 inet manual


allow-hotplug wlan0

iface wlan0 inet dhcp




재부팅을 한 후 ifconfig로 확인해보면 아래와 같이 추가된 인터페이스를 확인 할 수 있다.


root@arm:~# ifconfig

eth0      Link encap:Ethernet  HWaddr 8e:16:3e:3d:2b:e5

          UP BROADCAST MULTICAST  MTU:1500  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)


lo        Link encap:Local Loopback

          inet addr:127.0.0.1  Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          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:1

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)


wlan0     Link encap:Ethernet  HWaddr de:ad:be:ef:00:00

          UP BROADCAST MULTICAST  MTU:1500  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)



작업하면서 시행착오를 겪은 부분이 있는데,

allow-hotplug가 아닌 auto eth0, auto wlan0 로 추가를 했더니, 부팅과정에서 커널 로드 후 systemd가 각 service 파일을 차례로 시작하다가 interface up하는 부분에서 무한 대기상태로 빠지는 것이었다.


문득, interface up을 담당하는 service가 어떤건지 궁금해졌다.
현재 판다보드에서 동작중인 리눅스는 ubuntu 16.04 이다.
정확하게 어떤 버전부터인지는 모르겠으나 ubuntu 16.04는 기존의 init.d script를 systemd로 대체한 것으로 보인다.

root@arm:~# ls -l /sbin/init
lrwxrwxrwx 1 root root 20 Sep  7  2016 /sbin/init -> /lib/systemd/systemd


systemd에 대한 자세한 내용은 다른 포스팅에서 다루어 보고자 한다.
일단, systemd는 커맨드라인에서 인터페이스 툴을 제공해 주고 있는데, 그 이름은 'systemctl' 이다.
이 툴을 사용해서 networking service 에 대한 정보를 확인해보았다.

root@arm:~# systemctl cat networking
# /lib/systemd/system/networking.service
[Unit]
Description=Raise network interfaces
Documentation=man:interfaces(5)
DefaultDependencies=no
Wants=network.target
After=local-fs.target network-pre.target apparmor.service systemd-sysctl.service
Before=network.target shutdown.target network-online.target
Conflicts=shutdown.target

[Install]
WantedBy=multi-user.target
WantedBy=network-online.target

[Service]
Type=oneshot
EnvironmentFile=-/etc/default/networking
ExecStartPre=-/bin/sh -c '[ "$CONFIGURE_INTERFACES" != "no" ] && [ -n "$(ifquery
ExecStart=/sbin/ifup -a --read-environment
ExecStop=/sbin/ifdown -a --read-environment
RemainAfterExit=true
TimeoutStartSec=5min

# /run/systemd/generator/networking.service.d/50-insserv.conf-$network.conf
# Automatically generated by systemd-insserv-generator

[Unit]
Wants=network.target
Before=network.target


systemctl cat 은 각 service unit의 동작방식을 정의한 파일의 내용을 보여주는 명령이다.

간단히 설명 부분만 확인해보면, 'Raise network interfaces' , 찾았다 요놈.

네트워크 인터페이스를 올려주는 놈이란다.

내가 찾던 놈이구만.


Type=oneshot 인 걸로 봐서, 부팅될 때 한번만 실행 하고 끝내는 놈이지 싶다.

확인해봐야지.

networking service상태에 대해 살펴보자.


root@arm:~# systemctl status networking

● networking.service - Raise network interfaces

   Loaded: loaded (/lib/systemd/system/networking.service; enabled; vendor prese

  Drop-In: /run/systemd/generator/networking.service.d

           └─50-insserv.conf-$network.conf

   Active: active (exited) since Thu 2016-02-11 16:28:07 UTC; 27min ago

     Docs: man:interfaces(5)

  Process: 284 ExecStart=/sbin/ifup -a --read-environment (code=exited, status=0

  Process: 262 ExecStartPre=/bin/sh -c [ "$CONFIGURE_INTERFACES" != "no" ] && [

 Main PID: 284 (code=exited, status=0/SUCCESS)

   CGroup: /system.slice/networking.service


Feb 11 16:28:05 arm systemd[1]: Starting Raise network interfaces...

Feb 11 16:28:07 arm systemd[1]: Started Raise network interfaces.


자세히는 모르겠지만, 대충 살펴보면, load 되었고, active 상태인데, exited 상태이기도 하다.

그 아래를 보면, 284 PID를 갖는 process로 /sbin/ifup 을 실행 했던 것으로 보인다.

argument로 --read-environment 라는게 있는 걸로 보아, 뭔가 환경변수나 환경설정을 읽어서 interface up 을 했을 것으로 추정된다.


좋아, 다시 보자.

'systemctl cat networking' 을 통해 확인 했던 부분중에,

EnvironmentFile=-/etc/default/networking 라는 부분이 있는 것을 발견했다.


root@arm:~# cat /etc/default/networking

# Configuration for networking init script being run during

# the boot sequence


# Set to 'no' to skip interfaces configuration on boot

#CONFIGURE_INTERFACES=yes


# Don't configure these interfaces. Shell wildcards supported/

#EXCLUDE_INTERFACES=


# Set to 'yes' to enable additional verbosity

#VERBOSE=no


별다른 내용은 없는데, 주석들을 읽어보면, boot sequence 동안에 실행되는 networking init script의 설정파일쯤 되는놈인것 같다.

그런데 죄다 주석처리되어서, 딱히 하는 일은 없는 것으로 보인다.

OK. 이놈은 통과..


현재 내가 궁금한 것은 '/etc/network/interfaces' 이놈을 누가 읽는가 하는 부분인데.

ifup이 읽는 default 파일인 것으로 추정된다.. 

ifup --help 로 확인해보면 아래와 같다.


root@arm:/lib/systemd/system# ifup --help

Usage: ifup <options> <ifaces...>


Options:

        -h, --help             this help

        -V, --version          copyright and version information

        -a, --all              process all interfaces marked "auto"

        --allow CLASS          ignore non-"allow-CLASS" interfaces

        -i, --interfaces FILE  use FILE for interface definitions

        -X, --exclude PATTERN  exclude interfaces from the list of

                               interfaces to operate on by a PATTERN

        -n, --no-act           print out what would happen, but don't do it

                               (note that this option doesn't disable mappings)

        -v, --verbose          print out what would happen before doing it

        -o OPTION=VALUE        set OPTION to VALUE as though it were in

                               /etc/network/interfaces

        --no-mappings          don't run any mappings

        --no-scripts           don't run any hook scripts

        --no-loopback          don't act specially on the loopback device

        --force                force de/configuration

        --ignore-errors        ignore errors


-a 옵션은 'auto' 로 표시된 모든 인터페이스를 처리한다는 옵션이다.

--read-environment 라는 옵션은 없다.


또한 설명에 /etc/network/interfaces 에 대한 내용이 있는 걸로 미루어 봐서, interface 정의 하는 default 파일경로인 것 같다.


Next Action Item

이제 해보려는 작업은 두가지다.

1. eth0 에 '192.168.1.1' 이라는 ip를 boot argument로 설정되도록 하는 작업 ( 바로가기 )

2. wlan0 와 연동해서 Wi-Fi stack (wpa-supplicant)을 booting time에 실행되도록 하는 작업