有没有办法测量 ext4lazyinit 的进度?

有没有办法测量 ext4lazyinit 的进度?

我问了一个关于 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)可以间接测量进度,如下所示:

  1. 您可以获得有关设备和当前正在由 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)。

  1. 您可以获得信息,您的设备上的扇区数是多少(在我的例子中为/dev/md0)。这是可能的,例如使用图形工具“gparted”或通过命令“fdisk -l”。就我而言:

     sudo fdisk -l /dev/md0
    

输出将是这样的:

Festplatte /dev/md0: 5,5 TiB, 5990282952704 Bytes, 11699771392 Sektoren
...
  1. 现在您拥有当前正在处理的扇区数量和扇区中的设备大小,这样你就可以计算 ext4lazyinit 的进度

  2. 将 block_dump 设置回“0”

    echo 0 > /proc/sys/vm/block_dump
    

也可以看看

Für unser eins

答案3

检查这个修补讨论。您可以在没有lazyinit的情况下初始化系统,但无法测量它。如果你有时间等,那就等吧。您可以尝试讨论中的补丁,但根据 Patchwork 的说法,它的状态为“已拒绝”。

相关内容