При создании единого дискового пула zfs, состоящего только из одного диска емкостью 1 ТБ (= 931 ГБ), файловая система показывала только 899 ГБ свободного места ( df -h
или zfs list
; zpool list
фактически показал размер раздела (931 ГиБ) за вычетом накладных расходов (в результате осталось пространство 928 ГиБ).
Я пытался настроить пул дисков zfs, состоящий только из одного диска емкостью 1 ТБ (= 931,53 ГиБ):
# fdisk -l /dev/sdb
Disk /dev/sdb: 931.53 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: xxxx
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: xxx
Device Start End Sectors Size Type
/dev/sdb1 2048 1953516976 1953514929 931.5G Linux filesystem
При настройке пула zfs
# zpool create -f -o ashift=12 tank /dev/sdb1;
не хватает 32,5 ГиБ:
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 360K 899G 96K /tank
Что вызывает 32,5 ГиБ накладных расходов при настройке одного диска?
zpool list
сообщает:
# zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
tank 928G 444K 928G - - 0% 0% 1.00x ONLINE -
, но это не фактически используемое пространство, поскольку также df -h
сообщает:
# df -h
Filesystem Size Used Avail Use% Mounted on
tank 899G 128K 899G 1% /tank
] Нет квоты или резервирования:
# zfs get quota
NAME PROPERTY VALUE SOURCE
tank quota none default
# zfs get reservation
NAME PROPERTY VALUE SOURCE
tank reservation none default
# zfs get refquota
NAME PROPERTY VALUE SOURCE
tank refquota none default
# zfs get refreservation
NAME PROPERTY VALUE SOURCE
tank refreservation none default
# zfs get usedbyrefreservation
NAME PROPERTY VALUE SOURCE
tank usedbyrefreservation 0B -
Создание zpool с ashift = 9
не имеет никакого значения.
Я могу жить с фактическими накладными расходами в 3,5 ГиБ (= раздел размер по сравнению с размером, сообщаемым zpool), но не с накладными расходами 3 2,5 ГиБ или 29 ГиБ (= размер, сообщаемый zfs - размер, сообщаемый zpool) на таком маленьком диске.
Попробовав то же самое с btrfs, я получил больше свободного места:
# btrfs filesystem show
Label: 'tank' uuid: xxx
Total devices 1 FS bytes used 128.00KiB
devid 1 size 931.51GiB used 2.02GiB path /dev/sdb1
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sdb1 932G 3.8M 930G 1% /mnt
подробнее
# zfs --version
zfs-0.8.3-1ubuntu12.5
zfs-kmod-0.8.3-1ubuntu12.5
# uname -a
Linux xxx 5.4.0-58-generic #64-Ubuntu SMP Wed Dec 9 08:16:25 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
# cat /etc/os-release | grep VERSION
VERSION="20.04.1 LTS (Focal Fossa)"
VERSION_ID="20.04"
VERSION_CODENAME=focal
# zfs list -o space
NAME AVAIL USED USEDSNAP USEDDS USEDREFRESERV USEDCHILD
tank 899G 88.5K 0B 24K 0B 64.5K
Обновление:
воссоздано с помощью команды zpool create -oashift = 12 tank / dev / sdb1
.
Без разницы:
# zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
tank 928G 432K 928G - - 0% 0% 1.00x ONLINE -
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 336K 899G 96K /tank
Вывод zdb tank | grep metaslab | tail -n 3
:
# zdb tank | grep metaslab | tail -n 3
loading concrete vdev 0, metaslab 115 of 116 ...
metaslab 114 offset e400000000 spacemap 0 free 8G
metaslab 115 offset e600000000 spacemap 0 free 8G
vdev 0 metaslabs 116 fragmentation 0%
Вывод zdb | grep metaslab_shift
:
# zdb | grep metaslab_shift
metaslab_shift: 33
I не может воспроизвести вашу проблему.
root@banshee:/tmp# truncate -s 931G disk.bin
root@banshee:/tmp# zpool create -oashift=12 test /tmp/disk.bin
root@banshee:/tmp# zpool list test
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
test 928G 480K 928G - - 0% 0% 1.00x ONLINE -
В приведенном выше примере я начинаю с блочного устройства 931 ГБ (примерно 1 ТБ) и создаю на нем пул, используя секторы по 4 КиБ. Доступная емкость составляет 928 ГБ, как и ожидалось, если учесть остаток в метаслаборатории.
root@banshee:/tmp# zdb test | grep metaslab | tail -n 3
loading concrete vdev 0, metaslab 115 of 116 ...
metaslab 114 offset e400000000 spacemap 0 free 8G
metaslab 115 offset e600000000 spacemap 0 free 8G
vdev 0 metaslabs 116 fragmentation 0%
Мой «диск» 931 ГБ был разделен на 116 метаслаб по 8 ГБ; осталось 0,44125 метаслаборатории
0.44125 metaslabs * 8GiB/metaslab == 3.53GiB
931GiB disk - 3.53Gib metaslab remainder == ~~928GiB usable
... а Боб - ваш дядя. Я понятия не имею, почему вы видите примерно в десять раз больше накладных расходов; Я также использую Focal с той же версией ZFS, о которой вы сообщаете.
root@banshee:/tmp# apt policy zfsutils-linux
zfsutils-linux:
Installed: 0.8.3-1ubuntu12.5
Candidate: 0.8.3-1ubuntu12.5
Version table:
*** 0.8.3-1ubuntu12.5 500
500 http://us.archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages
100 /var/lib/dpkg/status
0.8.3-1ubuntu12 500
500 http://us.archive.ubuntu.com/ubuntu focal/main amd64 Packages
Это может помочь увидеть фактическое создание вашего пула, команда за командой с нуля и / или вывод zdb | grep metaslab_shift
в этом пуле.
Как указано пользователем grenkins в subreddit / r / zfs ( https://www.reddit.com/r / zfs / comments / kp2nnk / zfs_single_disk_setup_1tb_9315_gib_325_gib / - вся заслуга ему) zfs по умолчанию резервирует 3,2% места. Это резервирование выполняется модулем ядра в системе и не имеет ничего общего с параметрами zpool quota / reserve / refquota / refreservation / usedbyrefreservation. См. https://openzfs.github.io/openzfs-docs/Performance%20and%20Tuning/Module%20Parameters.html#spa-slop-shift
Резервирование выполняется с помощью параметра spa_slop_shift ядра zfs. модуль.
Резюме:
Normally, the last 3.2% (1/(2^spa_slop_shift)) of pool space is reserved to ensure the pool doesn’t run completely out of space [...]
For large pools, when 3.2% may be too conservative and more usable space is desired, consider increasing spa_slop_shift
Я увеличил значение параметра spa_slop_shift до 15, создав следующий файл:
# printf "options zfs spa_slop_shift=15" > /etc/modprobe.d/zfs.conf
После перезагрузки доступно 928 ГиБ:
# zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
tank 928G 576K 928G - - 0% 0% 1.00x ONLINE -
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 408K 928G 96K /tank
что на самом деле является свободным пространством zpool list
сообщал (размер раздела 931,5 - небольшие накладные расходы).
Так что для меня это исправлено.