Вопрос или проблема
У меня файловая система root только для чтения, защищенная dm-verity, и чистое хранилище пользовательских данных для записи. Тем не менее, мне нужно создать небольшой набор файлов на rootfs, которые требуют модифицируемого постоянного хранилища. Насколько я знаю, общим подходом для этого является использование файловых систем, похожих на unionfs, например, overlayfs. Проблема с overlayfs заключается в том, что, похоже, она не обеспечивает гранулярность на уровне файлов. Что я имею в виду: если я хочу сделать файл /etc/resolv.conf модифицируемым, мне нужно будет смонтировать всю папку /etc соответствующим образом.
mount -t overlay overlay -o lowerdir=/etc,upperdir=/opt/storage/etc-up,workdir=/opt/storage/etc-wd,noexec /etc
Я пытался использовать привязочные монтирования файлов вместо overlayfs, чтобы обойти это, поэтому идея заключалась в том, чтобы скопировать целевой файл в хранилище для записи при загрузке, а затем смонтировать его в оригинальное место. Однако, по-видимому, в некоторых случаях, например, при добавлении пользователя, программное обеспечение также пытается создать некоторые временные файлы в папке /etc (например, файлы блокировок), поэтому это не сработало для меня (создание файла, конечно, завершилось неудачей, потому что оригинальная rootfs смонтирована в режиме только для чтения). Мне интересно, есть ли решение, которое поможет мне сделать то, что я хочу. Требования можно резюмировать следующим образом:
Большинство rootfs навсегда остается только для чтения (уже реализовано, rootfs должен быть смонтирован в режиме только для чтения).
Я могу статически определить во время сборки образа, что file1, file2 … file_n исключены из этого списка “навсегда-только-для-чтения” данных.
Я могу определить, что новые файлы могут быть созданы в folder1, folder2 … folder_n.
Ответ или решение
Выборочное предоставление прав доступа на запись к файловой системе, смонтированной в режиме только для чтения
В современных системах на базе Linux часто возникает необходимость ограничить доступ к файловой системе, смонтированной в режиме только для чтения, сохраняя при этом возможность модификации определённых файлов или директорий. Ваше описание задачи указывает на применение dm-verity
для защиты корневой файловой системы и наличие чистого хранилища с возможностью записи для пользовательских данных. Рассмотрим ваш запрос более подробно, выделив ключевые моменты и возможные решения проблемы.
Проблема
Вы хотите оставить основное дерево файловой системы (rootfs) доступным только для чтения и при этом иметь возможность модифицировать только определённые файлы и директории. Вы упомянули, что использование overlayfs
не подходит из-за того, что оно обеспечивает уровень монтирования, при котором целые директории становятся доступными для записи вместо отдельных файлов.
Вы также столкнулись с проблемой использования связывающих (bind) монтирований, поскольку некоторые программы могут пытаться создавать временные файлы в защищённых директориях, что приводит к ошибкам, так как корневая файловая система монтируется в режиме только для чтения.
Решение
Чтобы реализовать описанную вами функциональность, можно рассмотреть несколько стратегий, которые позволят вам достигнуть поставленных целей:
-
Индивидуальные монтирования и привязка файлов:
- Вместо связывающего монтирования целых директорий можно по умножить отдельные файлы при загрузке системы. Например, для файла
/etc/resolv.conf
:cp /etc/resolv.conf /opt/storage/resolv.conf mount --bind /opt/storage/resolv.conf /etc/resolv.conf
Это позволит редактировать связанный файл, сохраняя при этом оригинал недоступным для записи.
- Вместо связывающего монтирования целых директорий можно по умножить отдельные файлы при загрузке системы. Например, для файла
-
Использование
overlayfs
сupperdir
для отдельных файлов:- Новая возможность в
overlayfs
позволяет создавать слои для отдельных файлов, но это требует дополнительных манипуляций. Вам необходимо будет создать отдельное место для хранения временных файлов, которые будет использовать программа, например, для/etc/passwd
:mkdir /opt/storage/etc-wd cp /etc/passwd /opt/storage/passwd mount -t overlay overlay -o lowerdir=/etc,upperdir=/opt/storage/etc-up,workdir=/opt/storage/etc-wd,noexec /etc/passwd
- Новая возможность в
-
Использование механизма ACL (Access Control Lists):
- Вы также можете рассмотреть возможность использования списков контроля доступа (ACL). Это позволит определить, какие пользователи или группы могут модифицировать конкретные файлы, не меняя разрешений всей директории.
- Убедитесь, что поддержка ACL включена в вашем ядре и монтируйте файловую систему с опцией
acl
, например:mount -o remount,acl /
- Затем можно задавать права доступа для определенных файлов:
setfacl -m u:username:w /etc/resolv.conf
-
Создание временных директорий:
-
В случае, если программе нужно создать временные файлы, вы можете создать отдельные директории на разделах, доступных для записи. Например, можно создать директорию
/opt/tmp
для хранения временных файлов и настроить программы на использование этой директории:mkdir /opt/tmp export TMPDIR=/opt/tmp
-
Заключение
Выборочное предоставление прав доступа на запись в файловую систему, смонтированную в режиме только для чтения, возможно при комплексном использовании нескольких инструментов и подходов. Каждый из предложенных методов имеет свои плюсы и минусы, и их можно комбинировать в зависимости от конкретных требований вашей среды.
Важно также учитывать специфику используемого программного обеспечения, которое может влиять на то, как управляются временные файлы и директории. Регулярное тестирование и мониторинг помогут убедиться в правильности и безопасности выбранных решений.