На "клієнтських" машинах безпечним способом переміщення /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
.
Якщо ви не хочете запускати корінь монтажу об'єднання (наприклад, тому, що він недоступний на вашій платформі або через те, що це занадто багато проблем), принаймні не видаляйте старий каталог. Перемістіть його, щоб запущені програми продовжували використовувати старий каталог, а нові програми використовуватимуть новий. (Звичайно, нові програми не зможуть спілкуватися зі старими програмами через розетки або трубу, /tmp
якщо ви не встановите TMPDIR
або іншим чином не скажете їм, де їх шукати.)
mv /tmp /tmp.old && mkdir /tmp