내 Android 휴대폰의 f2fs 파티션이 최근에 손상되었습니다. 여전히 잘 설치되지만 /data/media/0
현재 비어 있는 것처럼 보이는 하나의 디렉토리( ) 에 액세스할 수 없습니다 . 그러나 디스크 공간은 전혀 변경되지 않았습니다.
터미널에서 실행하면 fsck.f2fs
마운트된 파일 시스템 검사를 거부합니다. 데이터 파티션을 마운트 해제하거나 읽기 전용으로 다시 마운트할 수 없습니다. 아름다운. 복구 모드로 재부팅한 후 파티션이 마운트되지 않고 실행 시 다음 메시지가 표시됩니다 fsck.f2fs
.
~ # fsck.f2fs /dev/block/mmcblk0p39
Info: sector size = 512
Info: total sectors = 21425920 (in 512bytes)
Assertion failed!
[fsck_chk_dentry_blk: 563] le32_to_cpu(de_blk->dentry[i].hash_code) == hash_code
그래서 여전히 도움을 거부하고 이제 모호한 오류로 인해 실패합니다... stat
디렉토리는 다음을 제공합니다.
root@victara:/ # stat /data/media/0
File: `/data/media/0'
Size: 4096 Blocks: 24 IO Blocks: 4096 directory
Device: 10307h/66311d Inode: 4 Links: 35
Access: (770/drwxrwx---) Uid: (1023/media_rw) Gid: (1023/media_rw)
Access: 2016-04-04 16:55:56.800148001
Modify: 2016-04-05 02:47:44.314999998
Change: 2016-04-05 02:47:44.314999998
inode(숫자?)가 낮은 것 같아서... 다른 디렉토리를 확인했습니다.
root@victara:/ # stat /data/media/
File: '/data/media/'
Size: 4096 Blocks: 16 IO Block: 4096 directory
Device: 10307h/66311d Inode: 4078 Links: 4
Access: (0770/drwxrwx---) Uid: ( 1023/media_rw) Gid: ( 1023/media_rw)
__bionic_open_tzdata: couldn't find any tzdata when looking for localtime!
__bionic_open_tzdata: couldn't find any tzdata when looking for GMT!
__bionic_open_tzdata: couldn't find any tzdata when looking for posixrules!
Access: 2016-04-04 14:48:25.000000000
Modify: 1970-01-01 02:27:21.000000000
Change: 1970-02-07 02:30:36.000000000
root@victara:/ # stat /data/media/obb
File: `/data/media/obb'
Size: 4096 Blocks: 16 IO Blocks: 4096 directory
Device: 10307h/66311d Inode: 4080 Links: 3
Access: (775/drwxrwxr-x) Uid: (1023/media_rw) Gid: (1023/media_rw)
Access: 1970-01-01 03:27:21.519999999
Modify: 2016-03-17 22:38:30.505748550
Change: 2016-04-04 17:42:31.569999988
/data/media
상위 디렉터리( )에는 inode 4078이 있고 /data/media/obb
상위 디렉터리( )의 다른 하위 디렉터리에는 inode 4080이 있는 것 같습니다 . 따라서 논리적으로는 /data/media/0
inode 4079가 있어야 하지만 stat
inode 4가 있다고 알려줍니다.
따라서 파일 시스템 메타데이터가 손상된 것 같습니다. 및 fsck.f2fs
( 슬프게도 f2fs는 존재하지 않음) 의 도움 없이 debugfs
상당히 작은 Linux 환경(Android 복구)에서 inode 번호를 수정하거나 데이터에 대한 액세스를 복원하기 위해 수행할 수 있는 다른 방법이 있습니까?
흥미롭게도 디렉토리는 여전히 디스크 공간을 차지하고 있으며 "비어 있지 않은" 것으로 간주되어 삭제할 수 없습니다.
root@victara:/data/media # rm -rf 0
rm: 0: Directory not empty
1|root@victara:/data/media # ls
0 obb
root@victara:/data/media # ls -al 0
total 0
중요: 휴대폰과 저장 공간이 필요하고 파티션을 다시 포맷해야 하므로 더 이상 솔루션을 테스트할 수 없습니다.
답변1
Assertion failed!
[fsck_chk_dentry_blk: 563] le32_to_cpu(de_blk->dentry[i].hash_code) == hash_code
"어설션 실패"는 프로그램의 내부 오류를 의미하며, 이 경우 fsck.f2fs
기본적으로 프로그래머가 항상 true라고 기대했던 것이 실제로는 그렇지 않았음을 의미합니다.
프로덕션 수준 프로그램은 항상 오류를 처리해야 합니다.무엇"어설션 실패" 메시지보다 낫습니다. 적어도 더 설명적인 오류 메시지를 제공해야 합니다. 때때로 "어설션 실패" 오류는 개발자가 알고 있지만 아직 구현하지 않은 드문 상황이 발생했음을 의미합니다.
이 경우 유일한 옵션은 사용 가능한 최신 버전의 프로그램이 있는지 확인하고 이와 같은 상황을 합리적인 방식으로 처리할 수 있도록 업데이트되기를 바라는 것입니다. 최신 버전이 업스트림 개발자의 소스 코드 형식으로만 제공되고 문제가 해결되는 경우 배포판이 업데이트된 버전을 패키지해야 함을 나타내는 버그 보고서를 Linux 배포판 관리자에게 보내야 할 수도 있습니다. 관련 패치.
업스트림 개발자의 최신 소스 코드 버전에서도 문제가 처리되지 않으면 개발자에게 버그 보고서를 보내야 할 때입니다.