Linux掛載NFS共享

Linux掛載NFS共享

我想在嵌入式裝置 (mips) 上運行 Linux,它有一些非常嚴格的限制:

  • 僅 16MB 儲存空間
  • 沒有有線乙太網路(只有wifi)

好消息:

  • 我有一個工作引導程式(u啟動
  • 我還有一個工作內核(版本 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 時。)

  • 重要的一步是使用樞軸_根()系統呼叫將目前根目錄與新安裝的根目錄交換。呼叫後,原始 rootfs 仍然保持掛載狀態,但不再位於 / – 呼叫將掛載移至「新」rootfs 的子目錄。

    還有一個pivot_root程式在 Busybox(以及 util-linux)中,如果您的 init 進程是 shellscript(通常是這種情況),則可以使用它。連結的 util-linux 手冊頁有其用法範例。

  • 或者,根據萊納斯,簡單就足夠了chroot()進入新安裝的根目錄 - 也就是說,如果您不再需要存取原始根目錄。同樣,有一個chroot命令列工具可以實現這一點。


注意:你不需要建置並使用 initramfs 來實現此目的;這些函數並不關心它們是從 initrd 映像呼叫還是從真正的 rootfs 呼叫。

但是,由於「正常」initramfs 從臨時記憶體中解壓縮檔案系統運行,因此工具通常會switch_root在轉向新根之前刪除所有 initramfs 檔案。但是如果您直接從磁碟檔案系統啟動,這可能是不是你想要什麼,所以一定不要使用該switch_root工具,只使用pivot_root.

相關內容