Файлы /etc на другом разделе

Файлы /etc на другом разделе

Моя настройка требует, чтобы некоторые из моих /etcфайлов находились на отдельном разделе. Для этой цели я создал мягкую ссылку:

ls -li /etc/group
956 lrwxrwxrwx 1 root root 21 May  7 15:48 /etc/group -> /var/common/etc/group

ls -li /var/common/etc/group
3145744 -rw-r--r-- 1 root root 668 May 11 11:02 /var/common/etc/group

Моя проблема возникает при попытке выполнить команды с использованием этих файлов:

groupadd foo
groupadd: failure while writing changes to /etc/group

straceотчеты:

rename("/etc/group+", "/var/common/etc/group") = -1 EXDEV (Invalid cross-device link)
write(2, "groupadd: failure while writing "..., 54groupadd: failure while writing changes to /etc/group
) = 54

Есть идеи, как мне добраться groupaddдо работы?

решение1

По этой причине разделение файлов /etcпо разделам — плохая идея.

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

Другая потенциальная проблема, с которой вы можете здесь столкнуться, заключается в том, что когда что-то делает что-то rename, это затирает символическую ссылку, и теперь это обычный файл.

Другая потенциальная проблема заключается в том, что /etcдля правильной загрузки требуется много файлов, прежде чем система сможет смонтировать другие тома. Таким образом, эти файлы фактически будут отсутствовать.

 

Короче говоря, нет, это не исправить. И вообще, этого не следует делать.

решение2

/etcдолжен быть в корневой файловой системе. Разумнее всего оставить его таким.

Если вам действительно нужно разделить /etc, вы можете получить лучшие результаты с union mount. Я не знаю, поддерживает ли Linux union mount, где один из компонентов соответствует точке монтирования, и было бы сложно не сделать real /etcв корневой файловой системе частью union mount.

Если вы хотите поместить все /etcна другой раздел, вы можете создать минимальный /etc, который содержит только то, что нужно ( /etc/fstab, то, что нужно init ( /etc/inittabили /etc/initи /etc/rc*или то, что использует ваша система init), минимальный /etc/passwdи /etc/groupи т. д.). На раннем этапе загрузки (гораздо раньше, чем /etc/rc.local!), выполните привязку-монтирование /var/common/etcк /etc. Но это потребует много работы, чтобы сделать правильно, и в результате получится /var/common/etcвесь /etc, что, вероятно, не то, что вам нужно. Такая настройка в основном имеет смысл для некоторых встраиваемых систем, которые не используют ни одну из обычных систем init и имеют строгие ограничения на размер корневой файловой системы.

Если у вас есть , /var/commonкоторый используется совместно многими серверами, вам следует подойти к проблеме по-другому. Используйте правильную систему управления конфигурацией для развертывания общих файлов в /etc.

Файл типа /etc/passwdи /etc/groupне должен быть общим для разных машин. Используйте эти файлы только для локальных пользователей и групп. Для записей, которые являются общими для разных машин, используйте NIS или LDAP.

Связанный контент