接上篇。再次打开后发现无法ping通,检查后发现,因为在虚拟机的虚拟网络编辑器中开启了DHCP,故而每次开机都会重新分配网关,所以按照上一篇配置固定以后,每一次开机都需要重新开启自动分配,然后改回固定分配才能正常上网。又因为VMware依赖DHCP分配网关不能关闭,所以只能找其他方法解决。
记录一下自己的解决办法:使用脚本设置开机自动获取,以达到开机顺利联网并且固定ip。(注:我目前只用了VMware,其他虚拟机是否有用需要看具体情况)
方案:使用 rc.local 配置开机脚本,创建一个纯净的静态链接,开机自动生效,杜绝DHCP的干扰。
① 删除旧的DHCP配置连接(可以忽略)
sudo nmcli con delete ens33
②创建一个全新的静态链接(创建一个ens33-static的连接,并且固定网关和DNS)
使用以下命令添加静态以太网连接配置:
```bash
sudo nmcli con add type ethernet con-name ens33-static ifname ens33 \
ipv4.addresses 192.168.88.2/24 \
ipv4.gateway 192.168.88.1 \
ipv4.dns "8.8.8.8 114.114.114.114" \
ipv4.method manual \
connection.autoconnect yes
参数说明:
con-name ens33-static
:设置连接名称ifname ens33
:指定绑定的物理网卡名称ipv4.method manual
:关闭DHCP,采用手动IP配置connection.autoconnect yes
:启用开机自动连接功能
③ 启用新链接
sudo nmcli con up ens33-static
④ 设计编写一个自动设置固定IP的脚本,设为系统启动时运行
需求:
->创建一个新的固定IP网络连接
->设置静态IP、网关和DNS
->开机自动连
#!/bin/bash
# 声明要使用的参数
CON_NAME="ens33-static"
IF_NAME="ens33"
IP_ADDR="192.168.88.2/24"
GATEWAY="192.168.88.1"
DNS_SERVER="8.8.8.8 114.114.114.114"
# 删除旧连接,并且隐藏输出,若连接不存在也不要输出错误信息(将标准输出和错误输出都放入黑洞)
nmcli con delete "$CON_NAME" >/dev/null 2>&1
# 创建新连接,重新固定ip,(ens33是一个模拟的物理网卡,在系统中为几台网设备)
nmcli con add type ethernet con-name "$CON_NAME" ifname "$IF_NAME" \
ipv4.addresses "$IP_ADDR" \
ipv4.gateway "$GATEWAY" \
ipv4.dns "$DNS_SERVER" \
ipv4.method manual \
connection.autoconnect yes
# 启用连接
nmcli con up "$CON_NAME"
写好脚本,该做配置了
>>保存脚本并赋权
sudo vim /usr/local/bin/set_static_ip.sh
#创建一个配置文件,并且将刚刚编写的脚本写入,保存退出
sudo chmod +x /usr/local/bin/set_static_ip.sh
#给文件添加可执行权限
>>运行测试一下
sudo /usr/local/bin/set_static_ip.sh
#确认能看到IP和网关都成功设置
⑤设置开机自动运行
>>编辑 /etc/rc.local
sudo vim /etc/rc.local
>>写入脚本文件地址
#!/bin/bash
/usr/local/bin/set_static_ip.sh
exit 0
>>赋予执行权限
sudo chmod +x /etc/rc.local
>>启用rc-local服务
sudo systemctl enable rc-local
sudo systemctl start rc-local
# rc-local服务的作用(脚本文件,系统在完成所有标准初始化【网络、服务启动等】后,会执行该文件中的命令)
1.启动自定义服务
2.设置静态IP、挂载磁盘
3.运行一次性初始化任务
4.延迟执行某些命令(等系统完全启动以后再运行)
==============================二编后续=================================
发现重启后,有时成功有时失败,查询了一下,是Linux网络服务启动时序和VMware虚拟网络服务未及时就绪导致的。可能是nmcli提前激活了静态链接,但是此时VMware的NAT网桥服务还未启动,导致还未获取网关就发生了脚本重置。所以还需要写一个流程控制,将nmcli设置为开机延迟启动,以确保获取网关后再运行脚本。
①创建一个systemd服务,在所有网络组件都加载完毕后再执行脚本
sudo vim /etc/systemd/system/set-static-ip.service
编写一个systemd.service服务脚本
[Unit]
Description=Set static IP address at boot # 本服务的简要描述(可在 systemctl status 中看到)
After=network-online.target # 确保网络启动完成后再执行本服务
Wants=network-online.target # 希望系统同时激活网络目标(非强制)
[Service]
Type=oneshot # 表示一次性任务,执行完脚本就退出
ExecStart=/usr/local/bin/set_static_ip.sh # 要执行的脚本路径(需自行创建并赋予可执行权限)
RemainAfterExit=true # 脚本执行后保持“active”状态,便于查询状态
StandardOutput=journal # 输出日志到 systemd 的日志系统
StandardError=journal # 错误输出也写入日志系统
# 若你想把日志输出到文件,可改为:
# StandardOutput=append:/var/log/set_static_ip.log
# StandardError=append:/var/log/set_static_ip.log
[Install]
WantedBy=multi-user.target # 当系统进入 multi-user(常规运行级别)时自动启动本服务
配置完成后,重启查看是否顺利启动脚本
journalctl -u set-static-ip.service