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
    • 最新
    • 标签
主页 / server / 问题 / 562783
Accepted
David Tonhofer
David Tonhofer
Asked: 2013-12-21 09:35:07 +0800 CST2013-12-21 09:35:07 +0800 CST 2013-12-21 09:35:07 +0800 CST

正确设置主机名 - Amazon EC2 上的 Fedora 20

  • 772

语境

我有一个在 Amazon EC2 上运行的Fedora 20 云映像(以下称为“实例”)。而且我对持续设置其主机名有些不确定。

目标

在这种情况下,假设我想将实例的主机名设置为penpen.homelinux.org。(这个名称也将使用 注册在 DynDNS ddclient,但这是我们在这里不感兴趣的另一个方面。)

主机名当然可以在引导完成后手动设置(使用hostnamectl等)。但是我们希望在第一次登录之前设置正确的主机名。

传统上,要持久配置主机名,需要修改/etc/hostname. 不幸的是,这在这里不起作用。

默认系统行为

默认情况下,实例将其主机名设置为内部 EC2 名称。启动后,我们可以查看产生主机名的所有不同的地方,我们发现:

Kernel hostname via 'sysctl'                      : ip-10-164-65-105.ec2.internal
Kernel domainname via 'sysctl'                    : (none)
File '/etc/hostname'                              : contains 'ip-10-164-65-105.ec2.internal'
File '/etc/sysconfig/network'                     : exists but has no 'HOSTNAME' line
According to the shell                            : HOSTNAME = ip-10-164-65-105.ec2.internal
Nodename given by 'uname --nodename'              : ip-10-164-65-105.ec2.internal
Hostname ('hostname')                             : ip-10-164-65-105.ec2.internal
Short hostname ('hostname --short')               : ip-10-164-65-105
NIS domain name ('domainname')                    : (none)
YP default domain ('hostname --yp')               : [hostname --yp failed]
DNS domain name ('hostname --domain')             : ec2.internal
Fully qualified hostname ('hostname --fqdn')      : ip-10-164-65-105.ec2.internal
Hostname alias ('hostname --alias')               : 
By IP address ('hostname --ip-address')           : 10.164.65.105
All IPs ('hostname --all-ip-addresses')           : 10.164.65.105 
All FQHNs via IPs ('hostname --all-ip-addresses') : ip-10-164-65-105.ec2.internal 
Static hostname via 'hostnamectl'                 : ip-10-164-65-105.ec2.internal
Transient hostname via 'hostnamectl'              : ip-10-164-65-105.ec2.internal
Pretty hostname via 'hostnamectl'                 : 

因此,让我们尝试写入 /etc/hostname ...

如果将所需的主机名写入/etc/hostname,则此更改会在下次引导时再次丢失。让我们检查一下引导过程,该过程由systemd.

示例运行

写入rorororoor.homelinux.org,/etc/hostname然后重新启动。

使用journald我们发现(请注意,日志行并非完全按时间排序):

引导过程以主机名作为localhost开始,然后切换为 root,此时主机名变为rorororoor.homelinux.org。

Dec 26 15:12:08 localhost systemd[1]: Starting Cleanup udevd DB...
Dec 26 15:12:08 localhost systemd[1]: Started Cleanup udevd DB.
Dec 26 15:12:08 localhost systemd[1]: Starting Switch Root.
Dec 26 15:12:08 localhost systemd[1]: Reached target Switch Root.
Dec 26 15:12:08 localhost systemd[1]: Starting Switch Root...
Dec 26 15:12:08 localhost systemd[1]: Switching root.
Dec 26 15:12:08 localhost systemd-journal[67]: Journal stopped
Dec 26 15:12:12 rorororoor.homelinux.org systemd-journal[155]: Runtime journal is using 8.0M
Dec 26 15:12:12 rorororoor.homelinux.org systemd-journal[155]: Runtime journal is using 8.0M
Dec 26 15:12:12 rorororoor.homelinux.org systemd-journald[67]: Received SIGTERM
...........
Dec 26 15:12:12 rorororoor.homelinux.org kernel: SELinux: initialized
Dec 26 15:12:12 rorororoor.homelinux.org systemd-journal[155]: Journal started
Dec 26 15:12:08 rorororoor.homelinux.org systemd-cgroups-agent[128]: Failed to get D-Bus connection: Failed to connect to socket /run/systemd/private: No such file or directory
Dec 26 15:12:10 rorororoor.homelinux.org systemd[1]: systemd 208 running in system mode.
Dec 26 15:12:10 rorororoor.homelinux.org systemd[1]: Detected virtualization 'xen'.
Dec 26 15:12:10 rorororoor.homelinux.org systemd[1]: Set hostname to <rorororoor.homelinux.org>.
Dec 26 15:12:10 rorororoor.homelinux.org systemd[1]: Failed to open private bus connection: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory
Dec 26 15:12:11 rorororoor.homelinux.org systemd[1]: Mounted Debug File System.

我们看到systemd将主机名设置为rorororoor.homelinux.org,显然随着日志的主机列更改成功。发出一些错误,可能是因为hostnamectl此时无法联系 DBus。

我不确定是谁在这里命名;systemd的一些内部部分?无论如何,继续浏览日志,我们发现主机名很快被设置回 EC2 内部名称:

Dec 26 15:12:33 rorororoor.homelinux.org cloud-init[485]: [CLOUDINIT] util.py[DEBUG]: Running command ('resize2fs', '/dev/xvda1') with allowed return codes [0] (shell=False, capture=True)
Dec 26 15:12:33 rorororoor.homelinux.org cloud-init[485]: [CLOUDINIT] cc_resizefs.py[DEBUG]: Resizing took 0.067 seconds
Dec 26 15:12:33 rorororoor.homelinux.org cloud-init[485]: [CLOUDINIT] cc_resizefs.py[DEBUG]: Resized root filesystem (type=ext4, val=True)
Dec 26 15:12:33 rorororoor.homelinux.org cloud-init[485]: [CLOUDINIT] helpers.py[DEBUG]: config-set_hostname already ran (freq=once-per-instance)
Dec 26 15:12:33 rorororoor.homelinux.org cloud-init[485]: [CLOUDINIT] helpers.py[DEBUG]: Running config-update_hostname using lock (<cloudinit.helpers.DummyLock object at 0x2559210>)
Dec 26 15:12:33 rorororoor.homelinux.org cloud-init[485]: [CLOUDINIT] cc_update_hostname.py[DEBUG]: Updating hostname to ip-10-164-65-105.ec2.internal (ip-10-164-65-105)
Dec 26 15:12:33 rorororoor.homelinux.org cloud-init[485]: [CLOUDINIT] util.py[DEBUG]: Running command ['hostname'] with allowed return codes [0] (shell=False, capture=True)
Dec 26 15:12:33 rorororoor.homelinux.org cloud-init[485]: [CLOUDINIT] __init__.py[DEBUG]: Attempting to update hostname to ip-10-164-65-105.ec2.internal in 1 files
Dec 26 15:12:33 rorororoor.homelinux.org cloud-init[485]: [CLOUDINIT] util.py[DEBUG]: Running command ['hostnamectl', 'set-hostname', 'ip-10-164-65-105.ec2.internal'] with allowed return codes [0] (shell=False, capture=True)
Dec 26 15:12:33 rorororoor.homelinux.org dbus-daemon[226]: dbus[226]: [system] Activating via systemd: service name='org.freedesktop.hostname1' unit='dbus-org.freedesktop.hostname1.service'
Dec 26 15:12:33 rorororoor.homelinux.org dbus[226]: [system] Activating via systemd: service name='org.freedesktop.hostname1' unit='dbus-org.freedesktop.hostname1.service'
Dec 26 15:12:34 rorororoor.homelinux.org systemd[1]: Starting Hostname Service...
Dec 26 15:12:34 rorororoor.homelinux.org dbus-daemon[226]: dbus[226]: [system] Successfully activated service 'org.freedesktop.hostname1'
Dec 26 15:12:34 rorororoor.homelinux.org dbus[226]: [system] Successfully activated service 'org.freedesktop.hostname1'
Dec 26 15:12:34 rorororoor.homelinux.org systemd[1]: Started Hostname Service.
Dec 26 15:12:34 rorororoor.homelinux.org systemd-hostnamed[598]: Changed static host name to 'ip-10-164-65-105.ec2.internal'
Dec 26 15:12:34 ip-10-164-65-105.ec2.internal systemd-hostnamed[598]: Changed host name to 'ip-10-164-65-105.ec2.internal'
Dec 26 15:12:34 ip-10-164-65-105.ec2.internal systemd[1]: Started Initial cloud-init job (metadata service crawler).
Dec 26 15:12:34 ip-10-164-65-105.ec2.internal systemd[1]: Starting Cloud-config availability.
Dec 26 15:12:34 ip-10-164-65-105.ec2.internal systemd[1]: Reached target Cloud-config availability.
Dec 26 15:12:34 ip-10-164-65-105.ec2.internal systemd[1]: Starting Apply the settings specified in cloud-config...
Dec 26 15:12:34 ip-10-164-65-105.ec2.internal [485]: [CLOUDINIT] helpers.py[DEBUG]: Running config-update_etc_hosts using lock (<cloudinit.helpers.DummyLock object at 0x2559350>)
Dec 26 15:12:34 ip-10-164-65-105.ec2.internal [485]: [CLOUDINIT] cc_update_etc_hosts.py[DEBUG]: Configuration option 'manage_etc_hosts' is not set, not managing /etc/hosts in module update_etc_hosts
Dec 26 15:12:34 ip-10-164-65-105.ec2.internal [485]: [CLOUDINIT] helpers.py[DEBUG]: config-rsyslog already ran (freq=once-per-instance)
Dec 26 15:12:34 ip-10-164-65-105.ec2.internal [485]: [CLOUDINIT] helpers.py[DEBUG]: config-users-groups already ran (freq=once-per-instance)

此处的主机名设置是通过“systemd-hostnamed”单元完成的。“systemd-hostnamed”的“单元文件”/usr/lib/systemd/system/systemd-hostnamed.service包含:

[Unit]
Description=Hostname Service
Documentation=man:systemd-hostnamed.service(8) man:hostname(5) man:machine-info(5)
Documentation=http://www.freedesktop.org/wiki/Software/systemd/hostnamed

[Service]
ExecStart=/usr/lib/systemd/systemd-hostnamed
BusName=org.freedesktop.hostname1
CapabilityBoundingSet=CAP_SYS_ADMIN CAP_DAC_OVERRIDE CAP_SYS_PTRACE

上面调用的程序/usr/lib/systemd/systemd-hostnamed实际上是一个二进制文件(为什么!)。但是可以找到源代码。

关键是我们回到了ip-10-164-65-105.ec2.internal

做什么?

amazon-ec2
  • 5 5 个回答
  • 5234 Views

5 个回答

  • Voted
  1. Best Answer
    Michael Hampton
    2013-12-27T09:07:49+08:002013-12-27T09:07:49+08:00

    你需要做两件事(但只做了其中一件):

    1. 将主机名设置在/etc/hostname.
    2. 编辑/etc/cloud/cloud.cfg并设置preserve_hostname为True. (您也可以将此选项与您的用户数据一起传递。)

    第二步是必需的,因为 Fedora 使用cloud-init从 EC2 环境中引入用户数据来配置实例,并且cloud-init需要告知主机名应该保持不变。

    • 11
  2. IanB
    2015-07-29T18:02:57+08:002015-07-29T18:02:57+08:00

    另一种选择是通过用户数据设置主机名

    例如

    #cloud-config
    hostname: foo
    fqdn: foo.bar.net
    

    这将在启动时设置主机名,但是我不确定这是否总是在第一次登录之前发生。

    • 2
  3. user9517
    2013-12-21T13:09:34+08:002013-12-21T13:09:34+08:00

    看起来答案在 hostnamectl 手册页中,现在有 3 个主机名,静态、瞬态和漂亮的主机名。

    要设置我认为是您想要的静态主机名,

    hostnamectl --static set-hostname somehost.tld
    

    您可以将它们全部设置为相同

    hostnamectl set-hostname somehost.tld
    
    • 1
  4. David Tonhofer
    2013-12-27T09:05:53+08:002013-12-27T09:05:53+08:00

    使用附加单元文件求解

    以下内容实际上不起作用:

    创建/usr/lib/systemd/system/penpen-naming.service要在之后systemd-hostnamed.service(并且可能仅在 之后dbus.service)启动的系统单元文件。

    (我必须安静地进行几次试验才能找到“正确的位置”,这样systemd就不会因为“检测到循环”而简单地停用新单元。请注意,您可以使用 绘制单元文件依赖关系图systemd-analyze dot,这会创建一个“点" 文件被传递给 "graphviz"dot程序,但结果只是一个大的混乱图,除非你预先过滤它)

    单元文件内容/usr/lib/systemd/system/penpen-naming.service:

    [Unit]
    Description= *** Hostname becomes 'penpen.homelinux.org' ***
    After=default.target 
    # After=systemd-hostnamed.service -- NOPE 
    # After=dbus.service  -- NOPE
    
    [Service]
    Type=oneshot
    RemainAfterExit=yes
    ExecStart=/usr/local/toolbox/setting_hostnames/penpen
    
    [Install]
    WantedBy=multi-user.target
    

    使用激活它systemctl enable penpen-naming

    做什么/usr/local/toolbox/setting_hostnames/penpen?如果将penpen.homelinux.org写入/etc/hostname. 但这实际上还不够,还必须使用hostnamectl.

    即使这样,该单元也必须运行得这么晚(After=default.target),以至于登录 shell 仍然显示 EC2 内部主机名。连接到 DBus 仍然存在问题。

    所以这不是一个好的解决方案,或者至少它需要修复“在单元文件依赖树中的位置”和“dbus 到底是怎么回事”

    之后的主机名是:

    Kernel hostname via 'sysctl'                      : penpen.homelinux.org
    Kernel domainname via 'sysctl'                    : (none)
    File '/etc/hostname'                              : contains 'penpen.homelinux.org'
    File '/etc/sysconfig/network'                     : exists but has no 'HOSTNAME' line
    According to the shell                            : HOSTNAME = ip-10-164-65-105.ec2.internal
    Nodename given by 'uname --nodename'              : penpen.homelinux.org
    Hostname ('hostname')                             : penpen.homelinux.org
    Short hostname ('hostname --short')               : penpen
    NIS domain name ('domainname')                    : (none)
    YP default domain ('hostname --yp')               : [hostname --yp failed]
    DNS domain name ('hostname --domain')             : homelinux.org
    Fully qualified hostname ('hostname --fqdn')      : penpen.homelinux.org
    Hostname alias ('hostname --alias')               : 
    By IP address ('hostname --ip-address')           : 54.221.0.63
    All IPs ('hostname --all-ip-addresses')           : 10.164.65.105 
    All FQHNs via IPs ('hostname --all-ip-addresses') : ip-10-164-65-105.ec2.internal 
    Static hostname via 'hostnamectl'                 : penpen.homelinux.org
    Transient hostname via 'hostnamectl'              : penpen.homelinux.org
    Pretty hostname via 'hostnamectl'                 : 
    
    • 1
  5. devicenull
    2015-02-24T08:12:46+08:002015-02-24T08:12:46+08:00

    这实际上是使用 SystemD 的类 RHEL 发行版上的 cloud-init 中的一个错误。https://bugs.launchpad.net/cloud-init/+bug/1424710上有一个补丁可用

    • -1

相关问题

  • 权限被拒绝(公钥)。从本地 Ubuntu 到 Amazon EC2 服务器的 SSH

  • 管理员如何管理他们的 EC2 EBS 和快照?

  • 云有多大?[关闭]

  • EC2 映像启动

  • 如何将安全组添加到正在运行的 EC2 实例?

Sidebar

Stats

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

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve