AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1649543
Accepted
xpt
xpt
Asked: 2021-05-17 14:11:00 +0800 CST2021-05-17 14:11:00 +0800 CST 2021-05-17 14:11:00 +0800 CST

如何在 Debian/Ubuntu 上用域名更改主机名

  • 772

虽然这似乎是一个常见问题解答,但我从来没有找到在 Debian/Ubuntu 上用域名更改主机名的正确方法。

首先,通过将主机名和域名(FQDN)放入/etc/hostname,像这样,这个和这个,许多“答案”或着作都是错误的,因为

Debian 参考资料说主机名不应该使用 FQDN:

3.5.5。主机名

内核维护系统主机名。运行级别 S 中与“ /etc/init.d/hostname.sh ”符号链接的初始化脚本在引导时(使用hostname命令)将系统主机名设置为存储在“ /etc/hostname ”中的名称。此文件应仅包含系统主机名,而不是完全限定的域名。

此外,从man hostname,它说,

“/etc/hosts通常,这是通过将主机名别名为 FQDN 来设置域名的地方。” 和“FQDN 由短主机名和 DNS 域名组成。除非您使用绑定或 NIS 进行主机查找,否则您可以在 /etc/hosts 中更改 FQDN 和 DNS 域名(它是 FQDN 的一部分)文件。”

好的。以上是我应该做的,但这就是我得到的:

$ cat /etc/hostname
coral

$ head -1 /etc/hosts 
127.0.0.1       coral.my.domain.org localhost

$ dnsdomainname
ht.home

$ cat /etc/resolv.conf
domain ht.home
search ht.home
nameserver 192.168.0.1

# after I change it to --

$ cat /etc/resolv.conf
# Fixed resolv.conf file
domain my.domain.org
search my.domain.org
nameserver 192.168.0.1

# everything just gone wrong --

$ dnsdomainname
dnsdomainname: No address associated with hostname

$ hostname -f
hostname: No address associated with hostname

$ hostname -d
hostname: No address associated with hostname

更新

我做了一个跟踪hostname -f,似乎“没有与主机名关联的地址”错误来自libresolv.so:

$ strace -o /tmp/strace.log hostname -f
hostname: No address associated with hostname

$ grep -E 'openat|close|No address' /tmp/strace.log
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
close(3)                                = 0
close(3)                                = 0
close(3)                                = 0
openat(AT_FDCWD, "/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 3
close(3)                                = 0
openat(AT_FDCWD, "/etc/host.conf", O_RDONLY|O_CLOEXEC) = 3
close(3)                                = 0
openat(AT_FDCWD, "/etc/resolv.conf", O_RDONLY|O_CLOEXEC) = 3
close(3)                                = 0
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libnss_files.so.2", O_RDONLY|O_CLOEXEC) = 3
close(3)                                = 0
openat(AT_FDCWD, "/etc/hosts", O_RDONLY|O_CLOEXEC) = 3
close(3)                                = 0
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libnss_dns.so.2", O_RDONLY|O_CLOEXEC) = 3
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libresolv.so.2", O_RDONLY|O_CLOEXEC) = 3
close(3)                                = 0
close(3)                                = 0
close(3)                                = 0
write(2, "No address associated with hostn"..., 35) = 35

任何帮助表示赞赏。

$ uname -rm
5.10.0-6-amd64 x86_64

$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux bullseye/sid
Release:        testing
Codename:       bullseye

linux networking
  • 1 1 个回答
  • 1018 Views

1 个回答

  • Voted
  1. Best Answer
    user1686
    2021-05-17T15:32:40+08:002021-05-17T15:32:40+08:00

    您的“FQDN”由不同的程序以两种不同的方式确定:

    1. 通过对您的主机名进行“主机”查找(使用通常用于解析 IP 地址的相同 Glibc 函数)并返回产生答案的“规范”域名。

      例如,这是带有 flags=AI_CANONNAME 的 getaddrinfo() 将在 ai_canonname 字段中返回的内容,而 gethostbyname() 将在 ht_name 字段中返回的内容。实际上,inetutilshostname -f确实会调用 gethostbyname() 并在查找成功时打印结果 ht_name。

      这可以通过 /etc/hosts 或 DNS 进行处理,因此接下来会发生什么取决于 nsswitch.conf 中列出的模块,依次为:

      • 'files' 模块检查 /etc/hosts 的文字主机名(不附加任何内容)。如果它找到匹配的条目,则该条目的第一个名称是规范名称,其余的是别名。IP 地址被返回但被忽略。

        所以你可能有这样的条目:

        127.0.0.1 coral.my.domain.org coral localhost
        -or-
        192.168.0.234 coral.my.domain.org coral
        

        FQDN 必须放在“规范名称”字段中,但短主机名必须存在于别名中,否则将找不到匹配项。

        (实际地址在这里无关紧要,只有条目的存在。但因为 gethostbyname() 仅适用于 IPv4,hostname -f将跳过 IPv6 地址的 /etc/hosts 条目,而使用 getaddrinfo(AI_CANONNAME) 的程序将包括这些。)

      • 'dns' 模块对给定的主机名进行 DNS 'A' 查询,并结合来自 /etc/resolv.conf 的搜索域。因此,使用 hostnamecoral和 resolv.conf search my.domain.org,coral.my.domain.org将进行 A 查找。

        (如何在 Glibc 中确定搜索域?首先使用 $LOCALDOMAIN,然后使用 resolv.conf 中的“域”或“搜索”,以最后出现的为准,最后检查内核主机名是否包含域。)

        无论 DNS 答案中的名称是否具有 A 记录,都将作为规范名称(即您的 FQDN)返回;如果有任何 CNAME,它们的域将作为别名返回。例如,如果查询产生以下结果:

        coral.my.domain.org.    CNAME    coral.reef.domain.org.
        coral.reef.domain.org.  CNAME    coral.home.domain.net.
        coral.home.domain.net.  A        1.2.3.4
        

        然后coral.home.domain.net将是规范名称,左列中的其他两个名称将是别名。

        (实际返回的 IP 地址仍然无关紧要。关于 gethostbyname() 仅适用于 IPv4 的相同说明。)

      其他各种模块,例如“myhostname”或“ldap”或“nis”也可以参与其中。列表中产生答案的第一个获胜。仅当没有模块找到查询结果时,才会返回错误“没有与主机名关联的地址” 。

    2. 或者,通过对您的主机名进行“主机”查找,然后对生成的 IP 地址进行反向查找。我认为这不太常见,但仍然发生。

      这些是直接的查找,背后没有任何魔法。正向“主机”查找通常使用仅限 IPv4 的 gethostbyname() 完成,返回一个 IP 地址,反之则使用 gethostbyaddr()。

      • 在 /etc/hosts 中,使用 'files' 模块,您将再次需要一个与上面几乎相同的条目 - 将您的 FQDN 作为名字,将短主机名作为同一行中的别名之一。当通过 IP 地址进行反向查找时,将返回名字。

        127.0.0.1 coral.my.domain.org coral localhost
        -or-
        192.168.0.234 coral.my.domain.org coral
        
      • 在 DNS 中,使用“dns”模块,正向查找再次与上述相同(搜索域后缀)。

      这两个查找是独立的;一个可能通过 /etc/hosts 处理,另一个通过 DNS 等处理。

    探索方法#1:

    import sys
    import socket
    
    try:
        host = sys.argv[1]
    except IndexError:
        host = socket.gethostname()
    
    try:
        name, aliases, addresses = socket.gethostbyname_ex(host)
        print("gethostbyname(): name = %s, aliases = %s" % (name, aliases))
    except socket.gaierror as e:
        print("gethostbyname(): Not found (%s); must be IPv6-only" % e)
    
    try:
        res = socket.getaddrinfo(host, 0, flags=socket.AI_CANONNAME)
        for (addr_family, socktype, protocol, canonname, sock_addr) in res:
            print("getaddrinfo(): canonname =", canonname)
            break # gai only fills in cname for the 1st result
    except socket.gaierror as e:
        print("getaddrinfo(): Not found (%s)" % e)
    

    我对主机名 -f 进行了跟踪,似乎“没有与主机名关联的地址”错误来自 libresolv.so:

    不——它来自 libc 中的高级 nsswitch 代码,在它尝试调用所有启用的模块(首先是 nss_files,然后是 nss_dns→libresolv)并且它们都没有返回答案之后。

    首先,通过将主机名和域名(FQDN)放入/etc/hostname,许多“答案”或写作都是错误的,例如this,this和this,因为

    他们并非完全错误。Glibc DNS 解析器实际上从您的内核主机名中获取域,并将其用作后备“搜索”域(如果尚未在 resolv.conf 中指定)。

    因此它不会立即作为您的 FQDN 返回,但它确实会以与 /etc/resolv.conf 中的search或domain在 /etc/resolv.conf 中完全相同的方式影响该过程。不仅适用于本地 FQDN 查找,还适用于通过 Glibc 函数完成的任何DNS 查找。(参见 resolv/res_init.c 中的函数 domain_from_hostname())

    • 5

相关问题

  • Win10 1803:如何让移动热点成为专用网络?

  • nc如何识别服务名称

  • 以 root 身份运行 docker 容器

  • 如何在域和 Linux 活动目录中启用指纹传感器

  • 如何在CentOS 7 中将Ctrl+C 永久更改为Ctrl+K?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    Saaru Lindestøkke 为什么使用 Python 的 tar 库时 tar.xz 文件比 macOS tar 小 15 倍? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 为什么通过电缆(同轴电缆)的千兆位/秒 Internet 连接不能像光纤一样提供对称速度? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve