Мне нужно создать ext4 fs поверх zpool. Я хотел использовать все (или почти все) доступное пространство, как показано ниже.
# zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
nat2012 1,81T 124K 1,81T - - 0% 0% 1.00x ONLINE -
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
nat2012 105K 1,76T 24K none
# zfs create -V 1.75T nat2012/backup
bad volume size '1.75T': invalid numeric suffix '.75T'
# zfs get avail nat2012
NAME PROPERTY VALUE SOURCE
nat2012 available 1,76T -
# zfs get -H avail nat2012
nat2012 available 1,76T -
Моя проблема в том, что "1.75T" не принимается как размер тома. (Но отображается как размер.) Его значение округляется до 0.01T, что составляет 10G. Следующее, что я попробовал, это получить доступный размер в байтах, Мбайтах или ГБайтах или блоках, или практически в чем угодно, что сообщает мне точный размер и может быть использовано с "zfs create -V". Я был удивлен, когда увидел, что для этого нет опции "zfs get". Согласно документации, опция "-H" должна "отображать вывод в форме, более легко анализируемой скриптами". Она опускает заголовки и использует табуляции для разделения полей, но форматирование плохое. Размер по-прежнему отображается в ТБайтах и округляется с точностью +/- 10G. Меньшая проблема, но он отформатирован с использованием текущей локали (в моем случае десятичная точка "." заменена на ","). Это будет целое число в КБайтах.
Обратите внимание, что команда "df" не может быть использована в этом конкретном случае, поскольку ничего не смонтировано. Я мог бы сделать это, чтобы отобразить свободные блоки в килобайтах:
# mkdir -p /nat2012
# zfs set mountpoint=/nat2012 nat2012
# df -k | grep nat2012
nat2012 1885339520 128 1885339392 1% /nat2012
Но это даст ложный результат. Как видите, теперь он смонтирован как файловая система zfs, и набор данных уже использует 1% доступного пространства. Это не говорит мне точный размер, который доступен для создания нового тома ext4. (Опция -V обязательна — если вы ее не укажете, то ext4.mkfs не сможет его отформатировать.)
Конечно, я всегда могу провести эксперимент, например, такой:
# zfs create -V 1760G nat2012/backup
cannot create 'nat2012/backup': out of space
# zfs create -V 1755G nat2012/backup
cannot create 'nat2012/backup': out of space
# zfs create -V 1750G nat2012/backup
cannot create 'nat2012/backup': out of space
# zfs create -V 1740G nat2012/backup
# zfs destroy nat2012/backup
# zfs create -V 1745G nat2012/backup
cannot create 'nat2012/backup': out of space
# zfs create -V 1744G nat2012/backup
cannot create 'nat2012/backup': out of space
# zfs create -V 1743G nat2012/backup
На данный момент я могу быть уверен, что неиспользованным осталось максимум 1G. Этоочень неуклюжий. Я могу с этим жить, но мне придется делать то же самое для нескольких поездок в будущем.
Есть ли лучший способ «использовать все доступное пространство» для созданияисправленный размеробъем?