본문 바로가기

softwares/quick reference

[Hyper-V] 에서는 MAC 을 어떻게 할당 하는가?

Windows Server 2012 R2 부터 추가 된 기능 중, 가장 마음에 드는 것을 하나 꼽으라면 VM을 끄지 않더라도 내보내기 할 수 있는 "온라인 내보내기" 입니다. 기존 2012 까지만 하더라도 VM Guest를 복제하기 위해서는 반드시 VM을 꺼야 했었는데, 2012 R2 부터는 VM을 끄지 않고, 저장된 상태로 다른 호스트 혹은 복제를 할 수 있습니다. 이 기능을 쓰면서 발견한 문제인데, 종종 네트워크 (L2 Layer)에서 Mac Flapping 이 발생한다는 것이 었습니다. 저희 사이트에서는 고정 MAC이 아닌 동적 MAC을 사용하고 있었는데, VM을 복제해서 사용하면서 이와 같은 MAC 충돌이 발생 했습니다.

결론만 말씀드리면, 온라인 내보내기 후 가져오기를 한 다음 VM의 종료/시작을 안 한 것이 원인이며(VM 내부의 재부팅은 해결이 되지 않습니다), 자세한 원인을 찾기 위해 찾아본 결과 Hyper-V 에서 동적 MAC을 할당하는 구조를 알게 되었습니다.

VM 의 MAC 이 00-15-5D-98-1E-07 일 경우, 앞의 세 자리 00-15-5D는 Microsoft 에서 Hyper-V 에만 할당해서 쓰는 대역이며, 98-1E 는 호스트에 Hyper-V 롤을 설치할 당시의 Physical NIC 에 할당 된 IP의 세번째, 네번째의 옥탯에 해당하는 16진수 입니다. (Hyper-V 호스트의 ip가 192.168.152.30 일 때, 세번째 옥탯 152에 해당하는 98 / 30에 해당하는 1E가 할당 됩니다.) 마지막 자리 07 은 서버에서 자동으로 할당 되는 주소이며 기본 설정으로는 호스트 한 대당 최대 255개까지의 MAC만 할당할 수 있습니다. (http://support.microsoft.com/kb/2804678)

이와 같은 사실로 추정해보면 1.1.152.30 의 호스트에서 동적으로 할당 된 MAC과 1.2.152.30 의 Hyper-V 호스트에서 동적으로 할당 된 MAC 은 중복이 될 가능성이 있으며, (동적 MAC 의 영역은 실제로는 희박하다고 하더라도 서버마다 같은 IP를 가진 상태로 Hyper-V 롤이 설치 될 경우는 충돌 가능성이 아예 없지는 않습니다) 반대로 VM의 MAC 을 알면 어느 호스트에서 할당 된 것인지 (혹은 사용 중인지) 확인이 가능합니다.

각 호스트에서 Get-vmNetworkAdapater -all 의 결과

HOST1

AA-GAME01 vSwitch-Public  00155D981F07
AA-GAME01 vSwitch-Private 00155D981F08

HOST2

BB-GAME01 vSwitch-Public  00155D981F07
BB-GAME01 vSwitch-Private 00155D981F08


이 문제를 조금 더 확장해서 살펴보면, HOST1 에서 HOST2로 Live Migration 이나 Replica 의 환경도 한번 더 확인을 해봐야 하겠는데요, Live Migration 시에는 HOST1 에서 할당 된 MAC 을 HOST2로 이동 시, 그대로 HOST1 대역의 MAC 을 들고 이동하기 때문에 문제가 없습니다. 하지만 HOST 2번에 있다가 점검을 위해 VM의 전원을 껐다 킬 때 문제가 되는데요. 이 때부터는 HOST2 대역의 MAC을 가져오게 되어있습니다. (Replica 는 꺼져 있는 상태이니 Replica HOST 의 MAC 대역을 가져오겠고요)

여기까지가 윈도우 계열의 VM 및 전체적인 환경에 대한 이야기이고, Linux VM (특히 CentOS, RedHat 계열)의 경우는 똑같지만 약간 다른 방식으로 작동합니다. 왜냐하면, CentOS 에서는 동적으로 할당 받은 VM 의 MAC을 파일로 시스템 설정의 파일로 저장하고 있습니다. 윈도우의 경우 가상 NIC의 MAC이 바뀌더라도 IP를 할당 받지 못하는 경우가 없으나, Linux VM의 고가용성 환경 (Live Migration) 혹은 Replica 구성의 경우, 옮겨 가서 VM의 전원이 ON 될 때 기존의 NIC 에 설정 된 IP를 불러오지 못하는 경우가 발생 합니다.

따라서, 결론은...

이와 같이, Linux VM 의 고가용성 (혹은 Replica 구성)을 구성할 경우 반드시 VM NIC 의 MAC을 고정 (Static) 으로 사용하도록 설정 할 것이며, 동적 MAC을 사용하게 될 경우 FailBack을 설정하거나, 장애 조치 시 복구 가능한 시나리오를 확인 하는 것이 우선 입니다. CentOS 계열의 VM을 복제하여 사용 할 경우, /etc/sysconfig/network-script/ifcfg-eth0 의 HW_ADDR 을 지우고 /etc/udev/rules.d/70-persitent-net.rules 의 할당 된 MAC 을 지워야 합니다 eth0/1로 올라오게 됩니다.)

 

Important Considerations for Making Linux Virtual Machines Highly Available in Failover Clustering and Hyper-V Linux virtual machines that will be deployed in a highly available scenario (using Failover Clustering) should be configured with static MAC addresses for each virtual network adapter.

Because of the way Linux configures the network adapter, in some versions of Linux, it is possible that the networking configuration will be lost after failover because a new MAC address might be assigned to the virtual network adapter.

To work around this issue, ensure that each virtual network adapter has a static MAC address by editing the settings of the virtual machine in Hyper-V Manager.

references
http://support.microsoft.com/kb/2804678
http://www.padisetty.com/2013/09/centos-64-on-hyper-v.html