zfs - настройка одного диска: Где недостающее место? [1 ТБ (931,5 ГиБ) диск: 32,5 ГиБ отсутствует в качестве полезного пространства]

Краткое описание:

При создании единого дискового пула 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
0
задан 3 January 2021 в 02:02

2 ответа

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 в этом пуле.

1
ответ дан 3 January 2021 в 22:43

Как указано пользователем 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 - небольшие накладные расходы).

Так что для меня это исправлено.

0
ответ дан 3 January 2021 в 22:43

Другие вопросы по тегам:

Похожие вопросы: