Linux монтирует общий ресурс NFS

Linux монтирует общий ресурс NFS

Я хочу запустить Linux на встраиваемом устройстве (MIPS), которое имеет некоторые очень жесткие ограничения:

  • только 16 МБ памяти
  • нет проводного Ethernet (только Wi-Fi)

Хорошие новости:

  • У меня есть рабочий загрузчик (u-boot)
  • У меня также есть рабочее ядро ​​(версия 3.10.14 #2 PREEMPT)
  • и у меня есть рабочая корневая файловая система (Linux может запуститься и я могу войти в систему)

Теперь проблема в том, что у меня больше не осталось места для запуска каких-либо пользовательских приложений на этом оборудовании, поэтому я хочу перейти на NFS.

Я не совсем уверен в правильности процедуры.

Процесс загрузки обрабатывается U-boot, как я уже упоминал. Но U-boot не может инициализировать Wifi - поэтому мне понадобится небольшая ОС Linux для этой цели.

Основная идея

  1. U-boot загружает ядро ​​и запускает его
  2. Ядро содержит драйверы для чипа Wi-Fi и монтирует rootfs
  3. rootfs содержит необходимые файлы для подключения к точке доступа (пароли, ssid и т. д.)
  4. как только соединение будет установлено, NFS смонтирует удаленную файловую систему в /opt или что-то в этом роде

Можно ли как-то заменить корневую (/) файловую систему на ту, что лежит на NFS? (Несмотря на то, что на этом разделе хранится конфигурация Wi-Fi, которая была необходима для запуска соединения)

Обновлять

Я успешно скомпилировал клиентские программы nfs для mips, и теперь устройство может монтировать новую rootfs через nfs в какой-то каталог, однакоpivot_rootне удается:

# 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

Да – и вы в основном делаете то же самое, что делает initramfs на ПК с Linux. Initramfs запускается как обычная корневая файловая система на in-memory /rootfs; затем он монтирует настоящую корневую файловую систему где-то в /mnt или /real.

(На самом деле это часто используется для реализации NFS-root на серверах в ситуациях, когда встроенной в ядро ​​поддержки NFS недостаточно, например, когда требуется Kerberos.)

  • Важным шагом является использованиеpivot_root()syscall для замены текущего корня на вновь смонтированный. После вызова исходный rootfs все еще остается смонтированным, но уже не в / – вызов перемещает монтирование в подкаталог «нового» rootfs.

    Также естьpivot_rootпрограммав Busybox (а также в util-linux), который можно использовать, если ваш процесс init является скриптом оболочки (как это часто бывает). На связанной странице руководства util-linux есть примеры его использования.

  • В качестве альтернативы, согласноЛинус, может быть достаточно простоchroot()в недавно смонтированный корень – то есть, если вам больше не нужен доступ к исходному корню. Опять же, chrootдля этого есть инструмент командной строки.


Примечание: Вы ненуждатьсядля создания и использования initramfs для достижения этой цели; функциям неважно, вызываются ли они из образа initrd или из настоящей rootfs.

Однако, поскольку "обычный" initramfs запускается из временной распакованной файловой системы в памяти, обычно такие инструменты switch_rootудаляют все файлы initramfs прямо перед тем, как перейти к новому корню. Но если вы напрямую загружаетесь из файловой системы на диске, это, вероятно,нетчто вы хотите, поэтому убедитесь, что не используете этот switch_rootинструмент, только pivot_root.

Связанный контент