시스템 설치 후 네트워크 인터페이스 ( eth1 <-> eth0 ) 를 바꾸는 방법이 있습니까?
필자의 새로운 데비안 6.0 은 기본적으로 PCI 네트워크 카드를 ” eth0 “으로, 마더 보드 통합 네트워크 장치를 ” eth1 ” 로 할당 했습니다. 문제는 통합 장치를 기본 ( eth0 ) 네트워크 인터페이스 로 사용하고 싶습니다 .
나는 이미 편집했다 :
/etc/udev/rules.d/70-persistent-net.rules
이름을 바꾸고 모든 것이 정상인 것으로 보이며 네트워크가 작동하지만 프로그램은 여전히 PCI 네트워크 카드 (현재 ” eth1 “)를 기본 인터페이스 로 사용하려고합니다 . 예를 들어 iftop은 이제 스왑 전에 ” eth0 “을 사용했던 것처럼 ” eth1 “을 기본 장치로 사용하려고합니다 .
응용 프로그램이 인터페이스 이름에도 불구하고 처음 찾은 장치를 기본 장치로 사용하려고 할 때 이것이 순전히 소프트웨어 문제입니까, 아니면 OS를 구성하여이 문제를 해결할 방법이 있습니까?
편집 : iflist를 인쇄하기 위해 작은 응용 프로그램을 작성했으며 PCI 장치 ( eth1 )가 ” eth0 ” 전에 나타났습니다 . 장치 순서를 바꾸는 방법에 대한 아이디어.
편집 : 같은 문제에 대한 스레드 를 발견하고 그들이 제안한 모든 것을 시도했지만 이름을 “가상”으로 바꾸는 것 외에는 해결책이 없습니다.
답변
나는이 문제에 대한 해결책을 마침내 찾았 기 때문에 지금 내 자신의 질문에 대답하고 있습니다.
드라이버를 언로드 한 다음 올바른 순서로로드하여 장치를 재정렬 할 수 있다는 것을 알았습니다.
첫 번째 방법 (bruteforce) :
그래서 내가 생각해 낸 첫 번째 방법은 init.d 스크립트로 드라이버를 다시로드하는 것을 간단하게하는 것입니다.
다음 init 스크립트는 데비안 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
그런 다음 스크립트를 적절한 런레벨 디렉토리에 추가해야합니다. ” update-rc.d “명령 으로 데비안에서 쉽게 할 수 있습니다 . 예를 들면 다음과 같습니다.update-rc.d reorder-nics start S
두 번째 방법 (더 나은 생각) :
나는 또한 조금 더 우아한 방법을 찾았습니다 (적어도 Debian & Ubuntu 시스템의 경우).
먼저 커널이 NIC 드라이버를 자동으로로드하지 않는지 확인하십시오. 에 블랙리스트 파일을 생성하면됩니다 /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
그런 다음 루트로 ‘ depmod -ae ‘를 실행하십시오.
‘ update-initramfs -u ‘를 사용 하여 initrd를 다시 작성하십시오.
마지막으로 올바른 순서대로 드라이버 이름을 / etc / modules 파일에 추가하십시오.
# /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
솔루션을 검색하는 동안 찾은 유용한 링크 :
답변
당신은 사용할 수 있습니다 netdev=
주어진 인터페이스, 예를 들면에 지정된 IRQ를 연결하는 커널을 지시하는 (당신이 애벌레의 커널에 그것을 전달해야) 커널 명령 줄 매개 변수를 :netdev=irq=2,name=eth0
답변
영향을받는 각 프로그램 구성 파일로 이동하여 ‘eth1’을 ‘eth0’으로 변경해야 할 것입니다. 이러한 프로그램 기본값은 현재 감지 된 NIC로 설치되거나 처음 실행될 때 설정됩니다.
Linux를 라우터로 사용하고 스크립트를 사용할 때이 문제가 발생했습니다. 지금이라는 좋은 스크립트 조각이 netconf
난 NIC 이름을 사용해야 할 때마다 다른 스크립트에서이 나는 소스를,이 파일은 나에게 그것들을 지정하는 중앙 위치를 제공합니다 (즉 LAN_IFACE=eth0
, WAN_IFACE=eth1
등)
답변
와 같은 응용 프로그램에서 기본적으로 사용되는 인터페이스는 변경할 수 없습니다 iftop
. C 라이브러리 함수를 호출하고 if_nameindex
기본적으로 반환 된 배열의 첫 번째 요소를 사용합니다. if_nameindex
Linux 의 GNU libc 는 SIOCGIFCONF
ioctl 주위의 얇은 래퍼 입니다. 네트워크 드라이버가 초기화 된 순서와 각 드라이버가 각 장치를 감지 한 순서에 따라 고정 된 순서로 인터페이스를 반환합니다.
당신이 정말로 통과해야하고 싶지 않은 경우 -i
에 iftop
유사한 프로그램, 당신은 주위에 작은 래퍼 할 수 if_nameindex
와, 그 재 배열 반환 된 목록의 요소를 LD_PRELOAD
. 나는 그것이 가치보다 훨씬 더 많은 문제라고 부를 것입니다.
답변
서로 다른 드라이버가있는 경우 적어도 하루 전에 모듈 구성 파일 중 하나에 넣을 수 있습니다.
alias eth0 driver1
alias eth1 driver2
그것은 꽤 오래된 지식이지만 도움이 될 수 있습니다.
답변
‘ifrename’패키지를 살펴보십시오. 이를 통해 / etc / iftab 파일에 구성된 인터페이스, 드라이버, 인터럽트 …의 MAC 주소와 같은 다양한 정보를 기반으로 인터페이스 이름의 이름을 바꿀 수 있습니다.
매뉴얼 페이지의 몇 가지 예 :
# This is a comment
eth2 mac 08:00:09:DE:82:0E
eth3 driver wavelan interrupt 15 baseaddress 0x390
eth4 driver pcnet32 businfo 0000:02:05.0
air* mac 00:07:0E:* arp 1
myvpn SYSFS{address} 00:10:83:* SYSFS{type} 1
bcm* SYSFS{device} 0000:03:00.0 SYSFS{device/driver} bcm43xx
bcm* SYSFS{..} 0000:03:00.0 SYSFS{../driver} bcm43xx