Preciso criar um ext4 fs em um zpool. Queria usar todo (ou quase todo) o espaço disponível, conforme mostrado abaixo.
# 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 -
Meu problema é que "1,75T" não é aceito como tamanho de volume. (Mas é exibido como um tamanho.) Seu valor é arredondado para 0,01T, que é 10G. A próxima coisa que tentei foi obter o tamanho disponível em bytes, Mbytes ou GBytes ou blocos, ou praticamente qualquer coisa que me diga o tamanho exato e possa ser usado com "zfs create -V". Fiquei surpreso quando vi que não existe a opção "zfs get" para isso. De acordo com os documentos, a opção "-H" deve "exibir a saída em um formato mais facilmente analisado por scripts". Omitiu os cabeçalhos e usou tabulações para separar os campos, mas a formatação é ruim. O tamanho ainda é exibido em TBytes e arredondado com precisão de +/- 10G. Problema menor, mas é formatado usando a localidade atual (no meu caso, o ponto decimal "." é substituído por ","). Seria um número inteiro em KBytes.
Observe que o comando "df" não pode ser usado neste caso específico, porque nada está montado. Eu poderia fazer isso para exibir blocos livres em Kbytes:
# mkdir -p /nat2012
# zfs set mountpoint=/nat2012 nat2012
# df -k | grep nat2012
nat2012 1885339520 128 1885339392 1% /nat2012
Mas isso daria um resultado falso. Como você pode ver, agora ele está montado como sistema de arquivos zfs e o conjunto de dados já usa 1% do espaço disponível. Isso não me diz o tamanho exato disponível para criar um novo volume ext4. (A opção -V é obrigatória - se você não especificá-la, ext4.mkfs não poderá formatá-la.)
Claro, sempre posso fazer um teste, algo assim:
# 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
Neste ponto, posso ter certeza de que há no máximo 1G de espaço não utilizado. Isso émuito desajeitado. Posso conviver com isso, mas terei que fazer as mesmas coisas em várias unidades no futuro.
Existe uma maneira melhor de "usar todo o espaço disponível" para criar umtamanho fixovolume?