解决方法
像其他用户一样,我对此烦恼不已,但发现了一种令人满意的解决方法:
my_hostname='your-hostname-here'; for key in LocalHostName ComputerName HostName ; do sudo scutil --set $key $my_hostname; done
运行此命令后,可以使用此单行检查所有存储主机名的位置是否相同:
for key in LocalHostName ComputerName HostName ; do sudo scutil --get $key; done
如果Macbook仍然立即ComputerName
使用后缀重命名,则可以通过关闭使其停止Wake for Network Access
。
System Preferences→Energy Saver→Wake for Wi-Fi network access → Unchecked
关闭后,使用上面的命令重命名计算机以完成操作。您也可以尝试ComputerName
使用System Preferences→Sharing→Computer Name
文本字段首选项强制返回。
如果这样做没有帮助,请尝试刷新您的mDNS缓存:
# El Capitan (10.11) and later
# check if you have dscacheutil command with: which dscacheutil
sudo dscacheutil -flushcache
# Yosemite (10.10) and ealier
# check if you have discoveryutil command with: which discoveryutil
sudo discoveryutil mdnsflushcache
sudo discoveryutil mdnsrestartquestions
sudo discoveryutil mdnsrestartregistrations
sudo discoveryutil udnsflushcache
sudo discoveryutil udnsrestartquestions
刷新mDNS缓存后,请使用上述命令重命名计算机。
如果仍然无法解决问题,请尝试终止该mDNSResponder
服务:
sudo killall -HUP mDNSResponder
然后,再次尝试使用上述scutil
命令重设您的计算机名称。
如果您发现这些方法都无济于事,则有其他报告的解决方案,包括:
问题讨论
以我的经验,以这种方式或通过标准设置主机名System Preferences→Sharing→Computer Name
只能持续很短的时间。通常少于24小时,但有时ComputerName
偶数会立即更改,以在括号中带有后缀数字(N)
。我观察到使用上述命令后,该数字立即设置为(4)
或(5)
最近设置scutil --set
。
出现此现象的原因是由于某些守护程序代码在Mac OS中运行,该守护程序代码每次在(N)
网络上找到相同的主机名时都会尝试添加带数字的后缀。在我所有的测试中,我选择的主机名以前从未在网络上使用过,而且也从未用于任何蓝牙设备。
此行为的“触发”的真正原因是未知的且未经验证。就是说:通过我所有的在线研究和测试,我无法确切确定Mac OS为什么在显然没有使用该名称的情况下,决定使用该名称。
我的理论是,在某种程度上mDNS
也被称为Bonjour
(Avahi
Linux用户,或者Zero-conf
网络向Windows用户)可能是部分原因。不知何故,Macbook或Apple设备的先前主机名会保留在中mDNS
,或者可能ARP
是Macbook或Apple设备发现并存储的某种形式的表+主机名信息。这可能是某种比赛条件。该条目以某种方式被视为重复项,并触发Mac OS后缀重命名行为。
使用Apple提供的DNS服务发现实用程序时,带有数字后缀的主机名是可见的dns-sd
:
例如,使用hostname my-mbp-hostname
,它可能会显示为以下条目
dns-sd -Z _ssh._tcp
; To direct clients to browse a different domain, substitute that domain in place of '@'
lb._dns-sd._udp PTR @
; In the list of services below, the SRV records will typically reference dot-local Multicast DNS names.
; When transferring this zone file data to your unicast DNS server, you'll need to replace those dot-local
; names with the correct fully-qualified (unicast) domain name of the target host offering the service.
_ssh._tcp PTR my-mbp-hostname\032(5)._ssh._tcp
my-mbp-hostname\032(5)._ssh._tcp SRV 0 0 22 my-mbp-hostname.local. ; Replace with unicast FQDN of target host
my-mbp-hostname\032(5)._ssh._tcp TXT ""
[...SNIP...]
[...OTHER SSH HOSTS HERE...]
[...SNIP...]
真正原因的理论尚未得到证实,因为如果不访问内部Mac OS状态和低级Apple OS调试工具,很难找到并观察实际情况。之间的相互作用mdnsd
,mDNSResponder
以及mDNSResponderHelper
与其他Mac OS服务,或者在网络上甚至其他的avahi守护程序都有详细的记载或容易观察到。某些形式的网络发现的当前状态可以通过dns-sd
和arp -a
或可以查看arp -a -n
。可以存储此主机名信息的其他理论或潜在位置可能是:
- 操作系统在某处保留了蓝牙设备名称
- SMB(Windows文件共享)信息定期从网络缓存
smbd
(/System/Library/LaunchDaemons/com.apple.smbd.plist
)
- AFP共享从网络缓存的信息(大概也由
smbd
?)
mDNS
/ Avahi
反射器(或通过路由器或其他某些设备在网络上对Bonjour / zero-conf数据包进行的其他重播类型)?
- 可以由
mDNSResponder
或mdnsd
(/System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
)缓存
解决方案(占位符)
截至2017年10月6日,Apple仍未提供完整的解决方案或补救措施来防止此问题再次发生。我建议向Apple 提交错误报告以描述此问题。您可能还希望与Apple客户支持联系。
听到这个烦人的问题的声音的人越多,Apple产品经理就越会优先处理优先事项,以便工程师能够对其进行修复。
调试/将来的调查
这个MacRumors论坛讨论不仅提供了一些有用的信息,还增加了一个理论,即Wake for Wi-Fi Network Access
设备唤醒/睡眠与该问题有关。提出的其他理论与使用多个网络适配器(例如WiFi + Thunderbolt以太网)有关,这些路由器具有在多个频段(例如802.11 b/g/n
(2.4GHz)或802.11 a/ac
(5GHz))上发布的多个接入点。这些组合可能会导致Apple设备的“幽灵”版本临时以某种方式出现在网络上,从而触发重命名行为。
有没有有用的日志行中/var/log/system.log
即出现有关在被触发此重命名的行为。据说mDNSResponder
可以配置较高的日志级别:
- 错误-错误消息
- 警告-客户端启动的操作
- 注意-睡眠代理操作
- 信息-信息性消息
除了可能通过不存在的文件之外,如何设置这些调试级别/Library/Preferences/com.apple.mDNSResponder.plist
还不清楚。我没有要使用的plist示例配置,因此无法从中获取任何额外的日志记录信息mDNSResponder
。
诸如Wireshark之类的工具对于显示mDNS
正在网络上广播的数据包以及其他流量中可能与之相关的其他ARP数据包信息可能很有用。
在Mac OS上,dscacheutil
可能存在其他工具来查看此信息。没有足够的文档说明,也不清楚如何查看主机名重命名代码使用的此信息的最终缓存。当我测试该实用程序时,它没有产生任何有用的输出,除了在使用查询模式查询确切的主机名(为保护隐私而清理的IP)时:
sudo dscacheutil -cachedump -entries host
Unable to get details from the cache node
sudo dscacheutil -cachedump
Unable to get details from the cache node
dscacheutil -cachedump
Unable to get details from the cache node
dscacheutil -cachedump -entries host
Unable to get details from the cache node
dscacheutil -q host -a name my-mbp-hostname.local
name: my-mbp-hostname.local
ipv6_address: fe80:4::1a:1234:abcd:ef01
ipv6_address: 2601:280:1b00:1234:567:abcd:ef01:1234
name: my-mbp-hostname.local
ip_address: 192.168.1.123