可视化磁盘的原始位

可视化磁盘的原始位

有没有一个命令可以让我“查看”磁盘的原始位?换句话说,忽略文件系统并根据磁盘输出文字零和一的“大图片”。 (理想情况下不需要 TB 大小的临时存储。)

我实际上正在寻找的是一种轻松判断磁盘部分是否包含长重复的方法简单的序列,如所有0s、所有1s、所有01s、所有0101011s 等等。

执行此操作的最佳方法是什么?

答案1

迷你图可能有帮助...首先得到spark实用程序并安装most文本查看器

  1. 这个黑客展示了第一个的抽象视图61的部门 /dev/sda:

    for f in `seq 0 1 60` ; do :
        printf "%.03i %s\n" $f \
            $({   printf '4294967295\n'
                  sudo dd if=/dev/sda skip=$f bs=512 count=1 2> /dev/null |
                  od -v -A n -t uI ; } | 
               spark | sed 's/^.//' )
    done | most
    

    我的系统上的输出(缩写前两行):

    000 ▁▁▁▃▆▆▁▁▄▇▂▆▁▁▆▁▁▁▄▄▄▁ ...
    001 ▁▆▃▇▂▁▁▁▄▃▆▂▄▂▁▁▁▁▁▁▁▂ ...
    

    每行代表一个磁盘扇区。短线代表小数,长线代表大数。这里的每个迷你图字符代表一个无符号整数(4个字节),相对紧凑。如果屏幕不能全部显示most,请使用向右和向左箭头横向滚动。

    要查看空数据的样子,请将 替换/dev/sda/dev/zero

    上面的代码可用于浏览磁盘,只需更改值即可 seq。用于sudo hdparm -i /dev/sda | grep CurCHS获取柱面(磁道)、磁头和扇区号,在我的系统上返回:

    CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=312581808
    

    这意味着每一个16383号扇区是(虚拟)磁道的第一个扇区。对于大部分空白的磁盘略读,这些将显示数据耗尽的位置。

    将上面的内容更改seqseq 0 16383 $((16383*60))将显示第一个的第一个扇区61磁盘上的轨道。

    要使迷你图仅显示每个字符 1 个字节,请更改4294967295255uIuC


    关于代码如何工作的注释:

    dd发送一个512字节输出无符号整数的数据扇区od,这是可理解的最大数字spark

    spark使用根据输入计算出的相对高度(尝试spark <<< '1 2 3 4'看看它是如何工作的),这意味着除非存在前导最大数字,否则不同的线可能具有不同的比例。为了避免误导不同的比例,printf用于预先考虑正确的最大值,这使得spark使用一个一致的比例,但留下了不需要的第一个高字符,稍后用 删除sed


  2. 类似的技术可以显示磁盘或分区的数据密度的模糊概览。而不是抽象一些字节转化为火花字符,抽象出一个样本,或者更确切地说是块采样的相对压缩比。

    还需要两个实用程序:pigz,(对于大多数无标头的兹库压缩),以及pvpv确实是可选的,但是进度条使等待变得不那么乏味。

    代码:

    d=sda b=512 c=1 m=$(( (512*$(</sys/block/${d/s???*/${d%%[0-9]*}/$d}/size))/b )) \
    s=200 i=$((m/s)) ; \
    for ((f=0;f<m;f+=i)) ; do 
       sudo dd if=/dev/${d} skip=$f bs=$b count=$c 2> /dev/null | 
       pigz -9z | 
       wc -c
    done | pv -l -s $s -i "0.1" \
              -F 'Read %b of '"$((s+1)) $((b*c))-byte"' blocks %p%e' | 
    spark
    

    输出(在我的高清设备上):

    Read  201  of 201 512-byte blocks [=====================================>] 100%
    ▇███▁█▂██▃█▆▂▂██▃▆███▆█▅▁█████▇▂▇▂▁▇▂▂▂▆▄█▃▅█▁▄█▃▅▅▅▃▃▂▅
    ▃▂█▆▅▇▁▅▃▆▄▁█▃▇▁▁▂▂▅█████▇█████████▆█████████▅█▁████████
    ███████████████████████▆███████▆██▃███████▁████████▂███▂
    ▁▁▁▁▂▂▂▂██████████▁█▁▁▅▃▁▃█▂▅▄▅▁▁
    

    硬盘驱动器$d分为 200 ( $s) 个部分,每个部分的第一个块用 进行压缩pigz,通过管道传输到wc字节计数,并将生成的数字列表馈送到spark

    200个spark字符代表200的数据密度 512字节样本块。填充的字符是具有密集数据的块,不会压缩,较短的字符是稀疏数据,非常可压缩。

    设置s=2000为更有意义的视图。变量都在开始处,可以根据需要进行调整。增加$b(但形式为512*2^n仅)或$c读取更大的样本。有趣的是,增加样本量(阅读8K阻止而不是512字节一)通常会绘制一条非常相似的迷你图,这意味着512字节块已经足够好了...

答案2

dd if=/dev/sda | hd | less

这将以十六进制输出磁盘的全部内容,一次全屏。长时间运行相同的字节顺序将被记录并跳过。

相关内容