디스크의 원시 비트 시각화

디스크의 원시 비트 시각화

디스크의 원시 비트를 "볼" 수 있는 명령이 있습니까? 즉, 파일 시스템을 무시하고 디스크를 기반으로 문자 그대로 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
    

    내 시스템의 출력(처음 두 줄로 축약됨):

    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호섹터는 (가상) 트랙의 첫 번째 섹터입니다. 대부분 비어 있는 디스크 스킴의 경우 데이터가 소진된 위치가 표시됩니다.

    위의 내용을 첫 번째 섹터 seq로 변경하여 seq 0 16383 $((16383*60))첫 번째 섹터를 표시합니다.61디스크에 트랙이 있습니다.

    스파크라인에 문자당 1바이트만 표시하려면 , 및 로 4294967295 변경 합니다 .255uIuC


    코드 작동 방식에 대한 참고 사항:

    dd보내512바이트데이터 섹터를 부호 없는 정수 od(이해할 수 있는 가장 큰 숫자) 로 출력합니다 spark .

    spark입력에서 계산된 상대 높이를 사용하면(시도해 spark <<< '1 2 3 4'보고 어떻게 작동하는지 확인하세요) 이는 앞에 최대 숫자가 없는 한 서로 다른 선의 크기가 다를 수 있음을 의미합니다. 오해의 소지가 있는 다른 스케일을 피하기 위해 printf올바른 최대값이 미리 사용됩니다. 이는 spark일관된 스케일을 사용하지만 원하지 않는 첫 번째 상위 문자는 나중에 삭제되도록 남겨둡니다 sed.


  2. 유사한 기술을 사용하면 디스크나 파티션의 데이터 밀도에 대한 모호한 개요를 보여줄 수 있습니다. 추상적이기보다는바이트스파크 문자로 변환하고 샘플을 추상화합니다.조각, 또는 오히려 블록 샘플의 상대 압축 비율입니다.

    두 가지 유틸리티가 더 필요합니다:pigz, (대부분의 헤더가 없는 경우주쿠압축) 및pv. pv실제로 선택 사항이지만 진행률 표시줄을 사용하면 기다리는 시간이 덜 지루해집니다.

    암호:

    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, 각 부분의 첫 번째 블록은 압축되어 바이트 수로 pigz파이프 wc되고 결과 숫자 목록이 에 공급됩니다 spark.

    200 spark자는 200의 데이터 밀도를 나타냅니다. 512바이트샘플 블록. 패딩된 문자는 조밀한 데이터가 포함된 블록이며 압축되지 않으며, 짧은 문자는 희박한 데이터이며 압축 가능성이 매우 높습니다.

    s=2000보다 의미 있는 보기로 설정하세요 . 변수는 모두 처음에 있으며 필요에 따라 조정할 수 있습니다. 증가 $b(그러나 형태로512*2^n만) 또는 $c더 큰 샘플을 읽으십시오. 흥미롭게도 표본 크기를 늘리면(읽기8K대신 차단512바이트a) 일반적으로 매우 유사한 스파크라인이 그려집니다.512바이트블락이면 충분해..

답변2

dd if=/dev/sda | hd | less

그러면 디스크의 전체 내용이 한 번에 한 화면씩 16진수로 출력됩니다. 오랫동안 같은 길을 달리다바이트시퀀스가 기록되고 건너뜁니다.

관련 정보