ディスクの生ビットの可視化

ディスクの生ビットの可視化

ディスクの生ビットを「見る」ことができるコマンドはありますか?つまり、ファイルシステムを無視し、ディスクに基づいて文字通り0と1の「大きな画像」を出力します。 (理想的には、テラバイト級の一時保管スペースは不要です。)

私が実際に探しているのは、ディスクセクションに長い繰り返しが含まれているかどうかを簡単に知ることができます。シンプル0all s、all 1s、all 01s、all 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
    

    私のシステムの出力(最初の2行に短縮):

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

    各行はディスクセクタを表します。短い線は小数を表し、長い線は大きな数字を表します。ここの各スパークライン文字は、比較的簡潔な符号なし整数(4バイト)を表します。画面がすべて合わない場合は、most左右の矢印を使用して横にスクロールします。

    空のデータがどのように見えるかを見るには、/dev/sdaに置き換えます/dev/zero

    上記のコードは、ディスクを閲覧するために使用できます。値を変更するだけです seqsudo hdparm -i /dev/sda | grep CurCHS私のシステムからシリンダー(トラック)、ヘッド、およびセクター番号を取得するには、次のものが返されます。

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

    これは16383号セクタは(仮想)トラックの最初のセクタです。ほとんど空のディスクスキームの場合、データが使い果たされた場所が表示されます。

    上記を最初のセクタseqに変更してseq 0 16383 $((16383*60))最初のセクタを表示します。61ディスクにトラックがあります。

    スパークラインに文字ごとに1バイトのみを表示するには、およびに4294967295 変更します。255uIuC


    コードの仕組みに関する注意事項:

    dd送る512バイトデータセクタを符号なし整数od(理解できる最大数)として出力しますspark

    spark入力で計算された相対的な高さを使用すると(試してみて、どのように機能するかをspark <<< '1 2 3 4'確認してください)、これは前に最大数がない限り、異なる線のサイズが異なる可能性があることを意味します。誤解を招く他のスケールを避けるために、printf正しい最大値が事前に使用されます。これはspark一貫したスケールを使用しますが、望ましくない最初の親文字は後で削除されるようにしますsed


  2. 同様の技術を使用すると、ディスクまたはパーティションのデータ密度のあいまいな概要を表示できます。抽象的ではなくバイト火花文字に変換し、サンプルを抽象化します。彫刻、またはむしろブロックサンプルの相対圧縮比です。

    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
    

    出力(私のHDデバイスから):

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

    ハードドライブは$d200()の部分に分割され$s、各部分の最初のブロックは圧縮されてバイト数にパイプされ、結果の数字のリストpigzwcに供給されますspark

    200spark文字は 200 のデータ密度を表します。 512バイトサンプルブロック。パディングされた文字は密なデータを含むブロックであり、圧縮されず、短い文字は希薄なデータであり、圧縮の可能性が非常に高いです。

    s=2000より意味のあるビューに設定してください。変数はすべて最初にあり、必要に応じて調整できます。増加$b(ただし形で512*2^nのみ)または$cより大きなサンプルをお読みください。興味深いことに、サンプルサイズを増やすと(読む8K代わりにブロック512バイトa) 通常、非常に類似したスパークラインが描かれます。512バイトブロックなら十分です..

おすすめ記事