Я хочу запустить Linux на встраиваемом устройстве (MIPS), которое имеет некоторые очень жесткие ограничения:
- только 16 МБ памяти
- нет проводного Ethernet (только Wi-Fi)
Хорошие новости:
- У меня есть рабочий загрузчик (u-boot)
- У меня также есть рабочее ядро (версия 3.10.14 #2 PREEMPT)
- и у меня есть рабочая корневая файловая система (Linux может запуститься и я могу войти в систему)
Теперь проблема в том, что у меня больше не осталось места для запуска каких-либо пользовательских приложений на этом оборудовании, поэтому я хочу перейти на NFS.
Я не совсем уверен в правильности процедуры.
Процесс загрузки обрабатывается U-boot, как я уже упоминал. Но U-boot не может инициализировать Wifi - поэтому мне понадобится небольшая ОС Linux для этой цели.
Основная идея
- U-boot загружает ядро и запускает его
- Ядро содержит драйверы для чипа Wi-Fi и монтирует rootfs
- rootfs содержит необходимые файлы для подключения к точке доступа (пароли, ssid и т. д.)
- как только соединение будет установлено, 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
.