이수의 삽질 기록

배경

가끔 세상을 살다보면, 리눅스 인터페이스를 바꿀 때가 필요할 수 있다. 기존 리눅스의 경우 eth0, eth1과 같은 인터페이스 이름을 썼는데, 최근의 리눅스 배포를 보면 ens192, ens224와 같은 인터페이스 이름을 기본으로 설정해준다. 이게 불편할 때가 있다. 예를 들어, 오픈스택에서 PackStack을 통해 멀티 노드 환경을 만들어줄 때 그렇다.

 

여러 노드에서 통일된 인터페이스 이름을 가져야지 (안그래도 설치하기에 운이 따르는) PackStack이 잘 설치될 수 있다. 그래서 이번에는 CentOS 8에서 네트워크 인터페이스 이름을 변경해보도록 한다.

  • ens192 -> eth0: 외부 접속 용도 (192.168.100.0/24)
  • ens224 -> eth1: 내부 인스턴스 사이의 Tunnel 용도 (10.0.20.0/24)

이 내용은 수많은 삽질과 네트워크를 날려먹고 완성시킨 내용이다. 여러분의 환경에서 동작을 안할 수도 있다.

Grub 설정

/etc/default/grub를 설정해준다.

GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/cs-swap rd.lvm.lv=cs/root rd.lvm.lv=cs/swap rhgb quiet"

이런 느낌일텐데,

GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/cs-swap rd.lvm.lv=cs/root rd.lvm.lv=cs/swap rhgb quiet net.ifnames=0 biosdevname=0"

이렇게 GRUB_CMDLINE_LINUX를 바꿔준다. 이렇게 변경이 된 grub 파일은 다음의 명령어로 boot에다가 적용시켜준다.

sudo grub2-mkconfig -o /boot/grub2/grub.cfg

Udev에 Rule 추가

udev에 Rule을 추가하기 위해서는 각 인터페이스의 MAC 주소를 확인해야한다. 이는 그냥 평소에 쓰는 ifconfig로 확인할 수 있다. 예를 들어, 우리의 인터페이스와 다음과 같다고 가정하자:

  • ens192: 00:0c:29:64:99:65 (eth0 로 사용 예정)
  • ens224: 00:0c:29:64:99:6f (eth1 로 사용 예정)

이제 /etc/udev/rules 에다가 규칙을 추가해준다. 규칙 이름은 70-persistent-net.rules 로 하겠다. 따라서

sudo vim /etc/udev/rules.d/70-persistent-net.rules

를 통해 편집을 시작하고, 다음의 내용을 적어주자.

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:64:99:65", ATTR{type}=="1", KERNEL=="eth*", name="eth0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:64:99:6f", ATTR{type}=="1", KERNEL=="eth*", name="eth1"

저기에서 ATTR{address} 부분에 원하는 MAC 주소, name에 인터페이스 이름을 적어주면 된다.

 

여기까지 하고 부팅을 하면 인터페이스 이름은 바뀌어 있을텐데, IP를 못받았을 것이다. 따라서, 다음의 단계를 통해서 IP를 할당받도록 설정한다.

network-scripts 설정

다시 말하지만, 위의 단계까지 진행을 했다면, 인터페이스 이름은 변경이 되어있을텐데, IP를 할당받지 못했을 것이다. 그래서 만일 reboot를 한다면, 지금 이 단계까지 진행하고 해야 네트워크를 날려먹지 않을 수 있다. 위의 udev 단계까지 하고 reboot을 했다면, 네트워크를 날려먹었기에 서버실로 내려가서 콘솔을 봐야한다...

cd /etc/sysconfig/network-scripts

나는 귀찮으니, ifcfg-ens192ifcfg-eth0으로 변경하고, 안에 파일만 살짝 고치겠다.

sudo cp ifcfg-ens192 ifcfg-eth0

이후 편집을 살짝 해서

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=eui64
NAME=ens192
UUID=2513e5d6-5162-4137-8c1c-5a10f6e3c723
DEVICE=ens192
ONBOOT=yes

여기서 ens192eth0으로 바꿔주자: :%s/ens192/eth0/g.

반면 eth1의 경우 나는 고정 IP를 받을 예정이다. 이를 위해서는 다음과 같이 새로 스크립트를 만들어주자.

TYPE=Ethernet
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=10.0.20.10
PREFIX=24
GATEWAY=10.0.20.1

이후 ifcfg-eth1으로 저장.

이제 대망의 REBOOT 시간이다! 이것 까지 다 끝나고 리부팅을 해야 네트워크가 안날라간다...

결과

[isu@openstack-master ~]$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.100.113  netmask 255.255.255.0  broadcast 192.168.100.255
        inet6 fe80::20c:29ff:fe64:9965  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:64:99:65  txqueuelen 1000  (Ethernet)
        RX packets 66  bytes 8822 (8.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 66  bytes 8337 (8.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.20.10  netmask 255.255.255.0  broadcast 10.0.20.255
        inet6 fe80::20c:29ff:fe64:996f  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:64:99:6f  txqueuelen 1000  (Ethernet)
        RX packets 13  bytes 1470 (1.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 11  bytes 806 (806.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

이처럼 인터페이스 이름이 eth0, eth1로 변경이 되었고, 각자 IP가 할당된 것을 확인할 수 있다.

profile

이수의 삽질 기록

@IsuKim

두분의 주인님 밑에서 네트워크, 클라우드, 서버 삽질을 하는 학부생입니다