最近 ArchLinux 把 netcfg 换成 netctl 了 , 所以就进行了更换。 不过 netct wiki 里并没有深入描述关于多个 profile 并存的情况下, 到底是如何选择使用的。 所以翻到了这部分的源码,弄清楚了。
选择 profile 的代码在系统中是 /etc/ifplugd/netctl.action , 在 netctl 官方仓库 里面对应文件 src/ifplugd.action ,这是个 Bash 脚本, 会在 netctl-ifplugd@<interface> 服务启动时执行。
它将 profile 分成了 3 类:
- preferred_profiles 首选配置
- dhcp_profiles 自动获取配置
- static_profiles 静态地址配置
首先,它会遍历所有 profile,根据内容将他们分别归入上述 3 类。
然后,检查首选配置不能超过一个,否则给出提示。 这种提示可以在日志中查询: sudo journalctl -xn -f 。
最后,按照首选配置、自动获取配置、静态地址配置的顺序尝试连接。 尝试连接就类似模拟执行 netctl start PROFILE , 重点来了:一旦连接成功,脚本退出。 即只有第一个有效的配置生效, 没有我想象的自动按照网关能否 ping 通什么的“智能”选择。
所以,如果定义了多个 profile ,语法上没有毛病, 只是用于不同网络环境的话,这个自动选择 profile 就不适用了。
换言之,只有在多网卡(有线)且同时只连接其中一个的情况下, 适合启用 netctl-ifplugd@<interface> 服务, 连上哪个 profile 对应的网卡,就自动应用配置了。 其他的情况,比如单网卡选择接入不同局域网, 则不适用,因为网卡地址分配和启动操作总是能够成功, 起不到自动选择网络环境的作用。 这种情况应该用:
# netctl start <profile> # netctl enable <profile> # netctl switch-to <profle2> # netctl stop <profile2> # netctl disable <profile2> |
关于 profile 的默认顺序,就是按照 netctl list 命令的顺序来的, 这个顺序来自 src/lib/globals 中 list_profiles() 函数中的 find 命令, 而 find 命令却是不进行排序的, 所以实际结果的顺序就有点乱了。 目测是旧文件在前、新文件在后, 编辑、改名都会使文件“变新”。 这一点和 netcfg 有区别,后者采用字母排序,好掌控多了。
hi,你好,看了你写的这篇介绍文章,想请教一个问题,你最后说的智能选择网络的方法,怎么做到智能实现呢? 是要自己来选择吗?如netctl start ,选择某个profile吗?
不是智能的,详细可以看
https://github.com/joukewitteveen/netctl/blob/master/src/lib/globals#L101
如果设定失败,比如绑定的网卡不存在,会尝试下一个,地址设置错误、IP 不在网段内等问题是识别不出来的。