CentOS 7 主机名永久修改(防 DHCP 覆盖)速查清单

一、适用场景

  • 虚拟机 / 物理机,终端提示符主机名被 DHCP(如路由器)强制覆盖
  • 需将主机名永久修改为指定名称(如localhost),重启后不反弹
  • 新手友好,全程 root 执行,复制粘贴即可

二、前置准备

  1. 以 root 身份登录(普通用户执行su root,输入密码切换)
  2. 确认当前主机名:hostname(记录旧名,用于对比)

三、完整操作步骤(按顺序执行,禁止跳步)

步骤 1:强制设置静态主机名

bash

运行

# 替换为你想要的主机名,示例为localhost
hostnamectl set-hostname localhost --static

✅ 作用:直接写入/etc/hostname,锁定静态主机名,优先级最高

步骤 2:适配真实网卡,禁止 DHCP 修改主机名

bash

运行

# 自动识别真实网卡文件,无需手动确认网卡名
REAL_IF=$(ls /etc/sysconfig/network-scripts/ifcfg-e* | head -1)

# 禁止DHCP覆盖主机名,同时指定DHCP上报主机名
echo "PEERHOSTNAME=no" >> $REAL_IF
echo "DHCP_HOSTNAME=localhost" >> $REAL_IF

✅ 作用:彻底阻断 DHCP 推送的主机名覆盖,解决重启变旧名的核心问题

步骤 3:禁用 NetworkManager 动态主机名修改

bash

运行

# 自动在[main]段下添加配置,无需手动编辑文件
sed -i '/^\[main\]/a hostname-mode=none' /etc/NetworkManager/NetworkManager.conf
# 若文件无[main]段,执行以下命令补全
grep -q "\[main\]" /etc/NetworkManager/NetworkManager.conf || echo -e "[main]\nhostname-mode=none" >> /etc/NetworkManager/NetworkManager.conf

✅ 作用:完全关闭 NetworkManager 的主机名自动修改功能,双重保险

步骤 4:重启网络服务生效

bash

运行

systemctl restart NetworkManager

✅ 作用:加载所有网络配置,避免 network 服务启动失败(兼容 CentOS 7 默认 NetworkManager)

步骤 5:刷新当前终端提示符(立即生效)

bash

运行

exec bash

✅ 作用:无需重启,当前终端直接显示新主机名

步骤 6:重启系统验证永久生效

bash

运行

reboot

✅ 作用:验证重启后主机名不反弹,确认配置永久生效


四、验证命令(重启后执行)

bash

运行

# 1. 查看当前主机名
hostname
# 2. 查看静态主机名配置
hostnamectl status
# 3. 查看网卡配置(确认PEERHOSTNAME=no已生效)
cat $(ls /etc/sysconfig/network-scripts/ifcfg-e* | head -1) | grep PEERHOSTNAME
# 4. 查看NetworkManager配置(确认hostname-mode=none已生效)
cat /etc/NetworkManager/NetworkManager.conf | grep hostname-mode

✅ 正常输出:

  • hostname/hostnamectl status 显示目标主机名(如localhost
  • PEERHOSTNAME=nohostname-mode=none 配置存在

五、常见问题排查

1. 执行systemctl restart network报错

  • 原因:CentOS 7 默认使用 NetworkManager,network服务已废弃
  • 解决:直接使用systemctl restart NetworkManager,无需启动network服务

2. 重启后主机名仍变回旧名

  • 原因:DHCP 仍在推送主机名,或cloud-init覆盖配置
  • 解决:追加执行以下命令,彻底禁用 cloud-init 主机名修改

    bash

    运行

    echo "preserve_hostname=yes" >> /etc/cloud/cloud.cfg 2>/dev/null
    

3. 网卡文件不是ifcfg-e*格式

  • 原因:部分环境网卡名为ens33/eth0等,自动识别命令失效
  • 解决:手动执行ip addr查看网卡名,替换REAL_IF为真实网卡文件路径

    bash

    运行

    # 示例:网卡名为ens33
    REAL_IF=/etc/sysconfig/network-scripts/ifcfg-ens33
    

六、关键配置说明

表格

配置项 作用
hostnamectl set-hostname --static 写入静态主机名,系统级永久生效
PEERHOSTNAME=no 禁止 DHCP 客户端修改系统主机名
DHCP_HOSTNAME=xxx 指定 DHCP 上报的主机名,避免 DHCP 推送覆盖
hostname-mode=none 禁用 NetworkManager 动态主机名修改
preserve_hostname=yes 禁用 cloud-init 主机名覆盖(可选)

七、一键执行脚本(懒人版)

直接复制以下脚本,root 下一次性执行所有操作,自动适配环境:

bash

运行

#!/bin/bash
# CentOS 7 主机名永久修改脚本,替换为目标主机名
TARGET_HOSTNAME="localhost"

# 1. 设置静态主机名
hostnamectl set-hostname $TARGET_HOSTNAME --static

# 2. 识别真实网卡,禁止DHCP覆盖
REAL_IF=$(ls /etc/sysconfig/network-scripts/ifcfg-e* | head -1)
echo "PEERHOSTNAME=no" >> $REAL_IF
echo "DHCP_HOSTNAME=$TARGET_HOSTNAME" >> $REAL_IF

# 3. 禁用NetworkManager动态修改
sed -i '/^\[main\]/a hostname-mode=none' /etc/NetworkManager/NetworkManager.conf
grep -q "\[main\]" /etc/NetworkManager/NetworkManager.conf || echo -e "[main]\nhostname-mode=none" >> /etc/NetworkManager/NetworkManager.conf

# 4. 禁用cloud-init覆盖(可选)
echo "preserve_hostname=yes" >> /etc/cloud/cloud.cfg 2>/dev/null

# 5. 重启网络
systemctl restart NetworkManager

# 6. 刷新终端
exec bash

✅ 使用方法:

  1. 复制脚本到终端,按回车执行
  2. 执行reboot重启验证
  3. 如需修改主机名,仅需替换TARGET_HOSTNAME的值
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐