예측 가능한 네트워크 인터페이스 이름으로 인해 VM 마이그레이션이 중단됨


9

/etc/networking/interfaces"예측 가능한 네트워크 인터페이스 이름"을 사용할 때 어떻게 재설정 합니까?

15.10 이전의 Ubuntu 버전은 다음과 같은 네트워크 어댑터 이름을 사용합니다.

  • eth0
  • eth1
  • eth2

네트워크 카드를 교체하거나 vm을 새 하이퍼 바이저로 이동하면 Linux가 인터페이스 번호를 증가시킵니다. 삭제 /etc/udev/rules.d/70-peristent-net.rules하면 Linux를 재사용 할 수 eth0있습니다.

우분투 15.10 이상은 ' 예측 가능한 네트워크 인터페이스 이름 '을 사용합니다. 네트워크 어댑터 이름은 mac 주소에서 파생됩니다.

  • ens3
  • ens32
  • ens192

vm을 마이그레이션 할 때 /etc/network/interfaces기존의 존재하지 않는 네트워크 어댑터를 계속 참조 하므로 네트워킹이 시작되지 않습니다 .

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto ens32
iface ens32 inet dhcp
pre-up sleep 2

/ etc / network / interfaces 파일을 재설정하는 가장 좋은 방법은 무엇입니까?

Chef / Bento 골든 이미지를 기반으로 패커 를 사용하여 자동 골든 이미지를 만들기 때문에 vm을 종료하고 새 하이퍼 바이저로 마이그레이션 하기 전에이 작업을 수행해야합니다 .

마이그레이션 후 다음 부팅시 파일이 자동으로 재생성되지 않기 때문에 / etc / network / interfaces 삭제가 작동하지 않는 것을 발견했습니다.

grub 파일을 편집하여 'eth0'명명 규칙으로 되돌 렸습니다. / etc / network / interfaces는 이전 이름 ​​(eth0)을 참조하지만 vm은 IP를 얻지 않으며 재부팅하면 vm은 새로운 이름 지정 규칙을 사용합니다. 또한 biosdevname=0 grub config에 영구적으로 남아 있음을 보장 할 수 없다면 systemd가 항상 우선 합니다. 이것을 영구적으로 적용하는 방법을 모르겠습니다

GRUB_CMDLINE_LINUX_DEFAULT="net.ifnames=0 bios.devname=0"

가능한 경우 골든 이미지를 최대한 깨끗하게 유지하기 때문에 클라우드 초기화를 사용하거나 시작 스크립트를 사용하지 않을 것입니다.

분명히 이것은 클라우드 공급자 (Azure, AWS, RackSpace, Openstack)가 vms를 가져올 때 이미 해결 한 문제입니다. 예측 가능한 네트워크 인터페이스 이름을 사용하여 vm을 시도하고 마이그레이션 한 첫 번째 사람이 될 수는 없습니다.

VM을 종료하고 마이그레이션하기 전에 이러한 명령을 실행하려고했습니다.

apt-get remove biosdevname -y;
ln -s /dev/null /etc/systemd/network/99-default.link;

VM을 마이그레이션 할 때 /etc/network/interfaces, ip address여전히 참조ens32


자매 사이트 askubuntu에서 솔루션을 사용해 보셨습니까? askubuntu.com/a/785442/467355- 기본적으로 수동으로 udev 규칙을 작성하고 단일 시간 부트 스크립트를 사용하여 복제 후 새 Mac을 복제본에 삽입하거나 각 복제본 이후에 새 Mac을 작성하십시오.
Dani_l

그렇습니다. 이들은 누구나 사용할 수있는 일반적인 황금 이미지이므로 Mac 주소를 미리 알 수 없습니다.
spuder

"복제 후 새 Mac을 새 Mac에 삽입하려면 (또는 각 복제 후에 새로 만들려면) 단일 부팅 스크립트를 사용하십시오."-부팅시 새 부트 스크립트를 골든 이미지에 삽입하고 삽입합니다. udev 규칙에 맞는 mac.
Dani_l

답변:


4

분명히 이것은 클라우드 공급자 (Azure, AWS, RackSpace, Openstack)가 vms를 가져올 때 이미 해결 한 문제입니다.

OpenStack은 cloud-init, ConfigDrive 형식을 사용하고 VM 하드웨어와 일치하는 네트워크 구성을 제공한다고 생각합니다. 출처 :

첫 번째 부팅 스크립트를 배제하면 한 가지 확실한 대답이 있습니다.

이전에는 단일 이더넷 카드가 장착 된 호스트에 단일 "eth0"인터페이스 만있는 것이 실제로 보장되었습니다. 이 새로운 체계를 사용하면 관리자는 이전에 "eth0"이 올바른 이름 일 가능성이 높은 위치에서 명령을 호출하기 전에 로컬 인터페이스 이름이 무엇인지 먼저 확인해야합니다.

마음에 들지 않습니다. 어떻게 비활성화합니까?

기본적으로 세 가지 옵션이 있습니다.

  1. 예측할 수없는 커널 이름이 다시 사용되도록 고정 이름 할당을 비활성화합니다. 이를 위해 기본 정책에 대해 udev의 .link 파일을 마스킹하면됩니다. ln -s / dev / null /etc/systemd/network/99-default.link

https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/

기존의 영구 인터페이스 이름으로 다시 전환하는 것은 문서화 된 옵션 중 하나가 아닙니다.

다른 대안은 정확한 이름에 관계없이 네트워크 인터페이스가 기본적으로 활성화되는 설정입니다. NetworkManager가 기본적으로 이것을 지원한다고 생각합니다. systemd-networkd에게도 그렇게하도록 지시 할 수 있습니다 .

VM에 둘 이상의 네트워크 장치가있는 즉시 어쨌든 특정 구성이 필요할 수 있습니다.

VM 외부에서는 NetworkManager 스타일 접근 방식의 한 가지 분명한 이점이 있습니다. PC에는 여러 유형의 네트워크 인터페이스가있을 수 있으며 그 중 하나만 연결되어있을 수 있습니다. 예를 들어 이것은 일부 고급 마더 보드 또는 첫 번째 네트워크 인터페이스가 원하는대로 작동하지 않고 특정 시점에 두 번째 인터페이스가 설치된 시스템에서 볼 수 있습니다.


좋은 제안. 나는 그것이 ln -s /dev/null /etc/systemd/network/99-default.link아무런 차이가 없다는 것을 알았습니다 . 내 vms는 여전히 새로운 명명 규칙을 사용합니다.
spuder

3

나는 이것을 깨끗하게하기 위해 포기하고 다음 해킹을 생각해 냈습니다. vm을 종료하고 마이그레이션하기 직전에 다음 스크립트를 실행하면 전원을 켤 때 vm이 네트워크 어댑터로 eth0을 갖습니다.

ln -s /dev/null /etc/systemd/network/99-default.link;
echo '# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet dhcp
pre-up sleep 2' > /etc/network/interfaces

sed -i.bak 's/GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT="net.ifnames=0 bios.devname=0 quiet"/' /etc/default/grub
update-grub
apt-get remove biosdevname -y || true;

엄밀히 말하면, apt-get remove biosdevname패키지는 기본적으로 우분투 16.04에 설치되지 않기 때문에 필요하지 않습니다. 또한 biosdevname이 설치되어 있지 않기 때문에에 추가 bios.devname=0GRUB_CMDLINE_LINUX_DEFAULT필요가 없습니다. 나중에 biosdevname을 설치 한 경우 네트워크가 중단되지 않습니다.


왜 링크를 설정 하고 커널 인수를 전달? 문서에는 충분해야한다고 명시되어 있습니다. Cursory check은 실제로 그런 경우임을 시사합니다.
0xC0000022L

2

예측 가능한 네트워크 인터페이스 이름이 필요합니까?

내 솔루션은 uninstall biosdevname이며, 결과적으로 네트워크 인터페이스 이름이 항상 eth0, eth1 등으로 설정되었습니다. 예측 가능한 네트워크 인터페이스 이름이나 biosdevname을 설치해야 할 이유가 없습니다.

in /etc/udev/rules.d/70-persistent-net.rules은 Mac 하드웨어 이름을 eth0, eth1 등으로 지정할 수있는 곳입니다. 일반적 으로이 파일의 내용을 삭제하고 빈 파일로 저장 한 다음 재부팅 한 다음 올바른 네트워크 어댑터가 표시된 깨끗한 슬레이트가 있습니다 ...

# This file was automatically generated by the /lib/udev/write_net_rules
# program,run by the persistent-net-generator.rules rules file.
#
# This file was automatically generated by the /lib/udev/write_net_rules
# program,run by the persistent-net-generator.rules rules file.
#
# You can modify it,as long as you keep each rule on a single
# line,and change only the value of the NAME= key.
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

^^ 여기서 xx : xx : xx : xx : xx : xx는 네트워크 어댑터의 고유 한 mac 주소입니다.

나는이 파일을 삭제하는 것이 해결책이 아니라는 것을 알고 있지만 적어도 Suse /lib/udev/write_net_rules에서는이 파일을 생성 하기 때문에 위의 예를 게시 합니다. 따라서이 파일에 대한 역 추적이 도움이되는지 확인하십시오. 분배에 적용 가능한 경우 파일을 수정하여 문제점을 해결할 수 있습니다.

이것은 systemd 전에 이전 Init 방식 인 Suse 버전 11에서 알고있는 것입니다. systemd에서 최신 Linux 버전으로 변경되었는지 확실하지 않습니다.


biosdevname은 udev "builtin"net_id freedesktop.org/wiki/Software/systemd/…에
sourcejedi

0

이 Ubuntu 14.04 호스트를 16.04로 업그레이드했습니다. biosdevname패키지는 너무에 의지 설치되지 않은 "biosdevname=0 net.ifnames=0"에서 /etc/default.grubOP에 의해 명시된 바와 같이.

이 스크립트를 실행하고 출력이 좋아 보인다 /etc/udev/rules.d/70-persistent-net.rules면 커널이 이더넷 포트를 다른 순서로 열거하기로 결정한 경우 출력을 리디렉션하여 새로운 udev 규칙을 작성하십시오.

#!/bin/bash
count=0

# build array of network devices starting with eth? from /proc
for dev in `cat /proc/net/dev | egrep 'eth.*:' | awk '{print $1};' | cut -d':' -f1 | sort`; do
   edev[$count]="$dev"
   let count="$count+1"
done

# use array to find mac address
for d in ${edev[@]}; do
   mac=`ip addr show "$d" | grep ether | awk '{print $2};'`
   if [ -n "$mac" ]; then
      echo "# mac for $d is $mac"
   fi 

   printf 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="%s", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="%s"\n' $mac $d
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.