非常に厳しい制限がある組み込みデバイス (mips) 上で Linux を実行したいと考えています。
- ストレージ容量は16MBのみ
- 有線イーサネットなし(Wi-Fiのみ)
良いニュース:
- 動作するブートローダーがあります(ユーブート)
- 動作するカーネルもあります(バージョン 3.10.14 #2 PREEMPT)
- ルートファイルシステムが動作しています(Linuxを起動してログインできます)
問題は、このハードウェア上でユーザー アプリケーションを実行するためのスペースがもう残っていないことです。そのため、NFS に移行したいと考えています。
ここでは手順がよく分かりません。
前述したように、ブート プロセスは U-boot によって処理されます。ただし、U-boot は Wi-Fi を初期化できないため、この目的には小さな Linux OS が必要になります。
本旨
- U-bootはカーネルをロードして起動します
- カーネルにはWiFiチップのドライバーが含まれており、rootfsをマウントします
- rootfs には、AP に接続するために必要なファイル (パスワード、SSID など) が含まれています。
- 接続が確立すると、NFSはリモートファイルシステムを/optなどにマウントします。
ルート (/) ファイルシステムを NFS 上のファイルシステムに置き換えることは可能ですか? (接続を開始するために必要な Wi-Fi 構成がこのパーティションに保存されているにもかかわらず)
アップデート
私はMIPS用のNFSクライアントプログラムを正常にコンパイルし、デバイスはNFS経由で新しいルートファイルシステムを何らかのディレクトリにマウントできるようになりましたが、ピボットルート失敗:
# 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 サポートが不十分な状況 (たとえば、Kerberos が必要な場合) で、サーバーに NFS ルートを実装するためによく使用されます。)
重要なステップは、pivot_root()システムコールを使用して、現在のルートを新しくマウントされたルートと交換します。呼び出し後、元の rootfs はマウントされたままですが、/ にはなくなり、呼び出しによってマウントが「新しい」 rootfs のサブディレクトリに移動します。
また、
pivot_root
プログラムBusybox (および util-linux) では、init プロセスがシェルスクリプトである場合に使用できます (よくあるケース)。リンクされた util-linux のマニュアル ページには、その使用例が記載されています。あるいは、ライナス、それは単にchroot()新しくマウントされたルートに – つまり、元のルートにアクセスする必要がなくなった場合です。
chroot
この場合も、コマンドライン ツールがあります。
注:必要これを実現するには、initramfs をビルドして使用します。関数は、initrd イメージから呼び出されるか、実際の rootfs から呼び出されるかには関係ありません。
しかし、「通常の」initramfsは一時的なメモリ内の解凍されたファイルシステムから実行されるため、switch_root
新しいルートにピボットする直前にすべてのinitramfsファイルを削除するのがツールの慣例です。しかし、ディスク上のファイルシステムから直接起動する場合は、おそらくない必要なものswitch_root
だけなので、ツールは使用せず、 のみを使用してくださいpivot_root
。