방금 Intel I219-V 네트워크 어댑터가 있는 시스템에 FreeBSD(11.0-RELEASE-p1)를 설치했습니다. 이 FreeBSD 버전에는 em v7.6.1이 있습니다. (제 생각에는... 아마도 EEPROM 체크섬 오류일까요? 계속 읽으세요...) 이 네트워크 칩셋을 지원하지 않으므로 v7.6.2 업데이트 버전을 찾았습니다.인텔 웹사이트에서.
Readme에 따라 다음과 같이 설치했습니다.
- 압축 해제/압축 해제
make
make install
if_em_load="YES"
/boot/loader.conf에 추가ifconfig_em0="DHCP"
/etc/rc.conf에 추가
재부팅 후에도 여전히 다음 메시지가 나타납니다 dmesg.boot
.
module_register: cannot register pci/em from kernel; already loaded from if_em.ko
Module pci/em failed to register: 17
...
em0: <Intel (R) PRO/1000 Network Connection 7.6.1-k> mem 0xdf300000-0xdf31ffff irq 16 at device 31.6 on pci0
em0: Using an MSI interrupt
em0: The EEPROM Checksum Is Not Valid
device_attach: em0 attach returned 5
그리고 시스템에서 어댑터를 인식하지 못합니다.
여기서 주목해야 할 두 가지 사항은 나중에 다시 설명할 잘못된 체크섬과 방금 v7.6.2를 설치했는데도 v.7.6.1이 로드된다는 사실입니다!
각 버전의 위치를 찾으려고 합니다.
$ strings /boot/kernel/if_em.ko
...
7.6.1-k
...
$ strings /boot/modules/if_em.ko
...
7.6.2
...
그래서 if_em_load="YES"
로딩중오래된em 드라이버는 /boot/kernel에 있습니다. man kldload
거기에 있는 것처럼 보이 므로 놀라운 일은 아니지만 /boot/defaults/loader.conf에는 module_path="/boot/modules"
.
v7.6.2를 직접 로드하면 kldload /boot/modules/if_em.ko
다음과 같은 출력이 제공됩니다.
em0: <Intel (R) PRO/1000 Network Connection 7.6.1-k> mem 0xdf300000-0xdf31ffff irq 16 at device 31.6 on pci0
em0: Using an MSI interrupt
em0: The EEPROM Checksum Is Not Valid
device_attach: em0 attach returned 5
em0: <Intel (R) PRO/1000 Network Connection 7.6.2> mem 0xdf300000-0xdf31ffff irq 16 at device 31.6 on pci0
em0: Using an MSI interrupt
em0: The EEPROM Checksum Is Not Valid
device_attach: em0 attach returned 5
따라서 여전히 EEPROM 체크섬 문제가 있지만 또 다른 질문은 왜 kldload
v7.6.2(명시적으로 가리키는 파일) 전에 v7.6.1을 로드하려고 합니까?입니다.
마지막으로 패치가 필요한 체크섬 검사를 무시하고 드라이버 코드에 "EEPROM 체크섬 유효하지 않음"이라는 문자열이 존재하는 두 곳이 있으면 어떤 일이 발생하는지 알아보기로 결정 if_em.c
했습니다 if_lem.c
.
이와 같이
--- if_em.c 2017-05-16 01:44:07.189792000 -0700
+++ if_em_patch.c 2017-05-16 01:44:28.885779000 -0700
@@ -730,10 +730,10 @@
** if it fails a second time its a real issue.
*/
if (e1000_validate_nvm_checksum(hw) < 0) {
- device_printf(dev,
+ /*device_printf(dev,
"The EEPROM Checksum Is Not Valid\n");
error = EIO;
- goto err_late;
+ goto err_late;*/
}
}
이와 같이
--- if_lem.c 2017-05-16 01:39:27.605399000 -0700
+++ if_lem_patch.c 2017-05-16 01:44:47.661294000 -0700
@@ -641,10 +641,10 @@
** if it fails a second time its a real issue.
*/
if (e1000_validate_nvm_checksum(&adapter->hw) < 0) {
- device_printf(dev,
+ /*device_printf(dev,
"The EEPROM Checksum Is Not Valid\n");
error = EIO;
- goto err_hw_init;
+ goto err_hw_init;*/
}
}
이제 make; make install; restart
dmesg.boot에 v7.6.1이 제공되지만 실행하면 kldunload if_em; kldload /boot/modules/if_em.ko
다음과 같은 출력이 표시됩니다.
em0: <Intel (R) PRO/1000 Network Connection 7.6.1-k> mem 0xdf300000-0xdf31ffff irq 16 at device 31.6 on pci0
em0: Using an MSI interrupt
em0: The EEPROM Checksum Is Not Valid
device_attach: em0 attach returned 5
em0: <Intel (R) PRO/1000 Network Connection 7.6.2> mem 0xdf300000-0xdf31ffff irq 16 at device 31.6 on pci0
em0: Using an MSI interrupt
em0: Ethernet address: xx:xx:xx:xx:xx:xx
효과가있다! IP를 얻을 수 있고 dhclient em0
모든 ping 8.8.8.8
것이 정상입니다.
제 질문은 다음과 같습니다.
- EEPROM 체크섬이 잘못된 이유는 무엇입니까? 저는 펌웨어나 기타 문제를 일으킬 수 있는 어떤 작업도 수행하지 않았습니다. 내가 찾은 모든 답변처럼 "통합 어댑터에서는 작동하지 않습니다"라는 면책 조항으로 시작하지 않고 이 문제를 해결하려면 어떻게 해야 합니까?이것)?
- v7.6.2 로드를 사용하도록 명시적으로 지시했는데도 커널이 계속 v7.6.1을 로드하는 이유는 무엇입니까
kldload /boot/modules/if_em.ko
? module_path="/boot/modules"
/boot/defaults/loader.conf에서 부팅 시 커널이 v7.6.1을 로드하는 이유는 무엇입니까 ? 어떡해오직v7.6.2를 로드 중이신가요? /boot/kernel/if_em.ko를 삭제해야 합니까? 뭔가 잘못된 것 같습니다.
나는 FreeBSD를 실행하기로 선택하면 모든 하드웨어와 소프트웨어가 작동하는 "재미"를 갖게 될 것이라는 것을 알고 있습니다(그리고 그것은 정말 재미있습니다). 그러나 이것은 약간 많은 것 같습니다.
편집: 11.0-RELEASE-p9로 업데이트한 후에도 네트워크 연결이 유지되고 동일한 문제가 여전히 존재하며 변경 사항이 없습니다.
답변1
em0: EEPROM 체크섬이 잘못되었습니다.
EEPROM에 쓸 때 체크섬은 펌웨어에 따라 다릅니다. 나는 당신이 스스로 해결책을 찾았다고 확신합니다. 이러한 면책 조항은 과거로 거슬러 올라가는 것 같습니다 ibautil
. 이 보고서는 Supermicro 마더보드의 성공에 대해 보고합니다.내장 네트워크 카드누구 랑 함께인텔 D975XBX2.
다운로드하겠습니다최신 버전그리고 내 어댑터를 나열할 수 있는지 확인하세요. 그렇다면 PXE 구성을 재설정하는 것을 두려워하지 않을 것입니다. 하지만 YMMV.
잘못된 체크섬에 대해 권장되는 수정 방법은 다음 명령을 사용하여 PXE 기본 구성을 재설정하는 것입니다.
bootutil -nic=1 -defcfg
- 또는 -
bootutil -all -defcfg
이러한 옵션은 다음에서 찾을 수 있습니다.bootutil.txt
모듈 경로
module_path
시스템에 실제로 어떻게 설정되어 있는지 확인해야 합니다 . 를 사용하여 이 작업을 수행할 수 있습니다 kenv
.
# kenv module_path
/boot/kernel;/boot/modules
다음을 사용하여 확인할 수도 있습니다.KLD 구성이는 해결책을 암시하기도 합니다.
# kldconfig -r
/boot/kernel;/boot/modules
module_path
파일이 발견되는 순서와 위치를 결정 합니다 .ko
. 기본 설정은시스템/부팅/공통/module.c. 또는 module_path
에서 제거 하면 /boot/defaults/loader.conf
이해하기가 더 쉬울 것입니다 .컨퍼런스/73535구현되었습니다. 저도 이것 때문에 헷갈렸어요.
를 사용하여 변경할 수 있습니다 kldconfig
.
/boot/kernel
시스템에 의해 업데이트되고 FreeBSD 기본 시스템의 일부이므로 그대로 두는 것이 가장 좋습니다 . 반면에 경로 순서를 변경하면 예상치 못한 일이 발생할 수도 있습니다. 나는 다른 사람들이 소프트 링크를 만드는 것부터 시작하는 것을 권장하는 것을 보았습니다 /boot/kernel
.