Parece que encontrei uma maneira de aproximar o progresso do ext4lazyinit.
TL; DR: veja o script abaixo.
Esse método pressupõe que o disco nunca foi desconectado (nem o sistema foi reinicializado) desde a primeira vez em que a partição foi montada e que você gravou exatamente tantos dados na partição quanto em uso nela (portanto, nenhuma exclusão) ou modificação de arquivos).
Etapa 1 : Compare o tamanho da partição no fdisk (convertido em kiB) com o número de blocos de 1K mostrados em df. Subtraia (número de blocos de 1K) de (tamanho da partição em kiB) para obter (tamanho aproximado da tabela de inodes).
EDIT: Exemplo, fdisk:
Sector size (logical/physical): 512 bytes / 4096 bytes
(...omitted...)
Device Start End Sectors Size Type
/dev/sdd1 2048 11720978398 11720976351 5.5T Linux filesystem
df:
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/workbackup 5813233164 1217095176 4596121604 21% /mnt/backup_work
11720976351 setores * 512 bytes / setor / 1024 = 5860488175,5 kiB (quase 5,5 TiB, como diz o fdisk). Menos 5813233164 de DF é igual a 47255011,5 kiB (cerca de 45 GiB) para o tamanho aproximado da tabela de inodos.
Etapa 2 : obter (total de kiB gravado na partição):
awk '{ print $3"\t"$10 }' /proc/diskstats
Escolha a linha certa para sua partição e converta-a em kiB.
EDIT: exemplo:
sdb 260040
sdb1 260040
sdd 2530109116
sdd1 2530108940
Usando sdd1 no meu caso, kiB total gravado = 2530108940 setores * 512 bytes / setor / 1024 = 1265054470 kiB (quase 1,2 TiB).
Etapa 3 : necessário apenas se você já tiver gravado dados no sistema de arquivos. Subtraia (número de blocos de 1K USADO, mostrado em df) de (total de kiB gravado na partição) para obter (aproximadamente kiB gravado na tabela de inodes).
EDIT: exemplo: kiB aproximado gravado na tabela de inode = 1265054470 (da etapa 2) - 1217095176 (consulte a saída df na etapa 1) = 47959294 kiB (45,7 GiB)
Etapa 4 : divida (aproximadamente kiB gravado na tabela de inodes) por (tamanho aproximado da tabela de inodes em kiB) e multiplique por 100 para obter o progresso como uma porcentagem.
EDIT: exemplo: progresso aproximado = 47959294 / 47255011,5 * 100% = 101,5%
Roteiro
Ou para escrever isso como um script parcial (onde eu me recuso a escrever uma chamada para o fdisk, por razões de segurança):
let sectorsize=$(cat /sys/block/sda/queue/hw_sector_size)
let partsize=$2*$sectorsize/1024
let fssize=$(df -- "$3" | tail -n -1 | awk '{print $2}')
let approxinodetablesize=$partsize-$fssize
let tkw=$(awk "/$1/"' {print $10}' /proc/diskstats | head -n 1)*$sectorsize/1024
let used=$(df -- "$3" | tail -n -1 | awk '{print $3}')
let tkw_inodetable=$tkw-$used
echo "Approximate progress: $(bc -l <<< "$tkw_inodetable*100.0/$approxinodetablesize") %"
Ligue com $ 1 = "nome da partição" (por exemplo, sdd1), $ 2 = "setores da partição de acordo com o fdisk", $ 3 = "ponto de montagem sem barra"
Resultado dos testes
Eu só testei meu método uma vez. Configuração:
Partição de 6 TB
criptografia usando cryptsetup
sistema de arquivos criado com parâmetros padrão, exceto -m 0
279 GiB de arquivos gravados na partição antes da ext4lazyinit ser concluída.
Resultado : uma leitura de 99,7% no momento da conclusão :-)
EDIT: mesmo disco, depois de gravar quase outro TiB de dados, agora produz uma estimativa de 101,5%. Preciso o suficiente para ser útil, eu acho.