@fokin_nikolay1989

Как написать bash мониторинг файловой системы EXT4?

Доброго времени суток!
подскажите, как написать мониторинг файловой системы ext4 в части достижения лимита в 16Tb одного/нескольких файлов?
Подумал использовать find… но так как это будет регулярный поиск, то считаю не практично. Может можете подсказать как в bash можно написать?
  • Вопрос задан
  • 254 просмотра
Пригласить эксперта
Ответы на вопрос 7
@rPman
утилита inotify, первый же запрос в гугл выдал
Ответ написан
Alex_Geer
@Alex_Geer
System Engineer
Можно использовать более подходящую команду du
https://losst.pro/komanda-du-v-linux
Ответ написан
Комментировать
@pfg21
ex-турист
если нужны быстро параметры файловой системы то
df --output=used /dev/sda3
если необходимо вручную почистить место в директории, то
ncdu -x /home
Ответ написан
Комментировать
CityCat4
@CityCat4
//COPY01 EXEC PGM=IEBGENER
Если втупую - парсинг вывода ls :), потом sleep и так до бесконечности. Когда триггер сработал - там оповещение, буде надо.
Ответ написан
saboteur_kiev
@saboteur_kiev Куратор тега Linux
software engineer
16 tb это довольно большой размер. Не так часто файлы его достигают.
Я бы разбил мониторинг на две части.

Первая часть - find всех файлов которые больше 10 tb, например, и занесение их в базу. Раз в сутки, например.
Вторая - stat по файлам из базы, выбрать частоту, которая устраивает.

Базой может быть банально текстовый csv файл с timestamp, absolute path, size с каким-то разделителем.
Или, например, influxdb с графаной.. на выбор

Короче главная идея - разделить поиск в принципе больших файлов и более детальный и частый мониторинг когда они пересекут нужный размер.
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Подобоный bash мониторинг может создавать ненужную нагрузку (например если ты ишешь через find)
а файлов очень много. Они мелкие и т.п. Вобщем если искать часто (каждые 5 минут - то это будет ненужная
нагрузка). А если искать редко - то какая польза в таком мониторинге?

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

Есть у меня мысль - поднять информацию не из файлового API (find/du/ncdu) а из таблиц inode.
Там как раз есть информация о размере. Оптимистично - это более быстрый метод. По крайней
мере факт превышения квоты будет виден. А вот кем - надо искать.

Еще есть мысль что контроль квот - это технология уходящего века. В мире современных файловых
систем никто давно уже не учитывает файлы. Создается толстое хранилище на базе zfs например.
Оно нарезается пользователям на кусочки по 16/32/64 Gb и отдаются в пользование. По ним-же
идет тарификация. Если пользователь захочет больше - на ходу ему растягивается кусочек до нужного
ему размера. Тариф соотв другой.
Ответ написан
Комментировать
3vi1_0n3
@3vi1_0n3
Тут уже много интересного написали. Штука только в том, что в вопросе недостаточно информации, что не позволяет эту задачу решить эффективно. Есть вопросы, на которые надо ответить, прежде чем приступать:

1. Где хранятся эти файлы, которые могут потенциально вырасти до таких размеров и сколько их?
Если они хранятся в одной директории, тогда смысла делать поиск по всей системе нет. На моем десктопе с 500К файлов поиск занимает примерно 9.5 секунд с полным сканированием дерева файловой системы. Если файлов потенциально пара сотен, и они все в одной директории или в поддереве директорий, время поиска можно сильно сократить. Я подозреваю, что find читает информацию о размере из inode'ов, поэтому количество файлов играет значительную роль.

2. Что это за файлы, надо ли их на самом деле мониторить?
Если это логи, к примеру, есть много способов этого не делать (ротация логов, централизованное хранение), если это образы дисков для виртуальных машин (LVM, или еще что), то find может быть не совсем верное решение, могут быть другие инструменты (получение данных из гипервизора, и так далее)

3. Можно ли сделать линки на директории, в которых хранятся файлы, в одну директорию и сканировать её вместо всей файловой системы?
Логично, что, если файлы хранятся где попало и их надо искать по всей системе, поиск будет занимать больше времени.

Про inotify там выше уже дали ссылку на мою статью 2016 года. Это на самом деле самый лучший вариант, если надо сразу знать об изменениях файлов, и самый удобный. Вот только он может вполне быть "из пушки по воробьям", если вам не надо прямо сразу узнавать о событиях файловой системы и обрабатывать их, а достаточно периодических проверок (с учетом вопросов выше).

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

Учитывая, что вы хотите это сделать через bash, я бы сначала посчитал, сколько подобных событий (увеличение размера файлов до 16+Тб) происходит и попробовал оптимизировать поиск таких файлов за счет отсекания ненужного поиска (специфическая директория, фильтрация по типу файлов, имени и прочее).

Если файлы имеют какую-то одинаковую часть имени, можно использовать locate (вместо find) для получения списка файлов, и потом передавайте его в скрипт, который тупо проверит размер каждого (через stat, например). В этом случае надо при появлении новых файлов не забывать вызвать updatedb, если это не происходит автоматически по какой-то причине.

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

P.S. updatedb делает то же самое примерно, что и find, поэтому не надо его вызывать каждый раз перед использованием locate
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы