tmpfs (Русский)
Состояние перевода: На этой странице представлен перевод статьи tmpfs. Дата последней синхронизации: 6 мая 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.
tmpfs — это временная файловая система, которая находится в памяти и/или вашем разделе(ах) подкачки, в зависимости от того, насколько вы её заполнили. Монтирование каталогов как TMPFS — это эффективный способ ускорения доступа к своим файлам. Также это полезно, если вам нужно, чтобы содержимое каталогов автоматически удалялось при перезагрузке.
Совет: Можно создавать временные файлы в каталогах tmpfs при загрузке системы с помощью systemd-tmpfiles.
Использование
Некоторые каталоги, где обычно используется tmpfs(5) : /tmp, /var/lock и /var/run. Не используйте его на /var/tmp, так как этот каталог предназначен для временных файлов, которые сохраняются после перезагрузки.
Arch использует tmpfs в каталоге /run , с симлинками для совместимости /var/run и /var/lock . Он также используется для /tmp в настройках по умолчанию systemd и не требует записи в fstab, если не требуется конкрентная настройка.
glibc 2.2 и выше ожидает что /dev/shm будет смонтирован tmpfs для POSIX разделяемой памяти. Монтирование /dev/shm в tmpfs выполняется автоматически systemd, поэтому ручная настройка в fstab больше не требуется.
Как правило, задачи и программы, которые выполняют частые операции чтения/записи, могут выиграть от использования каталога tmpfs. Некоторые приложения могут даже получить существенную выгоду при переносе некоторых (или всех) их данных на общую память. Например, перемещение профиля Firefox в оперативную память показывает значительное улучшение производительности.
Примеры
Примечание: Фактическое потребление памяти/подкачки зависит от того, насколько вы заполните разделы tmpfs, поскольку они не потребляют память до тех пор, пока она действительно не понадобится.
По умолчанию раздел tmpfs имеет максимальный размер в половину от всей оперативной памяти, но это можно настроить. Чтобы точно установить максимальный размер, в данном примере, чтобы переопределить значение по умолчанию для монтирования /tmp , используем опцию монтирования size :
/etc/fstab
tmpfs /tmp tmpfs rw,nodev,nosuid,size=2G 0 0
Пример с опциями монтирования для большей безопасности:
/etc/fstab
tmpfs /www/cache tmpfs rw,size=1G,nr_inodes=5k,noexec,nodev,nosuid,uid=пользователь,gid=группа,mode=1700 0 0
Смотрите tmpfs(5) и Безопасность#Файловые системы для более подробной информации.
Перезагрузитесь, для того чтобы изменения вступили в силу. Обратите внимание, что может быть заманчивым, выполнить mount -a , чтобы сделанные изменения вступили в силу немедленно, это сделает недоступными какие-либо файлы, которые в настоящее время находятся в этих каталогах (например, особенно проблематично для запуска программ с файлами блокировки). Тем не менее, если все они пусты, она должна быть безопасной для запуска mount -a , вместо перезагрузки (или смонтируйте их в индивидуальном порядке).
После применения изменений, вы можете убедиться в том, что они вступили в силу, посмотрев в /proc/mounts и используя findmnt :
$ findmnt /tmp
TARGET SOURCE FSTYPE OPTIONS /tmp tmpfs tmpfs rw,nosuid,nodev,relatime
TMPFS также может быть временно изменен, без необходимости в перезагрузке, например, когда в ближайшее время необходимо выполнить большую работу компиляции. В этом случае вы можете запустить:
# mount -o remount,size=4G /tmp
Отключить автоматическое монтирование
systemd автоматически монтирует /tmp как tmpfs, даже если нет записи в /etc/fstab . Для отключения автоматического монтирования замаскируйте юнит tmp.mount .
После этого файлы в /tmp станут храниться не в памяти, а на блочном устройстве. Содержимое /tmp теперь будет сохраняться между перезагрузками, что может быть нежелательно. Чтобы вернуть прежнее поведение и очищать каталог /tmp автоматически при перезагрузке, можно использовать tmpfiles.d(5) :
/etc/tmpfiles.d/tmp.conf
# смотрите tmpfiles.d(5) # очистка каталога /tmp всегда включена D! /tmp 1777 root root 0 # удалить файлы в каталоге /var/tmp старше 10 дней D /var/tmp 1777 root root 10d # namespace mountpoints (PrivateTmp=yes) are excluded from removal x /tmp/systemd-private-* x /var/tmp/systemd-private-* X /tmp/systemd-private-*/tmp X /var/tmp/systemd-private-*/tmp
Решение проблем
Не получается открытие символьных ссылок в tmpfs от root
Предполагая, что /tmp использует tmpfs, измените текущий каталог на /tmp , а затем создайте файл и создайте символическую ссылку на этот файл в том же каталоге /tmp . При попытке прочитать файл по символической ссылке иногда может возникать ошибка «Отказано в доступе». Это ожидаемое поведение, так как /tmp имеет установленный sticky bit.
Поведение можно настроить через /proc/sys/fs/protected_symlinks или просто с помощью sysctl: sysctl -w fs.protected_symlinks=0 . Чтобы сделать изменение постоянным, смотрите sysctl (Русский)#Настройка.
Важно: Изменение этого поведения может привести к проблемам безопасности! Отключите это, только если вы знаете что делаете.
Смотрите также
Retrieved from «https://wiki.archlinux.org/index.php?title=Tmpfs_(Русский)&oldid=773008»
Помощь
Переполнение диска — частая проблема при использовании виртуальных серверов. И если многие решают её покупкой заблаговременно большого объема диска, то мы в данной статье предлагаем не покупать излишне много ресурсов, а при необходимости удалять ненужные данные с диска.
Чаще всего проблема встречается, когда диск уже переполнен.
Поэтому, вероятнее всего, в этом случае на VPS могут отключаться важные службы, возникать проблемы с загрузкой файлов и авторизацией через панель управления, тогда необходимо будет заходить на сервер по SSH или по VNC.
Просмотр занятого пространства
В первую очередь, авторизовавшись на VPS, убедитесь, что диск переполнен, с помощью команды:
Сразу обратим внимание, что помимо этой команды логично еще запустить команду df -i , для проверки переполнения файловых дескрипторов (inode). Сначала рассмотрим случай, если переполнен конкретно диск (по команде df -h ). О df -i расскажем позже.
Пример результата команды, когда диск переполнен:
Filesystem Size Used Avail Use% Mounted on
devtmpfs 909M 0 909M 0% /dev
tmpfs 919M 0 919M 0% /dev/shm
tmpfs 919M 8.5M 911M 1% /run
tmpfs 919M 0 919M 0% /sys/fs/cgroup
/dev/vda4 59G 59G 228M 100% /
/dev/vda2 1020M 434M 587M 43% /boot
tmpfs 184M 0 184M 0% /run/user/0
В этом примере и в аналогичной ситуации у вас важна строка /dev/vda4, это устройство, которое хранит в системе файлы вашего сервера. Название может быть другим, просмотрите все устройства, начинающиеся на /dev/ и столбец объёма (Size) в них, размер должен быть близок объёму вашего диска, согласно тарифу. Найдя нужную строку с файловой системой, обратите внимание на столбец Use% – если там 100, значит диск переполнен. Стоит внимательно отнестись и в случаях, когда процент использования близок к 100, например 98%.
Очистка диска
Дальнейшие действия по очистке.
Для начала важно хотя бы примерно представлять, где и какого объема файлы размещены у вас на сервере. Если, например, вы знаете, что в определённой папке валяется куча архивов неактуальных бэкапов или временных файлов, которые вы забыли удалить, то первым делом избавьтесь именно от них.
Если же ситуация иная, т.е. вы не знаете, что и где заняло такой объем диска, то можно выполнить поиск наиболее «толстых» директорий. Пример команды, которая поможет осуществить задуманное:
du -ah / —max-depth=12 —exclude=/proc | grep G | grep -v [0-9]M | grep -v [0-9]K | grep -vw 0
Команда выведет все основные и вложенные папки до заданной глубины (параметр –-max-depth ), в объеме которых будет встречаться буква G (гигабайт).
Будет выведен примерно такой список:
1.8G /usr
5.3G /root/backups
5.4G /root
1.0G /var/lib
1.0G /var/www/httpd-logs
1.8G /var/www/user1/data/www/site1.ispvds.com
2.0G /var/www/user1/data/www/site1.ispvds.com_bak
4.9G /var/www/user1/data/www
4.9G /var/www/user1/data
4.9G /var/www/user1
1.2G /var/www/user2/data/www/site2.ru/upload/iblock
1.2G /var/www/user2/data/www/site2.ru/upload/resize_cache/iblock
1.2G /var/www/user2/data/www/site2.ru/upload/resize_cache
2.9G /var/www/user2/data/www/site2.ru/upload
1.6G /var/www/user2/data/www/site2.ru/bitrix/cache/s1/bitrix
1.7G /var/www/user2/data/www/site2.ru/bitrix/cache/s1
1.8G /var/www/user2/data/www/site2.ru/bitrix/cache
2.3G /var/www/user2/data/www/site2.ru/bitrix
5.2G /var/www/user2/data/www/site2.ru
5.2G /var/www/user2/data/www
5.2G /var/www/user2/data
5.2G /var/www/user2
11G /var/www
12G /var
39G /home/bitrix/www/bitrix/testfile
39G /home/bitrix/www/bitrix
39G /home/bitrix/www
39G /home/bitrix
39G /home
20G /
Если есть хоть немного свободного места, то можно установить утилиту ncdu, которая изучает занятое пространство диска и сортирует директории по объему, позволяя удобно просматривать, какой объем какие директории занимают на сервере.
В Centos/AlmaLinux установить можно командой:
yum install ncdu
В Debian/Ubuntu можно установить командой:
apt install ncdu
После чего просто запустить выполнение анализа командой:
Какое-то время займет подсчет файлов, затем будет отображен управляемый список директорий:
Можно клавишами навигации выбрать самую объемную, нажать Enter и провалиться в поддиректорию глубже и глубже (если требуется), чтобы в конце концов увидеть источник такого большого объема директории:
Также можно поискать не директории, а просто большие файлы, командой:
find / -xdev -type f -size +500M -exec du -sh <> ‘;’ | sort -rh
/ — в данном случае означает, что мы ищем от корня файловой системы;
-type f — означает, что мы ищем только файлы;
+500M — означает размер файла (500 Мб) как стартовый для поиска. Все файлы со значением выше указанного попадут в выводимый список.
В целом, в данной методике возможен только ручной анализ получившихся выводов команд. Вам следует решить, логичен ли такой большой объём и можно ли его очистить. В примере выше (речь о команде du -ah / —max-depth=12 ) есть несколько вариантов, от которых можно «избавиться» для освобождения пространства сервера.
Частые случаи быстрого накопления данных
Можно посчитать довольно сомнительной папку с бэкапами /root/backups , как правило в эту директорию складывают временные копии, которые делаются на время работ с сервером и не расцениваются как централизованные бэкапы. Но этот момент следует дополнительно проверить, так как у каждого могут быть свои настройки. Главное, если вы знаете, что в другом месте (лучше всего — на внешнем хранилище) у вас есть актуальные резервные копии, тогда очевидно, что текущие бэкапы — дублирующие или неактуальны, поэтому их можно удалить.
Также рассмотреть на удаление можно и копию директории сайта /var/www/user1/data/www/site1.ispvds.com_bak . Вероятно, на сайт загружались какие-то изменения, и эта копия была для случая «вернуть все назад». Если сайт в порядке и работает из основной директории, то смысл в этой копии наверняка отсутствует, поэтому можно удалить и ее.
Также часто встречается, что приличный объем может занимать кэш сайта, в примере — сайт на Битриксе. Его директория /var/www/user2/data/www/site2.ru/bitrix/cache весит хоть и немного, но все же занимает определенное пространство, в случае когда по месту все «впритык», то кэш можно очистить командой:
find /var/www/user2/data/www/site2.ru/bitrix/cache/* -delete
Обратите внимание, символ “*” тут обязателен. Эту же команду можно применять (указав вместо папки кэша нужную директорию) и для удаления копий, о которых говорили выше.
Другая популярная причина — объемные логи. Когда службы сервера безостановочно пишут в лог, это может привести к резкому уменьшению свободного места на диске, порой даже быстрее, чем происходит системная ротация логов. В нашем случае некоторое место занимает директория с логами веб-сервера /var/www/httpd-logs
Важный момент, удалить её так же, как мы удаляли кэш и бэкапы, нельзя — это повлечет за собой то, что служба, работающая с этим логом, может перестать запускаться.
Чтобы выявить, какой лог какой объем занимает, воспользуемся командой:
du -sh /var/www/httpd-logs/*
Здесь также не забудьте про знак “*”.
Результат в нашем примере оказался такой:
2.0M /var/www/httpd-logs/site1.ispvds.com.access.log
128K /var/www/httpd-logs/site1.ispvds.com.error.log
223M /var/www/httpd-logs/site2.ru.access.log
765M /var/www/httpd-logs/site2.ru.error.log
24K /var/www/httpd-logs/site3.ispvds.com.access.log
4.0K /var/www/httpd-logs/site3.ispvds.com.error.log
Можно заметить, что больше всего весят логи: /var/www/httpd-logs/site2.ru.error.log и /var/www/httpd-logs/site2.ru.access.log
Удалять их нельзя, как мы отмечали ранее, поэтому только очистим содержимое с помощью команды:
cat /dev/null > /var/www/httpd-logs/site2.ru.access.log
Для этой команды в примере можно указывать любой другой лог, в том числе других служб, главное указать полный и корректный путь до лога.
Если окажется, что таких логов много, и каждый занимает весомый объем, можно «обнулить» их командой:
find /var/www/httpd-logs/ -type f -size +100M -exec truncate -s 0 <> \;
В этом случае каждый файл логов, который весит более 100 мегабайт, становится пустым.
Другой частый случай переполнения диска — забитые почтовые ящики, особенно если они были взломаны или на них отправилась куча спама. Очистить почтовые ящики можно в панели управления ISPmanager в разделе Почта — выбрать нужный почтовый ящик и нажать справа значок •••, где выбрать Перейти в почтовый клиент, чтобы выборочно удалить письма, или Очистить, если письма в этом ящике в целом не нужны.
Кстати, из-за спама довольно часто заканчиваются файловые дескрипторы, настало время затронуть и этот момент.
Просмотр количества свободных айнод в системе
Количество inode (индексных/файловых дескрипторов) в файловой системе задается при установке ОС — обычно 1 inode на каждые 2 Кбайт пространства диска по умолчанию. Для большинства систем этого количества достаточно, но бывают и исключения.
Если индексные дескрипторы исчерпались, создание любого нового файла в системе, даже служебного, становится невозможным. Из-за этого вся система или любая её служба могут работать некорректно. В начале статьи мы упоминали, что исчерпание файловых дескрипторов можно посмотреть с помощью команды:
Вывод команды будет примерно таким:
Filesystem Inodes IUsed IFree IUse% Mounted on
devtmpfs 232644 346 232298 1% /dev
tmpfs 235248 1 235247 1% /dev/shm
tmpfs 235248 442 234806 1% /run
tmpfs 235248 16 235232 1% /sys/fs/cgroup
/dev/vda4 523304 523087 217 100% /
/dev/vda2 523776 351 523425 1% /boot
tmpfs 235248 1 235247 1% /run/user/0
Как и в случае с df -h , здесь нужна строка с dev-устройством файловой системы. В примере выше — это /dev/vda4 и процент использования inode 100%. Несмотря на то, что в столбце IFree (кол-во свободных айнод) значение 159, для корректной работы ОС этого уже мало и создать новые она не даст.
Освобождение файловых дескрипторов
Что привело к этой проблеме? Где-то на VPS было создано или размещено большое количество файлов, суммарно приведшее к пределу возможных файлов в системе, т.е. перефразируя, у ОС есть максимальное значение количества файлов, и этот значение было почти достигнуто.
Поэтому необходимо найти источник размещения этих файлов. Сделаем это с помощью команды:
find / -type d -size +4096 -exec sh -c » ls -d <> && ls <> | wc -l» \;
В нашем примере вывод команды получился такой:
/var/www/user1/data/mod-tmp 481034 /var/spool/exim/input 99792 /var/www/user2/data/www/site2.ru/bitrix/cache 5485
Сначала выводится строка, в которой подсчитывалось количество файлов, в следующей строке — их количество в этой директории.
Частые случаи заполнения файловых дескрипторов (айнод)
Достаточно распространенный случай — большое количество файлов в каталоге хранения сессий. В примере это директория /var/www/user1/data/mod-tmp .Очистить ее можно командой:
find /var/www/user1/data/mod-tmp -type f -delete
Обратите внимание, что удаление займет время, чем больше файлов — тем дольше, так как операции с большим количеством мелких файлов всегда выполняются медленнее.
Если такое случилось, то недостаточно просто почистить каталог сессий PHP. Для удаления этих файлов у PHP есть garbage collector , он работает по схеме, заданной переменными в настройках PHP.
Для всех файлов сессий, которые были созданы больше, чем « session.gc_maxlifetime » секунд назад (обычно это — 1440 секунд, 24 минуты) есть вероятность, что файл будет удален. Вероятность равна « session.gc_probability », разделенная на « session.gc_divisor ».
Делитель обычно задается 1000, а вот параметр session.gc_probability — основная переменная, отвечающая за вероятность срабатывания. Она может быть выставлена в 0, тогда PHP не очищает старые сессии. Следовательно, файлы сессий очень быстро накопятся в каталоге вплоть до нескольких миллионов файлов. Выставите параметр в 1, сессии начнут очищаться.
Затронем снова почту, теперь случай, когда в почтовой очереди скопилось много писем. Каждое письмо создает в системе несколько файлов, соответственно, количество писем пропорционально увеличивает количество созданных файлов.
Однако, если проблема с исчерпанием индексных дескрипторов стоит не остро, имеет смысл не очищать почтовую очередь, а изучить заголовки писем, чтобы выявить источник накопления этой очереди. В ином случае, очищаем ее аналогично сессиям PHP:
find /var/spool/exim/input -type f -delete
Аналогично поступаем и с кэшем, выше мы его удаляли для освобождения места, но в случае освобождения дескрипторов нам нужно удалить кэш, потому что он состоит из множества мелких файлов:
find /var/www/user2/data/www/site2.ru/bitrix/cache -type f -delete
(хотя в нашем примере файлов выявлено немного, можно и не удалять).
В данной инструкции мы постарались описать ситуацию с переполнением диска и механику решения этой проблемы, указали наиболее частые случаи. Конечно, описать все варианты не представляется возможным. Если в инструкции вы не нашли ваш случай, вы всегда можете обратиться в поддержку за помощью, поможем разобраться.
Как происходит очищение папки tmp?
Хочу тут в tmp налить своих временных файлов, но никак не найду полноценной инфы о том как чистится эта папка. Есть дистры на базе debian и centos всякие. Везде при перезагрузке очищается tmp? Есть ли очистка по времени? Файлы при очистке по времени, если она есть, стираются только закрытые или даже те, что сейчас кем то используются?
i3draven ★★
25.08.22 13:15:56 MSK
/tmp в tmpfs обычно. При перезагрузке все чисто. Чистить по времени плохая идея, т.к. в общем случае неизвестно, какие файлы там нужны и работают, а какие уже мусор.
Anoxemian ★★★★★
( 25.08.22 13:34:13 MSK )
Хочу тут в tmp налить своих временных файлов
твои файлы, сам налил — сам чисти.
Minona ★★☆
( 25.08.22 14:16:41 MSK )
Ответ на: комментарий от Anoxemian 25.08.22 13:34:13 MSK
Я вроде бы видел где то упоминания, что в некоторых дистрах они удаляются и по времени. Но очень старые упоминания. Удалять по времени я собираюсь свои собственные файлы, так как сервак перегружается раз в год,а про то когда я это могу сделать я знаю. Меня беспокоит, что ОС снесет мои файлы по времени когда мне это не надо.
i3draven ★★
( 25.08.22 17:00:04 MSK ) автор топика
Последнее исправление: i3draven 25.08.22 17:00:26 MSK (всего исправлений: 1)
В systemd есть таймер для этих целей: systemd-tmpfiles-clean.timer .
How to clean /tmp?
will delete all files and folders older than 10 days. you may want to add it to the daily cron.
UPDATE
In comments below @sfussenegger recommends a slightly different format of this command that may be better suited to your needs and to the system you’re operating on.
sudo find /tmp -type f -atime +10 -delete
Here the command is using sudo to make sure everything is deleted (or you could run it as root), operating on files that haven’t been accessed for more than 10 days and only deletes files, not folders. It also uses -delete to avoid having to execute rm command
answered Apr 14, 2015 at 23:29
2,251 1 1 gold badge 10 10 silver badges 5 5 bronze badges
instead of creation time (-ctime) you may want to use access time (-atime) instead — of course only if the filesystem keeps this information (check for noatime in /etc/fstab)
Aug 2, 2017 at 7:30
ok, please bear with me but there’s one more thing: you want to search files only ( -type f ). otherwise you may find that the parent of a directory tree hasn’t been accessed in a while and delete all its content that could potentially still be in use. so the final command I’d recommend is sudo find /tmp -type f -atime +10 -delete
Aug 2, 2017 at 7:41
@sfussenegger, perhaps your could promote your comments to an answer? I think it is better than being «hidden» in the comments.
Aug 17, 2017 at 12:14
sudo find /tmp -type f,s -atime +10 -delete could be useful to also delete socket files.
Aug 12, 2021 at 11:13
You can assume that anything inside a tmp directory (/tmp/ /usr/tmp etc) can be deleted. BEFORE you start deleting stop all programs and services you are using since /tmp/ can be used by programs to temporarily store information for that session. So do a sudo service mysql stop and sudo service apache2 stop if you have a mysql and/or apache running. The name of the files in the /tmp/ directory most times give a clue to what program they belong.
So from command line.
cd /tmp/ pwd sudo rm -r *
will empty the /tmp/ directory and remove all files and subdirectories. Be careful to type it correctly. The command pwd in there is not necessary but should show /tmp .
If you want it interactively (so you need to confirm deleting):
cd /tmp/ sudo rm -ri *
Also worth noting that a reboot will clear /tmp aswell as shown here: How is the /tmp directory cleaned up? So if /tmp/ is full of files after a reboot you need to investigate where those files originate from.