파일에서 단일 비트를 뒤집는 방법은 무엇입니까? 이 기사에서는 파일 시스템을 제거하고

btrfs가 스스로 치료할 수 있다는 주장 을 테스트하기 위해 의도적으로 파일을 손상시키고 싶습니다 . 이 기사에서는 파일 시스템을 제거하고 단일 비트를 “충돌”한 다음 다시 마운트하여 사진을 손상시키는 방법에 대해 설명합니다. 오래된 파일 시스템에서는 이것이 손상되었지만 btrfs로 자체 수정해야합니다. 이론적으로 이것은 의미가 있지만 실제로 테스트하고 싶습니다.

문제는 기사에서 그 방법 을 설명하지 않는다는 것 입니다.
파일 시스템의 특정 부분에서 단일 비트를 변경하는 방법은 무엇입니까?

또한 btrfs가 내 쓰기를 의도적으로 보지 않도록 오프라인 파일 시스템 에서이 작업을 수행 해야 한다고 지적 해야합니다 .

편집 : btrfs에 대한 질문 (및 토론)이 많이 있지만, 이러한 종류의 손상을 구현하는 파일 시스템 독립 방법이 있는지 알고 싶습니다 (따라서 다른 RAID 유형 / 컨트롤러 등을 통해 비교할 수 있음).



답변

나는 전문가가 아니지만 btrfs-progs패키지에는 실제로이 작업을 수행하기위한 도구가 포함되어 있지만 소스에서 빌드해야 할 수도 있습니다. 어쨌든 일단 설치하거나 빌드 한 후에는 btrfs 개발자가 파일 시스템을 테스트하는 데 btrfs-progs사용하는 도구를 사용할 수 있어야 btrfs-corrupt-block합니다.

내가 말했듯이, 나는 btrfs를 가지고 놀 시간이 많지 않았 으므로이 도구의 정확한 사용법을 모른다. 그러나 오프라인 파일 시스템을 손상시킬 수 있어야합니다. 오프라인 파일 시스템은 손상된 파일을 읽을 때 수정됩니다 (RAID 또는 다른 사본을 사용하도록 설정 한 경우).


답변

  1. 블록 장치에서 단일 섹터의 값을 가져옵니다 (예 : /dev/sda1백만 개의 오프셋 오프셋 (예 :)).

    sudo dd if=/dev/sda1 of=/root/mysector bs=512 count=1 skip=1M
    

    이 임의의 1M * 512 바이트 오프셋은 파일 시스템의 메타 데이터 부분과 데이터가 포함 된 섹터에 있는지 확인하기위한 것입니다.

  2. 16 진 편집기로 컨텐츠를 변경하여 원시 섹터 데이터를 편집하십시오. 예를 들어 , Linux에 적합한 16 진 편집기 필요 .

  3. ifof인수를 반대로 하여 드라이브의 섹터를 다시 넣으십시오 .

    sudo dd if=/root/mysector of=/dev/sda1 bs=512 count=1 seek=1M
    

답변

@Oli-안녕하세요, 저는 그 기사를 실제로 쓴 Jim Salter입니다. 가상 머신을 사용하여 작업을 단순화했습니다. 내가 한 일은 JPEG 파일로 시작하여 16 진수 편집기에서 열었습니다. 내가 사용한 특정 것은 Bless였습니다. 간단한 apt-get install bless 로 우분투에 설치할 수 있습니다 .

Bless에서 JPEG를 연 후 JPEG의 “고기”에 잘 들어가기 위해 페이지를 몇 번 눌렀다가 약 50 바이트 분량의 데이터를 강조 표시 한 다음 텍스트 편집기에 복사하여 붙여 넣었습니다. 사례, gEdit). 이것은 나에게 검색 할 무언가를 주었다.

이제 JPEG를 VM의 각 배열에 저장했습니다. 어레이 뒤의 스토리지는 일련의 .qcow2 파일입니다. JPEG를 배열에 저장 한 후에는 각 배열과 관련된 .qcow2 파일을 Bless에로드하여 검색 할 수있었습니다. 파일 크기는 그다지 크지 않았으며 JPEG 및 일부 메타 데이터는 아니 었습니다. JPEG에서 강조 표시하고 복사했습니다. Voila, 나는 타락 할 블록이 있었다! 이 시점에서 Bless를 사용하여 VM의 가상 디스크에 저장된 JPEG의 개별 바이트를 수동으로 편집 할 수 있었으며, 각 어레이 에서 정확히 동일한 방식 으로 그렇게 할 수있었습니다 .

유일한 주름은 기사에서 테스트 된 RAID5 어레이의 경우 스트라이프 자체의 패리티가 아니라 스트라이프의 실제 데이터 사본을 편집했는지 확인해야한다는 것입니다. 그렇지 않으면 빈 배열이므로 스트라이프의 FOLLOWING 블록에 데이터가 없으므로 패리티 블록에 데이터 블록에서 변경되지 않은 데이터가 포함됩니다. 실수로 데이터 블록 대신 패리티 블록을 편집 한 경우 이미지가 변경되지 않은 것으로 나타납니다.

마지막 참고 사항-가상 머신이 필요하지 않습니다. 베어 메탈과 동일한 방식으로 동일한 작업을 수행 할 수 있습니다. 멋진 작은 .qcow2 파일 대신 전체 원시 드라이브로 작업해야하고 드라이브를 당겨 다른 컴퓨터에 넣어야하기 때문에 엉덩이가 더 고통 스럽습니다. 또는 실제 환경 (또는 대체 환경)으로 부팅하여 엉망으로 만듭니다. (저는 ZFS의 데이터 치유를 정확히 이런 방식으로 테스트했지만 7 년 전 차세대 파일 시스템에 처음 관심을 보였던 실제 베어 메탈 머신에서 테스트했습니다.)

이것이 도움이되기를 바랍니다!


답변

열린 파일에서 수행 할 작은 프로그램을 시도 할 수 있습니다.FIBMAP ioctl(2)

빠른 웹 검색 으로이 블로그 게시물 http://smackerelofopinion.blogspot.tw/2009/06/fibmap-ioctl-file-system-block-number.html 이 작업을 수행하는 방법을 자세히 설명했습니다. 컴파일하고 실행할 수있는 샘플 프로그램에

$ git clone git://kernel.ubuntu.com/cking/debug-code
$ cd debug-code/block-mapper-fibmap
$ make
$ sudo ./fibmap /path/to/your/image-file.jpg

이것은 hdparm --fibmap@falconer가 언급 한 것과 정확히 일치하는 방식 입니다.

블록 번호를 찾은 후 dd@gertvdijk가 스케치 한 것처럼 gongfu를 사용 하여 파일을 수정할 수 있습니다. 또는 fibmap.c파일 시스템 계층을 우회하여 장치 파일에 직접 쓰기 (프로그램에 대한 세 가지 매개 변수 : 1. 파일 경로, 2. 파일을 포함하는 장치 파일) 시스템, 3. 수정하려는 오프셋 및 비트).

( 면책 조항 :FIBMAP ioctl(2) 루프백 장치 또는 btrfs 파일 시스템에서 파일에 대한 작동 여부를 테스트하지 않았으며 보장 할 수는 없지만 강력하게 기대합니다. 파일에서 수행하기 전에 장치 유형을 검사하여 추측 합니다. 실패.)hdparmioctl(2)


답변

sudo hdparm --fibmap /PATH/TO/FILE

파일이 위치한 LBA를 제공합니다. 이 후 @gertvdijk의 답변을 사용할 수 있습니다.