主机名称的限制-不能含有下划线
关于 Linux 主机名称的规范遇到过多次,这次还真是由于自己记忆混淆引起,所以觉得有必要记录一下。
首先我肯定知道主机名称中-
和 _
是有一个是不允许的,但是在日常的使用中这俩字符串经常也会经常出现在主机名称中,但是没遇到什么限制。不过我对这个问题印象最深的是 ORACLE em 重建的时候,每次都不成功,但是看日志没有明显的提示是主机名称有问题,但是日志中会写到有关主机名称,后来真的将主机名称中的下划线去掉解决了,当时也去查了主机名称规范,但是呢好记性不如烂笔头,今天又遇到了,仍然也是 ORACLE em的问题,但是这次给我了主机名称之后,我一看是是个连字符-
我就说这个主机名称不行,创建oem会失败,然后我就给修改了,将-
改成了 _
,然后翻车的事情来了,这次在创建 em的时候直接给我来了一个提示:
WARNING : While repository is dropped the database will be put in quiesce mode.
Do you wish to continue? [yes(Y)/no(N)]: y
Jan 18, 2025 6:12:42 PM oracle.sysman.emcp.EMConfig perform
INFO: This operation is being logged at /data/app/oracle/cfgtoollogs/emca/fdbname/emca_2025_01_18_18_12_04.log.
Jan 18, 2025 6:12:42 PM oracle.sysman.emcp.EMConfig performSEVERE: Invalid Hostname xxx_abc. Hostname should not contain underscore _ in it.
Refer to the log file at /data/app/oracle/cfgtoollogs/emca/fdbname/emca_2025_01_18_18_12_04.log for more details.
Could not complete the configuration. Refer to the log file at /data/app/oracle/cfgtoollogs/emca/fdbname/emca_2025_01_18_18_12_04.log for more details.
查看/data/app/oracle/cfgtoollogs/emca/fdbname/emca_2025_01_18_18_12_04.log
日志如下:
oracle.sysman.emcp.exception.EMConfigException: Invalid Hostname xxx_abc. Hostname should not contain underscore _ in it.
at oracle.sysman.emcp.ParamsManager.checkValidHostname(ParamsManager.java:2867)
at oracle.sysman.emcp.EMDBPreConfig.invoke(EMDBPreConfig.java:213)
at oracle.sysman.emcp.EMDBPreConfig.invoke(EMDBPreConfig.java:198)
at oracle.sysman.emcp.EMConfig.perform(EMConfig.java:250)
at oracle.sysman.emcp.EMConfigAssistant.invokeEMCA(EMConfigAssistant.java:599)
at oracle.sysman.emcp.EMConfigAssistant.performConfiguration(EMConfigAssistant.java:1482)
at oracle.sysman.emcp.EMConfigAssistant.statusMain(EMConfigAssistant.java:583)
at oracle.sysman.emcp.EMConfigAssistant.main(EMConfigAssistant.java:529)
Jan 18, 2025 6:12:42 PM oracle.sysman.emcp.EMConfig restoreOuiLoc
这次是确确实实的提示主机名称不能含有_
,好吧,那就规规矩矩的改吧。
改完之后重建 em
1 | emca -config dbcontrol db -repos recreate |
参考资料 GPT-4o.
是的,某些应用程序和系统可能对主机名的格式有严格要求。例如,SEVERE: Invalid Hostname
提示的错误表明主机名 xxx_abc
因包含下划线 _
而被判定为无效。这种限制通常是遵循互联网标准的结果。
背景原因
DNS 和主机名标准:
根据
RFC 952
和
RFC 1123
,主机名的有效字符集为:
- 英文字母(
a-z
和A-Z
) - 数字(
0-9
) - 连字符(
-
,但不能在开头或结尾,也不能连续使用)
- 英文字母(
下划线
_
并不符合主机名的合法字符标准。例如,
xxx-abc
是合法的主机名,而xxx_abc
是非法的。
某些应用的严格性:
- 某些系统和应用(如 Oracle、Java 应用服务器等)严格遵循上述标准,在解析主机名时会拒绝包含非法字符的名称。
- 而一些系统(如 Windows)在本地解析时可能支持
_
,但在严格遵循标准的网络环境下,这些名称可能导致问题。
解决方法
1. 修改主机名
确保主机名只包含合法字符(英文字母、数字、连字符),例如将
xxx_abc
改为xxx-abc
。在 Linux 中修改主机名的步骤:
修改
1
/etc/hostname
文件:
1
echo "xxx-abc" > /etc/hostname
修改
1
/etc/hosts
文件,将旧主机名替换为新主机名:
1
sed -i 's/xxx_abc/xxx-abc/g' /etc/hosts
使更改生效:
1
hostnamectl set-hostname xxx-abc
2. 检查应用配置
- 如果无法修改主机名,可以检查应用程序是否提供绕过检查的选项。
- 某些系统可能允许自定义主机名校验规则,禁用对
_
的限制。
3. 网络环境测试
- 如果应用需要跨网络访问,务必避免使用包含
_
的主机名,因为 DNS 系统可能会拒绝解析。 - 对于本地测试或非严格环境,可以考虑直接使用 IP 地址。
总结
严格遵守主机名的标准可以避免潜在的兼容性问题。建议修改主机名以符合标准,特别是在生产环境中。
原文作者: liups.com
原文链接: http://liups.com/posts/cb9d2aa3/
许可协议: 知识共享署名-非商业性使用 4.0 国际许可协议