Linux 挂载 NFS 共享

Linux 挂载 NFS 共享

我想在嵌入式设备(mips)上运行Linux,但它有一些非常严格的限制:

  • 仅 16MB 存储空间
  • 没有有线以太网(只有 wifi)

好消息:

  • 我有一个可以工作的引导程序(引导程序
  • 我还有一个可以运行的内核(版本 3.10.14 #2 PREEMPT)
  • 并且我有一个可以工作的根文件系统(Linux 可以启动并且我可以登录)

现在的问题是,我没有更多空间在该硬件上运行任何用户应用程序,这就是为什么我想要转向 NFS。

我不太清楚这里的程序。

正如我所提到的,启动过程由 U-boot 处理。但 U-boot 无法初始化 Wifi - 因此我需要一些小型 Linux 操作系统来实现此目的。

大意

  1. U-boot加载内核并启动
  2. 内核包含 wifi 芯片的驱动程序,并安装 rootfs
  3. rootfs 包含连接 AP 所需的文件(密码、ssid 等)
  4. 一旦连接建立,NFS 就会将远程文件系统挂载到 /opt 或其他地方

是否有可能用 NFS 上的文件系统替换根 (/) 文件系统?(尽管这个分区上存储了启动连接所需的 wifi 配置)

更新

我已经成功为 mips 编译了 nfs 客户端程序,设备现在可以通过 nfs 将新的 rootfs 挂载到某个目录中,但是枢轴根失败:

# mount -o nolock IPADDRESS:/srv/fs /tmp/nfs
# ls /tmp/nfs
bin
etc
...
# ls /tmp
nfs
old
# pivot_root /tmp/nfs /tmp/old
pivot_root: Invalid argument
# pivot_root
BusyBox v1.29.0.git (2018-06-23 20:08:52 CEST) multi-call binary.

Usage: pivot_root NEW_ROOT PUT_OLD

Move the current root file system to PUT_OLD and make NEW_ROOT the new root file system

答案1

是的 – 你所做的基本上与 Linux PC 上的 initramfs 所做的相同。initramfs 像内存 rootfs 上的普通根文件系统一样启动/;然后它将真正的根文件系统挂载在 /mnt 或 /real 的某个位置。

(这实际上通常用于在服务器上实现 NFS-root,在内核的内置 NFS 支持不足的情况下 - 例如当需要 Kerberos 时。)

  • 重要的一步是使用枢轴根()系统调用将当前根与新挂载的根交换。调用后,原始根文件系统仍保持挂载状态,但不再位于 / – 调用将挂载移动到“新”根文件系统的子目录中。

    还有一个pivot_root程序在 Busybox(以及 util-linux)中,如果您的 init 进程是 shellscript(通常如此),则可以使用它。链接的 util-linux 手册页有其用法的示例。

  • 或者,根据莱纳斯,只需chroot()进入新挂载的根目录 — 也就是说,如果您不再需要访问原始根目录。同样,有一个chroot命令行工具可以实现这一点。


注意:您不需要需要构建并使用 initramfs 来实现这一点;这些函数不关心它们是从 initrd 映像调用还是从真正的 rootfs 调用。

但是,由于“正常”的 initramfs 是从临时内存中的解压文件系统运行的,因此switch_root在切换到新根之前,工具通常会删除所有 initramfs 文件。但如果您直接从磁盘上的文件系统启动,这可能不是你想要什么,所以请确保不要使用工具switch_root,只使用pivot_root

相关内容