BTRFS 수정할 수없는 오류가있는 파일 찾기


17

BTRFS 파일 시스템에서 복구 할 수없는 오류에 관한 질문이 있습니다. 특히, RAM 스틱 중 하나에 문제가 발생한 후 최근에 BTRFS Scrub을 실행했으며 수정할 수없는 4 개의 오류가있는 것으로 보입니다. 이것은 출력입니다.

scrub status for <UUID>
    scrub started at Thu Dec 25 15:19:22 2014 and was aborted after 89882 seconds
    total bytes scrubbed: 1.87TiB with 4 errors
    error details: csum=4
    corrected errors: 0, uncorrectable errors: 4, unverified errors: 0

운 좋게도 3 차 백업으로 모든 것을 백업 했으므로 파일 손실에 대해 특별히 걱정하지 않습니다 (BTRFS의 실험 상태와 관련된 문제를 잘 알고 있습니다. 데이터를 안전하게 유지하기 위해 여러 백업이 있으며 계속 사용하십시오. "솔루션; BTRFS를 사용하지 마십시오"게시물).

그러나 수정 불가능한 오류와 관련된 파일을 확인하는 방법을 알고 싶습니다. 찾아서 삭제하고 백업 사본으로 교체하고 싶습니다.

누구 든지이 작업을 수행하는 방법에 대한 정보가 있으면 귀하의 의견을 듣고 싶습니다.

미리 감사드립니다.

답변:


8

다음 방법이 유용하다는 것을 알았습니다 ...

btrfs scrub 음량.

위에 표시된대로 여러 가지 csum 오류가 표시됩니다. 오류 세부 사항
예제 사용 : csum = 4 . 다음 명령문 의 꼬리 지시문에 해당 번호를 사용하십시오 .

dmesg | grep "checksum error at" | tail -4 | cut -d\  -f24- | sed 's/.$//'

이 파일에 (예를 관이 밖으로에 편리합니다 > csums.txt)

나는 제안 된 inode 검색 접근법을 많이 시도했지만 성공하면 제한적으로 만났습니다.


내가 이해하는 한, 꼬리를 사용하여 표시된 줄 수를 제한하고 중복을 무시합니다. 다음 sort | uniq과 같이 복제물을 제거 하는 데 사용 하는 것이 좋습니다 .dmesg | grep "checksum error at" | cut -d\ -f24- | sed 's/.$//' | sort | uniq
niklasfi

3

예, INODE 또는 블록 번호에서 파일 이름으로 다시 매핑하는 것은 어려울 수 있습니다. 정말로 관심이 있다면, 이와 같은 것을 시도하고 복사 할 파일 파일을 볼 수 있습니다 ... 결국 파일이 나쁘면 복사 중에 오류가 발생합니다. 이전에이 유형의 기술을 사용했습니다.

 find /mount-point -type f -exec cp {} /dev/null \;

 where mount-point is the ROOT node/mount-point of the affected filesystem

지금 그것을 실행하면, 희망이 생길 것입니다. 조언을 주셔서 감사합니다. 결과에 대해 알려 드리겠습니다.
RedHack

1
그것이 작동하지 않는 것 같습니다 = / = 그것은 수정할 수없는 오류를 일으키는 첫 번째 파일을 찾았지만 메시지를 종료합니다. 파일을 찾았지만 이제는 파일을 제거하는 방법을 알 수 없습니다. BTRFS 메일 링리스트에 연락해야합니다.
RedHack

특수 디렉토리로 이동 한 후 추가 검색에서 제외 할 수 있습니다.
mdpc

1
이동하거나 복사하지 않고 파일 핸들이 오래되었다고 계속 알려줍니다. 난 심지어 ls 수 없습니다.
RedHack

2

dmesg수정할 수없는 체크섬 오류와 관련된 파일에 대한 세부 정보를 제공합니다. 메시지는 일반적으로 다음과 같습니다. "BTRFS : dev [...]의 논리 [...], 섹터 [...], 루트 [...], inode [...], 오프셋 [ ...], 길이 [...], 링크 [...] (경로 : [...]) "; 마지막 정보는 손상된 파일의 절대 경로입니다.


1

BTRFS에서도 "수정할 수없는 오류"를 찾아 여기에 왔습니다. 위의 grep은 저에게 효과가 없었습니다. 대신 사용해야했습니다.

$ dmesg | sed -n -r 's#.*BTRFS.*i/o error.*path: (.*)\)#\1#p' | sort -u
somepath/somefile.txt

경로가 하위 볼륨의 시작과 관련이있는 방법을 확인하십시오. 하위 볼륨이 어떤 것인지 표시하지 않습니다. 운 좋게도 이것은 나에게 문제가되지 않았습니다.


무엇입니까 somepath/somefile.txt? 별도의 명령으로 입력 한 것 같습니다. 입력 한 명령의 출력입니까? 모두 하나의 명령 행으로되어 있다면, 표시 목적으로 명령 행을 분리하지 마십시오. 단 하나의 긴 행으로 응답에 넣으십시오. 그러나 무엇입니까? 두 개의 입력 sort(파이프 및 파일)을 제공하고 있습니까? 아니면 somepath/somefile.txt출력 파일입니까? (다시 사용하고있는 중간 파일이 아니라면 출력 파일을 지정하는 것은 큰 도움이되지 않습니다. 사람들은 결과를 처리하는 방법을 알고 있습니다 (예 : 배관))
Scott

이것이 원래의 질문에 답합니까? 말할 수 없습니다.
Twisty Impersonator

@TwistyImpersonator 글쎄, 그것은 (IMO) Mark의 답변에 대한 대안으로 분명히 의미가 있으며, 8 표를 얻었습니다 (그리고 arrrr의 답변이 확장되었습니다 ).
Scott

1
@Scott 두 번째 줄은 명령의 샘플 출력입니다.
십자군
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.