디스크의 원시 비트를 "볼" 수 있는 명령이 있습니까? 즉, 파일 시스템을 무시하고 디스크를 기반으로 문자 그대로 0과 1의 "큰 그림"을 출력합니다. (이상적으로는 테라바이트급의 임시 저장 공간이 필요하지 않습니다.)
내가 실제로 찾고 있는 것은 디스크 섹션에 긴 반복이 포함되어 있는지 쉽게 알 수 있는 방법입니다.단순한0
all s, all 1
s, all 01
s, all 0101011
s 등과 같은 시퀀스.
이를 수행하는 가장 좋은 방법은 무엇입니까?
답변1
스파크라인도움이 될 수도 있습니다... 먼저spark
공익사업설치하고most
텍스트 뷰어.
이 핵은 첫 번째에 대한 추상적인 관점을 보여줍니다.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
변경 합니다 .255
uI
uC
코드 작동 방식에 대한 참고 사항:
dd
보내512바이트데이터 섹터를 부호 없는 정수od
(이해할 수 있는 가장 큰 숫자) 로 출력합니다spark
.spark
입력에서 계산된 상대 높이를 사용하면(시도해spark <<< '1 2 3 4'
보고 어떻게 작동하는지 확인하세요) 이는 앞에 최대 숫자가 없는 한 서로 다른 선의 크기가 다를 수 있음을 의미합니다. 오해의 소지가 있는 다른 스케일을 피하기 위해printf
올바른 최대값이 미리 사용됩니다. 이는spark
일관된 스케일을 사용하지만 원하지 않는 첫 번째 상위 문자는 나중에 삭제되도록 남겨둡니다sed
.유사한 기술을 사용하면 디스크나 파티션의 데이터 밀도에 대한 모호한 개요를 보여줄 수 있습니다. 추상적이기보다는바이트스파크 문자로 변환하고 샘플을 추상화합니다.조각, 또는 오히려 블록 샘플의 상대 압축 비율입니다.
두 가지 유틸리티가 더 필요합니다:
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% ▇███▁█▂██▃█▆▂▂██▃▆███▆█▅▁█████▇▂▇▂▁▇▂▂▂▆▄█▃▅█▁▄█▃▅▅▅▃▃▂▅ ▃▂█▆▅▇▁▅▃▆▄▁█▃▇▁▁▂▂▅█████▇█████████▆█████████▅█▁████████ ███████████████████████▆███████▆██▃███████▁████████▂███▂ ▁▁▁▁▂▂▂▂██████████▁█▁▁▅▃▁▃█▂▅▄▅▁▁
하드 드라이브는
$d
200( )개의 부분으로 나누어지고$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진수로 출력됩니다. 오랫동안 같은 길을 달리다바이트시퀀스가 기록되고 건너뜁니다.