CentOS 7 - เปลี่ยนชื่ออินเตอร์เฟซเครือข่ายโดยไม่ต้องรีบูตเครื่อง


24

/etc/sysconfig/network-scriptsฉันเปลี่ยนชื่อเชื่อมต่อเครือข่ายโดยการปรับเปลี่ยนไฟล์ใน

  • eth0 -> nic0
  • eth1 -> nic1

เนื้อหาของสคริปต์เครือข่ายมีลักษณะเช่นนี้หลังจากการแก้ไข:

# cat /etc/sysconfig/network-scripts/ifcfg-nic0
DEVICE=nic0
BOOTPROTO=static
ONBOOT=yes
HWADDR=xx:xx:xx:xx:xx:xx
USERCTL=no
IPV6INIT=no
MASTER=bond0
SLAVE=yes

การรีบูตเปิดใช้งานการกำหนดค่าใหม่ แต่ฉันจะเปิดใช้งานการกำหนดค่านี้โดยไม่ต้องรีบูตเครื่องได้อย่างไร

systemctl restart networkไม่ทำเคล็ดลับ

ฉันสามารถปิดอินเตอร์เฟซเดียวโดยใช้ชื่อเก่า ( ifdown eth0) แต่ifupผลลัพธ์ในข้อความด้านล่างไม่ว่าจะมีการระบุชื่อเก่าหรือใหม่:

ข้อผิดพลาด: [/ etc / sysconfig / network-script / ifup-eth] อุปกรณ์ nic0 ดูเหมือนจะไม่ปรากฏขึ้นทำให้การเริ่มต้นล่าช้า

/etc/init.d/network status แสดงผลลัพธ์นี้:

Configured devices:
lo bond0 nic0 nic1
Currently active devices:
lo eth0 eth1 bond0

ทั้งสองifconfigและip aแสดงชื่ออินเตอร์เฟสเก่า


1
คุณอาจลองลบและโหลดไดรเวอร์อุปกรณ์เครือข่ายอีกครั้งหากพวกเขากำลังรวบรวมเป็นโมดูลเคอร์เนล
Tom Hunt

คำตอบ:


29

คุณสามารถเปลี่ยนชื่ออุปกรณ์โดยใช้คำสั่ง ip:

/sbin/ip link set eth1 down
/sbin/ip link set eth1 name eth123
/sbin/ip link set eth123 up

แก้ไข :

ฉันปล่อยให้ด้านล่างเพื่อความสมบูรณ์และลูกหลาน (และเพื่อจุดประสงค์ในการให้ข้อมูล) แต่ฉันได้ยืนยันความคิดเห็นของ swillและคำตอบของ Marco Macuzzoที่เพียงแค่เปลี่ยนชื่อและอุปกรณ์ของอินเตอร์เฟส / etc / sysconfig / network-script / ifcfg- eth0 (และการเปลี่ยนชื่อไฟล์) จะทำให้อุปกรณ์ตั้งชื่ออย่างถูกต้องตราบเท่าที่ฟิลด์ hwaddr = รวมอยู่ในไฟล์กำหนดค่า ฉันขอแนะนำให้ใช้วิธีนี้แทนหลังจากการอัปเดตที่อ้างอิง

คุณอาจต้องการตรวจสอบให้แน่ใจว่าคุณได้กำหนดค่ากฎ udev เพื่อให้สามารถทำงานในการรีบูตครั้งถัดไปได้เช่นกัน เส้นทางสำหรับ udev ย้ายไปอยู่ใน CentOS 7 ไปยัง /usr/lib/udev/rules.d/60-net.rules แต่คุณยังคงสามารถจัดการได้ในลักษณะเดียวกัน หากคุณเพิ่ม "net.ifnames = 0 biosdevname = 0" ลงในสตริงบูตเคอร์เนลของคุณเพื่อกลับไปที่รูปแบบการตั้งชื่อเก่าสำหรับ nics ของคุณคุณสามารถลบ

ACTION=="add", SUBSYSTEM=="net", DRIVERS=="?*", ATTR{type}=="1", PROGRAM="/lib/udev/rename_device", RESULT=="?*", NAME="$result"

และแทนที่ด้วย

ACTION=="add", SUBSYSTEM=="net", DRIVERS=="?*", ATTR{address}=="00:50:56:8e:3f:a7", NAME="eth123"

คุณต้องการหนึ่งรายการต่อหนึ่งนิก ตรวจสอบให้แน่ใจว่าใช้ที่อยู่ MAC ที่ถูกต้องและอัปเดตฟิลด์ NAME หากคุณไม่ได้ใช้ "net.ifnames = 0 biosdevname = 0" โปรดใช้ความระมัดระวังเนื่องจากอาจมีผลกระทบที่ไม่ตั้งใจ


2
เพิ่งทราบเกี่ยวกับเรื่องนี้ หากคุณใช้ CentOS 7.3 แสดงว่าสิ่งนี้ไม่ทำงาน นี่เป็นเพราะปัญหานี้ ( access.redhat.com/solutions/2592561 ) คุณจะต้องแทนที่ไฟล์ที่/etc/udev/rules.d/90-eno-fix.rulesเพราะจะแทนที่วิธีการทำงานก่อนหน้านี้ทั้งหมดเพื่อเปลี่ยนชื่ออุปกรณ์เครือข่าย
กวาด

เมื่อดูที่คำแนะนำที่คุณอ้างถึงจะมีการบันทึก "ปัญหานี้สามารถหลีกเลี่ยงได้โดยการอัพเดตที่เก็บการติดตั้งเพื่อรวมแพ็คเกจ systemd-219-30.el7_3.6 หรือใหม่กว่าด้วยการเปิดตัว systemd รุ่นใหม่นี้อินเตอร์เฟสที่ได้รับผลกระทบ กฎของ udev จะถูกสร้างขึ้นโดยอัตโนมัติเพื่อหลีกเลี่ยงปัญหาการเปลี่ยนชื่อทั้งหมด "
James Shewey

นั่นคือปัญหาการเปลี่ยนชื่ออื่นที่พวกเขาอ้างถึง พวกเขากำลังพูดถึงชื่อที่สั้นลงเพราะมันยาวเกินไป (ฉันคิดว่า) กฎ udev ที่กล่าวถึงรหัสที่ยากชื่ออินเตอร์เฟซไปยังคุ้มค่าที่จะแทนที่ทั้งหมดของความพยายามเหล่านี้จะเปลี่ยนชื่อไปยังสิ่งที่ต้องการeno######## eth0มันสมเหตุสมผลไหม ฉันจะต้องตรวจสอบบนเครื่องของฉันว่าฉันใช้รุ่นใด แต่ฉันอัพเกรดเป็น CentOS 7.3 ล่าสุดเมื่อวานดังนั้นฉันคิดว่าฉันจะมีเวอร์ชันที่กล่าวถึง
กวาด

วิธีนี้มีประโยชน์สำหรับฉันในการแก้ปัญหาที่แตกต่าง แต่ที่เกี่ยวข้อง - คอนเทนเนอร์เกิดข้อผิดพลาดขณะเริ่มทำงานเนื่องจากข้อผิดพลาดเกี่ยวกับการกำหนดค่าที่ไม่เกี่ยวข้องและปล่อยให้อินเตอร์เฟสเปลี่ยนชื่อจากชื่อระบบ ensXfY เป็นชื่อคอนเทนเนอร์ของ eth1 จากนั้นมันเป็นไปไม่ได้ที่จะพยายามเริ่มต้นคอนเทนเนอร์อีกครั้งเนื่องจากไม่พบอินเทอร์เฟซจนกว่าจะถูกเปลี่ยนชื่อกลับ
Michael Firth

9

จริงๆแล้วคำตอบที่ดีที่สุดที่ฉันเชื่อว่าเป็นการรวมกันของคำตอบทั้งสองที่โพสต์ไว้แล้ว ในการเปลี่ยนชื่ออุปกรณ์โดยไม่ต้องเริ่มบริการเครือข่ายใหม่ให้ใช้ip linkคำสั่งที่แนะนำโดย James Shewey ( ip link set <old_device_name> name <new_device_name>)

เพื่อให้การเปลี่ยนแปลงอยู่รอดในการรีบูต Red Hat Linux /etc/sysconfig/network-scripts/การแก้ไขไฟล์ที่เกี่ยวข้องใน เปลี่ยนชื่อไฟล์ifcfg_<old_device_name>ไปifcfg_<new_device_name>และการเปลี่ยนแปลงภายในตัวแปรDEVICE <new_device_name>ตรวจสอบให้แน่ใจว่าHWADDRตัวแปรถูกตั้งค่าและถูกต้อง ไม่มีความจำเป็นที่จะสัมผัสกฎ udev คือตั้งแต่60-net.rulesเป็นจริงมีการอ่านไฟล์การกำหนดค่า ifcfg /etc/sysconfig/network-scriptsใน


3

ในการกู้คืนการตั้งชื่อแบบเก่าคุณต้องแก้ไข/etc/default/grubไฟล์และเพิ่มรายการต่อไปนี้

net.ifnames=0 biosdevname=0 

ในตอนท้ายของGRUB_CMDLINE_LINUXตัวแปร


หรือเพียงลบbiosdevnameแพ็คเกจออกไปหากติดตั้งไว้
GAD3R

3
ip link set ens33 down
ip link set ens33 name eth0
ip link set eth0 up

mv /etc/sysconfig/network-scripts/ifcfg-{ens33,eth0}

sed -ire "s/NAME=\"ens33\"/NAME=\"eth0\"/" /etc/sysconfig/network-scripts/ifcfg-eth0

sed -ire "s/DEVICE=\"ens33\"/NAME=\"eth0\"/" /etc/sysconfig/network-scripts/ifcfg-eth0

MAC=$(cat /sys/class/net/eth0/address)

echo -n 'HWADDR="'$MAC\" >> /etc/sysconfig/network-scripts/ifcfg-eth0

1
เคล็ดลับการเปลี่ยนชื่อที่ดี :) ขอบคุณสำหรับการแบ่งปัน
166_MMX

2

คำตอบที่ได้รับจาก @James Shewey ดูเหมือนจะเป็นวิธีที่เหมาะสมในการทำเช่นนั้น

หากคุณต้องการทำงานกับไฟล์กำหนดค่า/etc/sysconfig/network-scriptsจากนั้นเปิดใช้งานการโหลดอีกครั้งให้ยกเลิกการโหลดและโหลดโมดูลเคอร์เนลตามที่ @Tom Hunt กล่าวไว้ในความคิดเห็นยังใช้งานได้:

service network stop
modprobe -r igb
modprobe igb
service network start

หากคุณเข้าถึงเครื่องจากระยะไกลตรวจสอบให้แน่ใจว่าคุณเรียกใช้คำสั่งทั้งหมดในเวลาไม่นานหรือคุณจะล็อคตัวเอง:

nohup sh -c "service network stop && modprobe -r igb && modprobe igb ; service network start"

แน่นอนว่าไดรเวอร์สำหรับการโหลดขึ้นอยู่กับส่วนต่อประสานของคุณ


0

ฉันลองข้างต้นกับ Vagrant / VirtualBox และ ansible แต่อย่างใดนี้ไม่ได้เลยในสภาพแวดล้อมการพัฒนาของฉัน

ชื่ออินเทอร์เฟซเก่าถูกดูแลรักษาทุกอย่างที่ฉันทำจนกระทั่งรีสตาร์ทเต็ม

ฉันได้เพิ่มกฎต่อไปนี้ใน/etc/udev/rules.d/60-persistent-net.rules(ขึ้นอยู่กับ: https://access.redhat.com/solutions/112643 )

เป้าหมายของฉันคือให้ชื่อที่ระบุกับอินเตอร์เฟสตามที่อยู่ PCI

ตัวอย่าง:

ACTION=="add", SUBSYSTEM=="net", KERNELS=="0000:00:09.0", NAME:="int0"
ACTION=="add", SUBSYSTEM=="net", KERNELS=="0000:00:10.0", NAME:="ext0"

หลังจากเพิ่มกฎเหล่านั้นฉันดำเนินการคำสั่งต่อไปนี้:

ip link set eth0 down
udevadm control --reload-rules
udevadm trigger
ip link set int0 up

ข้อความแสดงข้อผิดพลาดCannot find device "int0"อยู่ในip link set * upคำสั่ง และใน/var/log/messagesฉันสังเกตเห็นข้อความต่อไปนี้

Aug 16 17:08:41 localhost ansible-command: Invoked with creates=None executable=None _uses_shell=True strip_empty_ends=True _raw_params=ip link set eth0 down && udevadm control --reload-rules && udevadm trigger && ip link set int0 up#012 removes=None argv=None warn=True chdir=None stdin_add_newline=True stdin=None
Aug 16 17:08:41 localhost NetworkManager[6989]: <info>  [1565975321.5971] device (eth6): state change: disconnected -> unavailable (reason 'carrier-changed', sys-iface-state: 'managed')
Aug 16 17:08:41 localhost systemd-udevd: Network interface NamePolicy= disabled on kernel command line, ignoring.

แต่ต่อไปนี้ทำงานโดยเข้าถึง VM ผ่าน VirtualBox และดำเนินการคำสั่งต่อไปนี้เพื่อลบและเพิ่มโมดูลเคอร์เนลอีกครั้ง

rmmod e1000 
modprobe e1000

ฉันพบสิ่งนี้ในกระทู้ต่อไปนี้: https://www.centos.org/forums/viewtopic.php?t=54695

สิ่งแปลกที่ฉันสังเกตเห็นคือที่lsmodให้ฉัน (หมายเหตุUsed by)

[vagrant@node-01 ~]$ lsmod
Module                  Size  Used by
e1000                 137586  0 

โปรดแจ้งให้เราทราบว่าอะไรไม่ได้ผลกับคำตอบที่ยอมรับพร้อมกับข้อความแสดงข้อผิดพลาดที่แน่นอน ด้วยวิธีนี้อาจปรับปรุงคำตอบได้
Ned64

@ Ned64 ฉันได้เพิ่มข้อความแสดงข้อผิดพลาดและข้อมูลอีกเล็กน้อย
Sander Visser

สิ่งที่ผมหมายถึงคือ: เกิดอะไรขึ้นเมื่อคุณพิมพ์เป็นราก: ip link set eth0 down; ip link set eth0 name int0; ip link set int0 up? ไม่มีudev...คำสั่ง!
Ned64
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.