Я, здається, знайшов спосіб наблизити хід ext4lazyinit.
TL; DR: див. Сценарій нижче.
Цей метод передбачає, що диск ніколи не був відключений (і система не перезавантажувалася) з першого разу, коли розділ був змонтований, і що ви записали стільки даних, скільки в ньому використовується, (тому жодного видалення або модифікація файлів).
Крок 1 : Порівняйте розмір розділу в fdisk (перетворений в kiB) до кількості 1K-блоків, показаних у df. Відніміть (кількість 1К-блоків) з (розмір розділу в кіБ), щоб отримати (приблизний розмір таблиці inode).
EDIT: Приклад, 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 сектори * 512 байт / сектор / 1024 = 5860488175,5 кіБ (майже 5,5 TiB, як каже fdisk). Мінус df's 5813233164 дорівнює 47255011,5 kiB (приблизно 45 GiB) для приблизного розміру таблиці inode.
Крок 2 : Отримайте (загальний кіБ, записаний у розділ):
awk '{ print $3"\t"$10 }' /proc/diskstats
Виберіть правильний рядок для свого розділу та перетворіть його в кіБ.
EDIT: приклад:
sdb 260040
sdb1 260040
sdd 2530109116
sdd1 2530108940
Використовуючи sdd1 в моєму випадку, загальна кількість kiB записано = 2530108940 секторів * 512 байт / сектор / 1024 = 1265054470 kiB (майже 1,2 TiB).
Крок 3 : Необхідний лише у тому випадку, якщо ви вже записали будь-які дані у файлову систему. Віднімаємо (кількість 1К-блоків, використаних, показаних у df) від (загальний кіБ, записаний у розділ), щоб отримати (приблизно kiB записано в таблицю inode).
EDIT: приклад: приблизний kiB, записаний у таблицю inode = 1265054470 (з кроку 2) - 1217095176 (див. Вихід df на кроці 1) = 47959294 kiB (45,7 GiB)
Крок 4 : Розділіть (приблизно kiB, записаний у таблицю inode) на (приблизний розмір таблиці inode в kiB) і помножте на 100, щоб отримати прогрес у відсотках.
EDIT: приклад: приблизний прогрес = 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 GiB файлів, записаних на розділ до завершення ext4lazyinit.
Результат : читання 99,7% на момент завершення :-)
EDIT: той самий диск, після запису майже іншого TiB даних, тепер дає оцінку в 101,5%. Думаю, досить точний, щоб бути корисним.