Это меня озадачило. Я думаю, это должно быть легко, но я, должно быть, чего-то упускаю, так как результаты не совпадают.
Я выполняю резервное копирование длинного списка файлов на несколько дисков с помощью rsync, используя список, отсортированный в хронологическом порядке, так что самые ранние файлы помещаются на 1-й диск, более поздние - на 2-й и так далее.
Я просматриваю список, складывая размеры файлов блоками по 4 КБ, и отмечаю дату последнего подходящего файла. Затем я создаю список, используя «find -not -newer and -newer»
STARTDATE="-newer /tmp/filedate.1"
ENDDATE="-not -newer /tmp/filedate.2"
find $SRC -type f ${STARTDATE} ${ENDDATE} -printf '%P\n' | sort > ${TEMPFILE}
, и передаю его в rsync, используя «--files-from», чтобы фактически выполнить копирование.
rsync -a --progress --verbose --prune-empty-dirs --files-from=${TEMPFILE} ${SRC} ${TARGET}
Я хочу точно выяснить, где разделить файлы, чтобы диски были заполнены до отказа.
Что у меня есть на данный момент:
#%T is the modification time, @ is seconds,
#%p is the path less the command line part, and %k is disk usage in 1k blocks
#MAXSIZE is number of 4k blocks available on disk
find $SRC -printf "%T@\t%p\t%k\n" | sort -n | \
awk -vMS="$MAXSIZE" '
BEGIN { FS = "\t";fnumber = 0 }
{rtot+=int(($3+3)/4); #edit; changed to ceiling on AlexP's advice
if (rtot<MS) {final=$2;filesize=rtot;}
else {
rtot=int(($3+3)/4); #edit; changed to ceiling on AlexP's advice
fnumber++;
printf "touch -r \"%s\" /tmp/filedate.%s\n", final, fnumber | "/bin/sh"
print "Found point " fnumber ". (" final ") 4096 Blocks:" filesize " Space Left:" (MS-filesize)*4
}
}
'
Детали диска:
#tune2fs -l /dev/sdzc1
tune2fs 1.41.4 (27-Jan-2009)
Filesystem volume name: <none>
Last mounted on: /share/external/sdzc1
Filesystem UUID: f3f2e855-b198-4d47-b76f-6526d16b0820
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode filetype needs_recovery extent flex_bg sparse_super large_file
huge_file uninit_bg dir_nlink extra_isize
Filesystem flags: signed_directory_hash
Default mount options: (none)
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 122101760
Block count: 488378007
Reserved block count: 0
Free blocks: 89451
Free inodes: 122088914
First block: 0
Block size: 4096
Fragment size: 4096
Reserved GDT blocks: 907
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 8192
Inode blocks per group: 512
Flex block group size: 16
Filesystem created: Sun May 11 13:45:08 2014
Last mount time: Wed Dec 7 11:44:24 2016
Last write time: Wed Dec 7 11:44:24 2016
Mount count: 68
Maximum mount count: 28
Last checked: Fri Feb 20 02:06:42 2015
Check interval: 15552000 (6 months)
Next check after: Wed Aug 19 02:06:42 2015
Reserved blocks uid: 0 (user admin)
Reserved blocks gid: 0 (group administrators)
First inode: 11
Inode size: 256
Required extra isize: 28
Desired extra isize: 28
Journal inode: 8
First orphan inode: 75890825
Default directory hash: half_md4
Directory Hash Seed: 1c7f838c-8614-4af0-8506-cd3659e1e5ac
Directory Magic Number: 0x514E4150
Journal backup: inode blocks
Итак, по моему мнению, имеется 488378007 блоков по 4096 байтов и 122101760 инодов по 256 байтов. Следовательно, для записи должно быть доступно (488378007 x 4096) - (122101760 x 256) байтов. то есть 1969 138 264 064, что составляет 1 922 986 586 КБ.
df показывает всего 1 922 858 380 блоков по 1 тыс., (Разница 128 206), = 480 714 595 блоков по 4 тыс.
Не обращая внимания на это, конечный результат состоит в том, что когда я фактически копирую файлы, даже используя нижний рисунок в качестве начальной точки, «оставшееся пространство», сообщаемое в выводе awk, не равно фактическому оставшемуся пространству, на разное количество , иногда даже полное исчерпание свободного места.
Где я ошибся с логикой? Я знаю, что могу обмануть это, просто уменьшив MAXSIZE, но мне действительно хотелось бы понять, чего мне не хватает!
пс. Я использую это как root, поэтому зарезервированное пространство не имеет значения.
Просто чтобы прояснить реальный вопрос: могу ли я суммировать размеры файлов и каталогов (в целых блоках по 4 КБ), чтобы получить общее использование диска?
Дополнительное редактирование: чтобы еще больше запутать, я только что заполнил (?) диск, и я получаю это от df -k:
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sdzb1 2927209048 2925317912 0 100% /share/external/sdzb1
2927209048-2925317912 = 1891136, или когда я учился в школе!
Два наблюдения:
Вам нужно округлить увеличить количество блоков, используемых файлом, а не уменьшить; если файл имеет длину 8192 + 1 байт, последний байт будет выделять блок размером 4 КиБ. (Поскольку «размер фрагмента» составляет 4 КиБ.)
Дисковое пространство, необходимое для файла, не обязательно равно количеству блоков данных, необходимых для хранения количества байтов в файле. Он может быть немного больше (для больших файлов, которым требуется больше метаданных для сопоставления выделенных им блоков) или меньше (для очень маленьких файлов, которые могут быть полностью сохранены в их индексных дескрипторах). Кроме того, как упоминает пользователь Стивен Китт, существует проблема разреженных файлов , размер которых может быть намного больше, чем пространство, которое они занимают на диске, и которые могут вызывать интересные проблемы при архивировании или копировании на другой диск. файловая система.
Некоторые файловые системы могут использовать некоторое дисковое пространство для своих целей. Кроме того, файловые системы имеют тенденцию к неправильному поведению, когда используемое дисковое пространство приближается к емкости. Вы действительно должны запланировать заполнение ваших дисков не более чем на 98% или 99%.
Я собираюсь ответить на свой вопрос и поблагодарить всех, кто внес свой вклад и руководил моими мыслями:
Из-за того, как пространство распределяется как диск записывается, в зависимости от размера и типа файла, разреженных файлов и т. д., на самом деле очень сложно, если не невозможно, заранее точно предсказать, сколько места будет занято.
Каталоги, из которых были удалены файлы, могут быть больше, чем при первом создании, и это пространство не будет восстановлено. (если каталог не будет удален и воссоздан) Пустые каталоги занимают место.
«Найти» не сообщает о каталогах, если это специально не запрошено.
Пространство записывается полными блоками, размер блока может варьироваться между дисками и может быть прочитан из e2fsdump.
'df' сообщает об отсутствии доступного пространства примерно через 98%, даже если он сообщает о меньшем количестве используемых блоков, чем доступно:
# df -B4k --sync
Filesystem 4K-blocks Used Available Use% Mounted on
/dev/sdzb1 731802262 731493169 0 100% /share/external/sdzb1
/dev/sdzc1 731802262 717225328 0 100% /share/external/sdzc1
'du' сообщает о другом использовании 'df':
# du -B4k -s /share/external/sdzb1 /share/external/sdzc1
731441722 /share/external/sdzb1
717173881 /share/external/sdzc1
Тем не менее, это возможно, используя начальная начальная точка для доступного пространства:
Space = (Total blocks x blocksize) - (Total inodes x inode size)
и допуск от 300 000 до 500 000 блоков для получения достаточно точного результата. (в пределах примерно 1%)