咨询从磁盘末尾扫描至首个非零位置的MB数统计方法及对应命令
咨询从磁盘末尾扫描至首个非零位置的MB数统计方法及对应命令
我明白你现在需要的是从磁盘末尾向前扫描,找到第一个非零字节的位置,然后算出这个位置距离磁盘末端有多少MB——就像你举的例子:128GB磁盘,最后100MB才出现非零数据,要得到这个100MB的结果对吧?结合你用的Kubuntu 22.04环境,我给你整理一套可行的方法和命令:
一、核心思路
我们没法直接让dd从磁盘末尾倒着读,但可以通过计算磁盘总扇区数,从最后一块开始逐步向前读取小块数据,检查是否全零,直到找到第一个包含非零数据的块,最后换算成MB数。
二、具体实现命令
这里用扇区(默认512字节)作为基本单位,因为磁盘大小统计通常以扇区为基准,计算更准确。
步骤1:先获取目标磁盘的总扇区数
先拿到目标磁盘(比如/dev/sdb)的总扇区数,用blockdev命令:
DISK="/dev/sdb" TOTAL_SECTORS=$(sudo blockdev --getsz "$DISK")
步骤2:逆向扫描找第一个非零块
我们每次读取1MB大小的块(也就是2048个扇区,因为1MB=1024×1024=2048×512),从磁盘最后一块开始逐步向前跳,直到找到第一个非零块:
# 每次扫描的块大小:1MB = 2048扇区 BLOCK_SECTORS=2048 # 从最后一个MB块开始 CURRENT_SECTOR=$((TOTAL_SECTORS - BLOCK_SECTORS)) while true; do # 读取当前位置的1MB数据,检查是否全零 sudo dd if="$DISK" bs=512 count="$BLOCK_SECTORS" skip="$CURRENT_SECTOR" 2>/dev/null | grep -qv '\x00' if [ $? -eq 0 ]; then # 找到非零块,计算距离末尾的MB数 MB_FROM_END=$(((TOTAL_SECTORS - CURRENT_SECTOR) / 2048)) echo "第一个非零位置距离磁盘末尾:$MB_FROM_END MB" break fi # 当前块全零,向前跳1MB CURRENT_SECTOR=$((CURRENT_SECTOR - BLOCK_SECTORS)) # 防止扫描到磁盘开头 if [ "$CURRENT_SECTOR" -lt 0 ]; then echo "整个磁盘都是全零" break fi done
三、命令细节解释
blockdev --getsz "$DISK":获取磁盘总扇区数,每个扇区默认512字节,这是磁盘硬件层面的标准单位。dd if="$DISK" bs=512 count="$BLOCK_SECTORS" skip="$CURRENT_SECTOR":从指定扇区位置读取1MB的数据,2>/dev/null是屏蔽dd的冗余输出。grep -qv '\x00':检查读取的数据中是否存在非零字节,如果有,grep返回0,说明找到了目标块。MB_FROM_END计算:用总扇区数减去非零块的起始扇区,再除以2048(每个MB对应的扇区数),得到距离磁盘末尾的MB数。
四、优化建议(可选)
如果你想加快扫描速度,可以把每次扫描的块调大(比如4MB、8MB),只需要修改BLOCK_SECTORS的值:比如4MB就是BLOCK_SECTORS=8192(4×2048),这样扫描更快,但精度会稍微降低(得到的是近似MB数)。
如果需要更精确到字节的位置,可以把最后找到的非零块拆成更小的单位(比如1扇区)再扫描一次,不过一般MB级的精度足够你的需求了。
备注:内容来源于stack exchange,提问作者joseph22
相关产品推荐
相关产品推荐

