Fedor
zfs dRAID всеравно круче )
Даже несмотря на постоянный stripe?
Roman
Да и raidz только данные восстанавливает, насколько я помню.
Okhsunrog
Ты у него источник инфы спроси. Так ему верить нельзя. Единственное, когда +- можно верить – это всякие режимы Deep Research. Когда он рядом со своими утверждениями оставляет ссылку на веб-ресурс, на который ссылается. Чтобы можно было сходить по ссылке и убедиться, что это так
Okhsunrog
Можешь ещё спросить у него, как приготовить ZFS со свиными крылышками :)
Okhsunrog
ChatGPT – это не замена Гуглу. Всякие режимы Deep Research в Grok и прочих могут заменить именно потому, что они именно гуглят, собирают инфу, и дают ссылки, где ты можешь прочитать. Но всё ещё далеки от идеала, время от времени пишут не самый оптимальный запрос в гугл, по которому ничего не находится. В целом, на протяжении долгого времени отличительной чертой айтишника было умение хорошо гуглить и эффективно искать информацию. И пока ещё нейросети кожаных в этом заменить до конца не могут) Так что рекомендую и самому походить по сайтам, почитать, что пишут
Δαρθ
zfs dRAID всеравно круче )
если целый диск запороть /dev/urandomом оно выживет? данные не побьёт?
Δαρθ
zfs dRAID всеравно круче )
чо? с какого оно там все пространство и все блоки пула восстанавливает?
Δαρθ
Не холивара ради, но уже давно есть соответствующие systemd сервисы которые этим занимаются. Ленивый вариант - zfs-mount-generator
это все - костыли. фактически чтоб ядро загрузилось с зфс надо его пнуть zfs import / zfs mount траляля из iitramfs . по мне, это основной костыль. все эти сервсисы - костылеобертки вокруг того основного. а бтрфс - опцией ядру из любого положения.
George
это все - костыли. фактически чтоб ядро загрузилось с зфс надо его пнуть zfs import / zfs mount траляля из iitramfs . по мне, это основной костыль. все эти сервсисы - костылеобертки вокруг того основного. а бтрфс - опцией ядру из любого положения.
Эээ, для любой фс в initramfs будут такие "костыли" :)) для зфс они соответствующим пакетом просто ставятся и... всё:) даже запрос на ввод пароля для зашифрованных датасетов из коробки есть
Vladislav
не для любой. бтрфс или ехт4 таких костылей не требует
Мммм, что-то я помню строчки в грабе про подрузку модулей ФС
George
не для любой. бтрфс или ехт4 таких костылей не требует
$ cp /boot/initrd.img-6.12.38+deb13-amd64 ./initrd.img $ unmkinitramfs ./initrd.img ./ $ grep btrfs ./ -IR ./main/lib/udev/rules.d/64-btrfs.rules:SUBSYSTEM!="block", GOTO="btrfs_end" ./main/lib/udev/rules.d/64-btrfs.rules:ACTION=="remove", GOTO="btrfs_end" ./main/lib/udev/rules.d/64-btrfs.rules:ENV{ID_FS_TYPE}!="btrfs", GOTO="btrfs_end" ./main/lib/udev/rules.d/64-btrfs.rules:ENV{SYSTEMD_READY}=="0", GOTO="btrfs_end" ./main/lib/udev/rules.d/64-btrfs.rules:# let the kernel know about this btrfs filesystem, and check if it is complete ./main/lib/udev/rules.d/64-btrfs.rules:IMPORT{builtin}="btrfs ready $devnode" ./main/lib/udev/rules.d/64-btrfs.rules:LABEL="btrfs_end" ./main/lib/udev/rules.d/64-btrfs-dm.rules:SUBSYSTEM!="block", GOTO="btrfs_end" ./main/lib/udev/rules.d/64-btrfs-dm.rules:KERNEL!="dm-[0-9]*", GOTO="btrfs_end" ./main/lib/udev/rules.d/64-btrfs-dm.rules:ACTION!="add|change", GOTO="btrfs_end" ./main/lib/udev/rules.d/64-btrfs-dm.rules:ENV{ID_FS_TYPE}!="btrfs", GOTO="btrfs_end" ./main/lib/udev/rules.d/64-btrfs-dm.rules:# Once the device mapper symlink is created, tell btrfs about it ./main/lib/udev/rules.d/64-btrfs-dm.rules:ENV{DM_NAME}=="?*", RUN{builtin}+="btrfs ready /dev/mapper/$env{DM_NAME}" ./main/lib/udev/rules.d/64-btrfs-dm.rules:LABEL="btrfs_end" ./main/lib/udev/rules.d/50-udev-default.rules:KERNEL=="btrfs-control", GROUP="disk" ./main/lib/modules/6.12.38+deb13-amd64/modules.softdep:softdep btrfs pre: blake2b-256 ./main/lib/modules/6.12.38+deb13-amd64/modules.softdep:softdep btrfs pre: sha256 ./main/lib/modules/6.12.38+deb13-amd64/modules.softdep:softdep btrfs pre: xxhash64 ./main/lib/modules/6.12.38+deb13-amd64/modules.softdep:softdep btrfs pre: crypto-crc32c ./main/lib/modules/6.12.38+deb13-amd64/modules.order:kernel/fs/btrfs/btrfs.ko ./main/lib/modules/6.12.38+deb13-amd64/modules.devname:btrfs btrfs-control c10:234 ./main/lib/modules/6.12.38+deb13-amd64/modules.dep:kernel/fs/btrfs/btrfs.ko.xz: kernel/crypto/xor.ko.xz kernel/lib/raid6/raid6_pq.ko.xz kernel/lib/libcrc32c.ko.xz ./main/lib/modules/6.12.38+deb13-amd64/modules.alias:alias devname:btrfs-control btrfs ./main/lib/modules/6.12.38+deb13-amd64/modules.alias:alias char-major-10-234 btrfs ./main/lib/modules/6.12.38+deb13-amd64/modules.alias:alias fs-btrfs btrfs ./main/scripts/local-premount/btrfs:if [ -x /bin/btrfs ] ./main/scripts/local-premount/btrfs: modprobe btrfs ||: ./main/scripts/local-premount/btrfs: /bin/btrfs device scan ./main/scripts/local-premount/ORDER:/scripts/local-premount/btrfs "$@" ./main/usr/lib/udev/rules.d/64-btrfs.rules:SUBSYSTEM!="block", GOTO="btrfs_end" ./main/usr/lib/udev/rules.d/64-btrfs.rules:ACTION=="remove", GOTO="btrfs_end" ./main/usr/lib/udev/rules.d/64-btrfs.rules:ENV{ID_FS_TYPE}!="btrfs", GOTO="btrfs_end" ./main/usr/lib/udev/rules.d/64-btrfs.rules:ENV{SYSTEMD_READY}=="0", GOTO="btrfs_end" ./main/usr/lib/udev/rules.d/64-btrfs.rules:# let the kernel know about this btrfs filesystem, and check if it is complete ./main/usr/lib/udev/rules.d/64-btrfs.rules:IMPORT{builtin}="btrfs ready $devnode" ./main/usr/lib/udev/rules.d/64-btrfs.rules:LABEL="btrfs_end" ./main/usr/lib/udev/rules.d/64-btrfs-dm.rules:SUBSYSTEM!="block", GOTO="btrfs_end" ./main/usr/lib/udev/rules.d/64-btrfs-dm.rules:KERNEL!="dm-[0-9]*", GOTO="btrfs_end" ./main/usr/lib/udev/rules.d/64-btrfs-dm.rules:ACTION!="add|change", GOTO="btrfs_end" ./main/usr/lib/udev/rules.d/64-btrfs-dm.rules:ENV{ID_FS_TYPE}!="btrfs", GOTO="btrfs_end" ./main/usr/lib/udev/rules.d/64-btrfs-dm.rules:# Once the device mapper symlink is created, tell btrfs about it ./main/usr/lib/udev/rules.d/64-btrfs-dm.rules:ENV{DM_NAME}=="?*", RUN{builtin}+="btrfs ready /dev/mapper/$env{DM_NAME}" ./main/usr/lib/udev/rules.d/64-btrfs-dm.rules:LABEL="btrfs_end" ./main/usr/lib/udev/rules.d/50-udev-default.rules:KERNEL=="btrfs-control", GROUP="disk" ./main/usr/lib/modules/6.12.38+deb13-amd64/modules.softdep:softdep btrfs pre: blake2b-256 ./main/usr/lib/modules/6.12.38+deb13-amd64/modules.softdep:softdep btrfs pre: sha256
George
не для любой. бтрфс или ехт4 таких костылей не требует
./main/usr/lib/modules/6.12.38+deb13-amd64/modules.softdep:softdep btrfs pre: xxhash64 ./main/usr/lib/modules/6.12.38+deb13-amd64/modules.softdep:softdep btrfs pre: crypto-crc32c ./main/usr/lib/modules/6.12.38+deb13-amd64/modules.order:kernel/fs/btrfs/btrfs.ko ./main/usr/lib/modules/6.12.38+deb13-amd64/modules.devname:btrfs btrfs-control c10:234 ./main/usr/lib/modules/6.12.38+deb13-amd64/modules.dep:kernel/fs/btrfs/btrfs.ko.xz: kernel/crypto/xor.ko.xz kernel/lib/raid6/raid6_pq.ko.xz kernel/lib/libcrc32c.ko.xz ./main/usr/lib/modules/6.12.38+deb13-amd64/modules.alias:alias devname:btrfs-control btrfs ./main/usr/lib/modules/6.12.38+deb13-amd64/modules.alias:alias char-major-10-234 btrfs ./main/usr/lib/modules/6.12.38+deb13-amd64/modules.alias:alias fs-btrfs btrfs это я ещё бинари из грепа исключил
George
а grub - это вообще набор "костылей" и драйверов для поддержки каждой фс https://github.com/search?q=repo%3Arhboot%2Fgrub2%20btrfs&type=code взял первый попавшийся форк чтобы легко поискать
George
$ cp /boot/initrd.img-6.12.38+deb13-amd64 ./initrd.img $ unmkinitramfs ./initrd.img ./ $ grep btrfs ./ -IR ./main/lib/udev/rules.d/64-btrfs.rules:SUBSYSTEM!="block", GOTO="btrfs_end" ./main/lib/udev/rules.d/64-btrfs.rules:ACTION=="remove", GOTO="btrfs_end" ./main/lib/udev/rules.d/64-btrfs.rules:ENV{ID_FS_TYPE}!="btrfs", GOTO="btrfs_end" ./main/lib/udev/rules.d/64-btrfs.rules:ENV{SYSTEMD_READY}=="0", GOTO="btrfs_end" ./main/lib/udev/rules.d/64-btrfs.rules:# let the kernel know about this btrfs filesystem, and check if it is complete ./main/lib/udev/rules.d/64-btrfs.rules:IMPORT{builtin}="btrfs ready $devnode" ./main/lib/udev/rules.d/64-btrfs.rules:LABEL="btrfs_end" ./main/lib/udev/rules.d/64-btrfs-dm.rules:SUBSYSTEM!="block", GOTO="btrfs_end" ./main/lib/udev/rules.d/64-btrfs-dm.rules:KERNEL!="dm-[0-9]*", GOTO="btrfs_end" ./main/lib/udev/rules.d/64-btrfs-dm.rules:ACTION!="add|change", GOTO="btrfs_end" ./main/lib/udev/rules.d/64-btrfs-dm.rules:ENV{ID_FS_TYPE}!="btrfs", GOTO="btrfs_end" ./main/lib/udev/rules.d/64-btrfs-dm.rules:# Once the device mapper symlink is created, tell btrfs about it ./main/lib/udev/rules.d/64-btrfs-dm.rules:ENV{DM_NAME}=="?*", RUN{builtin}+="btrfs ready /dev/mapper/$env{DM_NAME}" ./main/lib/udev/rules.d/64-btrfs-dm.rules:LABEL="btrfs_end" ./main/lib/udev/rules.d/50-udev-default.rules:KERNEL=="btrfs-control", GROUP="disk" ./main/lib/modules/6.12.38+deb13-amd64/modules.softdep:softdep btrfs pre: blake2b-256 ./main/lib/modules/6.12.38+deb13-amd64/modules.softdep:softdep btrfs pre: sha256 ./main/lib/modules/6.12.38+deb13-amd64/modules.softdep:softdep btrfs pre: xxhash64 ./main/lib/modules/6.12.38+deb13-amd64/modules.softdep:softdep btrfs pre: crypto-crc32c ./main/lib/modules/6.12.38+deb13-amd64/modules.order:kernel/fs/btrfs/btrfs.ko ./main/lib/modules/6.12.38+deb13-amd64/modules.devname:btrfs btrfs-control c10:234 ./main/lib/modules/6.12.38+deb13-amd64/modules.dep:kernel/fs/btrfs/btrfs.ko.xz: kernel/crypto/xor.ko.xz kernel/lib/raid6/raid6_pq.ko.xz kernel/lib/libcrc32c.ko.xz ./main/lib/modules/6.12.38+deb13-amd64/modules.alias:alias devname:btrfs-control btrfs ./main/lib/modules/6.12.38+deb13-amd64/modules.alias:alias char-major-10-234 btrfs ./main/lib/modules/6.12.38+deb13-amd64/modules.alias:alias fs-btrfs btrfs ./main/scripts/local-premount/btrfs:if [ -x /bin/btrfs ] ./main/scripts/local-premount/btrfs: modprobe btrfs ||: ./main/scripts/local-premount/btrfs: /bin/btrfs device scan ./main/scripts/local-premount/ORDER:/scripts/local-premount/btrfs "$@" ./main/usr/lib/udev/rules.d/64-btrfs.rules:SUBSYSTEM!="block", GOTO="btrfs_end" ./main/usr/lib/udev/rules.d/64-btrfs.rules:ACTION=="remove", GOTO="btrfs_end" ./main/usr/lib/udev/rules.d/64-btrfs.rules:ENV{ID_FS_TYPE}!="btrfs", GOTO="btrfs_end" ./main/usr/lib/udev/rules.d/64-btrfs.rules:ENV{SYSTEMD_READY}=="0", GOTO="btrfs_end" ./main/usr/lib/udev/rules.d/64-btrfs.rules:# let the kernel know about this btrfs filesystem, and check if it is complete ./main/usr/lib/udev/rules.d/64-btrfs.rules:IMPORT{builtin}="btrfs ready $devnode" ./main/usr/lib/udev/rules.d/64-btrfs.rules:LABEL="btrfs_end" ./main/usr/lib/udev/rules.d/64-btrfs-dm.rules:SUBSYSTEM!="block", GOTO="btrfs_end" ./main/usr/lib/udev/rules.d/64-btrfs-dm.rules:KERNEL!="dm-[0-9]*", GOTO="btrfs_end" ./main/usr/lib/udev/rules.d/64-btrfs-dm.rules:ACTION!="add|change", GOTO="btrfs_end" ./main/usr/lib/udev/rules.d/64-btrfs-dm.rules:ENV{ID_FS_TYPE}!="btrfs", GOTO="btrfs_end" ./main/usr/lib/udev/rules.d/64-btrfs-dm.rules:# Once the device mapper symlink is created, tell btrfs about it ./main/usr/lib/udev/rules.d/64-btrfs-dm.rules:ENV{DM_NAME}=="?*", RUN{builtin}+="btrfs ready /dev/mapper/$env{DM_NAME}" ./main/usr/lib/udev/rules.d/64-btrfs-dm.rules:LABEL="btrfs_end" ./main/usr/lib/udev/rules.d/50-udev-default.rules:KERNEL=="btrfs-control", GROUP="disk" ./main/usr/lib/modules/6.12.38+deb13-amd64/modules.softdep:softdep btrfs pre: blake2b-256 ./main/usr/lib/modules/6.12.38+deb13-amd64/modules.softdep:softdep btrfs pre: sha256
тут ещё -i мне стоило грепу включить, ещё плюс 4 строки
Okhsunrog
До того, как я пришел к ZFS + ZFSBootMenu, я пользовался btrfs, но без всякого grub. у меня был UKI - ядро + initramfs + efi stub + параметры командной строки ядра запаковывались в один EFI файл, добавлялась загрузочная запись в UEFI, и UEFI грузил напрямую ядро, без всякого загрузчика
George
у ext4 конечно сильно меньше, а если поставить zfs-initramfs то там много интересного про zfs, желающие посмотрят :)
Δαρθ
Мммм, что-то я помню строчки в грабе про подрузку модулей ФС
Модули можно при необходимости в ядро вкомпилировать. Даже ZFS. А вот замонтировать рутфс ЗФСный без скриптов невозможно. В отличие от.
Δαρθ
Δαρθ
А почему это проблема?
А я говорил что проблема? Я сказал — костыли.
Okhsunrog
Иногда лучшее - враг хорошего. Пускай будут костыли, ничего страшного. Нет ничего плохого в нескольких скриптах в initramfs
Δαρθ
Иногда лучшее - враг хорошего. Пускай будут костыли, ничего страшного. Нет ничего плохого в нескольких скриптах в initramfs
Пока работает - ничего плохого. А как только, ну даже банально надо загрузиться с диска на другйо машине - геморoя может подкинуть в полный рост
Δαρθ
И иди дрочи с флешкой и чрутом
Δαρθ
Vladislav
Но вообще, сильное имхо, я всегда слабо вижу прям необходимости в / на ZFS.
Δαρθ
На рутфс я считаю ZFS не нужна. На отдельных дисках/разделах — да, она зачастую рулит
Δαρθ
С некоторой долей натяжки — если вдруг припёрло зашифровать рутфс. Но с другой стороны посекторное шифрование для рутфс тоже сгодится
Δαρθ
И тут ещё кстати вопрос, вот если рутфс это зашифрованный датасет, то что мешает злоумышленнику его подменить на незашифрованный. Понятно что если таковой имеет физический доступ к машине, то почти наверняка он прохачит всё1 что надо, но всё же зачем давать лишнюю дырку
Δαρθ
ну вот у меня зашифрован весь пул. невозможно создать незашифрованный датасет внутри
можно и его подменить на незашифрованный. эти костылескриптики в инитрамфсе вообще заметят это?
Okhsunrog
Абсолютно так
Okhsunrog
А загрузчик можно подписать с помощью Secure Boot, это один EFI файл
Okhsunrog
можно и его подменить на незашифрованный. эти костылескриптики в инитрамфсе вообще заметят это?
Какой смысл пул подменять, я так и не понял. Тогда проще nvme диск уже заменить
Okhsunrog
Но цель атаки мне непонятна
Δαρθ
Инитрамфс тоже зашифрованный
инитрамфс увидит пул но пул окажется незашифрованным. что дальше?. и еще не оч понятно кто именно и как зашифровал инитрамфс. и кто его расшифрует
Δαρθ
Какой смысл пул подменять, я так и не понял. Тогда проще nvme диск уже заменить
если есть смысл шифровать рутфс то есть и смысл немножко обмануть и заставить секурное едро исполнить юзерспейс злоумышленника
Ivan
инитрамфс увидит пул но пул окажется незашифрованным. что дальше?. и еще не оч понятно кто именно и как зашифровал инитрамфс. и кто его расшифрует
загрузчик предложит ввести пароль. пароль откроет контейнер с ключем, который расшифровывает пул. в теории секур бут должен доверять только подписанному загрузчику.
Okhsunrog
инитрамфс увидит пул но пул окажется незашифрованным. что дальше?. и еще не оч понятно кто именно и как зашифровал инитрамфс. и кто его расшифрует
initramfs вместе с ядром лежат в корневом датасет, который зашифрован. ZFSBootMenu при включении импортирует пул и просит ввести пароль. После расшифровки уже загружает оттуда ядро и initramfs
Okhsunrog
Ты не можешь просто заменить корневой датасет не зашифрованным, это будет сразу видно по поведению. Потому что он мало того, что не запросит пароль, так ещё и не сможет расшифровать home датасет. В общем, странные идеи ты предлагаешь. Я не вижу сценария атаки, который не выглядел бы крайне странно и подозрительно
Δαρθ
загрузчик предложит ввести пароль. пароль откроет контейнер с ключем, который расшифровывает пул. в теории секур бут должен доверять только подписанному загрузчику.
тогда не "загрузчик" а скрипты инитрамфса. а дальше окажется что пул без пароля подсосался. скрипты упадут? или что?
Δαρθ
initramfs вместе с ядром лежат в корневом датасет, который зашифрован. ZFSBootMenu при включении импортирует пул и просит ввести пароль. После расшифровки уже загружает оттуда ядро и initramfs
ок. амесли вдруг у этого бутлоадера окажется пул незашифрованным? а ваще получается что вся защита стоит на левом бутлоадере
Δαρθ
а и пароль тот юзерспейс запросит так же.
Δαρθ
In essence, ZFSBootMenu is a small, self-contained Linux system that knows how to find other Linux kernels and initramfs images within ZFS filesystems. ну не костылище ли?
Fedor
Не больше, чем инитрамфс
Δαρθ
Не больше, чем инитрамфс
больше. инитрамфс это просто юзерспейс для кернела который потом выкидывается и заменяется на нормальный. а тут и ядро своё ещё )
Δαρθ
и еще интересно как оно инфу об "расшифрованном" пуле передает следующему ядру
Okhsunrog
а уже поздно. чужой пул забутился и трояны установлены
куда они установлены, в чужой пул? какой мне дело, что там стоит в чужом пуле? я выключу комп и снесу его. очень странные доводы, я могу так же сказать: заменю твой luks раздел с btrfs незашифрованным разделом, что будешь делать? абсолютно странный довод
Fedor
есть признаки компрометации системы даже таким способом. если в модели рисков это учтено, то это не должно вызвать дальнейшего продвижения
Δαρθ
если шифрация как защита от просера инфы в отключенном состоянии = то паралельно чем, лишь бы зашифровать. если чото большее хочется - возникают нюансы
Δαρθ
есть признаки компрометации системы даже таким способом. если в модели рисков это учтено, то это не должно вызвать дальнейшего продвижения
вот. а я лишь сомневаюсь что те зфсбутменеджеры и инитрамфсные скрипты эти признаки определят и не дадут двигаться дальше
Fedor
регистры те же например
Fedor
как это сделано - дискуссия уже не этого чата
Kosh
Всем привет! Подкиньте линк на шаблон к Zabbix 7v для мониторинга zfs. Используется в основном под VM и backup Proxmox. Посмотрел несколько шаблонов, много лишнего нужно до устанавливать, что не хочется. Проще написать самому с параметрами: статус пула, статус дисков в пуле, ошибки CKSUM, ошибки scrub, последний scrub, свободное место, фрагментация.
Vladislav
Тебе в любом случае кидать yaml на сервер с ZFS
Vladislav
И агента
Vladislav
https://github.com/Cosium/zabbix_zfs-on-linux
Kosh
так-то в случае ошибки в чексумме или при выпадении диска из пула прокс напишет письмо и приложит zpool status.
Это да, но нужно в телегу, завел в Zabbix через API опрос zfs, но не хватает: статуса scrub, информации о vdevs. Поставил агента, в раздумьях дописать только это или готовый шаблон подтянуть.
Ivan
Это да, но нужно в телегу, завел в Zabbix через API опрос zfs, но не хватает: статуса scrub, информации о vdevs. Поставил агента, в раздумьях дописать только это или готовый шаблон подтянуть.
я не отговариваю от использования заббикса, если что. но если вдруг он кажется для решения задачи избыточным, то в проксе есть уведомления через вебхук. соответственно, прокс может слать уведомления о событиях в телегу.
Kosh
Я понял, благодарю за совет. Но наружу только zabbix может кинуть алерт.
George
если вы где-то используете zfs+libvirt - оказалось что оно не умело в resize вольюмов через либвирт, в новом релизе 11.7 приняли мой патч, теперь умеет https://gitlab.com/libvirt/libvirt/-/commit/23a1eb0dc7f1c255ae6d857f78f5a6cf58b2dc5e