네트웍 디바이스 이름이 부팅할 때마다 바뀝니다. 뭐가 문제일까요?

academic의 이미지

CentOS 8.2 x64를 사용하고 있습니다.

커널 버전은 4.18.0, systemd 버전은 239입니다. 커널 등은 따로 커스터마이징한 것은 없고 배포판 그대로 사용 중입니다.

시스템에는 온보드 네트웍 디바이스가 두 개 있습니다.

그런데 부팅할 때마다 이 온보드 네트웍 디바이스 2개의 이름이 바뀝니다.

부팅 전 ip link 결과는 다음과 같습니다.

2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 00:1e:67:48:98:0d brd ff:ff:ff:ff:ff:ff
3: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
    link/ether 00:1e:67:48:98:0c brd ff:ff:ff:ff:ff:ff

부팅 후 ip link 결과는 다음과 같습니다.

2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
    link/ether 00:1e:67:48:98:0d brd ff:ff:ff:ff:ff:ff
3: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 00:1e:67:48:98:0c brd ff:ff:ff:ff:ff:ff

두 결과를 비교해보면 처음에는 맥 어드레스 00:1e:67:48:98:0d 인 녀석의 디바이스 이름이 eno1이었는데, 두 번째는 eth0 인 것을 알 수 있습니다.

맥 어드레스 00:1e:67:48:98:0c인 녀석의 디바이스 이름은 eth1에서 eno1로 바뀌어 있습니다.

뭐가 문제인지 어떻게 하면 해결할 수 있는지 알려주시면 감사하겠습니다.

academic의 이미지

인터넷을 검색하다 보니, 이게 비교적 잘 알려진 문제였던 것 같습니다.

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

를 참조해보면,

커널이 부팅할 때마다 네트웍 디바이스 이름을 eth0 <-> eth1 을 바꿔버리는게 근본 원인이었던 것 같고, systemd도 이를 제대로 바로 잡지는 못한 것 같네요.

다른 온보드 네트웍 디바이스가 두 개 있는 시스템에서는 디바이스 이름이 바뀌는 경우가 없는 걸 보면 특정 시스템에서만 문제가 되는 것 같습니다.

systemd.link man 페이지를 참고해서 디바이스 이름을 eth0,eth1,eno1이 아닌 다른 이름으로 고정시켜 해결했습니다.

----
academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.

김정균의 이미지

그래서 부팅시에 커널 command line option 으로 net.ifnames=0 을 줘서 예전의 ethX 를 사용하는 것으로 고정을 해서 사용하는 경우가 많습니다.

ethenet name format 하고 sytemd 는 정말 쉣 입니다. (그나먀 ethernet name format 은 net.ifnames 라도 있어서..)

academic의 이미지

정균님이 직접 답을 달아주시니 고맙기 그지 없습니다. ^^ 항상 도움받고 있습니다.

부팅 로그를 보면 (journalctl --boot) 커널이 부팅할 때마다 eth0 <-> eth1을 바꿔 인식하더군요. 그런 경우에도 net.ifnames=0으로 문제가 해결되는지요?

시간 내서 공부해야겠습니다. 알려주셔서 감사합니다.

----
academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.

김정균의 이미지

음 그 경우는 다른 경우인것 같습니다.
net.ifames 나 biosdevname=0 은 ethernet name space 를 예전 방식으로 돌리는 거라, PCI order 가 바뀌어서 인식이 되는 경우라면 이 방법이 해결책은 아닙니다.

이런 경우라면, MAC 주소를 이용해서 udev 로 고정을 시켜야 할 겁니다.

academic의 이미지

친절하게 답변 달아주셔서 감사합니다. ^^ 많은 가르침을 받았습니다.

----
academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.

익명 사용자의 이미지

완전 동감합니다.

저도 systemd / ethernet name 불편하다고 느끼는 1인입니다.

bushi의 이미지

ethernet NIC 에 대해 eth 라는 이름으로 커널이 장치를 만들어줍니다.
(대부분 커널 소스 코드의 ethernet/ 디렉토리 밑의 드라이버에서 생성합니다. 네, USB ethernet 포함입니다.)
H/W 가 커널에 인식된 순서대로 0, 1, 2, 3... 번호를 붙이게됩니다.

두가지 문제가 불거졌습니다.
"고정형/비고정형 구분 없다" 와 "인식된 순서대로 번호를 붙인다" 입니다.
장치 인식 순서, 드라이버 모듈 올리는 순서에 따라 장치 이름이 달라지는 것은 물론이고,
USB 같은 착탈식 장치들에 대해선 그야말로 혼돈의 카오스가 벌어집니다.

처음 제시된 해결책은 고유한 MAC address 를 이용해서 장치를 구분하고 이름을 고정하는 것이었습니다.
https://www.google.com/search?q=udev+persistent-net
어느 정도 알고있는 사람에게는 귀찮음을, 아무것도 모르는 사용자에게는 암담함을 발생시키는 상황이 잦았습니다.
당장 이 kldp 만 검색해봐도 질문글들이 있습니다.

그 다음 제시된 해결책은 장치의 물리적 연결 경로(bus-tree)에 따라 이름을 부여하는 것입니다.
udevadm info -q all /sys/class/net/eno1
을 봤을 때 ID_NET_NAME_PATH 로 나오는 이름입니다.
보면 아시겠지만, uniq 합니다.
게다가, 붙어있던 PCI 이더넷 카드를 빼고 다른 카드로 변경해도 이름이 유지되며,
USB 이더넷 장치를 빼고 그 포트에 다른 USB 이더넷 장치를 연결해도 이름이 유지됩니다.
하지만 인간친화적이지 않습니다. 알파벳들과 숫자들의 나열이죠. 다른 사람과 소통 하기에도 불편하고...
고정형 pci ethernet NIC 에 대해서라도 뭔가 좀 간단명료한 이름이 필요하게 됩니다.
결국엔, 제일 처음 인식된 PCI ethenet NIC 에 eno1 이라는 이름을 붙이는 것을 기본으로 하고 나머지는 사용자 선택/능력에 맡기게 됩니다.
즉, eno1 라는 이름에 한해선 옛날로 회귀했습니다. 먼저 인식된 PCI NIC 이름이 eno1 이 되는게 기본 설정입니다.

PCI ethernet NIC 들 의 인식 순서는 거의 바뀌지 않을 텐데... 부팅할 때 마다 바뀐다면,
정균님 말씀대로, net.ifnames=0 로 systemd(udevd) 의 자동화 머시기들을 비활성화하고,
MAC address 로 장치를 구분해서 이름을 지어주는 udev rule 을 만드는게 서버 머신 관리측면에선 더 편할지도 모르겠습니다.

academic의 이미지

둔한 저도 이해가 쏙쏙 되네요. bushi님 같은 선생님이 계셨으면 저도 많은 걸 깨우쳤을텐데요.

MAC address와 디바이스 이름을 매칭하는 방법을 systemd.link man 페이지를 참고해서 적용해 이름이 바뀌는 현상은 바로 잡았습니다.

다만, 디바이스 이름을 eno1로 지정하면 이미 그 이름을 사용 중이라고 에러가 뜨더군요. 그래서 다른 이름으로 매칭을 했습니다.

아마도 bushi님이 말씀해주신, 제일 먼저 인식된 PCI NIC 이름을 eno1로 바꾸는 프로세스 다음에 처리가 되는가 봅니다.

제가 주고 싶은 이름으로 완벽히 해결한 것이 아니라서 나중에 정균님과 bushi님이 가르쳐주신 대로 net.ifnames=0 으로 하고 udev rule를 공부해 다시 시도해보겠습니다. 감사합니다.

----
academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.