Экспортировать (через NFS) корневую (/) файловую систему

Вопрос или проблема

У меня есть 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/»? Если да, то есть ли идеи, что можно сделать для достижения цели? Заранее большое спасибо.

Дополнение/обновление:

  1. Каждый процессор знает свой номер, загрузчик (u-boot) передаст правильные параметры в командной строке Linux для загрузки с NAND (CPU0) или с NFS (CPU1-2). Таким же образом CPU0 запустит NFS сервер, в то время как CPU1-2 не будут.

  2. Нет необходимости в «приватных» файлах, так как в любом случае корневая файловая система сегодня монтируется только для чтения. Просто у каждого CPUx есть своя собственная приватная NAND, от которой я хочу избавиться.

  3. Это не то же самое, что случай «бездисковой» системы, потому что в случае бездисковой системы экспортируется какая-то ПОДДИРЕКТОРИЯ как корневая FS, в то время как в моем случае вся корневая FS должна быть экспортирована.

  4. Я должен отметить, что экспорт любой поддиректории из 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 не поддерживает экспорт корневого каталога по следующими причинам:

  1. Специфика NFS: NFS ориентирован на экспорт подкаталогов, а не корневых файловых систем, что связано с тем, как система должна обрабатывать монтирование и доступ к ресурсам.

  2. Проблемы с конфигурацией: Если все три системы используют одну и ту же файловую систему для хранения конфигураций (например, /etc), это может привести к конфликтам и нестабильной работе, так как изменения на одном из устройств могут нарушить работу других.

Возможные решения проблемы

Для достижения вашей цели можно рассмотреть следующие подходы:

  1. Использование ненадежного биндинга каталога: Вместо прямого экспорта корневого каталога, вначале можно смонтировать корень в другой директории, например, /srv/nfs/root, с помощью команды:

    mount --bind / /srv/nfs/root

    Далее, экспортируйте этот каталог:

    exportfs -o rw,async *(rw,sync,no_subtree_check) /srv/nfs/root

    Это позволит вам избежать проблемы с рекурсивным биндингом, который может экспортировать такие каталоги, как /proc, /sys и /dev, что недопустимо.

  2. Деление на разделы: Как было предложено, создайте разделы на флэш-памяти для крупных каталогов (/home, /usr и т.д.) и монтируйте их на компаньонах. Это снизит риск конфликта конфигурации и упростит управление.

    Дополнительный вариант — создать один общий раздел для расшаривания:

    mount /dev/<shared_partition> /shared
    ln -s /shared/home /home

    Но следует учесть, что этот подход требует аккуратного управления зависимостями и версиями файлов.

  3. Управление загрузкой и параметрами: Каждый процессор должен знать, является ли он основным или компаньоном. Это можно настроить через загрузчик (например, U-Boot), который будет передавать параметры в ядро и настраивать поведение системы при загрузке.

Заключение

Начиная процесс экспорта корневой файловой системы через NFS на устройствах с ограниченными ресурсами, вы должны учитывать специфические технические ограничения и практические аспекты управления файловыми системами. Используя биндинг каталога, более дробную структуру каталогов и надлежащую конфигурацию загрузки для каждого устройства, вы сможете эффективно разделить ресурс и минимизировать конфликты. Это позволит сохранить целостность системы и обеспечить её стабильную работу в рамках заданной архитектуры.

Оцените материал
Добавить комментарий

Капча загружается...