Моя настройка требует, чтобы некоторые из моих /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.