충돌 후 비정상적으로 높은 블록 수/크기로 인해 e2fsck가 실패함

충돌 후 비정상적으로 높은 블록 수/크기로 인해 e2fsck가 실패함

회로 차단기를 작동시킨 후 내 Raspberry Pi가 커널 패닉으로 부팅을 중지하기 시작했습니다(여기). 이것은 Raspbian을 실행하는 Raspberry Pi이므로 ext4SD 카드의 기본 파티션에서 실행됩니다. 다음을 사용하여 PC에서 복구를 시도했습니다.

sudo e2fsck -f -y -v /dev/sdx2

그러나 이는 결국 이상한 출력으로 인해 실패합니다.

Error writing block 137439060017 (Invalid argument) while getting next inode from scan.  Ignore error? yes
Error reading block 183472412950529 (Invalid argument).  Ignore error? yes
Force rewrite? yes
Error writing block 183472412950529 (Invalid argument) while getting next inode from scan.  Ignore error? yes
Inode 13329, i_size is 4096, should be 549755817984.  Fix? yes
Inode 13607, i_size is 69632, should be 137439023104.  Fix? yes
Error reading block 36983963385857 (Invalid argument).  Ignore error? yes
Force rewrite? yes
Error writing block 36983963385857 (Invalid argument) while getting next inode from scan.  Ignore error? yes
Error reading block 179632729097217 (Invalid argument).  Ignore error? yes
Force rewrite? yes
Error writing block 179632729097217 (Invalid argument) while getting next inode from scan.  Ignore error? yes
Error reading block 17592186080054 (Invalid argument) while reading directory block.  Ignore error? yes
Force rewrite? yes
Error writing block 17592186080054 (Invalid argument) while getting next inode from scan.  Ignore error? yes
Error storing directory block information (inode=17449, block=0, num=134507168): Memory allocation failed
/dev/sdx2: ***** FILE SYSTEM WAS MODIFIED *****
e2fsck: aborted
/dev/sdx2: ***** FILE SYSTEM WAS MODIFIED *****

여기서 걱정해야 할 두 가지가 있습니다.

  • inode 크기와 블록 크기가 엄청나게 높은 것 같습니다(16GB SD 카드에 대해 이야기하고 있습니다).
  • e2fsckMemory allocation failed- 32GB RAM이 장착된 PC에서는 대부분 무료입니다. 실제로 실패하기 전에 사용 가능한 RAM을 차지합니다.

임시 파일 디렉터리를 구성하려고 시도했지만 동일한 결과를 얻었습니다( e2fsck일부 파일이 거기에 기록되었고 대상 디렉터리가 +250GB의 여유 공간이 있는 마운트에 있었습니다. 여유 RAM을 차지하여 실패했습니다).

영향을 받은 파티션의 기본 파일 시스템 매개변수가 일부 손상된 것 같습니다. 그것을 진단하고 제거하는 방법은 무엇입니까?

답변1

e2fsck -fy를 실행하면 마지막 몇 개의 오류 메시지뿐만 아니라 전체 e2fsck 레코드를 저장해야 합니다. 아마도 파일 시스템이 심각하게 손상되었으며 -y 옵션은 어쨌든 계속하라는 의미일 수 있습니다.

블록 그룹 설명자가 심각하게 손상된 것 같습니다. 그래서 inode 테이블 위치가 이상합니다. E2fsck는 아마도 문제를 해결하려고 시도했지만 어떤 이유로든 문제를 해결할 수 없었습니다. "-y"는 그럼에도 불구하고 계속 실행된다는 의미입니다. 따라서 사람들이 버그 보고서를 보낼 때 마지막 몇 가지 오류뿐만 아니라 전체 e2fsck 레코드를 보낼 것을 항상 권장합니다.

답변2

얼른 살펴봤습니다e2fsck 소스, 제 생각에는 어떤 곳에서는"메모리 할당 실패"메모리 할당 오류로 인해 실제로 오류가 발생하지 않을 수도 있습니다.

오류 문자열은 [src]/lib/ext2fs/ext2_err.et.in상수를 기준으로 정의 됩니다 EXT2_ET_NO_MEMORY. 이는 코드의 다양한 위치에서 반환될 수 있습니다 [src]/e2fsck/. 다음은 다음의 예입니다 ea_refcount.c.

errcode_t ea_refcount_increment(ext2_refcount_t refcount, blk_t blk, int *ret)
{
    struct ea_refcount_el   *el;

    el = get_refcount_el(refcount, blk, 1);
    if (!el)
        return EXT2_ET_NO_MEMORY; 

get_refcount_el()같은 파일에서:

static struct ea_refcount_el *get_refcount_el(ext2_refcount_t refcount,
                          blk_t blk, int create)
{
    int low, high, mid;

    if (!refcount || !refcount->list)
        return 0;    

이것이 null을 반환하는 유일한 이유도 아니고 할당 실패와 직접적인 관련이 없는 것으로 보이는 유일한 이유도 아닙니다.

실제로 이를 증명하려면 조금 더 조사해야 하지만 시스템 메모리를 실제로 소모하지 않는다는 귀하의 진술과 일치합니다.

이 경우 문제는 엉망이거나 손상된 SD 카드 컨트롤러의 모호하고 예측할 수 없는 잠재력과 관련이 있을 수 있지만 이를 잡기 위해 일종의 온전한 검사 또는 기타 조치를 취해야 하기 때문에 여전히 e2fsck의 버그에 해당합니다. 문제는 단지 "죄송합니다. 장치가 손상되었습니다"(사실일 가능성이 높음) 또는 "메모리 부족"(사실이 아닐 가능성이 높음)일지라도 마찬가지입니다. 이 문제를 보고할 수 있습니다("이러한 프로그램에서 오류가 발생하면 Ted Ts'o에게 문의하세요.[이메일 보호됨]또는[이메일 보호됨]"-- 저는 TT가 리눅스 커널 개발자라고 생각합니다.) 이 Q&A를 참조하세요.

그 외에는 해당 카드에 있는 내용을 잊어버리고 파괴적인 읽기 및 쓰기 테스트를 수행하는 것이 더 나을 것 같습니다.

badblocks -v -w -b 1048576 -c 16 /dev/sdx

기억하세요, 이것은파괴적인테스트 - 모든 데이터가 손실됩니다. Badblocks는 SD 카드에 대한 실제 불량 블록 목록을 생성하는 데 유용하지 않지만(웨어 레벨링으로 인해 실제 물리적 주소를 보고하지 않음) 카드가 불량인지 알려줄 수 있습니다. 이 방법으로 16GB 카드를 테스트하는 데는 1시간도 채 걸리지 않습니다.

관련 정보