Linux - GPT를 사용하여 RAID1 어레이의 불량 블록 복구

Linux - GPT를 사용하여 RAID1 어레이의 불량 블록 복구

요약: RAID1 어레이의 디스크 1개에 있는 불량 블록을 수정하려면 어떻게 해야 합니까?

하지만 제가 이미 시도한 것과 제 방법에서 발생할 수 있는 오류에 대해서는 이 전체 내용을 읽어보시기 바랍니다. 최대한 자세히 설명하려고 노력했으며 피드백을 듣고 싶습니다.

이것이 제 상황입니다. 에서 관리하는 RAID1 어레이에 2개의 2TB 디스크(동일 모델)를 설정했습니다 mdadm. 약 6개월 전 SMART가 보고했을 때 첫 번째 불량 블록을 발견했습니다. 오늘 나는 더 많은 것을 발견했고 지금 그것을 고치려고 노력하고 있습니다.

이 HOWTO 페이지SMART가 보고하는 불량 블록을 수정하기 위해 모두가 링크하는 기사 중 하나인 것 같습니다. 정보가 가득한 훌륭한 페이지이지만 상당히 오래되었고 내 특정 설정을 다루지 않습니다. 내 구성이 어떻게 다른지는 다음과 같습니다.

  • 하나의 디스크 대신 RAID1 배열에 두 개의 디스크를 사용하고 있습니다. 한 디스크는 오류를 보고하지만 다른 디스크는 정상입니다. HOWTO는 하나의 디스크만을 염두에 두고 작성되었기 때문에 '이 명령을 디스크 장치에서 사용해야 합니까, 아니면 RAID 장치에서 사용해야 합니까?'와 같은 다양한 질문을 불러일으킵니다.
  • fdisk가 지원하지 않는 GPT를 사용하고 있습니다. 나는 대신 gdisk를 사용하고 있는데 그것이 나에게 필요한 것과 동일한 정보를 제공해주기를 바라고 있습니다.

그럼 그것에 대해 알아 보겠습니다. 이것이 내가 한 일이지만 작동하지 않는 것 같습니다. 내 계산과 방법에 오류가 있는지 다시 한번 확인하시기 바랍니다. 디스크 보고 오류는 /dev/sda입니다.

# smartctl -l selftest /dev/sda
smartctl 5.42 2011-10-20 r3458 [x86_64-linux-3.4.4-2-ARCH] (local build)
Copyright (C) 2002-11 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Short offline       Completed: read failure       90%     12169         3212761936

이를 통해 오류가 LBA 3212761936에 있다는 것을 수집합니다. HOWTO에 따라 gdisk를 사용하여 나중에 블록 번호를 결정할 때 사용할 시작 섹터를 찾습니다(fdisk는 GPT를 지원하지 않기 때문에 사용할 수 없습니다).

# gdisk -l /dev/sda
GPT fdisk (gdisk) version 0.8.5

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.
Disk /dev/sda: 3907029168 sectors, 1.8 TiB
Logical sector size: 512 bytes
Disk identifier (GUID): CFB87C67-1993-4517-8301-76E16BBEA901
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 3907029134
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048      3907029134   1.8 TiB     FD00  Linux RAID

사용하면 tunefs블록 크기가 4096. 이 정보와 HOWTO의 계산을 사용하여 문제의 블록이 이라는 결론을 내렸습니다 ((3212761936 - 2048) * 512) / 4096 = 401594986.

그런 다음 HOWTO에서는 debugfs블록이 사용 중인지 확인하도록 지시합니다. (저는 EXT 파일 시스템이 필요하기 때문에 RAID 장치를 사용합니다. 이것은 처음에 /를 사용해야 하는지 알지 못했기 때문에 혼란스러운 명령 중 하나였습니다. dev/sda 또는 /dev/md0):

# debugfs
debugfs 1.42.4 (12-June-2012)
debugfs:  open /dev/md0
debugfs:  testb 401594986
Block 401594986 not in use

따라서 블록 401594986은 빈 공간이므로 문제 없이 덮어쓸 수 있을 것입니다. 하지만 글을 쓰기 전에 실제로 읽을 수 없는지 확인하려고 노력합니다.

# dd if=/dev/sda1 of=/dev/null bs=4096 count=1 seek=401594986
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 0.000198887 s, 20.6 MB/s

블록을 읽을 수 없다면 이것이 작동할 것이라고 기대하지 않을 것입니다. 그러나 그렇습니다. 불량 블록 주변을 검색하기 위해 블록 번호에 /dev/sda, /dev/sda1, /dev/sdb, /dev/sdb1, , +-5를 반복 사용합니다 . /dev/md0모두 작동합니다. 나는 어깨를 으쓱하고 계속해서 쓰기 및 동기화를 커밋합니다(한 디스크를 수정하고 다른 디스크는 수정하지 않으면 문제가 발생할 수 있다고 생각했기 때문에 /dev/md0을 사용합니다. 이렇게 하면 두 디스크가 모두 불량 블록을 덮어씁니다).

# dd if=/dev/zero of=/dev/md0 bs=4096 count=1 seek=401594986
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 0.000142366 s, 28.8 MB/s
# sync 

불량 블록에 기록하면 디스크가 해당 블록을 좋은 블록에 다시 할당할 것으로 예상되지만 다른 SMART 테스트를 실행하면 다르게 표시됩니다.

# 1  Short offline       Completed: read failure       90%     12170         3212761936

1번으로 돌아가서 기본적으로 RAID1 어레이의 디스크 1개에 있는 불량 블록을 어떻게 수정합니까? 내가 뭔가 제대로 한 게 없는 게 확실해...

시간과 인내심을 가져주셔서 감사합니다.

관련 정보