Как (безопасно) переместить / tmp на другую громкость?

17

Сегодня /tmpкаталог заправлен на машине на работе. Проблема была в том, что он находился в корневом разделе, который был не очень большим. Чтобы это исправить, сотрудник создал /new/tmpкаталог в другом месте, скопировал все содержимое в новый каталог, удалил оригинал /tmpи сделал символическую ссылку /tmp -> /new/tmp.

Когда он копировал файлы (на самом деле, это был кто-то другой, а не я!), Он не использовал их, -aпоэтому владелец каждого файла /new/tmpбыл root. Кроме того, он не установил права доступа к /new/tmpкаталогу, так что это было значение по умолчанию 0755. Это не вызвало никаких проблем, и даже режим настройки и биты владения не смогли вернуть машину в приемлемо рабочее состояние. Я закончил тем, что все перебрал /tmpи перезагрузил.

/tmpКаталог содержит различные сокеты и трубы и этажерку, так как куча людей бежать Gnome через VNC, и я использую , screenкоторый имеет свои собственные трубки.

Есть ли безопасный способ переместить /tmpкаталог на другой том в работающей системе? Я не уверен, что бы я сделал, чтобы все работало. Мне особенно любопытно, что происходит с трубами и розетками.

Грег Хьюгилл
источник

Ответы:

20

На «клиентских» машинах безопасный способ перемещения /tmp- перезагрузка. Здесь под клиентом я подразумеваю все, что запускает программы, в которые вставляются сокеты /tmp, в частности X-серверы и экран.

Новое /tmpобязательно должно иметь правильные разрешения (1777), в противном случае вы не можете надеяться на наличие работающей системы.

Ведь /tmpвы практически не можете копировать файлы. Это потому, что в большинстве случаев программы /tmpоткрывают файлы. Если вы копируете файл, это копирует содержимое, но в программах все еще открыты старые файлы. Возможно, вы сможете получить доступ к ним с помощью отладчика ( ptrace), но это будет намного сложнее, чем перезагрузка, а со многими программами все, что вам нужно сделать, это все равно их аварийно завершить.

Если у вас /tmpвсе заполнено и вы хотите перейти на новую версию в реальном времени, вам необходимо перезапустить все программы, в которых есть открытые файлы. Поскольку это означает перезапуск сеансов X и экрана, это не намного лучше, чем перезагрузка.

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

  1. Сохраните все существующие файлы, /tmpкроме нескольких больших, выбранных вручную.
  2. Создать /tmp.new(режим 1777).
  3. Защита /tmpпо другому пути: mount --bind / /.root.only. Это необходимо, потому что следующим шагом будет тень /tmp. Могут быть разные реализации монтирования объединения, которые не требуют этого шага.
  4. Сделать союз крепление из /.root.only/tmpи /tmp.new, смонтированных на /tmp. Таким образом, новые файлы, созданные в /tmpбудут записаны в /tmp.new, но файлы /.root.only/tmpтакже видны в /tmp. Одним из возможных вариантов является UnionFS-предохранитель : unionfs-fuse /tmp.new:/.root.only/tmp /tmp.

Если вы не хотите использовать root для монтирования объединения (например, из-за того, что он недоступен на вашей платформе или из-за слишком больших проблем), по крайней мере не удаляйте старый каталог. Переместите его так, чтобы работающие программы продолжали использовать старый каталог, а новые программы использовали новый. (Конечно, новые программы не смогут взаимодействовать со старыми программами через сокеты или канал, /tmpесли вы не укажете TMPDIRили не скажете им, где искать.)

mv /tmp /tmp.old && mkdir /tmp
Жиль "ТАК - перестань быть злым"
источник
Не могли бы вы уточнить, как сохранить новую папку / tmp после перезагрузки?
FoxDeploy
@FoxDeploy Поместите запись для этого в/etc/fstab
Жиль "ТАК - перестань быть злым"
Не могли бы вы уточнить это?
FoxDeploy
@FoxDeploy Я не уверен, что вы спрашиваете здесь. Если вы хотите /tmpбыть где-то кроме корневой файловой системы, внесите ее в список /etc/fstab, как и любую другую файловую систему, которую вы хотите смонтировать во время загрузки. Если это не то, что вы спрашиваете, вы должны задать новый вопрос с достаточным контекстом.
Жиль "ТАК - перестань быть злым"