네트워크 인터페이스를 교체하는 방법이 있습니까(이더넷 1<->이더넷 0) 시스템 설치 후.
나의 새로운 Debian 6.0 설치에는 "이더넷 0"그리고 마더보드 통합 네트워크 장치는"이더넷 1"기본적으로. 문제는 통합 장치를 기본으로 사용하고 싶다는 것입니다(이더넷 0)네트워크 인터페이스.
내가 편집한 내용:
/etc/udev/rules.d/70-pertant-net.rules
이름을 바꾸면 모든 것이 괜찮은 것 같고 네트워크는 작동하지만 프로그램이 여전히 PCI 네트워크 카드를 사용하려고 합니다(현재는 "이더넷 1")를 기본 인터페이스로 사용합니다. 예를 들어iftop이제 "를 사용해 보세요.이더넷 1"기본 장치로 사용"이더넷 0" 교환 전.
응용 프로그램이 인터페이스 이름에도 불구하고 처음 발견된 장치를 기본값으로 사용하려고 하기 때문에 이것은 순전히 소프트웨어 문제입니까, 아니면 OS를 구성하여 이 문제를 해결할 수 있는 방법이 있습니까?
편집하다:나는 iflist와 PCI 장치를 인쇄하기 위한 작은 애플리케이션을 작성했습니다(이더넷 1) 이전에 나타났습니다."이더넷 0". 장치 순서를 바꾸는 방법에 대한 아이디어.
편집하다:내가 하나 찾았어철사같은 문제에 대해 그들이 제안한 모든 것을 시도했지만 "더미" 교환 이름을 제외하고는 어떤 솔루션도 작동하지 않았습니다.
답변1
마침내 이 문제에 대한 해결책을 찾았기 때문에 이제 내 질문에 대답하고 있습니다.
드라이버를 언로드한 다음 올바른 순서로 로드하면 장치를 다시 주문할 수 있다는 것을 알았습니다.
첫 번째 방법(무차별 대입 크래킹):
그래서 제가 생각해낸 첫 번째 방법은 단순히 init.d 스크립트를 사용하여 드라이버를 강제로 다시 로드하는 것이었습니다.
다음 init 스크립트는 Debian 6.0용으로 사용자 정의되었지만 올바른 init.d 스크립트를 사용하는 거의 모든 배포판에는 동일한 원칙이 적용되어야 합니다.
#!/bin/sh -e
### BEGIN INIT INFO
# Provides: reorder-nics
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop:
# Short-Description: Reloads the nics in correct order
### END INIT INFO
#
# This script should reload the nic drivers in corrected order.
# Basically it just unloads and then loads the drivers in different order.
#
echo "Reloading NICs!"
# unload the drivers
modprobe -r driver_0 # eth0 nic interface
modprobe -r driver_1 # eth1 nic interface
# load the drivers in corrected order
modprobe driver_1
modprobe driver_0
#EOF
그런 다음 스크립트를 올바른 실행 수준 디렉터리에 추가해야 합니다. 이 작업은 데비안에서 "를 사용하여 쉽게 수행할 수 있습니다.업데이트-rc.d" 명령입니다. 예를 들면 다음과 같습니다.update-rc.d reorder-nics start S
두 번째 방법(내 의견으로는 더 좋음):
나는 또한 (적어도 데비안과 우분투 시스템에서는) 좀 더 우아한 방법을 발견했습니다.
먼저 커널이 네트워크 카드 드라이버를 자동으로 로드하지 않는지 확인하십시오. 이 작업은 다음에서 블랙리스트 파일을 생성하여 수행할 수 있습니다./etc/modprobe.d/
. ""라는 파일을 만들었습니다 disable-nics.conf
. 파일에는 접미사 /etc/modprobe.d/
가 있어야 합니다 .conf
. 또한 모듈 이름을 지정해도 /etc/modprobe.d/blacklist.conf
커널의 모듈 자동 로딩에 영향을 미치지 않으므로 자신만의 파일을 만들어야 합니다.
# Disable automatic loading of kernel driver modules
# Disable NIC drivers
blacklist driver_0 # eth0 by default
blacklist driver_1 # eth1 by default
그런 다음 '을 실행하십시오.데프모드애' 루트로
'를 사용하여 initrd를 다시 생성하십시오.업데이트-initramfs -u'
마지막으로 드라이버 이름을 올바른 순서로 추가하십시오./etc/모듈문서.
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
# Parameters can be specified after the module name.
# drivers in wanted order
driver_1 # this one should be loaded as eth0
driver_0 # this one should be loaded as eth1
변경 사항은 다음에 시작할 때 적용됩니다.
하지만 재부팅이 필요하지 않습니다. 물론 다음 명령을 사용하여 장치를 쉽게 전환할 수 있습니다.
modprobe -r driver_0; modprobe -r driver_1; modprobe driver_1; modprobe driver_0
솔루션을 검색하는 동안 몇 가지 유용한 링크를 찾았습니다.
답변2
netdev=
커널 명령줄 인수(grub의 커널에 전달해야 함)를 사용하여 주어진 irq를 주어진 인터페이스에 연결하도록 커널에 지시할 수 있습니다 . 예를 들면 다음과 같습니다.netdev=irq=2,name=eth0
답변3
iftop
에서 호출하는 C 라이브러리 함수는 변경할 수 없습니다 .if_nameindex
그리고 기본적으로 배열의 첫 번째 요소를 반환합니다. if_nameindex
Linux의 GNU libc는 얇은 래퍼입니다.SIOCGIFCONF
I/W 제어. 인터페이스는 네트워크 드라이버가 초기화되는 순서와 각 드라이버가 각 장치를 감지하는 순서에 따라 고정된 순서로 반환됩니다.
유사한 프로그램 -i
에 전달하고 싶지 않은 경우 다음을 사용하여 반환된 목록의 요소를 재정렬하는 작은 래퍼를 만들 수 있습니다.iftop
if_nameindex
LD_PRELOAD
. 내 생각엔 이것이 가치 있는 것보다 더 큰 문제라고 생각한다.
답변4
서로 다른 드라이버가 있는 경우 적어도 과거에는 이를 모듈 구성 파일 중 하나에 넣을 수 있었습니다.
alias eth0 driver1
alias eth1 driver2
이것은 꽤 오래된 지식이지만 도움이 될 수 있습니다.