[OSTEP] 스터디 17주차 Part.2 Data Integrity and Protection

파일 시스템이 저널링을 통해 크래시 일관성을 완벽하게 보장한다고 해도, 저장 장치(디스크) 자체가 데이터를 망가뜨린다면 아무 소용이 없다. 현대의 파일 시스템과 스토리지 시스템은 이러한 하드웨어 레벨의 데이터 손상을 탐지하고 복구하기 위해 다양한 기법을 사용한다.


1. 디스크 실패의 유형 (Disk Failure Models)

디스크는 완벽하지 않으며 다양한 방식으로 실패한다. 가장 기본적인 모델은 디스크가 완전히 고장 나는 fail-stop이지만, 실제로는 더 까다로운 부분적 실패가 빈번하다.

  • 잠재적 섹터 오류 (Latent Sector Errors, LSEs): 디스크 표면의 물리적 손상이나 헤드 문제 등으로 인해 특정 섹터를 읽거나 쓸 수 없는 상태가 된다. 디스크 컨트롤러가 오류를 감지하고 운영체제에 보고한다.
  • 조용한 데이터 부패 (Silent Data Corruption): 가장 위험한 형태의 실패다. 펌웨어 버그, 전자기적 간섭 등으로 인해 디스크에 저장된 데이터의 비트가 바뀌지만, 디스크 컨트롤러가 이를 감지하지 못하고 정상적인 읽기 작업인 것처럼 손상된 데이터를 반환한다.

위 그림은 정상적인 읽기(왼쪽)와 두 가지 주요 디스크 실패 유형을 보여준다. 가운데 LSE는 물리적 손상으로 명시적인 에러를 반환하지만, 오른쪽의 조용한 데이터 부패는 에러 신호 없이 변질된 데이터가 그대로 전달된다.


2. 해결책: 체크섬 (Checksums)

데이터 무결성을 보장하기 위한 핵심 기법은 체크섬을 사용하는 것이다. 체크섬은 데이터 블록의 내용을 요약한 작은 크기의 해시 값이다.

체크섬의 작동 원리:

  1. 쓰기 시점: 데이터를 디스크에 쓸 때, 해당 데이터에 대한 체크섬을 계산하여 데이터와 함께 (또는 별도의 위치에) 저장한다.
  2. 읽기 시점: 디스크에서 데이터를 읽을 때, 함께 저장된 체크섬도 읽어온다. 동시에, 읽어온 데이터를 바탕으로 새로운 체크섬을 계산한다.
  3. 검증: 저장되어 있던 체크섬과 새로 계산한 체크섬을 비교한다. 두 값이 일치하면 데이터가 안전하다고 판단하고, 일치하지 않으면 데이터가 손상된 것으로 간주한다.

3. 체크섬 알고리즘 (Checksum Algorithms)

체크섬을 계산하는 방식은 다양하며, 계산 속도와 오류 감지 능력 사이의 트레이드오프가 있다.

  • XOR: 가장 단순하고 빠른 방식이지만, 두 비트가 동시에 반전되는 등의 특정 오류 패턴을 감지하지 못하는 약점이 있다.
  • 덧셈 (Addition): 데이터를 바이트 단위로 더하고 2의 보수를 취하는 방식이다. XOR보다 약간 더 낫지만 여전히 충돌 가능성이 있다.
  • 플레처 체크섬 (Fletcher's Checksum): 위치에 따른 가중치를 부여하여 단순 합계 방식의 약점을 보완했다. 계산이 비교적 간단하면서도 오류 감지 능력이 뛰어나 널리 사용된다 (예: ZFS).
  • 순환 중복 검사 (CRC): 네트워크 통신 등에서 검증된 강력한 방식이다. 이진 다항식 나눗셈을 기반으로 하며, 일반적인 버스트 에러(연속적인 비트 손상)를 매우 효과적으로 감지한다.

4. 실전 적용과 데이터 복구 (Practical Use and Recovery)

체크섬만으로는 데이터 손상을 탐지할 뿐 복구할 수는 없다. 복구를 위해서는 중복성(Redundancy)이 필수적이다.

체크섬의 저장 위치:

체크섬을 데이터 블록 내부에 저장하는 방식은 구현이 간단하지만 공간 효율이 떨어진다. ZFS와 같은 현대적인 시스템은 부모 포인터에 체크섬을 저장한다. 즉, 어떤 블록을 가리키는 간접 블록(indirect block)이나 아이노드(inode)에 그 블록의 주소와 함께 체크섬을 저장하는 방식이다.

복구 메커니즘:

  1. 데이터를 읽을 때 체크섬 불일치가 감지되면, 시스템은 해당 데이터가 손상되었음을 알게 된다.
  2. 시스템은 미러링된 다른 디스크나 RAID의 패리티 블록을 사용하여 손상된 데이터의 정상적인 복사본을 가져온다.
  3. 가져온 정상 데이터로 손상된 블록을 덮어써서 복구한다.

스크러빙 (Scrubbing):

데이터 손상은 읽기 작업이 수행될 때만 감지된다. 잘 사용되지 않는 '차가운(cold)' 데이터는 오랫동안 손상된 채 방치될 수 있다. 이를 방지하기 위해 시스템은 백그라운드에서 주기적으로 모든 데이터를 읽고 체크섬을 검증하는 디스크 스크러빙 작업을 수행하여 잠재적인 오류를 선제적으로 찾아내고 복구한다.

위 순서도는 데이터 읽기 과정에서의 체크섬 검증 로직을 보여준다. 계산된 체크섬과 저장된 체크섬이 일치하지 않으면 데이터 손상으로 판단하고 복구 절차를 시작한다.


결론

파일 시스템은 단순히 데이터를 위치시키는 것을 넘어, 하드웨어의 불완전성을 극복하고 데이터의 무결성을 보장해야 하는 중요한 책임을 가진다. 저널링이 논리적인 일관성을 책임진다면, 체크섬스크러빙은 물리적인 데이터 부패로부터 우리의 소중한 정보를 지키는 최후의 보루 역할을 수행한다.