Кажется, я нашел способ приблизить прогресс ext4lazyinit.
TL; DR: см. Сценарий ниже.
Этот метод предполагает, что диск никогда не был отключен (и система не была перезагружена) с самого первого момента монтирования раздела, и что вы записали ровно столько данных, сколько используется на нем (поэтому удаление не требуется) или модификация файлов).
Шаг 1 : Сравните размер раздела в fdisk (в килобайтах) с количеством блоков в 1K, показанных в df. Вычтите (количество блоков 1K) из (размер раздела в килобайтах), чтобы получить (приблизительный размер таблицы inode).
РЕДАКТИРОВАТЬ: Пример, 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
ДФ:
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/workbackup 5813233164 1217095176 4596121604 21% /mnt/backup_work
11720976351 секторов * 512 байт / сектор / 1024 = 5860488175,5 КБ (почти 5,5 ТБ, как говорит fdisk). Минус df 5813233164 равен 47255011,5 кБ (около 45 ГиБ) для приблизительного размера таблицы inode.
Шаг 2 : Получить (всего килобайт записано в раздел):
awk '{ print $3"\t"$10 }' /proc/diskstats
Выберите правильную строку для вашего раздела и преобразуйте его в килобайты.
РЕДАКТИРОВАТЬ: пример:
sdb 260040
sdb1 260040
sdd 2530109116
sdd1 2530108940
Используя sdd1 в моем случае, общее количество записанных килобайт = 2530108940 секторов * 512 байт / сектор / 1024 = 1265054470 килобайт (почти 1,2 ТиБ).
Шаг 3 : Требуется, только если вы уже записали какие-либо данные в файловую систему. Вычтите (число ИСПОЛЬЗОВАННЫХ 1K-блоков, показанное в df) из (общее количество килобайт, записанных в раздел), чтобы получить (приблизительно килобайт, записанное в таблицу inode).
РЕДАКТИРОВАТЬ: пример: примерный килобайт записан в таблицу inode = 1265054470 (из шага 2) - 1217095176 (см. Вывод df в шаге 1) = 47959294 кБ (45,7 ГиБ)
Шаг 4 : Разделите (приблизительно килобайт, записанный в таблицу inode) на (приблизительный размер таблицы inode в килобайтах) и умножьте на 100, чтобы получить прогресс в процентах.
РЕДАКТИРОВАТЬ: пример: приблизительный прогресс = 47959294 / 47255011,5 * 100% = 101,5%
скрипт
Или написать это как частичный скрипт (где я отказываюсь писать скрипт для вызова fdisk по соображениям безопасности):
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") %"
Вызов с $ 1 = "имя раздела" (например, sdd1), $ 2 = "секторы раздела в соответствии с fdisk", $ 3 = "точка монтирования без косой черты"
Результаты теста
Я только один раз проверил свой метод. Настроить:
6 ТБ раздел
шифрование с использованием cryptsetup
файловая система, созданная с параметрами по умолчанию, за исключением -m 0
279 ГБ файлов, записанных в раздел до завершения ext4lazyinit.
Результат : чтение 99,7% на момент завершения :-)
РЕДАКТИРОВАТЬ: тот же диск, после записи почти другого ТиБ данных на него, теперь дает оценку 101,5%. Я думаю, что достаточно точен, чтобы быть полезным.