Вопрос или проблема
У меня есть 3 встроенные системы с процессорами, работающие на Linux 2.6.37, которые подключены через Ethernet. У каждого процессора есть своя NAND флеш-память. Один из них является «основным» процессором номер 0, а два других — его спутники. Я хочу, чтобы все три работали с одной и той же корневой файловой системой, находящейся на CPU0, чтобы избежать утроения возможных обновлений/изменений в файлах RootFS.
Для этого я хотел экспортировать «https://unix.stackexchange.com/» (корневую файловую систему) через NFS на CPU0, тогда как CPU1 и CPU2 будут загружаться с CPU0 через NFS (nfsroot).
Но это, похоже, не срабатывает — любая попытка экспортировать «https://unix.stackexchange.com/» завершается неудачей с сообщением:
exportfs: / не поддерживает экспорт NFS
Существуют ли какие-либо принципиальные ограничения на экспорт «https://unix.stackexchange.com/»? Если да, то есть ли идеи, что можно сделать для достижения цели? Заранее большое спасибо.
Дополнение/обновление:
-
Каждый процессор знает свой номер, загрузчик (u-boot) передаст правильные параметры в командной строке Linux для загрузки с NAND (CPU0) или с NFS (CPU1-2). Таким же образом CPU0 запустит NFS сервер, в то время как CPU1-2 не будут.
-
Нет необходимости в «приватных» файлах, так как в любом случае корневая файловая система сегодня монтируется только для чтения. Просто у каждого CPUx есть своя собственная приватная NAND, от которой я хочу избавиться.
-
Это не то же самое, что случай «бездисковой» системы, потому что в случае бездисковой системы экспортируется какая-то ПОДДИРЕКТОРИЯ как корневая FS, в то время как в моем случае вся корневая FS должна быть экспортирована.
-
Я должен отметить, что экспорт любой поддиректории из NAND работает нормально (я по крайней мере пробовал несколько). Просто экспорт «https://unix.stackexchange.com/» не удается.
Если бы процессоры делили всю корневую файловую систему, это включало бы все конфигурации, включая, например, конфигурацию NFS. Как бы они знали, кто является основным, а кто спутником?
Один из подходов — создать разделы на флешке для самых больших директорий (узнать можно с помощью du -sm /*|sort -n
) и смонтировать их с компаньонов, если это возможно (вы можете сделать это с /home
или /usr
, но не с /etc
).
Но поскольку система все еще в разработке, вы можете не знать, сколько места вам потребуется на каждом разделе, поэтому может быть лучше иметь только небольшой /root
раздел и один большой другой раздел, такой как /shared
, который можно монтировать. Затем вам придется создать символические ссылки, такие как ln -s /shared/home /home
. Но убедитесь, что вы не «убьете» свою систему! Если вы попытаетесь переместить /bin
на общий раздел, /bin/mount
не будет найден при загрузке.
Не рекурсивно смонтируйте корневую директорию в другое место, например /srv/nfs/root
:
mount --bind / /srv/nfs/root
Затем экспортируйте /srv/nfs/root
.
Не делайте рекурсивное связывание (--rbind
), иначе такие директории, как /proc, /sys и /dev, также будут экспортированы.
Ответ или решение
Для успешного экспорта корневой файловой системы (/) через NFS с CPU0 и её использования на CPU1 и CPU2, необходимо учесть несколько важных аспектов.
Основные ограничения при экспорте корневой файловой системы
Попытка экспорта корневой файловой системы (/) напрямую приводит к ошибке exportfs: / does not support NFS export
, что, кажется, связано с внутренними ограничениями системы и особенностями NFS. NFS не поддерживает экспорт корневого каталога по следующими причинам:
-
Специфика NFS: NFS ориентирован на экспорт подкаталогов, а не корневых файловых систем, что связано с тем, как система должна обрабатывать монтирование и доступ к ресурсам.
-
Проблемы с конфигурацией: Если все три системы используют одну и ту же файловую систему для хранения конфигураций (например,
/etc
), это может привести к конфликтам и нестабильной работе, так как изменения на одном из устройств могут нарушить работу других.
Возможные решения проблемы
Для достижения вашей цели можно рассмотреть следующие подходы:
-
Использование ненадежного биндинга каталога: Вместо прямого экспорта корневого каталога, вначале можно смонтировать корень в другой директории, например,
/srv/nfs/root
, с помощью команды:mount --bind / /srv/nfs/root
Далее, экспортируйте этот каталог:
exportfs -o rw,async *(rw,sync,no_subtree_check) /srv/nfs/root
Это позволит вам избежать проблемы с рекурсивным биндингом, который может экспортировать такие каталоги, как
/proc
,/sys
и/dev
, что недопустимо. -
Деление на разделы: Как было предложено, создайте разделы на флэш-памяти для крупных каталогов (
/home
,/usr
и т.д.) и монтируйте их на компаньонах. Это снизит риск конфликта конфигурации и упростит управление.Дополнительный вариант — создать один общий раздел для расшаривания:
mount /dev/<shared_partition> /shared ln -s /shared/home /home
Но следует учесть, что этот подход требует аккуратного управления зависимостями и версиями файлов.
-
Управление загрузкой и параметрами: Каждый процессор должен знать, является ли он основным или компаньоном. Это можно настроить через загрузчик (например, U-Boot), который будет передавать параметры в ядро и настраивать поведение системы при загрузке.
Заключение
Начиная процесс экспорта корневой файловой системы через NFS на устройствах с ограниченными ресурсами, вы должны учитывать специфические технические ограничения и практические аспекты управления файловыми системами. Используя биндинг каталога, более дробную структуру каталогов и надлежащую конфигурацию загрузки для каждого устройства, вы сможете эффективно разделить ресурс и минимизировать конфликты. Это позволит сохранить целостность системы и обеспечить её стабильную работу в рамках заданной архитектуры.