Монтируем 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-диск!