Por que os.stat do python e du e ls não concordam com o tamanho do bloco?

0

Enquanto escrevia uma função simples que calcula a quantidade de blocos consumidos em um diretório, eu verifiquei com du para ver se estava obtendo as mesmas respostas.

Por que ls e du dizem que esse arquivo ocupa 16 blocos?

#!/bin/bash                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

targetfile=/scratch/blob
rm -rf /scratch > /dev/null 2>&1
mkdir -p /scratch > /dev/null 2>&1
bs=$(dumpe2fs -h /dev/mapper/testvm-root 2> /dev/null | grep "Block size:")
bs=${bs/Block size:/}
bs=${bs// /}
echo blocksize=$bs
# create a file slightly too big for three blocks
dd if=/dev/zero of=$targetfile count=1 bs=$((bs*3+1)) > /dev/null 2>&1

echo "du says $(du $targetfile) units"
echo "du says $(du -b $targetfile) bytes:"
echo "ls says $(ls -s $targetfile) blocks"

echo "python says:"
python <(cat <<ENDMARKER
import os
import math
x = os.stat("$targetfile")
blocks=math.ceil(float(x.st_size)/float(x.st_blksize))
print("%d bytes st_blksize=%d, %d blocks " % (x.st_size,x.st_blksize,blocks))
print("blocksize=%d" % os.statvfs("$targetfile").f_bsize)
ENDMARKER
)

Isso é o que eu vejo:

blocksize=4096
du says 16      /scratch/blob units
du says 12289   /scratch/blob bytes:
ls says 16 /scratch/blob blocks
python says:
12289 bytes st_blksize=4096, 4 blocks 
blocksize=4096

Eu esperaria ls -s dizer 4 blocos como du -B 4096 faz.

    
por John Schmitt 30.03.2014 / 22:41

1 resposta

1

O padrão du e ls é o tamanho do bloco de 1024 bytes ao calcular o número de blocos. Como seu sistema de arquivos está configurado com blocos de 4K e o arquivo usa 4 desses blocos de 4K, ambos relatam 16 blocos de 1K usados.

du (1) manpage menciona este fato no final de sua seção de descrição, enquanto ls(1) não indica diretamente. No entanto, ambos os programas fazem parte do pacote GNU coreutils e suportam as mesmas opções de tamanho de bloco -B /, então acho que é provável que eles dependam da mesma implementação.

Se você deseja obter o número real de blocos usados, é necessário fornecer blocos de sistema de arquivos para ls e du .

    
por 05.06.2014 / 12:25