microSD 카드 백업(Raspberry Pi)에는 원래 파일 시스템이 괜찮아 보이지만 항상 손상된 ext4 파일 시스템이 있습니다.

microSD 카드 백업(Raspberry Pi)에는 원래 파일 시스템이 괜찮아 보이지만 항상 손상된 ext4 파일 시스템이 있습니다.

내 Raspberry Pi microSD 카드의 모든 백업 이미지가 손상된 것 같습니다. 이미지 파일을 생성하거나 microSD 카드를 다른 microSD 카드에 직접 백업해도 아무런 차이가 없습니다.

나는 다양한 접근법을 시도했습니다. 사용된 백업 명령:

dd if=/dev/sde of=pi.img
cat /dev/sde > pi.img
dd if=/dev/sde2 of=pi_part2.img
dd if=/dev/sde2 of=pi_part2.img oflag=dsync bs=64k
pv /dev/sde > /dev/sdf

원래 파일 시스템에서 fsck를 실행하면 오류가 표시되지 않습니다.

fsck.ext4 -fnv /dev/sde2
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information

      169390 inodes used (17.63%, out of 960992)
         686 non-contiguous files (0.4%)
         153 non-contiguous directories (0.1%)
             # of inodes with ind/dind/tind blocks: 0/0/0
             Extent depth histogram: 159486/127
     2576756 blocks used (67.10%, out of 3840256)
           0 bad blocks
           1 large file

      141540 regular files
       17848 directories
          30 character device files
           0 block device files
           2 fifos
          53 links
        9898 symbolic links (9674 fast symbolic links)
          63 sockets
------------
      169434 files

새 microSD 카드, 이미지 파일, losstup으로 만든 루프 장치, kpartx로 만든 루프 장치에서 fsck를 실행해 보았습니다. 결과는 항상 동일하며 파티션을 이미지화하는지 전체 드라이브를 이미지화하는지 여부는 중요하지 않습니다.

losetup -vf pi.img
or
kpartx -a pi.img
or 
losetup -vf pi_part2.img
or
kpartx -a pi_part2.img
fsck.ext4 -fnv /dev/sdf2
Pass 1: Checking inodes, blocks, and sizes
Inode 651592 has an invalid extent node (blk 2661556, lblk 0)
Clear? no

Inode 651592 extent tree (at level 1) could be shorter.  Optimize? no

Inode 651592, i_blocks is 200, should be 0.  Fix? no

Inode 652399 has an invalid extent node (blk 2656133, lblk 0)
Clear? no

Inode 652399 extent tree (at level 1) could be shorter.  Optimize? no

Inode 652399, i_blocks is 96, should be 0.  Fix? no

Inode 653587 has an invalid extent node (blk 2655215, lblk 0)
Clear? no

Inode 653587 extent tree (at level 1) could be shorter.  Optimize? no

Inode 653587, i_blocks is 51776, should be 0.  Fix? no

Inode 781825 seems to contain garbage.  Clear? no

Inode 781825 has inline data and extent flags set but i_block contains junk.
Clear inode? no

Inode 781825 has INLINE_DATA_FL flag on filesystem without inline data support.
Clear? no

...

Directories count wrong for group #99 (275, counted=0).
Fix? no

Free inodes count wrong (791602, counted=786221).
Fix? no


/dev/sdf2: ********** WARNING: Filesystem still has errors **********


      169390 inodes used (17.63%, out of 960992)
         592 non-contiguous files (0.3%)
         140 non-contiguous directories (0.1%)
             # of inodes with ind/dind/tind blocks: 0/0/0
             Extent depth histogram: 134099/114
     2576756 blocks used (67.10%, out of 3840256)
           0 bad blocks
           1 large file

      118579 regular files
       15409 directories
          30 character device files
           0 block device files
           0 fifos
  4294967090 links
        8110 symbolic links (7886 fast symbolic links)
          58 sockets
------------
      142315 files

1093872행에서 오류가 발생합니다.

나는 대체 슈퍼블록을 사용해 보았습니다. zfs 파일 시스템의 ext4에 이미지를 저장하려고 합니다. 이미지를 만들어 새 microSD 카드에 넣어 보았습니다. 다른 microSD 카드에 직접 복사(cat)를 시도하고, 카드를 제거하고 어댑터의 쓰기 잠금을 밀어서 100% 나중에 아무 것도 변경할 수 없도록 했습니다.

결과는 항상 동일합니다.

원시 파일 시스템을 마운트하고 rsync 백업을 수행하면 완벽하게 작동합니다.

편집하다: SD 카드의 파일 시스템은 이미지/백업 제작 시 절대 사용되지 않습니다. 아직 마운트되지 않았으며 iostat에 따르면 어떤 블록도 쓰거나 읽히지 않습니다. 나는 또한 이 작업을 수행하기 위해 두 대의 다른 컴퓨터를 사용합니다. 하나는 Kali 및 내장 카드 리더기와 함께 제공되고, 다른 하나는 Debian Buster 및 외부 USB 카드 리더기와 함께 제공됩니다.

편집하다: 깨끗한 microSD 카드를 분할하고 동등한 파일 시스템을 만든 다음 파일로 채웠습니다. 위와 같이 생성된 백업 이미지에는 오류가 없습니다. 원래 microSD 카드나 원래 ext4 파일 시스템에 문제가 있는 것 같습니다. fsck가 오류를 표시하지 않고 문제를 일으키지 않고 파일 시스템을 마운트하고 사용하는 이유는 무엇입니까?

편집하다: e2fsck 버전은 매우 새로운 버전입니다(Debian Buster의 최신 버전):

e2fsck -V
e2fsck 1.44.5 (15-Dec-2018)
    Using EXT2FS Library version 1.44.5, 15-Dec-2018

주로 사용하는 명령어를 확인해 보세요 fsck.ext4. e2fsck차이 없음.

편집하다:

mount | grep /dev/sde
/dev/sde2 on /mnt/oldpi type ext4 (rw,relatime,stripe=1024)
blkid /dev/sde
/dev/sde: PTUUID="21f74a8c" PTTYPE="dos"
blkid | grep /dev/sde
/dev/sde1: UUID="4B06-547E" TYPE="vfat" PARTUUID="21f74a8c-01"
/dev/sde2: UUID="e6935217-65c8-44be-bde3-79d93b146920" TYPE="ext4" PARTUUID="21f74a8c-02"

편집하다: 두 개의 별도 이미지를 만들면 동일한 이미지가 생성됩니다.

sha256sum *
da464bf4884c8f5db546637cd3e82c41ddd63d65f91f38ca1ec85af1f71c6757  pi_sdcard_20200404_1.img
da464bf4884c8f5db546637cd3e82c41ddd63d65f91f38ca1ec85af1f71c6757  pi_sdcard_20200404_2.img

복구 모드에서 Raspberry pi에 직접 복사본을 만들고 ro를 다시 마운트한 후 오류가 더 적은 사용 가능한 복사본이 생성됩니다.

fsck.ext4 -nvf /dev/sde2 
e2fsck 1.44.5 (15-Dec-2018)
Warning: skipping journal recovery because doing a read-only filesystem check.
Pass 1: Checking inodes, blocks, and sizes
Inode 653587 has an invalid extent node (blk 2655215, lblk 0)
Clear? no

Inode 653587 extent tree (at level 1) could be shorter.  Optimize? no

Inode 653587, i_blocks is 51776, should be 0.  Fix? no

Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Block bitmap differences:  -2655215 -(2895872--2896020) -(2898068--2898069) -(2902016--2902036) -(2902038--2902039) -(2902043--2902200) -(2902233--2902297) -(2902330--2902648) -(2902681--2904063) -(2906112--2906552) -(2906554--2906617) -(2906619--2907710) -(2907712--2907775) -(2907777--2907840) -(2907842--2908115) -(2908117--2908871) -(2908873--2908936) -(2908938--2909256) -(2909258--2909321) -(2909323--2909386) -(2909388--2909451) -(2909453--2909516) -(2909518--2909581) -(2909583--2909646) -(2909648--2909711) -(2909713--2909776) -(2909778--2909841) -(2909843--2909906) -(2909908--2909971) -(2909973--2910036) -(2910038--2910207) -(2912405--2912406) -(2914448--2914455) -(2916498--2916504) -(2943123--2943129) -(2945171--2945242) -(2945244--2945266) -(2945268--2945331) -(2945333--2945392) -(2945394--2945428) -(2945430--2945441) -(2945472--2945478)
Fix? no


/dev/sde2: ********** WARNING: Filesystem still has errors **********


      169390 inodes used (17.63%, out of 960992)
         685 non-contiguous files (0.4%)
         153 non-contiguous directories (0.1%)
             # of inodes with ind/dind/tind blocks: 0/0/0
             Extent depth histogram: 159485/126
     2575505 blocks used (67.07%, out of 3840256)
           0 bad blocks
           1 large file

      141539 regular files
       17847 directories
          30 character device files
           0 block device files
           2 fifos
          53 links
        9898 symbolic links (9674 fast symbolic links)
          65 sockets
------------
      169434 files

fsck를 사용한 후 자동으로 오류를 수정합니다. 모든 것이 괜찮은 것 같습니다.

디버깅하거나 microSD 카드가 손상되었는지 확인할 수 있는 방법이 있습니까? 나에게 가장 중요한 질문은: 왜 이런 일이 발생하는가? 이 백업 방법(dd, cat, pv 등)을 사용하여 SD 카드, 플래시 드라이브 등을 백업할 수 있습니까?

관련 정보