Linux CentOS 7 主机名永久修改(防 DHCP 覆盖)速查清单
·
CentOS 7 主机名永久修改(防 DHCP 覆盖)速查清单
一、适用场景
- 虚拟机 / 物理机,终端提示符主机名被 DHCP(如路由器)强制覆盖
- 需将主机名永久修改为指定名称(如
localhost),重启后不反弹 - 新手友好,全程 root 执行,复制粘贴即可
二、前置准备
- 以 root 身份登录(普通用户执行
su root,输入密码切换) - 确认当前主机名:
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=no、hostname-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
✅ 使用方法:
- 复制脚本到终端,按回车执行
- 执行
reboot重启验证 - 如需修改主机名,仅需替换
TARGET_HOSTNAME的值
更多推荐
所有评论(0)