OpenBSD용 GEFS, 파일시스템 생성 가능해져…스냅샷 커밋 순서 구현은 남아
Ori Bernstein이 공개한 OpenBSD용 GEFS 작업본에서 파일시스템 생성 도구 mkfs가 가능해졌고 오류 처리 코드도 검토됐습니다. 하지만 스냅샷 제어와 커밋 데이터의 디스크 기록 순서를 보장하는 프로토콜은 아직 미완성입니다. GEFS의 장애 후 복구 목표를 포트에서 실현하려면 이 순서 처리가 남아 있습니다.
본문
OpenBSD Journal(Undeadly)의 Peter N. M. Hansteen은 2026년 11월 1일, Ori Bernstein이 10월 31일 openbsd-tech 메일링 리스트에 올린 GEFS 개발 업데이트를 전했습니다. 이번 글은 개발자가 공유한 OpenBSD 포트 작업 현황을 다룹니다. Bernstein은 9월 15일 초기 공개 때 이식판을 오류와 문제가 많은 시험용 코드로 설명했습니다. 오류 상황에서 데이터 손실이 예상되므로 운영 환경에 투입하기 전 단계라고 밝혔습니다.
이번 업데이트에서 Bernstein은 작업물을 최신 코드에 맞춰 다시 정리하고(rebase) 사용자들이 보낸 패치를 반영했다고 말했습니다. 9front에서 중요한 버그 수정도 대부분 가져왔습니다. 9월 공개 당시 오류 처리 경로가 대부분 주석 처리돼 있었지만, 이번에는 해당 코드를 검토했습니다. Bernstein은 이론상 대부분의 오류를 적절히 처리할 것으로 보지만 실제 상황과 맞지 않는 부분이 남을 수 있다고 설명했습니다.
GEFS는 Bernstein이 9front용으로 만든 파일시스템을 OpenBSD로 옮기는 프로젝트입니다. 설계 문서는 데이터와 메타데이터를 copy-on-write 방식으로 기록하고 스냅샷을 만드는 구조를 설명합니다. 기존 블록을 덮어쓰는 대신 변경된 내용을 새 블록에 쓰면 이전 세대의 스냅샷을 유지할 수 있습니다. 설계상 서버가 새 superblock을 기록하기 전에 멈추면 다음 마운트에서 디스크에 동기화된 마지막 커밋을 읽도록 하는 것이 목표입니다.
이 목표를 구현하려면 디스크 쓰기 순서가 중요한 조건입니다. superblock이 새 세대를 가리키기 전에 그 세대에 필요한 블록이 실제로 기록돼 있어야 장애 뒤에도 일관된 상태를 찾을 수 있습니다. Bernstein은 OpenBSD 포트에서 이 순서를 보장하는 일관성 프로토콜이 여전히 가장 큰 미완성 항목이라고 밝혔습니다.
이번에 구체적으로 진전된 사용자 공간 작업은 파일시스템 생성입니다. 기본 설정에서 GEFS는 첫 파일시스템 블록을 비워 둡니다. 디스크 레이블이 놓일 자리를 마련하고 superblock과 같은 위치에 두는 일을 피하려는 변경입니다. 또 일부 사용자 공간 도구가 만들어져 OpenBSD에서 mkfs를 실행할 수 있게 됐습니다. 이는 시험용 파일시스템을 준비하는 경로가 마련됐다는 뜻입니다.
반면 스냅샷을 만들고 관리하는 제어 기능은 아직 없습니다. Bernstein은 9front의 ctl 파일과 비슷한 인터페이스를 제공할 사용자 공간 gefs 프로그램을 구상하고 있습니다. 메일에 든 명령 예시는 디버그 설정, 사용자 예약 공간, 스냅샷 보존 시점, 스냅샷 이름 변경과 fork를 다룹니다. 이 명령은 앞으로 만들 인터페이스의 제안이며, 구현 완료를 뜻하지 않습니다.
Bernstein이 설명한 이상적인 기록 순서는 평상시 데이터 블록을 어느 순서로든 쓰다가 커밋 시점에 장벽을 두는 방식입니다. 첫 장벽은 커밋 전에 기록된 블록이 디스크에 도착하도록 합니다. 이어 free list와 deadlist, arena 관련 메타데이터를 준비하고 arena header를 기록합니다. 그다음 장벽을 거쳐 superblock과 arena footer를 쓰고, 대기 중인 블록 쓰기가 끝난 뒤 이전 세대에서 더 이상 참조하지 않는 블록을 회수합니다. 쓰기 장벽은 커밋에 필요한 단계가 잘못된 순서로 디스크에 반영되는 일을 막기 위한 장치입니다.
9front에서는 세대와 블록 주소를 기준으로 우선순위 큐를 정렬해 같은 세대 안의 쓰기를 가능한 한 순차적으로 내보내고 세대 경계를 넘지 않게 합니다. Bernstein은 OpenBSD에서도 비슷한 방식을 구현하는 안을 검토하고 있습니다. 동기식으로 블록 장치에 I/O를 수행하는 syncer 커널 프로세스를 띄우고, 버퍼 캐시가 arena header와 superblock을 재정렬하지 못하도록 표시하는 방법을 생각 중입니다. 그는 다른 제안도 받고 있다고 밝혔습니다.
이번 진전으로 OpenBSD에서 GEFS를 생성하는 도구가 마련됐고 오류 처리 코드도 검토됐습니다. 스냅샷 관리와 장애 뒤 커밋 상태를 보장하는 쓰기 순서 프로토콜은 남아 있습니다. Bernstein은 9월 15일 메시지에서 OpenBSD 본체에 곧 통합할 계획이 없다고 밝혔습니다. 이번 업데이트는 작업물 갱신과 시험 요청을 전합니다.
자료: OpenBSD Journal(Undeadly), openbsd-tech 메일링 리스트, Ori Bernstein의 GEFS 설계 문서 / 정리·해설: Trawling