На «клиентских» машинах безопасный способ перемещения /tmp- перезагрузка. Здесь под клиентом я подразумеваю все, что запускает программы, в которые вставляются сокеты /tmp, в частности X-серверы и экран.
Новое /tmpобязательно должно иметь правильные разрешения (1777), в противном случае вы не можете надеяться на наличие работающей системы.
Ведь /tmpвы практически не можете копировать файлы. Это потому, что в большинстве случаев программы /tmpоткрывают файлы. Если вы копируете файл, это копирует содержимое, но в программах все еще открыты старые файлы. Возможно, вы сможете получить доступ к ним с помощью отладчика ( ptrace), но это будет намного сложнее, чем перезагрузка, а со многими программами все, что вам нужно сделать, это все равно их аварийно завершить.
Если у вас /tmpвсе заполнено и вы хотите перейти на новую версию в реальном времени, вам необходимо перезапустить все программы, в которых есть открытые файлы. Поскольку это означает перезапуск сеансов X и экрана, это не намного лучше, чем перезагрузка.
Вы должны иметь возможность переключаться на новые программы, но сохранять существующие открытые файлы на месте с помощью монтирования объединения . (Принцип здравый, но я никогда не пробовал, поэтому могут возникнуть непредвиденные проблемы.) Вот способ сделать это в Linux.
- Сохраните все существующие файлы,
/tmpкроме нескольких больших, выбранных вручную.
- Создать
/tmp.new(режим 1777).
- Защита
/tmpпо другому пути: mount --bind / /.root.only. Это необходимо, потому что следующим шагом будет тень /tmp. Могут быть разные реализации монтирования объединения, которые не требуют этого шага.
- Сделать союз крепление из
/.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