Назад | Перейти на главную страницу

AUFS: как создать ветвь чтения / записи только части дерева каталогов?

AuFS (другая файловая система объединения) позволяет нам объединять два дерева в одно, даже если эти деревья перекрываются. Затем мы можем направить запись в объединенное дерево в одну из ветвей и чтение в другую.

Классическое использование этого - с файловой системой flash и RAM-диском, например этот (ссылка 1) для создания корневой файловой системы только для чтения, которая не нарушает работу Linux. Все записи файлов идут в оперативную память. После перезагрузки система восстановит исходную конфигурацию.

/aufs затем повторно монтируется с --move сделать это / (корень)

Упрощенно, пример в (ссылка 1) просто делает это

mount -t aufs br=/dir2:/dir1 /aufs
mount --move /aufs /

Однако я хочу использовать его так, чтобы записываемый (/dir2) находится на реальном диске, а не на RAM-диске. Таким образом, после перезагрузки данные сохранятся.

Но мне нужно убедиться, что определенные файлы в dir2 не сохраняются и восстанавливаются в их (/dir1) по умолчанию. Это гарантирует, что в будущих загрузках всегда будут использоваться файлы при поставке. Без потери данных о пользователях и журналах.

например Измененные файлы в /etc, /bin, /boot, /usr не должен пережить перезагрузку.

В Веб-страница AUFS (ссылка 2) очень мало примеров.

Итак, на вопрос: как правильно это сделать с помощью AuFS?

Я могу думать о следующем:

  1. Измените как-нибудь первую команду монтирования
  2. Добавьте дополнительные команды монтирования, используя aufs add / del перед вторым монтированием
  3. Просто удалите деревья, которые не следует сохранять из /dir2 во время загрузки
  4. Частичное дерево (etc, bin, boot, lib, etc) в tmpfs

Ссылка 1: https://help.ubuntu.com/community/aufsRootFileSystemOnUsbFlash
Ссылка 2: http://aufs.sourceforge.net/aufs.html

Опция 1: auFS сам по себе не поддерживает такой вариант крепления, поэтому вариант №1 мертв. Вы должны обойти это.

Вариант # 3: Конечно, вы можете просто удалять эти каталоги при каждой загрузке. Возможно, это самый простой способ, который я вижу здесь.

Вариант # 2: Вы можете работать с tmpfs. Итак, сначала создайте tmpfs, скажем размером 500 МБ:

mount -t tmpfs -o rw,size=500M tmpfs /tmpfs

Сейчас у нас есть:

  • /dir1: только чтение
  • /dir2: читай пиши
  • /tmpfs: чтение / запись в ОЗУ
  • /aufs: наложение /dir1 и /dir2

Внутри /tmpfs, мы создаем те каталоги, которые вы хотите сохранить:

mkdir -p /tmpfs/{etc,usr,boot,bin}

Обратите внимание, мы делаем это, когда уже объединяем два каталога. Итак, когда дерево каталогов в /aufs уже существует. Однако теперь мы выполняем одно монтирование aufs для каждого каталога, которое необходимо сохранить:

mount -t aufs -o dirs=/tmpfs/etc=rw:/dir2/etc=ro none /aufs/etc
mount -t aufs -o dirs=/tmpfs/usr=rw:/dir2/usr=ro none /aufs/usr
mount -t aufs -o dirs=/tmpfs/boot=rw:/dir2/boot=ro none /aufs/boot
mount -t aufs -o dirs=/tmpfs/bin=rw:/dir2/bin=ro none /aufs/bin

Теперь у вас есть дерево каталогов в /aufs где вы можете писать файлы везде, но когда вы пишете в /etc например, это будет записано в /tmpfs/etc, который находится в ОЗУ, поэтому не переживает перезагрузку. Другие файлы в /home например, написаны на /dir2/home, которая является файловой системой с возможностью чтения и записи и, следовательно, выдерживает перезагрузку.

Другое решение: Я также использую клиентскую систему, которая использует файловую систему наложения и сохраняет пользовательские данные. Вот как я решил это: просто файловая система только для чтения и tmpfs, смонтированный поверх нее. Позже, когда пользователь входит в систему, я монтирую его домашний каталог с сервера Samba с возможностью чтения и записи. Таким образом, все его пользовательские данные хранятся и сохраняются в /home, а остальное не переживает перезагрузку. В вашем случае вы можете просто поставить /home в другой физический раздел, доступный для чтения и записи, и смонтировать его позже в /aufs/home.