chv-cell: networkd 不管 ve + 单元内 DNS 修复
- systemd-networkd(/usr/lib 80-container-ve.network,匹配 ve-*) 会在 veth 建好后几秒内刷掉静态 10.200.0.1、改 DHCP/链路本地, 致单元网关不可达、TCP/UDP 全灭(FORWARD/NAT 计数器恒 0; 早先一次 curl 403 是刷掉前的窗口期偶发)。修法:镜像内置 /etc/systemd/network/79-chv-cell.network(Unmanaged=yes), 须排在 80 之前(99 会被 80 抢走,已实测);build.sh copy-in + 校验、BASE_CONTENTS 与两处 DECLARED_SOURCES 登记。 - run_cell 配网后复核 ve 上确有 10.200.0.1(_iface_has_ip), 不见即大声失败、不跑无网单元(第二道防线)。 - 单元内 DNS:/etc/resolv.conf 是 127.0.0.53 stub,单元独立 netns 里自己的 lo 上没有 resolver;把上游 /run/systemd/resolve/resolv.conf 绑到 /etc/resolv.conf (解析 symlink 后挂真实目标)。live 验证:DNS-UDP-OK、 getaddrinfo 解析成功、curl https://gitea.tose.top 200。 - 单测:CellResolvTest + _iface_has_ip 真实 lo 断言 + 规约 dns_resolv_conf 字段;P2 + 阶段 2 共 74 项全过。
This commit is contained in:
1 parent
4b5f2f124f
commit
1cbaf7c1d5
7 files changed
+48
No files matched your search
@@ -543,6 +543,19 @@ def _wait_for_iface(iface, timeout=10.0):
|
||||
return False
|
||||
|
||||
|
||||
def _iface_has_ip(iface, ip):
|
||||
"""接口上是否有所给 IPv4。配网后复核:2026-11-07 实测
|
||||
networkd(80-container-ve.network)会在接口建好后几秒内
|
||||
刷掉静态 10.200.0.1、改 DHCP/链路本地,致单元网关不可达;
|
||||
镜像里有 79-chv-cell.network(Unmanaged)兜底,这里是
|
||||
第二道防线——地址不见即大声失败,不跑无网单元。"""
|
||||
proc = subprocess.run(["ip", "addr", "show", iface],
|
||||
capture_output=True, text=True)
|
||||
if proc.returncode != 0:
|
||||
return False
|
||||
return ("inet %s/" % ip) in proc.stdout
|
||||
|
||||
|
||||
def _run_cmds(cmds, what):
|
||||
for cmd in cmds:
|
||||
print("chv-cell: + %s" % " ".join(cmd), file=sys.stderr)
|
||||
@@ -806,6 +819,10 @@ def run_cell(command, network="veth"):
|
||||
"chv-cell: veth 接口 %s 未出现,拒绝回落共享网络"
|
||||
% HOST_IFACE)
|
||||
_run_cmds(cell_network_commands(cell_pid), "单元内配网")
|
||||
if not _iface_has_ip(HOST_IFACE, HOST_IP):
|
||||
raise RuntimeError(
|
||||
"chv-cell: veth %s 上 %s 不见了(疑似 networkd "
|
||||
"刷掉),拒绝跑无网单元" % (HOST_IFACE, HOST_IP))
|
||||
# 放行单元 init 去 exec payload。
|
||||
try:
|
||||
os.write(go_w, b"1")
|
||||
|
||||
Reference in new issue
Block a user