关于 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 perform
SEVERE: 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 因包含下划线 _ 而被判定为无效。这种限制通常是遵循互联网标准的结果。

背景原因

  1. DNS 和主机名标准

    • 根据

      RFC 952

      RFC 1123

      ,主机名的有效字符集为:

      • 英文字母(a-zA-Z
      • 数字(0-9
      • 连字符(-,但不能在开头或结尾,也不能连续使用)
    • 下划线 _ 并不符合主机名的合法字符标准。

    • 例如,xxx-abc 是合法的主机名,而 xxx_abc 是非法的。

  2. 某些应用的严格性

    • 某些系统和应用(如 Oracle、Java 应用服务器等)严格遵循上述标准,在解析主机名时会拒绝包含非法字符的名称。
    • 而一些系统(如 Windows)在本地解析时可能支持 _,但在严格遵循标准的网络环境下,这些名称可能导致问题。

解决方法

1. 修改主机名

  • 确保主机名只包含合法字符(英文字母、数字、连字符),例如将 xxx_abc 改为 xxx-abc

  • 在 Linux 中修改主机名的步骤:

    1. 修改

      1
      /etc/hostname

      文件:

      1
      echo "xxx-abc" > /etc/hostname
    2. 修改

      1
      /etc/hosts

      文件,将旧主机名替换为新主机名:

      1
      sed -i 's/xxx_abc/xxx-abc/g' /etc/hosts
    3. 使更改生效:

      1
      hostnamectl set-hostname xxx-abc

2. 检查应用配置

  • 如果无法修改主机名,可以检查应用程序是否提供绕过检查的选项。
  • 某些系统可能允许自定义主机名校验规则,禁用对 _ 的限制。

3. 网络环境测试

  • 如果应用需要跨网络访问,务必避免使用包含 _ 的主机名,因为 DNS 系统可能会拒绝解析。
  • 对于本地测试或非严格环境,可以考虑直接使用 IP 地址。

总结

严格遵守主机名的标准可以避免潜在的兼容性问题。建议修改主机名以符合标准,特别是在生产环境中。

https://datatracker.ietf.org/doc/html/rfc1034#section-3.1

原文作者: liups.com

原文链接: http://liups.com/posts/cb9d2aa3/

许可协议: 知识共享署名-非商业性使用 4.0 国际许可协议