Файловая система
Что это такое
Linux представляет одно дерево каталогов, а устройства хранения присоединяются к местам в этом дереве, а не занимают собственные буквы. У файла есть inode, который его описывает, и имя, указывающее на этот inode, — поэтому два имени могут ссылаться на один файл и поэтому удаление открытого файла не освобождает его место. Понимание дерева и его монтирований и делает вопрос «куда делось место на диске» вопросом с ответом.
Почему это важно
Заполненный диск — один из самых частых отказов хоста и самый не загадочный, когда знаешь, где искать. Логи растут, образы контейнеров накапливаются, удалённые файлы остаются открытыми, временные файлы никогда не чистятся. Поскольку дерево устроено по назначению — конфигурация в одном месте, изменяемые данные в другом, логи в третьем, — это устройство само говорит, что можно удалить без потери чего-либо и что нужно сохранить. Оно же решает, что должно входить в резервную копию.
Ключевые идеи
Дерево — это соглашение о том, что меняется, а что нет
Системные программы и библиотеки отделены от конфигурации, которая отделена от изменяемых данных, таких как базы данных и логи, которые отделены от временных файлов. Соглашение существует, чтобы машину можно было заменить или обновить, не уничтожив данные: переустановить первые две, сохранить третью.
программы -> заменяются при обновлении
конфигурация -> правится осознанно, обычно сохраняется
изменяемые данные (базы данных, логи, загрузки) -> нужно резервировать
временные -> можно удалить, хотя открытый файл не освобождается
Точка монтирования — это решение о хранении
Присоединить устройство по пути означает, что всё ниже этого пути живёт на этом устройстве. Размещение изменяемых данных на собственном томе позволяет им расти, не заполняя корень, и позволяет изменять размер тома или снимать его снимки независимо. Поэтому полезный взгляд на хост — это список его монтирований и того, насколько полно каждое, а не одно число свободного места.
inode расходуются так же, как байты
Каждый файл расходует inode, поэтому файловая система может быть заполнена, показывая свободное место, — обычная причина в каталоге с миллионами крошечных файлов. То же рассуждение объясняет, почему удаление каталога со множеством файлов медленно: каждый нужно развязать.
Удаление файла не освобождает место, пока он открыт
Процесс, удерживающий удалённый файл, сохраняет его блоки занятыми, пока не закроет его или не завершится. Поэтому файл журнала можно удалить, а диск останется полным, и поэтому ответ обычно — обрезать файл или перезапустить процесс, а не искать пропавший файл.
rm big.log -> имя пропало, inode всё ещё удерживается процессом журнала
truncate big.log -> размер становится нулём, место возвращается
Ссылки делают слой имён явным
Символическая ссылка — это имя, указывающее на другое имя; жёсткая ссылка — второе имя для того же inode. Обе существуют, чтобы не дублировать данные или соглашения о путях, и обе сбивают с толку листинг каталога, показывающий файл вроде бы в двух местах. Чтение ссылок как имён, а не содержимого, проясняет большую часть.
Права на каталоги решают достижимость
Режим файла неважен, если путь каталога к нему не проходим процессом. Поэтому файл с правильными правами в закрытом каталоге защищён каталогом, и поэтому ослабление режима каталога ради одной проблемы с доступом может открыть всё под ним.
Практика
Найдите, что заполнило файловую систему
Заполните или найдите файловую систему, заполненную более чем на девяносто процентов, и определите, занято ли место файлами, inode или удалённым файлом, всё ещё удерживаемым открытым.
Готово, когда: вы можете назвать крупнейшего потребителя и команду, которая это доказала, и вы не удалили ничего, чьего назначения не могли объяснить.
Вынесите изменяемые данные на собственное монтирование
Опишите, как вы перенесли бы растущий каталог данных на собственный том, не потеряв данные и не изменив пути, которые использует приложение.
Готово, когда: таблица монтирований показывает каталог на собственном томе, а приложению не потребовалось менять конфигурацию.
Частые ошибки
- Удаление большого открытого файла с ожиданием возврата места — процесс всё ещё удерживает блоки; исправить: обрежьте файл или перезапустите процесс.
- Чтение одной цифры свободного места для хоста — каждое монтирование заполняется независимо; исправить: проверяйте по монтированию и следите за растущими.
- Игнорирование исчерпания inode — свободное место остаётся, а файл создать нельзя; исправить: проверяйте счётчики inode на файловых системах со множеством мелких файлов.
- Ослабление режима каталога ради одной ошибки доступа — всё под ним становится достижимым; исправить: дайте доступ к конкретному файлу или группе.
- Хранение изменяемых данных на том же томе, что и система — рост угрожает всему хосту; исправить: дайте данным собственное монтирование и резервируйте их там.
Что читать дальше
- Процессы и службы (06-cloud-devops/09-linux-administration/02-processes-and-services) — процессы, удерживающие удалённые файлы открытыми и пишущие растущие логи.
- Администрирование Linux (06-cloud-devops/09-linux-administration) — хост, чьё хранение описывает этот дочерний урок.
- Логи и диагностика (06-cloud-devops/09-linux-administration/04-logs-and-troubleshooting) — где на самом деле записаны улики о заполненном диске или отказе прав.