跟思兼學Klipper(32):修復 CrealityOS IP 地址經常改變的問題
前言
原創文章,轉載引用務必著名鏈接,水平有限,如有疏漏,歡迎指正交流。
文章如有更新請訪問 DFRobot 社區及 cnblogs 博客園,前者內容較全,后者排版及閱讀體驗更佳。
使用 K1C 時有個問題,過個一天或者一段時間再開機它的IP地址會發生改變,很是惱人。本文試圖探究可能的原因及多種解決方法。
軟硬件測試環境:
- Creality K1C 3D 打印機
- CrealityOS,以下簡稱CoS
本文涉及的內容:
- DHCP 基礎知識

1、常見解決方法
-
使用 mdns
CoS會啟動一個精簡版的 mdns 服務,地址為 [hostname].local,不論設備 IP 地址如何改變,此域名不變。目前測試 OrcaSlicer、MobaXterm 可以使用,但是網頁打不開也 ping 不通。
-
綁定 MAC 地址
在路由器中,將設備網卡 MAC 地址和指定 IP 地址綁定。但是有些朋友沒有路由器管理權。
-
設置靜態 IP 地址
在設備上設置靜態 IP 地址而非從 DHCP 服務器上自動獲取 IP 地址,但是存在設備地址沖突的可能,同時更換不同網段的網絡時會出問題。
2、可能的原因
查看 CoS 相關服務,/etc/init.d/S44wifi_bcm_up ——> /usr/bin/wifi_up.sh ,可以看到 CoS 使用 udhcpc -i wlan0 -x hostname:$(hostname) & 來從 DHCP 服務器處獲取網絡配置。我默認由 BusyBox 自帶的 udhcpc 背鍋,懷疑沒有正確續約。當然之前也懷疑過無線網卡 MAC 地址變化導致,觀察后排除。
3、可能的解決方法:使用 dhclient 取代 udhcpc
前提:需要啟用 root 后安裝 chs,并安裝 entware 軟件倉庫
# 安裝 dhclient
sed -i.bak 's|https\?://bin.entware.net|http://mirrors.cernet.edu.cn/entware|g' /opt/etc/opkg.conf
opkg update
opkg install isc-dhcp-client-ipv4
# 創建租約文件及 resolv.conf 軟鏈接
mkdir /opt/var/db/ && touch /opt/var/db/dhclient.leases
ln -sf /etc/resolv.conf /opt/etc/resolv.conf
# 修改默認 dhcp 客戶端程序
# 注釋 udhcpc -i wlan0 -x hostname:$(hostname) &
# 在其下添加一行:/opt/sbin/dhclient -nw -v --no-pid wlan0
sed -i '/hostname:/s/^/# /' /usr/bin/wifi_up.sh
sed -i '/hostname:/a \ /opt/sbin/dhclient -nw --no-pid wlan0' /usr/bin/wifi_up.sh
# 重啟生效
4、與 DHCP 服務器交互過程
root@K1Max-5BC9 /root [#] dhclient -v wlan0
Internet Systems Consortium DHCP Client 4.4.3-P1
Copyright 2004-2022 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/wlan0/fc:ee:28:01:5b:c9
Sending on LPF/wlan0/fc:ee:28:01:5b:c9
Sending on Socket/fallback
# Client:DHCP 發現
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 6
# Server: DHCP 提供
DHCPOFFER of 192.168.0.118 from 192.168.0.1
# Client: DHCP 請求/續租
DHCPREQUEST for 192.168.0.118 on wlan0 to 255.255.255.255 port 67
# Server: DHCP 確認
DHCPACK of 192.168.0.118 from 192.168.0.1
bound to 192.168.0.118 -- renewal in 3173 seconds.
udhcpc 是一個簡單的 DHCP 客戶端,用于在 Unix-like 系統上自動獲取網絡配置。以下是 udhcpc 續租 IP 地址的基本步驟和原理:
- DHCP 發現(DHCPDISCOVER):
- 當 udhcpc 啟動時,它會發送一個 DHCPDISCOVER 廣播消息,以發現網絡上可用的 DHCP 服務器。
- DHCP 提供(DHCPOFFER):
- DHCP 服務器收到 DHCPDISCOVER 消息后,會發送一個 DHCPOFFER 消息,提供給客戶端一個 IP 地址和其他網絡配置信息。
- DHCP 請求(DHCPREQUEST):
- udhcpc 收到 DHCPOFFER 消息后,會發送 DHCPREQUEST 消息,請求分配提供的 IP 地址。
- DHCP 確認(DHCPACK):
- 如果 DHCP 服務器確認請求,它會發送一個 DHCPACK 消息,正式分配 IP 地址和相關配置。
- 續租(DHCPREQUEST):
- 在租期過半(通常為50%)時,udhcpc 會自動發送 DHCPREQUEST 消息給之前分配 IP 地址的 DHCP 服務器,請求續租當前的 IP 地址。
- 續租成功或失敗:
- 如果 DHCP 服務器響應 DHCPACK,表示續租成功,租期將被重置。
- 如果 DHCP 服務器響應 DHCPNACK,表示續租失敗,udhcpc 將重新發送 DHCPDISCOVER 消息以獲取新的 IP 地址。
- 租期結束:
- 如果在租期結束前沒有收到 DHCP 服務器的響應,udhcpc 將放棄當前 IP 地址,并重新進入 DHCP 發現階段。
- 釋放 IP 地址(DHCPRELEASE):
- 如果用戶希望主動放棄 IP 地址,udhcpc 可以發送 DHCPRELEASE 消息給 DHCP 服務器,釋放當前的 IP 地址。
udhcpc 的續租行為通常是自動的,不需要用戶干預。但是,用戶可以通過配置文件或命令行參數來調整續租行為,例如設置租期長度或禁用自動續租。
如果您發現 udhcpc 沒有續租 IP 地址,可能的原因包括:
- DHCP 服務器沒有響應續租請求。
- 網絡配置問題導致 udhcpc 無法與 DHCP 服務器通信。
- udhcpc 配置錯誤或版本問題。
- 系統防火墻或安全設置阻止了 DHCP 通信。
【以上內容部分由 kimi 生成】
5、leases 租約文件內容
root@K1Max-5BC9 /root [#] cat /opt/var/db/dhclient.leases
lease {
interface "wlan0";
fixed-address 192.168.0.118;
option subnet-mask 255.255.255.0;
option routers 192.168.0.1;
option dhcp-lease-time 7200;
option dhcp-message-type 5;
option domain-name-servers 223.5.5.5,114.114.114.114;
option dhcp-server-identifier 192.168.0.1;
renew 5 2024/06/14 00:55:30;
rebind 5 2024/06/14 01:50:31;
expire 5 2024/06/14 02:05:31;
}
renew、rebind 和 expire 概念介紹
由上面內容可知路由器的 DHCP 服務租約時長為 7200s,即 2h。
在DHCP(動態主機配置協議)中,renew、rebind和expire是與IP地址租期管理相關的三個概念,它們的含義如下:
- renew:當DHCP客戶端的IP地址租期達到50%時,會自動以單播的方式向DHCP服務器發送
DHCP REQUEST報文,請求更新IP地址租期。如果收到DHCP服務器回應的DHCP ACK報文,則租期更新成功(即租期從0開始計算);如果收到DHCP NAK報文,則重新發送DHCP DISCOVER報文請求新的IP地址。 - rebind:當DHCP客戶端的IP地址租期達到87.5%時,如果仍未收到DHCP服務器的應答,DHCP客戶端會自動以廣播的方式向DHCP服務器發送
DHCP REQUEST報文,請求更新IP地址租期。如果收到DHCP服務器回應的DHCP ACK報文,則租期更新成功(即租期從0開始計算);如果收到DHCP NAK報文,則重新發送DHCP DISCOVER報文請求新的IP地址。 - expire:如果DHCP客戶端的IP地址租期到期時都沒有收到服務器的回應,客戶端將停止使用此IP地址,并重新發送
DHCP DISCOVER報文請求新的IP地址。
renew和rebind都是DHCP(動態主機配置協議)中的概念,它們的主要區別在于觸發的時間和發送的目標服務器不同。
renew報文是在DHCP客戶端的IP地址租期達到50%時觸發的,此時客戶端會以單播的方式向最初提供IP地址的DHCP服務器發送renew報文,請求延長IP地址的租期。如果客戶端在租期的50%時發送了renew報文,但沒有收到服務器的響應,那么它將在租期的87.5%時觸發rebind報文。
rebind報文是在renew報文沒有得到響應的情況下觸發的,客戶端會以廣播的方式向任何可用的DHCP服務器發送rebind報文,請求延長IP地址的租期。
總的來說,renew報文是在租期的中期發送給特定的服務器,而rebind報文是在renew報文沒有得到響應時發送給所有可用的服務器。這樣可以確保客戶端在IP地址租期到期之前能夠及時續租,避免IP地址被收回。
【以上內容部分由 豆包 生成】
Bonus
entware 的路徑問題
我們發現 opkg 安裝的軟件包都在 /opt 目錄,配置文件亦如是,導致很多軟件從 /etc 載入默認配置時報錯。考慮和 entware 有關
查看 Creality-Helper-Script/files/entware/generic.sh 可知如下:
ln -nsf /usr/data/opt /opt
# echo '#!/bin/sh\n/opt/etc/init.d/rc.unslung "$1"' > /etc/init.d/S50unslung
# 這里有錯誤,應該為如下內容:
echo -e '#!/bin/sh\n/opt/etc/init.d/rc.unslung "$1"' > /etc/init.d/S50unslung
ln -sf /etc/localtime /opt/etc/localtime
ln -sf /etc/resolv.conf /opt/etc/resolv.conf
# 目錄則是額外 -n 參數
其他調試命令
# 時區設置:/etc/localtime
# 搜索并關閉進程
ps aux |grep udhcpc
kill [pid]
# 測試 DNS 解析
nslookup example.com

浙公網安備 33010602011771號