Linux md-RAID는 디스크 읽기 오류를 어떻게 처리합니까?

Linux md-RAID는 디스크 읽기 오류를 어떻게 처리합니까?

2가지 상황이 있습니다:

  • 읽기 명령은 커널 수준에서 시간 초과됩니다(기본적으로 30초).
  • 드라이브에서 해당 섹터를 읽을 수 없다고 보고합니다.앞으로커널은 인내심을 잃습니다(제가 관심을 갖고 있는 경우입니다).

커널 시간 초과

드라이브 액세스는 일반적으로 Linux SCSI 계층을 통해 이루어지기 때문에 시간 초과 상황은 전적으로 해당 계층에서 처리된다고 가정합니다. ~에 따르면이 문서, 드라이브, 버스, 호스트 등을 재설정한 후 명령을 여러 번 시도합니다. 이들 중 어느 것도 작동하지 않으면 SCSI 계층은 장치를 오프라인으로 전환합니다. 이 시점에서 나는 md 계층이 드라이브가 사라진 것을 "발견"하고 누락(실패)으로 표시한다고 생각합니다.맞습니까?

드라이브에서 오류를 보고함

일부 드라이브는 특정 시간 초과에 도달한 후 읽기 오류를 보고하여 내부 복구 시도를 중단하도록 구성할 수 있습니다. 이것은 ... 불리운다유럽 ​​연구 협의회(또는 TLER, CCTL). 디스크 시간 초과는 일반적으로 트리거되도록 구성됩니다.앞으로운영 체제가 시간 초과(또는 하드웨어 RAID 컨트롤러)되어 단순히 "기다렸다가 중단"하는 것이 아니라 실제로 무슨 일이 일어나고 있는지 알 수 있습니다.

내 질문은 다음과 같습니다Linux(및 md)는 드라이브에서 보고된 읽기 오류를 어떻게 처리합니까?

다시 시도하시겠습니까, 스마트한 작업을 수행하시겠습니까, 아니면 위의 "커널 시간 초과"에 설명된 모든 시도를 거치지 않고 드라이브를 오프라인으로 전환하시겠습니까? MD는 이런 일이 언제 일어나는지 알고 있나요?

어떤 사람들은제안ERC는 드라이브에 복구를 시도할 충분한 시간을 제공하지 않기 때문에 Linux에서 위험합니다. 그들은 또한 읽기 오류가 발생하면 RAID 중복으로 인해 손실된 읽을 수 없는 섹터 데이터를 계산하기 때문에 ZFS-raid가 좋다고 말합니다.씌우다드라이브로 돌아갑니다. 그런 다음 후자는 문제가 있는 섹터 읽기 시도를 중단하고 자동으로 해당 섹터를 불량(더 이상 사용되지 않음)으로 표시한 후 양호하고 정상적인 섹터에 다시 매핑해야 합니다.

MD에도 이런 기능이 있나요?

답변1

md(4) 이에 대한 자세한 내용은 매뉴얼 페이지 섹션에 설명되어 있습니다 RECOVERY.

[...] 읽기 오류로 인해 md는 불량 블록을 덮어써서 복구를 시도하게 됩니다. 즉, 다른 곳에서 올바른 데이터를 찾아서 실패한 블록에 쓴 다음 다시 읽으려고 시도합니다. 쓰기 또는 다시 읽기가 실패하면 md는 쓰기 오류와 동일한 방식으로 오류를 처리하고 전체 장치에 실패합니다.

시간 초과의 경우 드라이브가 대기 모드에서 쫓겨난다는 보고가 있었지만 실제로 그런 일이 발생한 적은 없습니다. 나는 7개의 HDD를 가지고 있는데 일반적으로 정지되고(메인 시스템은 SSD로 실행되고 장기간 HDD 액세스 없이 실행될 수 있기 때문에) 잘 작동합니다( md모든 드라이브를 깨우는 대신 드라이브를 하나씩 깨우는 것을 제외하고). 한 번).

나는 그것이 다른 레이어가 보고하는 것에 달려 있다고 생각합니다 md.

답변2

TLER가 위험한지에 대해서는 그렇지 않다고 생각합니다. 사실 이 기능이 필요했다는 사실이 아직도 믿기지 않습니다. 어떤 드라이브도 재시도하는 데 그렇게 오랜 시간이 걸리지는 않을 것입니다. 느린 5400rpm 드라이브가 수백 번 재시도하는 데는 7초면 충분합니다. 몇 번(수백 번은 고사하고) 시도 후에도 할 수 없다면 결코 할 수 없습니다.

관련 정보