在以只读方式安装的ifup wlan0
系统(嵌入式计算机)上执行操作时,出现以下错误:/
Failed to connect to non-global ctrl_ifname: wlan0 error: Read-only file system
Internet Systems Consortium DHCP Client 4.3.1
Copyright 2004-2014 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
can't create /var/lib/dhcp/dhclient.wlan0.leases: Read-only file system
Listening on LPF/wlan0/80:1f:02:d3:42:b8
Sending on LPF/wlan0/80:1f:02:d3:42:b8
Sending on Socket/fallback
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 7
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 13
...
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 5
No DHCPOFFERS received.
No working leases in persistent database - sleeping.
另一方面,当ifup wlan0
以/
读写方式挂载时,没有问题,IP 已成功归属。
如何使 DHCP 在只读根文件系统上工作?
# /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-ssid "<myssid>"
wpa-psk "<mypasswd>"
答案1
在 RAM 中创建一个 tmpfs 分区,然后将 /var/lib/dhcp 符号链接到其中的目录。
编辑:我假设您可以在将根文件系统更改为只读之前对其进行编辑。所以:
- 设置 tmpfs 挂载点
mkdir /mnt/ramdisk && mkdir /mnt/ramdisk/var-lib-dhcp
- 将 tmpfs 添加到您的 fstab 中
tmpfs /mnt/ramdisk/var-lib-dhcp tmpfs size=10M 0 0
/var/lib/dhcp
添加从到 的符号链接/mnt/ramdisk/var-lib-dhcp
- 在文件系统读/写时进行测试
- 将文件系统设为只读,再次测试
答案2
如同丹尼尔·格里斯科姆 回答但简单一点。
你可以加
tmpfs /var/lib/dhcp/ tmpfs nodev,nosuid,size=1M,mode=1777 0 0
在/etc/fstab
这会在 RAM 中创建一个临时文件系统,并覆盖该目录作为该 tempfs 的挂载点。 (因此,如果您之前有文件,则它们不可用)
有了这个,您不需要管理符号链接等...并且 1M 的大小对于某些嵌入式板 dhcp 信息来说应该足够了。如果您想创建带有 DHCP 服务器的接入点(租用信息存储在服务器的同一目录中),也需要这样做。
请记住首先以写访问权限重新安装mount -o remount,rw /
(以 root 身份) - 完成更改后重新安装只写 ( mount -o remount,ro /
) 或重新启动。
我这个 tmpfs 配置字符串的原始来源是这个简短的指南为最终应用准备 microSD
答案3
假设您已经有一个 tmpfs 挂载点,例如 /run、/var/run 或 /tmp,则执行一个非常简单的方法,
sudo rm -rf /var/lib/dhcp/
和
sudo ln -s /run /var/lib/dhcp
第一个将删除您的/var/lib/dhcp
数据库目录,第二个将创建到/run
.或者您可以链接到/tmp
或/var/run
。
您需要以读写方式重新挂载文件系统才能执行上述更改。
答案4
我刚刚也遇到了这个问题,为 /var/lib/dhcp 创建一个读写位置是不够的。
我必须做以下两件事:
通过向 /etc/fstab 添加注释条目来欺骗 /sbin/dhclient-script 来告诉它 / 位于只读文件系统上:
# The following line is here only to tell dhclient that we are readonly
#/root / auto defaults 0 0
(请注意,“/”必须是该行的第二个标记)
我还必须编辑 /etc/dhcp/dhclient.conf 配置文件以从请求列表中删除(至少)“域名服务器”(但我删除了更多,只留下我感兴趣的那些,所以我不知道只删除这个是否足够)。
如果您有兴趣从 DHCP 服务器接收域名服务器信息,那么您可以尝试将 /etc/resolv.conf 链接到读写版本(在 /run 或 /var/run 或任何其他 tmpfs 位置) ,但您必须在 tmpfs 位置的脚本和设置网络的脚本之间的某个位置创建该文件,或者作为 R/W 文件系统上文件的链接。