LINUX.ORG.RU

сбор общей схемы использования хранилищ на freebsd

 , ,


1

1

Время от времени хотелось чтоб был некий дамп схемы использования физических накопителей разными файловыми системами, чтобы не лазить отдельно по camcontrol devlist, gmirror/gmultipath/gpart, спискам монтирования и иногда sysctl. И чтобы этот дамп был пригоден для обычного diff между «было» и «теперь». Написал в итоге такую прогу, может кому пригодится или кто даст совет как поудобнее сделать её вывод чтобы было нагляднее кто за что отвечает. (только не так как geom -t который дублирует на каждого члена mirror/multipath всю вышележащую топологию)

исходник

Компилировать с -lgeom -lfcl

update 2023-12-05

как скомпилировать с нуля с черновой поддержкой zfs:

cd /tmp/
fetch https://dev.m1089.ru/fcl/files/fcl-20231205.tar.gz
tar xf fcl-20231205.tar.gz
cd fcl-20231205/DEV/src
./build.sh fcl
fetch https://dev.m1089.ru/freebsd-misc/files/storage-summary/storage-summary.c
cc storage-summary.c -DWITH_LIBZFS -DLIBZFS_HACK -I../include -L../lib -lgeom -lfcl -lzfs -lnvpair -o storage-summary

★★★★★

Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Несколько моментов:

Сбилдил, при выполнении ./storage-summary говорит:

storage-summary: [cam-devlist] open(/dev/xpt0) error 13 (Permission denied)
Может лучше сразу проверить имеет ли юзер права доступ к нужным устройствам нежели сразу пытаться скакать по ним?

Выдало ошибку:

storage-summary: [geom-cam] lowest-level geom-dev bad name "zvol/zroot/win10byhve"
Чем ему ZVOL не понравился?

Хорошо бы внутри архива fcl-20231130.tar.gz папку называть не DEV, а fcl-20231130. А то распаковал и потом ищи по папке исходников какой оно версии.

Процесс билда, чтоб другим не вникать:

$ cd /tmp/
$ fetch https://dev.m1089.ru/fcl/files/fcl-20231130.tar.gz
$ tar xf fcl-20231130.tar.gz
$ cd DEV/src
$ ./build.sh fcl
$ fetch https://dev.m1089.ru/freebsd-misc/files/storage-summary/storage-summary.c
$ cc storage-summary.c -I/tmp/DEV/src -L /tmp/DEV/lib/ -lgeom -lfcl -o storage-summary
$ doas ./storage-summary

iron ★★★★★
()

кто даст совет как поудобнее сделать её вывод чтобы было нагляднее кто за что отвечает

Как минимум, вывод в виде таблички с описанием полей (по дефолту) для наглядности. То, что есть сейчас пускай выводится с флагом --raw и так же в других форматах, таких как csv, json, чтоб можно было скармливать всяким заббиксам и прочей нечести.

iron ★★★★★
()
Ответ на: комментарий от iron

Может лучше сразу проверить имеет ли юзер права доступ к нужным устройствам нежели сразу пытаться скакать по ним?

Не знаю, не знаю. Вот camcontrol примерно так же себя ведёт (пишет xpt0 Permission denied). Устройств кроме xpt0 ему не нужно, всё остальное в sysctl и statfs(). Теоретически можно и без xpt0 что-то выдать, но там не будет инфы о нижнем железном уровне хранилищ, только geom и монтирования. А если в jail-е - то и их почти не будет.

Чем ему ZVOL не понравился?

Он считает что устройство самого низкого уровня в geom это название драйвера + номер юнита (но вообще это просто варнинг и на дальнейшую работу не влияет). У zfs по-другому. Не тестил на zfs. По-хорошему надо не только его тома поддерживать но и структуру самого zfs тоже дампить, подозреваю там отдельная история будет со сбором данных из его api. Посмотрю этот момент, его конечно стоит поддерживать.

Хорошо бы внутри архива fcl-20231130.tar.gz папку называть не DEV, а fcl-20231130

Возможно.

-I/tmp/DEV/src

там DEV/include есть

firkax ★★★★★
() автор топика
Последнее исправление: firkax (всего исправлений: 3)
Ответ на: комментарий от firkax

сейчас вывод покрасивее

Чет не заметно:

# ./storage-summary 
*********************************************************
>> GEOM:DISK[vtbd0] >> vtbd0 
vtbd0p1 >> GEOM:LABEL[vtbd0p1] >> gptid/332ed257-007e-11e7-83eb-589cfc05fab9 
vtbd0 >> GEOM:PART[vtbd0] >> vtbd0p1 vtbd0p2(/) vtbd0p3(SWAP)
# ./storage-summary -L -q -q -s
*********************************************************
>> GEOM:DISK[vtbd0] >> vtbd0 
vtbd0 >> GEOM:PART[vtbd0] >> vtbd0p1 vtbd0p2(/) vtbd0p3(SWAP)
Звезды я бы убрал, если это raw вывод для парсинга скриптами.

iron ★★★★★
()

Вот как-то так было бы гуд:

-------------------------------------------------------------------------------------
| Col                | Col 2            |  Col 3    | Col 4       | Col 5           |
-------------------------------------------------------------------------------------
| GEOM:DISK[vtbd0]   | vtbd             |           |             |                 |                                          
| vtbd0              | GEOM:PART[vtbd0] | vtbd0p1   | vtbd0p2(/)  | vtbd0p3(SWAP)   |   
-------------------------------------------------------------------------------------

iron ★★★★★
()
Ответ на: комментарий от iron

Обновил прогу - но надо и новое fcl скачать (20231205).

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

Добавил ключи

--raw (текстовый вид, иначе таблицы)

--nodec (убрать звёздочки из текстового вида или рамки из таблиц)

Поразбирался с zfs, убрал лишний варнинг и добавил в таблицу маркеры использования geom-раздела zfs vdev-ом.

Касательно нормальной поддержки zfs: там всё печально, консольные утилиты используют некую libzfs, к которой хедеры имеются только в /usr/src и она типа нестабильная и закрытая от обычных прог. Рекомендуют вместо неё libzfs_core, но в ней нет нужного функционала + её тоже без /usr/src кажется не получится использовать.

Добавил вместо всего этого грязный хак - копипаст нужных объявлений из libzfs.h и других его хедеров, объявлений мало и они между freebsd 12 и freebsd 14 полностью совпадают (несмотря на замену solaris zfs -> openzfs), надо надеяться что и дальше их не сломают т.к. причин к этому не видно. Ну, а если сломают, то на каком-нить freebsd 15 или 16 прогу придётся патчить.

Чтобы скомпилировать с хак-поддержкой libzfs нужны опции -DWITH_LIBZFS -DLIBZFS_HACK -lzfs -lnvpair, пока что сделал там вывод в ту же таблицу конфигов zfs пулов (то что zpool list -v выдаёт только без чисел и в одну строчку на пул). Потом доделаю и нормальный вывод смонтированных zfs и zvol.

для компиляции получается так:

cd /tmp/
fetch https://dev.m1089.ru/fcl/files/fcl-20231205.tar.gz
tar xf fcl-20231205.tar.gz
cd fcl-20231205/DEV/src
./build.sh fcl
fetch https://dev.m1089.ru/freebsd-misc/files/storage-summary/storage-summary.c
cc storage-summary.c -DWITH_LIBZFS -DLIBZFS_HACK -I../include -L../lib -lgeom -lfcl -lzfs -lnvpair -o storage-summary
На 12 и 14 у меня работает.

firkax ★★★★★
() автор топика
Последнее исправление: firkax (всего исправлений: 4)
Ответ на: комментарий от firkax

Добавил ключи

Хорошо бы еще --json и --csv...

Если делать по одной колонке на раздел как у тебя - то при большом их количестве получается нечитаемая каша.

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

Касательно нормальной поддержки zfs

ИМХО, самый универсальный вариант — парсить вывод консольных zfs и zpool ибо в исходниках будет вечно «разброд и шатание».

А, ну и предупреждения про права добавил и при недоступности xpt0 убрал выход.

Под юзером:

storage-summary: [cam-devlist] open(/dev/xpt0) error 13 (Permission denied)
storage-summary: WARNING: CAM layer data is not accessible and so will be skipped (possible reasons: non-root or jailed user)
storage-summary: [geom-cam] lowest-level geom-dev "ada0" not found in cam device list
storage-summary: [geom-cam] lowest-level geom-dev "ada1" not found in cam device list
storage-summary: [geom-cam] lowest-level geom-dev "ada2" not found in cam device list
storage-summary: [geom-cam] lowest-level geom-dev bad name "zvol/zroot/win10byhve"
Под рутом:
storage-summary: [geom-cam] lowest-level geom-dev bad name "zvol/zroot/win10byhve"

iron ★★★★★
()
Ответ на: комментарий от iron

Обновил .c файл.

Хорошо бы еще --json и --csv...

json да надо бы, а вот csv не очень понятно как делать учитывая что у него нет нормальной спецификации касательно экранирования символов, а в путях хотя бы точек монтирования может быть что угодно включая переводы строк

Может лучше по дефолту или с отдельной опцией выводить структуру в виде дерева?

Из этого получается куча дублирования если mirror/multipath т.к. они в обе стороны разветвляются. geom -t как раз так делает. Ну и в diff-ах будет ужас. По-моему нормально только диаграммы с прямоугольниками и стрелками если рисовать это получится.

ИМХО, самый универсальный вариант — парсить вывод консольных zfs и zpool ибо в исходниках будет вечно «разброд и шатание».

Я в начале и camcontrol парсить хотел, но всё-таки без этого как-то лучше. А под другой мажорный релиз можно и доработать будет.

lowest-level geom-dev bad name

А, теперь точно убрал. И лишние варнинги про CAM (кроме самого кода ошибки и рекомендации запустить от рута).

Кстати я раньше не знал что всё geom-дерево оказывается доступно всем подряд, включая non-root юзеров в jail-ах. Может быть это следует считать утечкой информации.

firkax ★★★★★
() автор топика
Последнее исправление: firkax (всего исправлений: 4)

Доделал вывод zfs пулов, файловых систем, томов и снапшотов (с ключом --zsnaps). Добавил ещё два табличных вывода --table2 и --table3 - с более короткой правой колонкой.

firkax ★★★★★
() автор топика
Ответ на: комментарий от firkax

учитывая что у него нет нормальной спецификации касательно экранирования символов

А нафига их экранировать? Достаточно весь текст элемента заключать в двойные кавычки. Читающий эти данные будет понимать, что нужно читать все что внутри не взирая на любые спец-символы. В названиях дисков же не будет быть символа двойных кавычек.

Кстати я раньше не знал что всё geom-дерево оказывается доступно всем подряд

Так jail и не имеет цели полной изоляции. Для этого есть виртуалки. Но в прочем, да, возможно это и утечка, хоть и весьма сомнительно.

Вот выполдения в jail-е под рутом:

storage-summary: [jail] WARNING: running in a jail, a lot of information may be unavailable
storage-summary: [cam-devlist] open(/dev/xpt0) error 2 (No such file or directory)
storage-summary: WARNING: CAM layer data is not accessible and so will be skipped (possible reasons: non-root or jailed user)
 List of logical device nodes:
 Origin  | Type       | Targets
-------------------------------------------------------------------
         | GEOM:DISK  | vtbd0
 vtbd0p1 | GEOM:LABEL | gptid/332ed257-007e-11e7-83eb-589cfc05fab9
 vtbd0   | GEOM:PART  | vtbd0p1 vtbd0p2(/) vtbd0p3(SWAP)
И снова этот мерзопакостный xpt0 =)

Доделал вывод zfs пулов
Добавил ещё два табличных вывода --table2 и --table3

Все гуд, работает отлично.👍

iron ★★★★★
()
Ответ на: комментарий от iron

А нафига их экранировать? Достаточно весь текст элемента заключать в двойные кавычки. Читающий эти данные будет понимать, что нужно читать все что внутри не взирая на любые спец-символы. В названиях дисков же не будет быть символа двойных кавычек.

В путях монтирования могут быть и кавычки - там могут быть вообще любые символы кроме \0

И снова этот мерзопакостный xpt0 =)

Всмысле «снова»? Конкретно это сообщение я не убирал - оно самоценное. xpt0 (как и другие устройства) можно и в jail пробросить, и юзеру права на него выдать, а ошибка может быть разной - как минимум «no such file» или «permission denied», а может и ещё какая, так что эта строчка ни из какой другой однозначно не следует.

firkax ★★★★★
() автор топика
Последнее исправление: firkax (всего исправлений: 1)