wisekb 파티션 테이블 복구

개요

wisekb(가상머신)의 xvdb디스크(8T)의 디스크 파티션이 손상되어,

wisekb의 파티션 테이블을 복구하는 과정을 기술합니다.

Index

  • 1.) TestDisk를 이용한 파티션 테이블 복구
  • 2.) 슈퍼블록/그룹 디스크립터 복구작업
  • 3.) fsck 진행을 위한 설정 및 복구

wisekb의 정보

  • wisekb를 구동하는 하이퍼바이저의 호스트네임은 qaserver이다.
  • wisekb의 xvdb 디스크를 export 중인 스토리서버의 호스트네임은 storage4이다.

손상 전 디스크의 정보

  • Device name : xvdb
  • LV name : vm-60-b
  • Disk Size : 8TB / 8796.1GB / 8796093022208 bytes
  • Sector Size : 512B
  • Partition Table : gpt
    • Partition Number : 1
    • Start Size : 1049kB
    • End Size : 8796GB
    • File system type : ext4

손상 후 디스크의 상태

현재 디스크는 파티션 테이블이 없음을 나타낸다.:

root@qaserver:~# parted /dev/pengrix_vg/vm-60-b
GNU Parted 2.3
Using /dev/dm-53
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: Linux device-mapper (linear) (dm)
Disk /dev/dm-53: 8796GB
Sector size (logical/physical): 512B/512B
Partition Table: loop

Number  Start  End     Size    File system  Flags
 1      0.00B  8796GB  8796GB  ext4
  • Partition Table 라인을 보면 loop의 값을 가진다.
  • 정상적이라면 gpt를 나타내야 한다.

복구 프로그램 조사

디스크 복구 프로그램은 아래 두가지가 가장 많이 사용된다.

  1. TestDisk
  2. PhotoRec

이 둘의 차이는 아래와 같다.

  • 파티션에서 문제가 발생하면 TestDisk.
  • 손실된 사진,파일을 복구 하려면 PhotoRec.

현재 wisekb의 경우 1번(TestDisk)의 프로그램을 사용하는 것이 적합하다.

TestDisk ?

  • 라이센스 : GPLv2+
  • 지원 운영체제 : 리눅스, 윈도우, OS X, FreeBSD, NetBSD, OpenBSD
  • TestDisk의 기능
    • Fix partition table, recover deleted partition
    • Recover FAT32 boot sector from its backup
    • Rebuild FAT12/FAT16/FAT32 boot sector
    • Fix FAT tables
    • Rebuild NTFS boot sector
    • Recover NTFS boot sector from its backup
    • Fix MFT using MFT mirror
    • Locate ext2/ext3/ext4 Backup SuperBlock
    • Undelete files from FAT, exFAT, NTFS and ext2 filesystem
    • Copy files from deleted FAT, exFAT, NTFS and ext2/ext3/ext4 partitions.

1.) TestDisk를 이용한 파티션 테이블 복구

TestDisk를 실행할 서버는 vm-60-b(LV)를 export하고있는 storage4에서 실행한다.

Install testdisk.:

root@storage4:~# apt-get install testdisk

Start testdisk.:

root@storage4:~# testdisk

Next.:

TestDisk 6.13, Data Recovery Utility, November 2011
Christophe GRENIER <grenier@cgsecurity.org>
http://www.cgsecurity.org


TestDisk is free data recovery software designed to help recover lost
partitions and/or make non-booting disks bootable again when these symptoms
are caused by faulty software, certain types of viruses or human error.
It can also be used to repair some filesystem errors.

Information gathered during TestDisk use can be recorded for later
review. If you choose to create the text file, testdisk.log , it
will contain TestDisk options, technical information and various
outputs; including any folder/file names TestDisk was used to find and
list onscreen.

Use arrow keys to select, then press Enter key:
>[ Create ] Create a new log file
 [ Append ] Append information to log file
 [ No Log ] Don't record anything
  • Create 를 눌러 로그파일을 만든다.

Next.:

TestDisk 6.13, Data Recovery Utility, November 2011
Christophe GRENIER <grenier@cgsecurity.org>
http://www.cgsecurity.org

  TestDisk is free software, and
comes with ABSOLUTELY NO WARRANTY.

Select a media (use Arrow keys, then press Enter):
 Disk /dev/mapper/pengrix_vg-vm--21 - 537 GB / 501 GiB
 Disk /dev/mapper/pengrix_vg-vm--25 - 171 GB / 160 GiB
 Disk /dev/mapper/pengrix_vg-vm--29 - 536 GB / 500 GiB
 Disk /dev/mapper/pengrix_vg-vm--3 - 10 GB / 10 GiB
 Disk /dev/mapper/pengrix_vg-vm--30 - 107 GB / 100 GiB
 Disk /dev/mapper/pengrix_vg-vm--31 - 10 GB / 10 GiB
 Disk /dev/mapper/pengrix_vg-vm--32 - 107 GB / 100 GiB
 Disk /dev/mapper/pengrix_vg-vm--32--mysql - 536 GB / 500 GiB
 Disk /dev/mapper/pengrix_vg-vm--34 - 536 GB / 500 GiB
 Disk /dev/mapper/pengrix_vg-vm--35 - 53 GB / 50 GiB
 Disk /dev/mapper/pengrix_vg-vm--36 - 214 GB / 200 GiB
 Disk /dev/mapper/pengrix_vg-vm--4 - 10 GB / 10 GiB
 Disk /dev/mapper/pengrix_vg-vm--40 - 107 GB / 100 GiB
 Disk /dev/mapper/pengrix_vg-vm--42 - 107 GB / 100 GiB
 Disk /dev/mapper/pengrix_vg-vm--44 - 10 GB / 10 GiB
 Disk /dev/mapper/pengrix_vg-vm--45 - 53 GB / 50 GiB
 Disk /dev/mapper/pengrix_vg-vm--45--backup - 53 GB / 50 GiB
 Disk /dev/mapper/pengrix_vg-vm--49--back - 11 GB / 11 GiB
 Disk /dev/mapper/pengrix_vg-vm--50--back - 12 GB / 12 GiB
 Disk /dev/mapper/pengrix_vg-vm--53 - 10 GB / 10 GiB
 Disk /dev/mapper/pengrix_vg-vm--60 - 32 GB / 30 GiB
 Disk /dev/mapper/pengrix_vg-vm--60--b - 8796 GB / 8192 GiB
 Disk /dev/mapper/pengrix_vg-vm--60--b--back - 8796 GB / 8192 GiB
 Disk /dev/mapper/pengrix_vg-vm--60--c - 1099 GB / 1024 GiB
 Disk /dev/mapper/pengrix_vg-vm--60--d - 1099 GB / 1024 GiB
 Disk /dev/mapper/pengrix_vg-vm--62 - 107 GB / 100 GiB
 Disk /dev/mapper/pengrix_vg-vm--64 - 536 GB / 500 GiB
 Disk /dev/mapper/pengrix_vg-vm--65 - 547 GB / 510 GiB
 Disk /dev/mapper/pengrix_vg-vm--66 - 536 GB / 500 GiB - SMC SMC2108
 Disk /dev/mapper/pengrix_vg-vm--68 - 2684 GB / 2500 GiB - SMC SMC2108
 Disk /dev/mapper/pengrix_vg-vm--70 - 10 GB / 10 GiB
 Disk /dev/mapper/pengrix_vg-vm--71 - 536 GB / 500 GiB - SMC SMC2108
 Disk /dev/mapper/pengrix_vg-vm--75 - 536 GB / 500 GiB - SMC SMC2108
>Disk /dev/mapper/pengrix_vg-vm--77 - 536 GB / 500 GiB - SMC SMC2108
>[Previous]  [  Next  ]  [Proceed ]  [  Quit  ]

Note: Disk capacity must be correctly detected for a successful recovery.
If a disk listed above has incorrect size, check HD jumper settings, BIOS
detection, and install the latest OS patches and disk drivers.
  • 상/하 방향키로 vm–60–b - 8796 GB / 8192 GiB 를 선택한다.
  • 좌/우 방향키로 Proceed를 선택하고 엔터를 누른다.

Next.:

TestDisk 6.13, Data Recovery Utility, November 2011
Christophe GRENIER <grenier@cgsecurity.org>
http://www.cgsecurity.org


Disk /dev/mapper/pengrix_vg-vm--60--b - 8796 GB / 8192 GiB

Please select the partition table type, press Enter when done.
 [Intel  ] Intel/PC partition
 [EFI GPT] EFI GPT partition map (Mac i386, some x86_64...)
 [Humax  ] Humax partition table
 [Mac    ] Apple partition map
>[None   ] Non partitioned media
 [Sun    ] Sun Solaris partition
 [XBox   ] XBox partition
 [Return ] Return to disk selection




Note: Do NOT select 'None' for media with only a single partition. It's very
rare for a drive to be 'Non-partitioned'.
  • EFI GPT를 선택하고 엔터를 누른다.

Next.:

TestDisk 6.13, Data Recovery Utility, November 2011
Christophe GRENIER <grenier@cgsecurity.org>
http://www.cgsecurity.org


Disk /dev/mapper/pengrix_vg-vm--60--b - 8796 GB / 8192 GiB - CHS 17179869184 1 1

>[ Analyse  ] Analyse current partition structure and search for lost partitions
 [ Advanced ] Filesystem Utils
 [ Geometry ] Change disk geometry
 [ Options  ] Modify options
 [ Quit     ] Return to disk selection








Note: Correct disk geometry is required for a successful recovery. 'Analyse'
process may give some warnings if it thinks the logical geometry is mismatched.
  • Analyes를 선택하여 디스크를 검사하여 손실된 파티션을 스캔한다.

Next.:

TestDisk 6.13, Data Recovery Utility, November 2011
Christophe GRENIER <grenier@cgsecurity.org>
http://www.cgsecurity.org

Disk /dev/mapper/pengrix_vg-vm--60--b - 8796 GB / 8192 GiB - CHS 17179869184 1 1
Current partition structure:
     Partition                  Start        End    Size in sectors

Bad GPT partition, invalid signature.




                P=Primary  D=Deleted
>[Quick Search]
                            Try to locate partition
  • 현재는 파티션이 없다.
  • 엔터를 눌러 Quick Search를 시작한다.

Next.:

TestDisk 6.13, Data Recovery Utility, November 2011
Christophe GRENIER <grenier@cgsecurity.org>
http://www.cgsecurity.org

Disk /dev/mapper/pengrix_vg-vm--60--b - 8796 GB / 8192 GiB - CHS 17179869184 1 1
     Partition               Start        End    Size in sectors
>P MS Data                     2048 17179867135 17179865088





Structure: Ok.  Use Up/Down Arrow keys to select partition.
Use Left/Right Arrow keys to CHANGE partition characteristics:
                P=Primary  D=Deleted
Keys A: add partition, L: load backup, T: change type, P: list files,
     Enter: to continue
EXT4 Large file Sparse superblock, 8796 GB / 8191 GiB
  • 파티션이 발견되었다.
  • 엔터를 눌러 다음을 이어간다.

Next.:

TestDisk 6.13, Data Recovery Utility, November 2011
Christophe GRENIER <grenier@cgsecurity.org>
http://www.cgsecurity.org

Disk /dev/mapper/pengrix_vg-vm--60--b - 8796 GB / 8192 GiB - CHS 17179869184 1 1

     Partition                  Start        End    Size in sectors

 1 P MS Data                     2048 17179867135 17179865088

 [  Quit  ] >[Deeper Search]  [ Write  ]
                          Try to find more partitions
  • Write를 눌러 복구한다.

Next.:

TestDisk 6.13, Data Recovery Utility, November 2011
Christophe GRENIER <grenier@cgsecurity.org>
http://www.cgsecurity.org

Write partition table, confirm ? (Y/N)
  • Y를 눌러 파티션 테이블을 복구한다.

Next.:

TestDisk 6.13, Data Recovery Utility, November 2011
Christophe GRENIER <grenier@cgsecurity.org>
http://www.cgsecurity.org


You will have to reboot for the change to take effect.
  • Ok를 눌러 마친다.
  • 리부팅해야 적용이 된다.
  • 여기까지가 TestDisk를 이용한 파티션테이블 작업이며, 성공한 것으로 보인다.

straoge4 서버를 리부팅하였다.

이후 파티션테이블을 확인하였다.:

root@storage4:~# parted /dev/pengrix_vg/vm-60-b
GNU Parted 2.3
Using /dev/dm-6
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Error: The backup GPT table is corrupt, but the primary appears OK, so that will be used.
OK/Cancel? ok
Model: Linux device-mapper (linear) (dm)
Disk /dev/dm-6: 8796GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  8796GB  8796GB  ext4
  • Partition Table 라인을 보니 gpt로 정상 표시된다.
  • 파티션 테이블 복구에 성공하였다.

이대로 데이터가 잘 살아있길 바라며, 마운트하여 데이터를 확인한다.:

root@storage4:~# kpartx -a /dev/pengrix_vg/vm-60-b
Alternate GPT is invalid, using primary GPT.

root@storage4:~# mount /dev/mapper/pengrix_vg-vm--60--b1 /mnt
mount: wrong fs type, bad option, bad superblock on /dev/mapper/pengrix_vg-vm--60--b1,
       missing codepage or helper program, or other error
       In some cases useful info is found in syslog - try
       dmesg | tail  or so
  • 아 에러가 발생하였다.
  • 슈퍼블록이 손상되었단다.

로그를 확인하였다.:

root@storage4:~# dmesg |tail
...
[8569958.689594] EXT4-fs warning (device dm-54): ext4_fill_super:3551: fragment/cluster size (1024) != block size (4096)
[8569958.710147] EXT4-fs (dm-54): ext4_check_descriptors: Checksum for group 0 failed (20449!=44364)
[8569958.710217] EXT4-fs (dm-54): group descriptors corrupted!
[8573527.573250] EXT4-fs warning (device dm-54): ext4_fill_super:3551: fragment/cluster size (1024) != block size (4096)
[8573527.594039] EXT4-fs (dm-54): ext4_check_descriptors: Checksum for group 0 failed (20449!=44364)
[8573527.594104] EXT4-fs (dm-54): group descriptors corrupted!
  • fragment/cluster 사이즈가 block사이즈와 같지 않다.
  • 그룹 디스크립터도 손상되었다.

파티션 정보를 덤프하여 Fragment/cluster와 Block Size를 확인한다.:

root@storage4:~# dumpe2fs /dev/pengrix_vg/vm-60-b
dumpe2fs 1.41.12 (17-May-2010)
Filesystem volume name:   <none>
Last mounted on:          /test
Filesystem UUID:          b19f1f0d-fb1e-4a78-a73b-04f9910b4c79
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      ext_attr resize_inode dir_index filetype extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash
Default mount options:    (none)
Filesystem state:         not clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              536870912
Block count:              2147483648
Reserved block count:     107374182
Free blocks:              1074310842
Free inodes:              350075079
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      512
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Flex block group size:    16
Filesystem created:       Fri Dec 14 11:08:19 2018
Last mount time:          Fri Dec 14 14:12:29 2018
Last write time:          Mon Feb 11 16:30:20 2019
Mount count:              3
Maximum mount count:      27
Last checked:             Fri Dec 14 11:08:19 2018
Check interval:           15552000 (6 months)
Next check after:         Wed Jun 12 11:08:19 2019
Lifetime writes:          131 GB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:           256
Required extra isize:     28
Desired extra isize:      28
Default directory hash:   half_md4
Directory Hash Seed:      6c22ff8c-01be-4367-9e63-d0de2edfef0b
Journal backup:           inode blocks
ext2fs_read_bb_inode: A block group is missing an inode table
  • Blcok size : 4096
  • Fragment size : 4096

결론

파티션 테이블을 복구에 성공하였으나, 슈퍼블록/그룹디스크립터가 손상되었다.

2.) 슈퍼블록/그룹 디스크립터 복구작업

슈퍼블록/그룹 디스크럽터 복구를 위해 fsck를 진행한다.:

root@storage4:~# fsck /dev/mapper/pengrix_vg-vm--60--b1
fsck from util-linux 2.20.1
e2fsck 1.42.5 (29-Jul-2012)
ext2fs_open2: The ext2 superblock is corrupt
fsck.ext4: Superblock invalid, trying backup blocks...
fsck.ext4: The ext2 superblock is corrupt while trying to open /dev/mapper/pengrix_vg-vm--60--b1

The superblock could not be read or does not describe a correct ext2
filesystem.  If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
    e2fsck -b 8193 <device>
  • 위 로그를 설명하자면 아래와 같다.
  • 슈퍼블록이 손상되어 fsck를 진행하지 못한다.
  • ext4 슈퍼블록은 정해진 위치의 블록에 백업본을 저장한다.
  • 현재 블록그룹0의 슈퍼블록은 손상되었으니, 백업본 블록에서 복구하여 fsck를 시도해야 한다는 설명이다.

슈퍼블록의 백업본 위치는 어떻게 알 수 있을까?

아래는 e2fsck man page의 내용 이다.:

-b superblock
          Instead of using the normal superblock, use an alternative superblock specified by superblock.  This
          option is normally used when the primary superblock has been corrupted.  The location of the  backup
          superblock is dependent on the filesystem's blocksize.  For filesystems with 1k blocksizes, a backup
          superblock can be found at block 8193; for filesystems with 2k blocksizes, at block 16384;  and  for
          4k blocksizes, at block 32768.

          Additional  backup  superblocks can be determined by using the mke2fs program using the -n option to
          print out where the superblocks were created.   The -b option to mke2fs, which  specifies  blocksize
          of the filesystem must be specified in order for the superblock locations that are printed out to be
          accurate.

          If an alternative superblock is specified and the filesystem is not opened  read-only,  e2fsck  will
          make  sure  that  the  primary superblock is updated appropriately upon completion of the filesystem
          check.
  • 슈퍼블록 백업본의 위치는 파일시스템 블록크기에 따라 다르다.
  • block size 1k = 8193
  • block size 2k = 16384
  • block size 4k = 32768

현재 우리의 경우 Block Size는?.:

root@storage4:~# dumpe2fs /dev/pengrix_vg/vm-60-b
...
Block size:               4096
...
  • 그렇다면 32768 위치에 슈퍼블록의 백업본이 있다는 것이다.

슈퍼블록의 백업본으로 복구하자.:

root@storage4:~# e2fsck -b 32768 /dev/mapper/pengrix_vg-vm--60--b1
e2fsck 1.41.12 (17-May-2010)
e2fsck: Bad magic number in super-block while trying to open /dev/mapper/pengrix_vg-vm--60--b1

The superblock could not be read or does not describe a correct ext2
filesystem.  If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
    e2fsck -b 8193 <device>
  • 32768 블록(슈퍼블록 백업)으로 복구가 불가하다…

모든 슈퍼블록의 백업 위치를 덤프한다.:

root@storage4# mke2fs -n -S /dev/mapper/pengrix_vg-vm--60--b1
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
536870912 inodes, 2147483136 blocks
107374156 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
65536 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
    4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
    102400000, 214990848, 512000000, 550731776, 644972544, 1934917632
  • -S 옵션은 슈퍼블록과 그룹디스크립터를 생성하는 명령이다.
  • -n 옵션은 실제로 생성하지 않고 초안을 보도록 하는 옵션이다.
  • 즉, -S 와 -n 옵션을 함께 사용하면 -S옵션이 실제로 적용되지 않으며, -n옵션으로 인해 초안을 볼 수 있어 슈퍼블록의 위치를 파악할 수 있다.

위 결과를 보니 슈퍼블록의 백업위치는 아래와 같다.:

Superblock backups stored on blocks:
   32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
   4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
   102400000, 214990848, 512000000, 550731776, 644972544, 1934917632
  • 첫 번째 위치인 32768 에서 복구를 실패했었다.

두 번째 백업본으로 한다.:

root@storage4:~# e2fsck -b 98304 /dev/mapper/pengrix_vg-vm--60--b1
e2fsck 1.41.12 (17-May-2010)
e2fsck: Bad magic number in super-block while trying to open /dev/mapper/pengrix_vg-vm--60--b1

The superblock could not be read or does not describe a correct ext2
filesystem.  If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
    e2fsck -b 8193 <device>
  • 두 번째 슈퍼블록의 백업본으로 시도했지만 효과가 없다.

나는 모든 슈퍼블록의 백업본에서 복구를 시도하였다.:

root@storage4:~# e2fsck -b 163840 /dev/mapper/pengrix_vg-vm--60--b1
root@storage4:~# e2fsck -b 229376 /dev/mapper/pengrix_vg-vm--60--b1
root@storage4:~# e2fsck -b 294912 /dev/mapper/pengrix_vg-vm--60--b1
root@storage4:~# e2fsck -b 819200 /dev/mapper/pengrix_vg-vm--60--b1
root@storage4:~# e2fsck -b 884736 /dev/mapper/pengrix_vg-vm--60--b1
root@storage4:~# e2fsck -b 1605632 /dev/mapper/pengrix_vg-vm--60--b1
root@storage4:~# e2fsck -b 2654208 /dev/mapper/pengrix_vg-vm--60--b1
root@storage4:~# e2fsck -b 4096000 /dev/mapper/pengrix_vg-vm--60--b1
root@storage4:~# e2fsck -b 7962624 /dev/mapper/pengrix_vg-vm--60--b1
root@storage4:~# e2fsck -b 11239424 /dev/mapper/pengrix_vg-vm--60--b1
root@storage4:~# e2fsck -b 20480000 /dev/mapper/pengrix_vg-vm--60--b1
root@storage4:~# e2fsck -b 23887872 /dev/mapper/pengrix_vg-vm--60--b1
root@storage4:~# e2fsck -b 71663616 /dev/mapper/pengrix_vg-vm--60--b1
root@storage4:~# e2fsck -b 78675968 /dev/mapper/pengrix_vg-vm--60--b1
root@storage4:~# e2fsck -b 102400000 /dev/mapper/pengrix_vg-vm--60--b1
root@storage4:~# e2fsck -b 214990848 /dev/mapper/pengrix_vg-vm--60--b1
root@storage4:~# e2fsck -b 512000000 /dev/mapper/pengrix_vg-vm--60--b1
root@storage4:~# e2fsck -b 550731776 /dev/mapper/pengrix_vg-vm--60--b1
root@storage4:~# e2fsck -b 644972544 /dev/mapper/pengrix_vg-vm--60--b1
root@storage4:~# e2fsck -b 1934917632 /dev/mapper/pengrix_vg-vm--60--b1
  • 절망적이게도 모든 슈퍼블록에서 복구를 할 수 없었다.
  • 모든 슈퍼블록이 손상된 것 같다.

아래는 mke2fs의 man page의 -S옵션 내용이다.:

-S     Write superblock and group descriptors only.  This is useful if all of  the  superblock  and  backup
          superblocks  are corrupted, and a last-ditch recovery method is desired.  It causes mke2fs to reini‐
          tialize the superblock and group descriptors, while not touching the inode table and the  block  and
          inode bitmaps.  The e2fsck program should be run immediately after this option is used, and there is
          no guarantee that any data will be salvageable.  It is critical to specify  the  correct  filesystem
          blocksize when using this option, or there is no chance of recovery.
  • 위 내용을 설명하자면 아래와 같다.
  • -S 옵션은 슈퍼블록/그룹디스크립터만 생성한다. (다른것은 건들지 않는다.)
  • -S 옵션은 슈퍼블록이 모두 손상되었을 경우 사용한다.
  • -S 옵션을 사용한 후에 e2fsck 프로그램을 사용하여 데이터를 복구해야 한다.
  • 모든 데이터가 복구될 보장은 없다.

결국은 -S옵션이 최후의 수단이며, 모든 데이터가 복구될지 보장할 수 없다.

하지만 지금 이것 말고 다른 방법이 없다. 시도하자.:

root@storage4:~# mke2fs -S /dev/mapper/pengrix_vg-vm--60--b1
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
536870912 inodes, 2147483136 blocks
107374156 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
65536 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
    4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
    102400000, 214990848, 512000000, 550731776, 644972544, 1934917632

Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 30 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

다음으로 fsck로 복구를 시도한다.:

root@storage4:~# nohup fsck.ext4 -y /dev/mapper/pengrix_vg-vm--60--b1 &
  • 이제야 fsck가 진행된다.!

하지만 시작한지 5분도 안되어 종료되었다.:

[1]+  Exit 9                  nohup efsck.ext4 -y /dev/mapper/pengrix_vg-vm--60--b1
  • 왜?

로그를 확인한다.:

root@storage4:~# tail nohup.out
Illegal block #4 (3935540716) in inode 116701.  CLEARED.
Inode 116701 is too big.  Truncate? yes

Block #2107580 (761606450) causes directory to be too big.  CLEARED.
Error storing directory block information (inode=116701, block=0, num=1855256): Memory allocation failed

/dev/mapper/pengrix_vg-vm--60--b1: ***** FILE SYSTEM WAS MODIFIED *****
e2fsck: aborted

/dev/mapper/pengrix_vg-vm--60--b1: ***** FILE SYSTEM WAS MODIFIED *****
  • 메모리가 부족하여 종료되었다.
  • 디스크가 8T로 크니 메모리도 많이 소모되는 듯하다. 메모리를 늘리자.

결론

  • 기존 슈퍼블록은 모두 손상되어 복구에 실패한다.
  • mke2fs -S 옵션으로 슈퍼블록/그룹디스크립터만 새로 만들었다.
  • 이후 fsck가 정상적으로 진행이 가능하다.
  • 하지만 fsck가 많은 메모리를 소모한다.
  • 스왑 메모리를 늘려 fsck를 진행해야 한다.

3.) fsck 진행을 위한 설정

메모리가 부족하므로 스왑을 늘려야 한다.

현재 메모리 양을 확인한다.:

root@storage4:/data# free -m
             total       used       free     shared    buffers     cached
Mem:          3925       2749       1175          0          0       2591
-/+ buffers/cache:        156       3768
Swap:         1023          9       1014
  • free 양을 보니 1175M 이다.
  • 하지만 8T디스크를 검사하는데 얼마나 많은 메모리를 필요로 하는지 감이 안온다.

스왑 파일을 만들 디스크 공간을 확인한다.:

root@storage4:~# df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
rootfs         rootfs    9.9G  2.0G  7.5G  21% /
udev           devtmpfs   10M     0   10M   0% /dev
tmpfs          tmpfs     393M  828K  392M   1% /run
/dev/md0       ext4      9.9G  2.0G  7.5G  21% /
tmpfs          tmpfs     5.0M     0  5.0M   0% /run/lock
tmpfs          tmpfs     990M     0  990M   0% /run/shm
/dev/sdb3      xfs       455G  2.8G  452G   1% /data
  • sdb3 (로컬디스크)를 마운트한 /data 디렉토리에 여유 공간이 많다.
  • /data 디렉토리에 스왑파일을 만들면 되겠다.

스왑 메모리를 100G 늘린다.:

root@storage4:~# cd /data

root@storage4:~# dd if=/dev/zero of=swapfile bs=1024M count=100
100+0 records in
100+0 records out
107374182400 bytes (107 GB) copied, 540.786 s, 199 MB/s

root@storage4:/data# mkswap swapfile
Setting up swapspace version 1, size = 104857596 KiB
no label, UUID=9ab1dfa2-95f9-4d37-8e23-6bd87983a5d7

root@storage4:/data# swapon swapfile

root@storage4:/data# free -m
             total       used       free     shared    buffers     cached
Mem:          3925       2776       1148          0          1       2594
-/+ buffers/cache:        181       3744
Swap:       103423          9     103414

fsck를 다시 시작하자.:

root@storage4:~# nohup fsck.ext4 -y /dev/mapper/pengrix_vg-vm--60--bp1 &

root@storage4:~# date
Thu Feb 14 19:33:30 KST 2019
  • 1시간 뒤 fsck가 스왑 100G도 모두 사용하고, 동일한 문제로 fsck가 중단되었다.
  • 대체 fsck가 8T 디스크를 검사하는데 얼만큼의 메모리를 필요로 하는건가?

스왑을 489G로 늘렸다.:

root@storage4:~# fdisk -l /dev/sdc

Disk /dev/sdc: 500.1 GB, 500107862016 bytes
2 heads, 4 sectors/track, 122096646 cylinders, total 976773168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x88209d7d

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1            2048    20973567    10485760   fd  Linux raid autodetect
/dev/sdc2        20973568   976773167   477899800   82  Linux swap / Solaris
  • sdc2(사용하지 않던 로컬디스크) 489G를 스왑으로 파티셔닝 하였다.

swapon.:

root@storage4:~# mkswap /dev/sdc2

root@storage4:~# swapon /dev/sdc2

root@storage4:~# free -m
         total       used       free     shared    buffers     cached
Mem:          3925       2641       1283          0       2291         72
-/+ buffers/cache:        277       3647
Swap:       467723          6     467716

fsck를 다시 시작하자.:

root@storage4:~# nohup fsck.ext4 -y /dev/mapper/pengrix_vg-vm--60--bp1 &

2시간 뒤 또 같은 문제가 발생하였다.:

root@storage4:~# tail nohup.out
Illegal block #2 (3928012957) in inode 2016311.  CLEARED.
Illegal block #3 (2666302642) in inode 2016311.  CLEARED.
Illegal block #10 (2258103330) in inode 2016311.  CLEARED.
Illegal block #12585020 (3965693365) in inode 2016311.  CLEARED.
Error storing directory block information (inode=2016311, block=0, num=12410723): Memory allocation failed

/dev/mapper/pengrix_vg-vm--60--bp1: ***** FILE SYSTEM WAS MODIFIED *****
e2fsck: aborted

/dev/mapper/pengrix_vg-vm--60--bp1: ***** FILE SYSTEM WAS MODIFIED *****
  • inode 2016311 검사중 메모리 할당에 실패하였고, 실제로 스왑을 모두 사용한다.
  • 이거 무슨 버그인가? 489G의 메모리가 정말 필요한걸까?

나는 특정 디렉토리 안에 fsck를 캐싱하는 설정을 알아냈다.

설정하자.:

root@storage4:/data# vi /etc/e2fsck.conf
[scratch_files]
directory = /data/fsck

다시 시작하자.:

root@storage4:~# nohup fsck.ext4 -y /dev/mapper/pengrix_vg-vm--60--bp1 &

root@storage4:/data# ls -l fsck/
total 149956
-rw------- 1 root root  1789952 Feb 15 01:03 81ad740c-ba73-40f2-9c18-23f053d3bcec-dirinfo-4PQwfi
-rw------- 1 root root   528384 Feb 15 12:10 81ad740c-ba73-40f2-9c18-23f053d3bcec-dirinfo-Ce6vB3
-rw------- 1 root root 65290240 Feb 15 12:10 81ad740c-ba73-40f2-9c18-23f053d3bcec-icount-9UI241
-rw------- 1 root root 63852544 Feb 15 01:03 81ad740c-ba73-40f2-9c18-23f053d3bcec-icount-QoYqDT
  • /data/fsck/ 디렉토리 안에 fsck로 인한 파일들이 생성된다.
  • 이 파일이 캐싱을 위한 파일들이다.
  • 시작한 시각 2019.02.15 01:05

중간에 메모리 부족으로 중단되었지만 다시 시작한 후 처음부터 시작히지 않고 이어지는 것을 확인했다.:

root@storage4:/data# tail nohup.out

Inode 2446049 has a extra size (11298) which is invalid
Fix? yes

Inode 2446049 has a bad extended attribute block 540680226.  Clear? yes

Inode 2446049, i_size is 651063008960127520, should be 0.  Fix? yes

Inode 2446049, i_blocks is 2414551584, should be 0.  Fix? yes
  • Inode 값을 확인 했다.

결론

  • 8T 디스크를 검사하는데 많은 메모리가 소모된다.
  • 스왑 메모리를 489G 로 늘렸다.
  • fsck의 결과를 /data/fsck 디렉토리안에 캐싱하도록 하였다.
  • 이렇게 하면 fsck가 중간에 메모리 부족으로 끊어져도 다시 시작하면 이어서 검사를 한다.
  • 즉, 메모리가 부족해도 fsck를 이어서 검사할 수 있으니 어떻게든 모두 검사는 마칠 수 있다.