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

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

/etc/networking/interfaces"예측 가능한 네트워크 인터페이스 이름"을 사용할 때 재설정하는 방법은 무엇입니까?

15.10 이전 Ubuntu 버전에서는 다음 네트워크 어댑터 이름을 사용했습니다.

  • eth0
  • eth1
  • eth2

네트워크 카드를 교체하거나 가상 머신을 새 하이퍼바이저로 이동하면 Linux에서 인터페이스 번호가 늘어납니다. 삭제하면 /etc/udev/rules.d/70-peristent-net.rulesLinux를 다시 사용할 수 있습니다 eth0.

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

  • ens3
  • ens32
  • ens192

/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 파일을 재설정하는 가장 좋은 방법은 무엇입니까?

난 이걸 해야 해앞으로사용하고 있으므로 VM을 종료하고 새 하이퍼바이저로 마이그레이션합니다.포장 노동자다음을 기반으로 자동화된 골든 이미지를 생성합니다.셰프/도시락황금 이미지.

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

"eth0" 명명 규칙으로 되돌리기 위해 grub 파일을 편집해 보았습니다. /etc/network/interfaces는 이전 이름(eth0)을 참조하지만 VM은 IP를 얻지 못하고 재부팅하면 VM이 새로운 명명 규칙을 사용하게 됩니다. 또한 보장할 수 없는 한 systemd가 항상 우선시된다는 것을 알았습니다.biosdevname=0 grub 구성에 영구적으로 유지됨. 이것을 영구적으로 적용하는 방법을 잘 모르겠습니다.

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

가능하다면 골든 이미지를 최대한 깨끗하게 유지하기 위해 클라우드 초기화를 사용하지 않거나 출시 후 스크립트를 사용하지 않습니다.

물론 클라우드 제공업체(Azure, AWS, RackSpace, Openstack)는 가상 머신을 가져올 때 이 문제를 해결했습니다. 예측 가능한 네트워크 인터페이스 이름을 사용하여 VM을 마이그레이션하는 첫 번째 사람은 제가 될 수 없습니다.

VM을 종료하고 마이그레이션하기 전에 다음 명령을 실행해 보았습니다.

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

VM을 마이그레이션할 때 /etc/network/interfaces여전히 ip address참조한 것을 발견했습니다.ens32

답변1

물론 클라우드 제공업체(Azure, AWS, RackSpace, Openstack)는 가상 머신을 가져올 때 이 문제를 해결했습니다.

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 외에도 NetworkManager 스타일 접근 방식에는 분명한 이점이 있습니다. PC에는 다양한 유형의 여러 네트워크 인터페이스가 있을 수 있지만 그 중 하나만 연결됩니다. 예를 들어 일부 고급 마더보드 또는 첫 번째 네트워크 인터페이스가 예상대로 작동하지 않고 어느 시점에 두 번째 인터페이스가 설치된 시스템에서 이러한 현상이 나타날 수 있습니다.

답변2

나는 이것을 깔끔하게 하려는 노력을 포기하고 다음과 같은 트릭을 생각해 냈습니다. 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=0추가할 필요가 없습니다 . GRUB_CMDLINE_LINUX_DEFAULT나중에 biosdevname을 설치하면 네트워크 중단을 방지할 수 있습니다.

답변3

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

내 솔루션은 제거하는 것이었고 biosdevname, 그 결과 네트워크 인터페이스 이름은 항상 eth0, eth1 등으로 안정적으로 지정되었습니다. 예측 가능한 네트워크 인터페이스 이름이나 biosdevname을 설치해야 할 타당한 이유를 찾지 못했습니다.

에서는 /etc/udev/rules.d/70-persistent-net.ruleseth0, eth1 등의 하드웨어 MAC 주소를 수정할 수 있습니다. 저는 보통 파일의 내용을 삭제하고, 빈 파일로 저장하고, 재부팅하면 올바른 네트워크 어댑터가 표시되는 깨끗한 상태를 얻습니다...

# 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 버전에서 이것이 변경되었는지 확실하지 않습니다.

답변4

Ubuntu 14.04 호스트를 16.04로 업그레이드할 때 이 문제가 발생했습니다. biosdevname패키지가 설치되어 있지 않으므로 "biosdevname=0 net.ifnames=0"OP의 설명대로 사용하십시오./etc/default.grub

이 스크립트를 실행하고 출력이 양호하면 /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

관련 정보