Монтируем tmpfs в /tmp

За жизнь у меня появилась привычка со всеми временными задачами разбираться именно в /tmp. Это удобно. Загружаю туда файлы, произвожу операции и, только если надо, забираю файлы в домашнюю директорию.

Или, например, если нужно производить деструктивную операцию, имеет смысл выгрузить файл в /tmp и опробовать всё на новой копии.

Правда, с /tmp есть одна заковырка. Если Debian не устанавливался с Live CD/DVD, то, в большинстве случаев, это будет аналог серверной инсталляции. Одно из отличий – монтируется ли tmpfs в /tmp.

В настольных конфигурациях /tmp может быть tmpfs. А вот в серверных /tmp не будет смонтирован, а будет простой папкой в ФС.

В любом случае содержимое /tmp будет “теряться”. В случае tmpfs данные будут пропадать при выключении или перезагрузке системы. Аналогичное поведение без монтирования tmpfs обеспечит systemd-tmpfiles, но уже при старте системы. Рекомендую почитать man systemd-tmpfiles если интересует последний вариант

Размер tmpfs обычно составляет половину доступного RAM, ведь в RAM и будут расположены данные. Если на борту ПК имеется 32G RAM, то можно ожидать tmpfs объёмом до 16G. Объём tmpfs можно настроить и в большую сторону, но я это значение не меняю, половина RAM по-умолчанию выбрана неспроста.

В случае обычной папки размер ограничен лишь доступным местом корневого раздела.

К слову, 16G для tmpfs не будут “заблокированы” для приложений с самого начала. Они будут использоваться только по мере заполнения. Если в папке /tmp будут данные на 4G, то в использованной RAM будет дополнительно плюс 4G, а не 16G.

Все перечисленные особенности намекнут пытливому уму, что tmpfs это одна из возможных имплементаций RAM-диска и будут абсолютно правы. Наличие таких особенностей и привлекает меня в варианте монтирования tmpfs в /tmp.

Но, хватит теории, переходим к практике как смонтировать tmpfs.

Чтобы проверить, используется ли tmpfs для /tmp, воспользуюсь findmnt.

$ findmnt -rn | grep /tmp
$ grep /tmp /etc/fstab

В выводе пусто, значит /tmp не смонтирован сейчас и никаких записей в файле /etc/fstab нет. Если в выводе что-то есть, то, скорее всего, ничего делать больше не стоит, ведь что-то уже явно смонтировано в /tmp.

Чтобы смонтировать tmpfs, добавляю строку в /etc/fstab:

$ echo 'tmpfs    /tmp    tmpfs    noatime,mode=1777    0    0' \
    | sudo tee -a /etc/fstab

tmpfs    /tmp    tmpfs    noatime,mode=1777    0    0

Отмечу наличие mode=1777 в параметрах. Это установит доступ на запись, чтение и исполнение для всех по умолчанию и дополнительно поставит липкий бит, чтобы нельзя было удалять или переименовывать файлы другого пользователя.

Любая операция с /etc/fstab требует осторожности. В случае ошибки система может просто не загрузиться. Проверяю конфигурацию с помощью findmnt после перезагрузки конфигурации systemd:

$ sudo systemctl daemon-reload
$ sudo findmnt --verify --verbose

/
   [ ] target exists
   [ ] FS options: errors=remount-ro
   [ ] UUID=d25a4529-eaaf-4155-8b15-66187575e491 translated to /dev/vda1
   [ ] source /dev/vda1 exists
   [ ] FS type is ext4
none
   [ ] UUID=a09c59b4-15a1-498e-bcf7-5faa13e749d7 translated to /dev/vda5
   [ ] source /dev/vda5 exists
   [ ] FS type is swap
/media/cdrom0
   [ ] target exists
   [ ] userspace options: user,noauto
   [ ] source /dev/sr0 exists
   [W] cannot detect on-disk filesystem type (No medium found)
/tmp
   [ ] target exists
   [ ] VFS options: noatime
   [ ] FS options: mode=1777
   [ ] do not check tmpfs source (pseudo/net)
   [ ] do not check tmpfs FS type (pseudo/net)

0 parse errors, 0 errors, 1 warning

Единственный warning касается отсутствующего диска в /media/cdrom0, что не касается всей истории с /tmp. Значит, никаких ошибок не было допущено.

Последний штрих – удаляю файлы в существующей /tmp, иначе после следующей загрузки системы файлы будут на месте, но их не будет видно “под” mount.

Хорошим тоном будет выйти из графического окружения нажатием CTRL + ALT + F2 и удалить /tmp.

$ sudo rm -rf /tmp/*
$ sudo reboot

Если забыли сделать это сразу, то после перезапуска можно демонтировать /tmp и удалить файлы с помощью тех же команд. Главное не забыть выйти из графического окружения!

$ sudo umount /tmp
$ sudo rm -rf /tmp/*
$ sudo reboot

На этом всё, теперь можно использовать /tmp как RAM-диск!

Если Вы хотите обсудить содержание заметки, задать вопросы или предложить изменения, то со мной можно связаться в Telegram