네트워크 카드 링크가 계속해서 올라가거나 내려가는 이유 디버깅

네트워크 카드 링크가 계속해서 올라가거나 내려가는 이유 디버깅

Ubuntu Intel NUC에서 이더넷 링크가 다운되었다가 다시 나타나는 문제를 발견했습니다. 이는 NIC가 4초 동안 꺼졌다가 12초 동안 켜졌다가 다시 4초 동안 꺼지는 일반 모드입니다.
이것가능한물리적인 손상이 있을 수 있는 일인데 네트워크카드가 일체형이라 교체가 안되네요. 분명히 값비싼 부품을 교체하기 전에 이를 확인하고 싶습니다.

커널 모듈을 제거했다가 다시 삽입하면 kern.log에 다음 출력이 나타납니다. 이는 마지막 몇 줄을 제외하면 정상적인 현상입니다.

kernel: [ 1299.003606] e1000e: Intel(R) PRO/1000 Network Driver - 3.2.6-k
kernel: [ 1299.003608] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
kernel: [ 1299.004140] e1000e 0000:00:1f.6: Interrupt Throttling Rate (ints/sec) set to dynamic conservative mode
kernel: [ 1299.216578] e1000e 0000:00:1f.6 0000:00:1f.6 (uninitialized): registered PHC clock
kernel: [ 1299.288105] e1000e 0000:00:1f.6 eth0: (PCI Express:2.5GT/s:Width x1) 94:c6:91:a7:78:3f
kernel: [ 1299.288112] e1000e 0000:00:1f.6 eth0: Intel(R) PRO/1000 Network Connection
kernel: [ 1299.288256] e1000e 0000:00:1f.6 eth0: MAC: 13, PHY: 12, PBA No: FFFFFF-0FF
kernel: [ 1299.293482] e1000e 0000:00:1f.6 eno1: renamed from eth0
kernel: [ 1304.424541] e1000e 0000:00:1f.6 eno1: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx
kernel: [ 1304.424696] IPv6: ADDRCONF(NETDEV_CHANGE): eno1: link becomes ready
kernel: [ 1325.609674] e1000e 0000:00:1f.6 eno1: NIC Link is Down
kernel: [ 1330.702483] e1000e 0000:00:1f.6 eno1: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx

내가 시도한 것들:

  • 케이블 교체
  • 연결된 허브의 포트를 변경했습니다. (동일 허브의 다른 컴퓨터에는 문제가 없었습니다.)
  • BIOS 업데이트
  • 이전 커널로 돌아가기
  • 디버그 매개변수를 사용하여 모듈을 로드해 보세요.

모듈 정보를 보면 $ modinfo e1000e출력에서 ​​디버그 매개변수를 볼 수 있습니다.

parm:           debug:Debug level (0=none,...,16=all) (int)

그러나 예를 들어 modprobe 또는 insmod를 실행하십시오. $ sudo modprobe e1000e debug=16kern.log에는 추가 정보가 생성되지 않습니다. 이는 제가 예상하는 것입니다.

다음에 어디로 가야할지 잘 모르겠습니다. 누군가 모듈에서 디버그 정보를 얻지 못하는 이유를 말해 줄 수 있다면 좋은 시작이 될 것이며 추가 정보도 크게 감사하겠습니다.

답변1

새 커널을 설치했지만 좋은 소식은 그렇게 할 필요가 없다는 것입니다. 디버깅 정보를 얻는 방법에 대해 몇 가지 상충되는 정보가 있지만 그 비밀은 동적 디버깅을 올바르게 구성하는 데 있습니다.

먼저 e1000e의 각 디버그 메시지를 커널 debugFS에 덤프합니다.

echo "module e1000e +flmpt" > /sys/kernel/debug/dynamic_debug/control

모듈이 로드된 후에 이 작업을 수행해야 한다는 것을 알았습니다. /sys/kernel/debug/dynamic_debug/control을 사용하여 이 명령을 기반으로 수정되는 방법을 확인할 수 있습니다. 바라보다https://www.kernel.org/doc/html/v4.11/admin-guide/dynamic-debug-howto.html더 많은 정보를 알고 싶다면

이 방법으로 커널 로깅을 활성화할 수도 있지만 echo 8 > /proc/sys/kernel/printk위의 동적 디버그 제어 설정을 수정하기 전까지는 이 기능이 작동하지 않는 것 같았습니다. 이 방법은 모듈이 로드될 때 정보도 제공하는 것으로 생각되지만 아직 살펴보지는 않았습니다.

그러면 두 가지 디버깅 정보 세트가 생성됩니다. kern.log에는 이제 많은 디버그 정보가 있으며 cat /proc/kmsg둘 다 동일한 정보를 표시하는 것 같습니다.

답변2

정말로 커널 코드를 디버그하고 싶다면,

  1. 배포판에서 커널을 컴파일하는 방법이나 적어도 배포판에서 특정 모듈을 컴파일하는 방법을 배우십시오.

  2. 모듈의 소스 코드를 읽으십시오(디버깅 기능이 어떻게 작동하는지 알려주어야 함).

  3. 필요한 경우((2)를 수행한 후에 알 수 있음) 컴파일 타임에 커널 구성을 변경하여 디버깅을 활성화합니다.

$ sudo modprobe e1000e debug=16kern.log에는 추가 정보가 생성되지 않습니다. 이는 제가 예상하는 것입니다.

잠재적인 함정: 실제로 시도하기 전에 이전 모듈을 삭제했습니까? 삭제되었습니다. 즉, 자동으로 다시 로드되지 않습니까?

NIC는 4초 동안 꺼졌다가 12초 동안 복구된 다음 4초 동안 다시 꺼졌습니다.

추측: 펌웨어(또는 하드웨어)에 문제가 있고 펌웨어가 비공개 소스이고 하드웨어 사양이 없기 때문에 디버깅할 수 없습니다.

답변3

시도해 볼 수 있는 두 가지가 있습니다.

  • 커널 매개변수로 추가하여 pcie_aspm=offPCIE 비활성화

  • TSO, GSO 및 GRO를 비활성화하려면 와 함께 사용하십시오 ethtool -K eth0 gso off gro off tso off(자세한 내용은 다음을 참조하십시오).이 버그 보고서).

둘 다 이전 스레드에서 가져온 것이지만 여전히 유효할 수 있습니다.

관련 정보