zpool list
fornecerá uma lista dos pools do ZFS e zfs list
fornecerá uma lista de todos os conjuntos de dados do ZFS.
Eu gostaria de zerofill todo o espaço livre em partições dentro de uma máquina virtual FreeBSD.
A máquina virtual contém uma fatia de 512K% de freebsd-boot
de inicialização (espero que eu tenha a terminologia aqui), seguida por uma fatia de 2.0G freebsd-swap
e uma fatia de 254.0G freebsd-zfs
.
# gpart show da0
=> 34 536870845 da0 GPT (256G)
34 6 - free - (3.0K)
40 1024 1 freebsd-boot (512K)
1064 984 - free - (492K)
2048 4194304 2 freebsd-swap (2.0G)
4196352 532672512 3 freebsd-zfs (254G)
536868864 2015 - free - (1.0M)
É o layout criado pelo instalador do FreeBSD 10.2 por padrão ao escolher a opção "root no ZFS".
No passado, com o UFS, eu simplesmente usava mount -t ufs
para listar todos os rótulos UFS e simplesmente criar um arquivo preenchido com zero nessas montagens até que não houvesse mais espaço.
No entanto, com o ZFS, não tenho mais certeza. Agora eu recebo:
# mount -t zfs
zroot/ROOT/default on / (zfs, local, noatime, nfsv4acls)
zroot/tmp on /tmp (zfs, local, noatime, nosuid, nfsv4acls)
zroot/usr/home on /usr/home (zfs, local, noatime, nfsv4acls)
zroot/usr/ports on /usr/ports (zfs, local, noatime, nosuid, nfsv4acls)
zroot/usr/src on /usr/src (zfs, local, noatime, nfsv4acls)
zroot/var/audit on /var/audit (zfs, local, noatime, noexec, nosuid, nfsv4acls)
zroot/var/crash on /var/crash (zfs, local, noatime, noexec, nosuid, nfsv4acls)
zroot/var/log on /var/log (zfs, local, noatime, noexec, nosuid, nfsv4acls)
zroot/var/mail on /var/mail (zfs, local, nfsv4acls)
zroot/var/tmp on /var/tmp (zfs, local, noatime, nosuid, nfsv4acls)
zroot on /zroot (zfs, local, noatime, nfsv4acls)
que não me dá uma pista além dos nomes, que, como eu entendo, são meramente uma convenção (estilo ruim para confiar em convenções). E repetir a operação de preenchimento zero em cada desses conjuntos de dados parece um pouco bobo.
Seria então suficiente encontrar todos os pools do ZFS ( zpool list -pH|cut -f 1
) e procurar por aqueles na lista que o mount -t zfs
me dá? Ou seja ignorando conjuntos de dados desse pool do ZFS.
Resumindo, seria suficiente para preencher o espaço livre nos pontos de montagem listados por (usando o Bash, mas provavelmente também funciona com o Zsh):
mount -t zfs|awk '$1 ~ /^'$(zpool list -pH|cut -f 1)'$/ {print $3}'
ou o fato de o ZFS ter esses conjuntos de dados mudar a parte de que preciso zerfill antes de compactar o disco da máquina virtual no lado do host?
Saída ao listar os pools do ZFS e as montagens:
# mount -t zfs
zroot/ROOT/default on / (zfs, local, noatime, nfsv4acls)
zroot/tmp on /tmp (zfs, local, noatime, nosuid, nfsv4acls)
zroot/usr/home on /usr/home (zfs, local, noatime, nfsv4acls)
zroot/usr/ports on /usr/ports (zfs, local, noatime, nosuid, nfsv4acls)
zroot/usr/src on /usr/src (zfs, local, noatime, nfsv4acls)
zroot/var/audit on /var/audit (zfs, local, noatime, noexec, nosuid, nfsv4acls)
zroot/var/crash on /var/crash (zfs, local, noatime, noexec, nosuid, nfsv4acls)
zroot/var/log on /var/log (zfs, local, noatime, noexec, nosuid, nfsv4acls)
zroot/var/mail on /var/mail (zfs, local, nfsv4acls)
zroot/var/tmp on /var/tmp (zfs, local, noatime, nosuid, nfsv4acls)
zroot on /zroot (zfs, local, noatime, nfsv4acls)
# zpool list -pH
zroot 270582939648 1668632576 268914307072 - 0% 0 1.00x ONLINE -
zpool list
fornecerá uma lista dos pools do ZFS e zfs list
fornecerá uma lista de todos os conjuntos de dados do ZFS.
Você está pensando muito complicado.
Você só precisa preencher zero cada pool, não cada sistema de arquivos! (O último não faz muito sentido no ZFS).
Então, basta iterar todos os pools (via zpool list
). Para cada pool, faça o seguinte:
Observe que o algoritmo acima funciona corretamente, mesmo no caso especial em que você tem algum conjunto que não contenha nenhum sistema de arquivos. (nenhum sistema de arquivos ainda, ou nenhum sistema de arquivos mais)