저는 v4.19.106 커널과 BeagleBone Black용 BusyBox로 시스템 이미지를 빌드하기 위해 buildroot 2020.02를 사용하고 있습니다. 결과 SD 카드에서 보드를 부팅하면 이상한 동작이 나타납니다. 시스템 로드는 0.60~0.75 사이로 유지되고 CPU 사용량은 1% 미만이며, 이더넷 케이블이 연결되어 있지 않으면 서비스가 실행되지 않습니다. 케이블을 연결하면 부하가 0.00-0.01로 떨어집니다.
케이블을 뽑은 후 다음 줄을 볼 수 있습니다 top -H
.
PID USER TIME+ S WCHAN COMMAND
42 root 0:03.03 D msleep [kworker/0:3+events_power_efficient]
출력 스니펫 ip link
:
4: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 1000
link/ether 4c:3f:d3:91:f2:66 brd ff:ff:ff:ff:ff:ff
출력 스니펫 ifconfig
:
eth0 Link encap:Ethernet HWaddr 4C:3F:D3:91:F2:66
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)
Interrupt:49
케이블을 연결하면 다음 메시지가 표시됩니다.
# [ 3811.689083] cpsw 4a100000.ethernet eth0: Link is Up - 100Mbps/Full - flow control off
그 후에는 프로세스 상태가 D 인 프로세스가 더 이상 없으며 top -H
로드가 떨어집니다.
ip link
케이블 연결 후 출력 스니펫:
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 4c:3f:d3:91:f2:66 brd ff:ff:ff:ff:ff:ff
ifconfig
케이블의 출력 클립을 삽입합니다.
eth0 Link encap:Ethernet HWaddr 4C:3F:D3:91:F2:66
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:66 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:7605 (7.4 KiB) TX bytes:0 (0.0 B)
Interrupt:49
케이블을 뽑으면 높은 부하가 복원됩니다.
내 eth0 구성은 다음과 같습니다 /etc/network/interfaces
.
auto eth0
iface eth0 inet dhcp
을 사용하면 allow-hotplug eth0
시작 시 케이블을 뽑을 때 인터페이스가 계속 작동하지 않지만(부하는 계속 양호하게 유지됨) 케이블을 연결하면 실행 중일 때 표시되지 않습니다 ifup eth0
.
케이블을 뽑았을 때 높은 로딩을 방지하고 케이블을 꽂았을 때 정상적인 연결을 얻으려면 어떻게 해야 합니까? 확인해야 할 커널 구성이나 장치 트리 항목이 있습니까?
고쳐 쓰다:
이 문제는 보드의 기본 구성(beaglebone_defconfig). 그것은 사용한다beagleboard 저장소의 v4.19.79-ti-r30 커널(그리고omap2plus_defconfig).
또 다른 혼란스러운 점은 부팅할 때마다 문제가 나타나지 않는다는 것입니다. 보드가 없는 경우 보드의 전원을 껐다가 켜면 일반적으로 보드가 나타나게 되지만 reboot
반드시 그런 것은 아닙니다. (내가 사용한 방법이 실제로 변화를 가져왔는지, 아니면 제한된 횟수의 시도에서 발생한 것인지는 확실하지 않습니다.)
답변1
이 문제는 BeagleBone Black의 SMSC LAN8710A PHY 칩으로 인해 발생합니다. 절전 모드로 진입하면 케이블이 연결되어 있는지 감지할 수 없습니다. 이 문제를 해결하기 위해 커널 드라이버는 주기적으로 PHY 칩을 깨워 연결을 테스트하며, 이 해결 방법에 대한 자세한 내용은 v3.8.13-bone80(for데비안 7.11) 및 v4.4.9(용데비안 8.4). 새로운 방법은 Linux 커널 v5.6.4에서 여전히 사용되고 있습니다.
msleep
in 에 표시되는 함수는 in top -H
에서 lan87xx_read_status()
호출 됩니다 drivers/net/phy/smsc.c
.
절전 모드를 비활성화하는 플래그를 사용하여 PHY 칩의 노드를 장치 트리에 추가하여 문제를 해결했습니다.
&davinci_mdio {
ethernetphy0: ethernet-phy@0 {
reg = <0>;
smsc,disable-energy-detect;
};
};
( CONFIG_PM
드라이버는 이 동작을 비활성화하는 유일한 방법인 커널 구성 옵션을 무시합니다.)