На «клиентских» машинах безопасный способ перемещения /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