मुझे लगता है कि ext4lazyinit की प्रगति का अनुमान लगाने का एक तरीका मिल गया है।
TL; DR: नीचे स्क्रिप्ट देखें।
यह विधि मानती है कि विभाजन को माउंट किए जाने के बाद से डिस्क को कभी भी डिस्कनेक्ट नहीं किया गया है (और न ही सिस्टम को रिबूट किया गया है), और यह कि आपने विभाजन पर ठीक उतना ही डेटा लिखा है जितना उस पर उपयोग में है (इसलिए कोई डिलीट नहीं) या फ़ाइलों का संशोधन)।
चरण 1 : df में दिखाए गए 1K- ब्लॉक की संख्या के लिए fdisk (kiB में परिवर्तित) में विभाजन आकार की तुलना करें। प्राप्त करने के लिए (इनकोड तालिका का लगभग आकार) पाने के लिए (kiB में विभाजन आकार) से घटाएँ (1K- ब्लॉक की संख्या)।
संपादित करें: उदाहरण, 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 kiB (लगभग 5.5 TiB, जैसे fdisk कहते हैं)। अनुमानित डायोड टेबल के आकार के लिए माइनस df का 5813233164 बराबर 47255011.5 kiB (कुछ 45 GiB) है।
चरण 2 : प्राप्त करें (विभाजन के लिए लिखा गया कुल kiB):
awk '{ print $3"\t"$10 }' /proc/diskstats
अपने विभाजन के लिए सही लाइन चुनें और इसे kiB में बदलें।
संपादित करें: उदाहरण:
sdb 260040
sdb1 260040
sdd 2530109116
sdd1 2530108940
मेरे मामले में sdd1 का उपयोग करते हुए, कुल kiB लिखा = 2530108940 सेक्टर * 512 बाइट्स / सेक्टर / 1024 = 1265054470 kiB (लगभग 1.2 TiB)।
चरण 3 : केवल तभी आवश्यक है जब आपने पहले से ही फाइल सिस्टम के लिए कोई डेटा लिखा हो। प्राप्त करने के लिए (लगभग kiB से विभाजन के लिए) कुल मिलाकर (1K- ब्लॉक उपयोग किए गए, df में दिखाया गया है) (लगभग kiB इनकोड तालिका में लिखा है)।
संपादित करें: उदाहरण: लगभग kiB इनोड टेबल = 1265054470 (चरण 2 से) लिखा हुआ - 1217095176 (चरण 1 में df आउटपुट देखें) = 47959294 kiB (45.7 GiB)
चरण 4 : (kiB में इनोड तालिका का अनुमानित आकार) द्वारा विभाजित (लगभग kiB इनोड तालिका) और प्रतिशत के रूप में प्रगति प्राप्त करने के लिए 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 टीबी का विभाजन
क्रिप्टसएटअप का उपयोग कर एन्क्रिप्शन
फ़ाइल सिस्टम डिफ़ॉल्ट पैरामीटर को छोड़कर बनाया गया है -m 0
Ext4lazyinit के पूर्ण होने से पहले विभाजन को लिखी गई फ़ाइलों की 279 GiB।
परिणाम : पूरा होने के समय 99.7% का पठन :-)
EDIT: समान डिस्क, डेटा के लगभग एक और TiB लिखने के बाद, अब 101.5% का अनुमान लगाता है। पर्याप्त उपयोगी होने के लिए, मुझे लगता है।