При написании простой функции, которая вычисляет количество блоков, потребляемых в каталоге, я проверил с помощью du, чтобы убедиться, что я получаю те же ответы.

Почему ls и du говорят, что этот файл занимает 16 блоков?

#!/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
)

Вот что я вижу:

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

Я ожидаю, что ls -s скажет 4 блока, как du -B 4096.

1 ответ1

2

Как du и ls умолчанию используют размер блока 1024 байта при расчете количества блоков. Так как ваша файловая система сконфигурирована с блоками 4K, и файл использует 4 таких блока 4K, оба они сообщают о 16 использованных блоках по 1K.

Страница man du(1) упоминает этот факт в конце своего раздела Description, тогда как ls(1) не устанавливает его напрямую. Однако обе программы являются частью пакета GNU coreutils и поддерживают одинаковые параметры -B/- размера блока, поэтому я полагаю, что они, вероятно, будут полагаться на одну и ту же реализацию.

Если вы хотите получить реальное количество используемых блоков, вы должны указать размеры блоков файловой системы как для ls и для du .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .