[unix] 리눅스에서 네트워크 카드 (eth1 <-> eth0)의 순서를 바꾸는 방법

시스템 설치 후 네트워크 인터페이스 ( 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_nameindexLinux 의 GNU libc 는 SIOCGIFCONFioctl 주위의 얇은 래퍼 입니다. 네트워크 드라이버가 초기화 된 순서와 각 드라이버가 각 장치를 감지 한 순서에 따라 고정 된 순서로 인터페이스를 반환합니다.

당신이 정말로 통과해야하고 싶지 않은 경우 -iiftop유사한 프로그램, 당신은 주위에 작은 래퍼 할 수 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


답변