我问了一个关于 ext4lazyinit 的问题这里。根据我所阅读和理解的内容,它只是允许您开始使用硬盘,而无需为文件系统创建所有索引节点。
您知道或可以衡量的唯一方法是ext4lazyinit
监控iotop
。有没有办法以百分比形式获取其进度?
答案1
我似乎找到了一种方法来近似 ext4lazyinit 的进度。
长话短说:参见脚本以下。
此方法假设自第一次挂载分区以来磁盘从未断开连接(也没有重新启动系统),并且您向该分区写入的数据量与该分区正在使用的数据量完全相同(因此不会删除或修改文件)。
步骤1:将 fdisk 中的分区大小(转换为 kiB)与 df 中显示的 1K 块数进行比较。从(分区大小(以 kiB 为单位))减去(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
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),即 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:仅当您已将任何数据写入文件系统时才需要。从(写入分区的总 kiB)减去(已使用的 1K 块数,在 df 中显示)即可得到(写入 inode 表的大约 kiB)。
编辑:示例:写入 inode 表的近似 kiB = 1265054470(来自步骤 2)- 1217095176(请参阅步骤 1 中的 df 输出)= 47959294 kiB (45.7 GiB)
步骤4:将(写入 inode 表的大约 kiB)除以(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 =“不带尾部斜杠的挂载点”
检测结果
我的方法只测试过一次。设置:
6TB分区
使用 cryptsetup 进行加密
使用除 -m 0 之外的默认参数创建的文件系统
在 ext4lazyinit 完成之前,已向分区写入 279 GiB 文件。
结果:完成时读数为 99.7% :-)
编辑:同一个磁盘,在向其写入几乎另一个 TiB 数据后,现在的估计产量为 101.5%。我认为足够准确,很有用。
答案2
(你会看到,英语不是我的母语)
至少在基于 Ubuntu 的系统中(我使用 ZorinOS 15)可以间接测量进度,如下所示:
- 您可以获得有关设备和当前正在由 ext4lazyinit 处理的扇区的信息。
a) 因此你必须在 /proc/sys/vm/block_dump 中写入“1”。 (重要的是:如果你准备好工作,你必须将 block_dump 设置回“0”):
echo 1 > /proc/sys/vm/block_dump
b) 然后你通过以下方式获取信息
tail -f /var/log/syslog | grep ext4
输出将类似于(也许你必须等待,直到 ext4lazyinit 访问设备):
May 7 13:19:59 xxx kernel: [ 1130.643118] ext4lazyinit(1070): WRITE block 9235888384 on md0 (2048 sectors)
May 7 13:20:01 xxx kernel: [ 1132.594961] ext4lazyinit(1070): WRITE block 9235890432 on md0 (2048 sectors)
May 7 13:20:01 xxx kernel: [ 1132.632755] ext4lazyinit(1070): WRITE block 9235892480 on md0 (2048 sectors)
您会看到 ext4lazyinit 正在运行的当前扇区(块 9235892480)和设备(md0)。
您可以获得信息,您的设备上的扇区数是多少(在我的例子中为/dev/md0)。这是可能的,例如使用图形工具“gparted”或通过命令“fdisk -l”。就我而言:
sudo fdisk -l /dev/md0
输出将是这样的:
Festplatte /dev/md0: 5,5 TiB, 5990282952704 Bytes, 11699771392 Sektoren
...
现在您拥有当前正在处理的扇区数量和扇区中的设备大小,这样你就可以计算 ext4lazyinit 的进度。
将 block_dump 设置回“0”
echo 0 > /proc/sys/vm/block_dump
答案3
检查这个修补讨论。您可以在没有lazyinit的情况下初始化系统,但无法测量它。如果你有时间等,那就等吧。您可以尝试讨论中的补丁,但根据 Patchwork 的说法,它的状态为“已拒绝”。