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


20

시스템 설치 후 네트워크 인터페이스 ( 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 " 전에 나타났습니다 . 장치 순서를 바꾸는 방법에 대한 아이디어.


편집 : 같은 문제에 대한 스레드 를 발견하고 그들이 제안한 모든 것을 시도했지만 이름을 "가상"으로 바꾸는 것 외에는 해결책이 없습니다.


참고로, /etc/udev/rules.d/70-persistent-net.rules를 편집하고 재부팅하면 나를 위해 일했습니다
Xosofox

답변:


18

나는이 문제에 대한 해결책을 마침내 찾았 기 때문에 지금 내 자신의 질문에 대답하고 있습니다.

드라이버를 언로드 한 다음 올바른 순서로로드하여 장치를 재정렬 할 수 있다는 것을 알았습니다.

첫 번째 방법 (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

솔루션을 검색하는 동안 찾은 유용한 링크 :


2
+1 당신은 분명히 하나 이상의 투표권이 있습니다.
bahamat

비슷한 문제가 있습니다. 통합 NIC가 있고 때로는 다른 인터페이스를 만드는 VPN 프로그램을 실행하기도합니다. VPN 인터페이스가 항상 우선하는 것처럼 보이지만 그 이유를 모르겠습니다. 매우 드문 상황에서만 사용하기를 원합니다 (사용하는 응용 프로그램이 VPN 인터페이스를 지정해야 함). 어떤 아이디어? ^ _ ^ 어쨌든 곧 새로운 질문을 게시 할 것입니다.
제한적 속죄

2

당신은 사용할 수 있습니다 netdev=주어진 인터페이스, 예를 들면에 지정된 IRQ를 연결하는 커널을 지시하는 (당신이 애벌레의 커널에 그것을 전달해야) 커널 명령 줄 매개 변수를 :netdev=irq=2,name=eth0


1
grub 구성 수정으로 내 상자를 부팅 했는데 많은 앱에서 여전히 eth1 을 기본 장치로 사용하고 있습니다. dmesg에서 네트워크 정보를 확인했으며 통합 NIC가 여전히 eth1 인 ifname : 이라고 말합니다 forcedeth 0000:00:04.0: ifname eth1, PHY OUI 0x57d @ 1, addr 40:40:00:40:40:40. 이것은 너무 심각한 문제는 아니지만 통합 된 1GB 카드이므로 기본 장치 여야하므로 실제로 장비를 연마하는 데 어려움이 있습니다.
Athabaska Dick

1
이제 nameif 를 사용하여 네트워크 인터페이스 이름을 변경 하려고했지만 udev와 동일한 방식으로 보입니다. "실제"NIC 순서는 변경되지 않습니다. 또한 PCI NIC 물리적 위치를 변경하려고 시도했지만 도움이되지 않았습니다. 통합 NIC에는 IRQ 22가 있고 PCI NIC에는 IRQ 17이 있으므로 커널이 IRQ에 의해 커널을 주문하는 것처럼 보이며 사용자는 어떤 식 으로든 그 사실을 변경할 수 없습니다. 신선한 아이디어가 있습니까?
Athabaska Dick

1

영향을받는 각 프로그램 구성 파일로 이동하여 'eth1'을 'eth0'으로 변경해야 할 것입니다. 이러한 프로그램 기본값은 현재 감지 된 NIC로 설치되거나 처음 실행될 때 설정됩니다.

Linux를 라우터로 사용하고 스크립트를 사용할 때이 문제가 발생했습니다. 지금이라는 좋은 스크립트 조각이 netconf난 NIC 이름을 사용해야 할 때마다 다른 스크립트에서이 나는 소스를,이 파일은 나에게 그것들을 지정하는 중앙 위치를 제공합니다 (즉 LAN_IFACE=eth0, WAN_IFACE=eth1등)


2
많은 프로그램이 <net / if.h> 헤더의 if_nameindex () 함수 에 의존하는 것처럼 보입니다 . 그들은 찾은 첫 번째 장치를 사용하고 인터페이스 이름을 완전히 무시합니다. 왜 그런 식으로 수행되는지 알 수 있습니다. 이름을 정렬하는 것보다 처음 찾은 장치를 사용하는 것이 훨씬 쉽습니다.
Athabaska Dick

1

와 같은 응용 프로그램에서 기본적으로 사용되는 인터페이스는 변경할 수 없습니다 iftop. C 라이브러리 함수를 호출하고 if_nameindex기본적으로 반환 된 배열의 첫 번째 요소를 사용합니다. if_nameindexLinux 의 GNU libc 는 SIOCGIFCONFioctl 주위의 얇은 래퍼 입니다. 네트워크 드라이버가 초기화 된 순서와 각 드라이버가 각 장치를 감지 한 순서에 따라 고정 된 순서로 인터페이스를 반환합니다.

당신이 정말로 통과해야하고 싶지 않은 경우 -iiftop유사한 프로그램, 당신은 주위에 작은 래퍼 할 수 if_nameindex와, 그 재 배열 반환 된 목록의 요소를 LD_PRELOAD. 나는 그것이 가치보다 훨씬 더 많은 문제라고 부를 것입니다.


나는 "문제"를 정확히 지적 if_nameindex했다. 아마도 나는 지금 그것을 떠날 것입니다. 운 좋게 일부 앱은 실제로 인터페이스 이름을 확인합니다. 반면에 일부 응용 프로그램에는 기본 구성 옵션이 없으므로 -i 옵션을 사용해야합니다. 왜 커널 로딩 옵션 netdev=irq=22,name=eth0이 작동하지 않는지 궁금 했습니다. 커널 시작시 NIC 순서를 변경할 수 있어야한다고 생각했습니다.
Athabaska Dick

커널 소스 ( for_each_netdev매크로)를 간단히 살펴보면 드라이버가로드되는 순서대로 인터페이스가 열거됩니다. 인터페이스는 아마도 다른 드라이버를 사용하기 때문에 원하는 순서대로 드라이버를로드해야합니다. 특히 커널 업그레이드를 통해 조정을 수행하려는 경우에는 이것이 어려울 것으로 예상됩니다.
Gilles 'SO- 악의를 멈춰라'

1

서로 다른 드라이버가있는 경우 적어도 하루 전에 모듈 구성 파일 중 하나에 넣을 수 있습니다.

alias eth0 driver1
alias eth1 driver2

그것은 꽤 오래된 지식이지만 도움이 될 수 있습니다.


-1

'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

U & L에 오신 것을 환영합니다. 단순한 힌트가 아닌 완전한 답변을 제공해 주시겠습니까? "man 페이지가 있습니다 ..."와 같은 내용을 게시해서는 안됩니다.
Archemar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.