Диск занят на 100% и не понятно чем, df и du показывают разные значения

Столкнулся сегодня с нестандартной ситуацией, когда на сервере исчезало место на диске, а я не мог понять кто его занимает. Хотя ситуация не такая уж нестандартная, но из-за ряда случайностей, она получилась в какой-то мере курьезной. Я по сути на ерундовую ошибку потратил много времени.

Онлайн-курс по устройству компьютерных сетей

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Началось все с того, что один из разработчиков написал мне, что на сервере кончается место и он не понимает, кто его занимает. У меня не было времени подробно разбираться, я просто добавил на сервер места. Для справки, расскажу как это сделать, полезная информация.

В данном случае сервер это виртуальная машина, у нее один диск и один корневой раздел, на котором все расположено. На диске ext4 поверх lvm. Задача увеличить свободное место в корневом разделе без перезагрузки сервера. С lvm все очень просто. Добавляем к виртуальной машине диск нужного размера и выполняем в консоли:

# vgextend vg00 /dev/sdb
# lvextend -r -l +100%FREE /dev/vg00/root

Иногда конструкция -l +100%FREE не срабатывает при увеличении раздела, хотя при создании все в порядке. Тогда можно указать добавляемый размер явно:

# lvextend -r -L+10G /dev/vg00/root

В моем примере есть системный диск sda, на котором расположен том vg00, а на нем логический раздел root. Мы расширяем том vg00 с помощью нового диска sdb, а затем расширяем логический раздел root до 100% свободного места тома.

После этого системный раздел будет увеличен сразу, перезагрузка не требуется. Можно не добавлять отдельный диск, а увеличить существующий через свойства диска в панели гипервизора. Тогда вам нужно будет на новом свободном месте на диске sda сделать новый раздел, например, sda2 и расширить том с его помощью. Как делать лучше, увеличивать диск или добавлять новый - не знаю, я и так, и так делаю. Тем не менее, считаю это плохой практикой, лучше сразу спланировать раздел диска и потом уже его не трогать. Данный способ это крайний случай, когда по-другому уже никак.

Проблема вроде как решена. Через пару дней ко мне обращается этот же разработчик и говорит, что места опять нет и он не понимает, кто его занимает. Тут я уже внимательно посмотрел на сервер. Посмотрел размер всех папок с помощью нехитрой конструкции, запущенной в консоли с корня диска:

# du -s *|sort -nr|cut -f 2-|while read a;do du -hs $a;done

Получим сразу в консоли размер всех директорий. У меня получилось так, что если сложить объем всех директорий, то получится занятыми где-то 6 Гб диска. А если выполнить команду

# df -h

То видно, что корень занят на 100%, а его размер равен 20-ти Гб. Кто занял остальные 14 гигабайт места было не понятно.

Стал рассуждать, как такое может быть. Ситуация не такая уж и редкая, раньше встречался с этим. Суть в том, что удален какой-то большой файл, который до сих пор открыт приложением. Но смысл в том, что на этом сервере такого файла никогда не было. Разработчик сказал, что ничего особенного последнее время на сервере не делал.

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

Переходим к конкретике. Когда у вас сложилась ситуация, что не понятно, куда делось свободное место, которое ничем не занято, первым делом проверьте удаленные файлы, которые все еще открыты каким-то приложением:

# lsof | grep '(deleted)'

Предпоследний столбец это размер файла. На самом деле, эту команду я сразу же выполнил на сервере, но невнимательно посмотрел. В выводе команды была всякая мелочь и пару логов nginx в самом начале. Я не посмотрел внимательно на размер этих логов, так как никак не думал, что они могут быть огромными.

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

Смысл в том, что nginx несколько дней писал в удаленный файл, который занимал место на диске. Если бы разработчик не трогал этот лог, то он бы ротировался раз в сутки и проблемы бы не было. А так он из системы был удален, но реально постоянно рос, его не было видно и он не обрабатывался с помощью logrotate.

В итоге через пару часов, когда я уже готовил подменный сервер, еще раз внимательно все проверил и обратил внимание на удаленные логи и место, которое они занимают. Вопрос решился простым перезапуском службы nginx. Он тут же отцепил свой лог файл и начал писать в новый. А старый реально удалился из системы и освободил место.

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

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

Углубленный онлайн-курс по MikroTik.

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

19 комментариев

  1. Андрей

    Каким образом можно на лету увеличить корень /

    fdisk -l

    Disk /dev/sda: 536.9 GB, 536870912000 bytes, 1048576000 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: dos
    Disk identifier: 0x0004a1db

    Device Boot Start End Blocks Id System
    /dev/sda1 * 2048 2099199 1048576 83 Linux
    /dev/sda2 2099200 44042239 20971520 83 Linux
    /dev/sda3 44042240 1048575999 502266880 8e Linux LVM

    Disk /dev/mapper/centos-swap: 3217 MB, 3217031168 bytes, 6283264 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes

    Disk /dev/mapper/centos-home: 511.1 GB, 511101108224 bytes, 998244352 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes

    __________________________________________________________________________

    df -h
    Filesystem Size Used Avail Use% Mounted on
    devtmpfs 3.8G 0 3.8G 0% /dev
    tmpfs 3.8G 0 3.8G 0% /dev/shm
    tmpfs 3.8G 8.9M 3.8G 1% /run
    tmpfs 3.8G 0 3.8G 0% /sys/fs/cgroup
    /dev/sda2 20G 20G 20K 100% /
    /dev/sda1 1014M 143M 872M 15% /boot
    /dev/mapper/centos-home 476G 356G 121G 75% /home
    tmpfs 764M 0 764M 0% /run/user/0

    _________________________________________________________________

    lsblk
    NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
    fd0 2:0 1 4K 0 disk
    sda 8:0 0 500G 0 disk
    ├─sda1 8:1 0 1G 0 part /boot
    ├─sda2 8:2 0 20G 0 part /
    └─sda3 8:3 0 479G 0 part
    ├─centos-swap 253:0 0 3G 0 lvm [SWAP]
    └─centos-home 253:1 0 476G 0 lvm /home
    sr0 11:0 1 1024M 0 rom

    • Здесь его никак не увеличить, так как он сделан в виде обычного раздела, зажатого между двух других разделов. Всё это без риска потери информации не подвинуть. Вообще, странная идея так разбить диск. Сделать корень обычным разделом, а /home в виде lvm. Лучше бы наоборот.

  2. Максим

    Доброго дня.
    Увеличил /dev/mapper/root, теперь /dev/mapper/v1--84--vg-root 795G 783G 0 100% / . Не могли бы подсказать как исправить?

    • Так заметка же как раз об этом. Причин занятого на 100% места может быть несколько. В статье один из вариантов расследования этой истории.

  3. А мне эта история напомнила старый анекдот про 1 доллар за простукивание и 999 долларов за то, что знаешь, где простукивать. Может не точная формулировка, но идея такая)

    • Не знаю такой анекдот.

      • Одна американская фирма купила дорогое японское оборудование по производству ( чего-то ). Его установили, настроили и оно начало бесперерывно работать, принося солидную прибыль. Дела у фирмы пошли резко в гору и всё было хорошо. Но однажды станок сломался и остановился. Все попытки отремонтировать его были безуспешны.
        Тогда директор фирмы объявил, что тот, кто запустит станок получит 1000 долларов за это.
        Много лучших умов и рук трудились, но у них ничего не выходило.
        И тут пришёл простой слесарь из цеха, походил, посмотрел, взял кувалду и ударил ей станок. Всё заработало как раньше.

        Вызвал рабочего довольный директор к себе и сказал, чтобы тот написал отчёт о выполненной работе для получения обещенной премии. Рабочий написал: 1 доллар за то, что ударил кувалдой и 999 долларов за то, что знал куда бить.

        • Нам ттакой же анекдот расказывали преподаватели в техникуме, но только про телемастера который брал 1 долл за деталь а 99 за то что знал что именно нужно поменять. Суть этих анекдотов в одном - знание сила.

  4. Руслан

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

    # vgextend vg00 /dev/sdb

    как тебе это удалось сделать интересно, увеличить корневой раздел без его размонитирования ???

    У тебя по идее должна была вылезти ошибка из серии exclusively. Mounted filesystem?

    • Так и удалось. LVM позволяет на ходу увеличивать размер тома и расширять файловую систему (даже корень / ) без остановки и перезагрузки. Если не веришь - просто проверь. Я постоянно использую эту возможность.

  5. А у меня в FreeBsd на команду : lsof | grep '(deleted)' вот что пишет:
    lsof: WARNING: compiled for FreeBSD release 11.1-RELEASE-p10; this is 11.2-RELEASE.
    lsof: WARNING: /root/.lsof_A9t was updated.

    Что делать как посмотреть?

    • Так в ошибке все написано. У вас бинарник lsof скомпилирован под версию 11.1, а у вас стоит 11.2 Надо обновить, как я понимаю, lsof. Если это возможно, конечно. Я уже давно не работают с freebsd и отвык от нее.

  6. Не слабую раскрутил головоломку. Поздравляю.

  7. Можно еще так (топ-10):
    du . --max-depth=1 -ah | sort -rh | head -10

  8. Аноним

    Утилиткой ncdu можно размер каталогов посмотреть.

  9. Аноним

    Стоило упомянуть правильный способ ручной очистки логов, вроде cat /dev/null > ./file.log

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar