내장된 장치가 네트워크의 어떤 항목에도 ping을 수행할 수 없습니다.

내장된 장치가 네트워크의 어떤 항목에도 ping을 수행할 수 없습니다.

커널 버전 3.6.11로 busybox를 실행하는 buildroot로 구축된 임베디드 장치가 있습니다. 커널은 완전히 기본 옵션으로 구축되었습니다. 네트워크 담당자가 지정한 IP, 게이트웨이, 넷마스크 등에 따라 장치를 구성하고 해당 값을 /etc/network/interfaces 파일에 넣었습니다. 시스템이 시작되었을 때 전화 한 통으로 ifconfig모든 네트워크 설정이 정상적으로 되어 있다고 알려 주었습니다. 그러나 장치와 동일한 서브넷에 있는 다른 컴퓨터에는 ping을 실행할 수 없습니다. 직접 이더넷 케이블 연결을 통해 호스트와 통신할 수 있으므로 네트워크 어댑터가 정상이라고 가정합니다. ssh호스트에 연결할 수 있고 호스트는 vsftpd내가 설치한 장치에서 대상을 올바르게 봅니다. 기본적으로 문제 진단을 어떻게 진행해야 할지 잘 모르겠습니다. 인터넷 포럼 Linux 네트워크 설정 가이드에 몰두했지만 아무것도 찾지 못했습니다. 그리고 걱정스럽게 타이핑을 할때

# ip addr show dev eth0

libuClibc-0.9.33.2.so에서 세그폴트에 대한 보고를 받았습니다. 나는 buildroot를 사용하여 이 모든 것을 구축했고 모든 것이 성공했다고 보고했습니다. 내 커널이 손상되었을 가능성이 있나요? 진행 방법을 잘 모르므로 조언을 주시면 대단히 감사하겠습니다.

편집하다의 출력은 ip addr show dev eth0다음과 같습니다

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen
    1000 link/ether 00:18:7d:19:a0:d8 brd ff:ff:ff:ff:ff:ff
    inet 172.18.255.212/24 brd 172.18.255.255 scope global eth0
[  331.700545] ip[951]: segfault at 0 ip b76e1f26 sp bfbd29b0 error 4 in 
libuClibc-0.9.33.2.so[b76b5000+4d000]
Segmentation fault

다른 어댑터인 eth1에서 동일한 명령을 호출하면 세그폴트가 발생하지 않으므로 실제로 무슨 일이 일어나고 있는지 알 수 없습니다.

편집 2디버그 정보를 사용하여 재구축한 후 stracesegfault에 대한 strace 출력을 얻을 수 있었습니다. 그게 무슨 뜻인지는 잘 모르겠습니다만, 쓰지 말아야 할 위치에 쓰려고 하는 것처럼 보입니다. 모두 포함하지 말고 마지막 몇 줄만 포함하세요).

socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 4
ioctl(4, SIOCGIFTXQLEN, {ifr_name="eth1", ifr_qlen=1000}) = 0
close(4)                                = 0
write(1, "3: eth1: <BROADCAST,MULTICAST,UP"..., 793: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
) = 79
write(1, "    link/ether 00:18:7d:19:a0:d7"..., 55    link/ether 00:18:7d:19:a0:d7 brd ff:ff:ff:ff:ff:ff
) = 55
open("/etc/iproute2/rt_scopes", O_RDONLY) = 4
ioctl(4, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0xbfc91b30) = -1 ENOTTY (Inappropriate ioctl for device)
read(4, "#\n# reserved values\n#\n0\tglobal\n2"..., 4096) = 92
read(4, "", 4096)                       = 0
close(4)                                = 0
write(1, "    inet 192.168.12.198/16 brd 1"..., 65    inet 192.168.12.198/16 brd 192.168.255.255 scope global eth1
) = 65
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0} ---
+++ killed by SIGSEGV +++
Segmentation fault

답변1

분할 오류 문제를 해결했으며 나중에 비슷한 문제가 발생할 경우를 대비해 여기에 문제를 문서화하겠습니다. 나는 다음과 같은 전화를 걸 때

 ip -f inet addr show dev eth0

바꾸다

 ip inet addr show dev eth0

그러면 세그폴트가 발생하지 않지만 여전히 발생합니다.

 ip -f inet6 addr show dev eth0

이로 인해 내 툴체인이나 비지박스 어딘가에 IPv6 지원과 호환되지 않는 부분이 있다는 결론을 내릴 수 있었습니다. 저는 buildroot 구성 파일을 사용하여 전체 타겟, 툴체인, 커널 및 uClibc를 처음부터 다시 재구축했으며, 이번에는 크로스 툴이 IPV6 지원으로 생성되었는지 확인했습니다. 이 옵션을 설정하면 보고된 세그폴트가 더 이상 발생하지 않습니다.

관련 정보