Найти в Дзене
Записки сисадмина

Linux. Расширяем директорию временных файлов tmp.

Нет ничего постоянного в нашей жизни. Любовь, бывает, проходит, люди меняются сами и меняют других людей. Все в этом мире меняется, и мудрые люди советуют не привязываться к незначительным и не очень важным конкретно вещам. Прямо как ко временным файлам в вашей системе. Сегодня поговорим о директории /tmp в linux, как она устроена, для чего нужна, и как ее модифицировать. И вот с правами начинается самое интересное. Как разграничить доступ к папке, в которую писать может абсолютно каждый? При этом пользователи не должны иметь возможность удалять файлы друг друга, чтобы не возникло конфликтов и ошибок. Нам на помощь приходить sticky bit. Sticky bit - это специальный бит в файловых системах Unix и Linux, который применяется к директориям. Он предотвращает удаление или переименование файлов в директории пользователями, которые не являются владельцами этих файлов. Если простыми словами - создать файл может каждый, изменить и удалить - только создатель. chmod +t /directory chmod 1777 /direc
Оглавление

Нет ничего постоянного в нашей жизни. Любовь, бывает, проходит, люди меняются сами и меняют других людей. Все в этом мире меняется, и мудрые люди советуют не привязываться к незначительным и не очень важным конкретно вещам.

Прямо как ко временным файлам в вашей системе.

Сегодня поговорим о директории /tmp в linux, как она устроена, для чего нужна, и как ее модифицировать.

Немного теории.

  • Директория /tmp — это директория для хранения временных файлов в системах Unix и Linux.
  • Иногда эта папка монтируется в память, однако если оперативной памяти не так много, а какой-нибудь софт активно пишет в нее, есть смысл перенести /tmp на диск.
  • Файлы, которые хранятся в этой директории, обычно могут быть удалены при перезагрузке, либо после определенного временного интервала. Многие дистрибутивы Linux автоматически очищают эту папку при запуске системы, чтобы освободить место на диске.
  • Директория доступна для всех пользователей в системе. Также каждая программа может сохранять свои файлы в /tmp, которые нужны для работы. Из-за этого важно следить за распределением доступов к временному каталогу.

И вот с правами начинается самое интересное. Как разграничить доступ к папке, в которую писать может абсолютно каждый? При этом пользователи не должны иметь возможность удалять файлы друг друга, чтобы не возникло конфликтов и ошибок.

Нам на помощь приходить sticky bit.

Sticky bit - это специальный бит в файловых системах Unix и Linux, который применяется к директориям. Он предотвращает удаление или переименование файлов в директории пользователями, которые не являются владельцами этих файлов.

Если простыми словами - создать файл может каждый, изменить и удалить - только создатель.

  • Установить sticky bit можно двумя способами:
chmod +t /directory
chmod 1777 /directory
  • При вызове ls -l мы увидим в последнем бите прав "t":
drwxrwxrwt 17 root root 4096 Feb 24 03:39 tmp

Да, sticky bit можно установить на любую директорию.

Нет, делать этого без необходимости не нужно.

А теперь к конкретным случаям и практике.

Запущена у нас одна программа, которая активно создает свои временные файлы в /tmp.

В случае, если директория хранится у нас в оперативной памяти, в ближайшее время мы познакомимся с OOM-killer поближе и узнаем, как он работает. Спойлер: ничего хорошего нам это не сулит.

В случае, если директория хранится в корне, у нас чуть больше шансов.

Но опять же: особо упоротый софт может накидать в tmp директорию слишком большой объем данных. И нам не хотелось бы лишний раз нагружать наш диск.

Есть решение? Конечно же есть: выносим хранилище временных файлов на отдельный диск.

Способ 1:

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

Способ откровенно не очень, как и следующий.

Способ 2:

Создаем папку /mnt/tmp, выдаем ей 1777 права, монтируем в нее наш новый диск и делаем symlink с /mnt/tmp на /tmp.

Может сработать с высокоуровневым софтом. Но опять же: можно огрести немало проблем, если софт откажется использовать symlink для записи.

Способ 3:
А теперь давайте сделаем все грамотно и красиво.

  • Создаем новую папку, в которую будем монтировать наш диск:
mkdir /mnt/tmp
  • Выставляем ей права со sticky bit:
chmod 1777 /mnt/tmp
  • Монтируем в нее наш новый диск:
mount -rw /dev/vdb /mnt/tmp/
  • Проверяем:
  • Создаем точку монтирования systemd.

Создаем новый файл /etc/systemd/system/mnt-tmp.mount

-2
[Unit]
Description=Mount tmpfs on /mnt/tmp
[Mount]
What=tmpfs
Where=/mnt/tmp
Type=tmpfs
Options=mode=1777,size=20G
[Install]
WantedBy=multi-user.target

Важно: Имя файла должно соответствовать пути до папки. Если бы мы монтировали в /mnt/tmp/admin, файл назывался бы /etc/systemd/system/mnt-tmp-admin.mount

  • Уведомляем systemd об изменениях:
systemctl daemon-reload
systemctl enable mnt-tmp.mount
systemctl start mnt-tmp.mount
  • Редактируем файл /etc/enviroments:
TMPDIR=/mnt/tmp
  • Применяем системные изменения:
source /etc/environment
  • Проверяем:
echo $TMPDIR

На вывод нам должно выдать "/mnt/tmp"

Поздравляю: теперь все процессы в нашей системе будут использовать новый временный каталог.