문제현상
판다보드에서 리눅스를 부팅한 후, 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하는 부분에서 무한 대기상태로 빠지는 것이었다.
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에 실행되도록 하는 작업
'개발자의 기록 노트 > Embedded Linux' 카테고리의 다른 글
[네트워크/프로토콜] BOOTP 에 대해서. BOOTP 패킷 형식(BOOTP Packet Format) (0) | 2017.05.07 |
---|---|
[네트워크/프로토콜] BOOTP 에 대해서. BOOTP 클라이언트/서버의 메세지전송과 주소설정 방법 (0) | 2017.05.07 |
eth0 에 고정 IP 주소할당하기(static IP address) (0) | 2017.01.18 |
Kernel command line 보는 방법 (0) | 2017.01.05 |
[네트워크/프로토콜] BOOTP 에 대해서. BOOTP란? BOOTP 특성? (1) | 2016.12.30 |
PandaBoard ES : 부팅용 SD card 준비 (0) | 2016.12.16 |