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=16
kern.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
정말로 커널 코드를 디버그하고 싶다면,
배포판에서 커널을 컴파일하는 방법이나 적어도 배포판에서 특정 모듈을 컴파일하는 방법을 배우십시오.
모듈의 소스 코드를 읽으십시오(디버깅 기능이 어떻게 작동하는지 알려주어야 함).
필요한 경우((2)를 수행한 후에 알 수 있음) 컴파일 타임에 커널 구성을 변경하여 디버깅을 활성화합니다.
$ sudo modprobe e1000e debug=16
kern.log에는 추가 정보가 생성되지 않습니다. 이는 제가 예상하는 것입니다.
잠재적인 함정: 실제로 시도하기 전에 이전 모듈을 삭제했습니까? 삭제되었습니다. 즉, 자동으로 다시 로드되지 않습니까?
NIC는 4초 동안 꺼졌다가 12초 동안 복구된 다음 4초 동안 다시 꺼졌습니다.
추측: 펌웨어(또는 하드웨어)에 문제가 있고 펌웨어가 비공개 소스이고 하드웨어 사양이 없기 때문에 디버깅할 수 없습니다.
답변3
시도해 볼 수 있는 두 가지가 있습니다.
커널 매개변수로 추가하여
pcie_aspm=off
PCIE 비활성화TSO, GSO 및 GRO를 비활성화하려면 와 함께 사용하십시오
ethtool -K eth0 gso off gro off tso off
(자세한 내용은 다음을 참조하십시오).이 버그 보고서).
둘 다 이전 스레드에서 가져온 것이지만 여전히 유효할 수 있습니다.