ฉันดูเหมือนจะได้พบวิธีประมาณความคืบหน้าของ ext4lazyinit
TL; DR: ดูสคริปต์ด้านล่าง
วิธีนี้จะถือว่าดิสก์ไม่เคยถูกตัดการเชื่อมต่อ (และไม่มีการรีบูทระบบ) ตั้งแต่ครั้งแรกที่มีการติดตั้งพาร์ติชันและคุณได้เขียนข้อมูลลงในพาร์ติชั่นเท่าที่มีการใช้งานจริง (ดังนั้นจึงไม่มีการลบ หรือการดัดแปลงไฟล์)
ขั้นตอนที่ 1 : เปรียบเทียบขนาดพาร์ติชันใน fdisk (แปลงเป็น kiB) กับจำนวนบล็อก 1K ที่แสดงใน df ลบออก (จำนวนบล็อก 1K) จาก (ขนาดพาร์ติชันเป็น kiB) เพื่อรับ (ขนาดโดยประมาณของตาราง 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
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 พูด) 5813233164 ลบ df เท่ากับ 47255011.5 kiB (บาง 45 GiB) สำหรับขนาดตาราง inode โดยประมาณ
ขั้นตอนที่ 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 : จำเป็นเฉพาะเมื่อคุณได้เขียนข้อมูลใด ๆ ไปยังระบบไฟล์แล้ว ลบออก (จำนวนบล็อก 1K ที่ใช้แสดงในรูป df) จาก (kiB ทั้งหมดที่เขียนไปยังพาร์ติชัน) เพื่อรับ (ประมาณ kiB เขียนไปยังตาราง inode)
แก้ไข: ตัวอย่าง: kiB โดยประมาณที่เขียนลงในตาราง inode = 1265054470 (จากขั้นตอนที่ 2) - 1217095176 (ดู df เอาต์พุตในขั้นตอนที่ 1) = 47959294 kiB (45.7 GiB)
ขั้นตอนที่ 4 : หาร (ประมาณ kiB เขียนไปยังตาราง inode) โดย (ขนาดโดยประมาณของตาราง inode ในหน่วย 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 TB
การเข้ารหัสโดยใช้ cryptsetup
ระบบไฟล์ที่สร้างด้วยพารามิเตอร์ดีฟอลต์ยกเว้น -m 0
ไฟล์ 279 GiB ที่เขียนไปยังพาร์ติชันก่อนที่ ext4lazyinit จะเสร็จสิ้น
ผลลัพธ์ : การอ่าน 99.7% ณ เวลาที่ดำเนินการเสร็จ :-)
แก้ไข: ดิสก์เดียวกันหลังจากที่เขียนข้อมูลไปยัง TiB อีกเกือบหนึ่งตอนนี้ให้ผลการประเมินที่ 101.5% แม่นยำพอที่จะเป็นประโยชน์ฉันคิดว่า