Trawling

Cong Wang, 재부팅 없는 Linux 커널 장애 복구 도구 kmorph 발표

Cong Wang은 커널 패닉이나 정지 뒤 미리 실행해 둔 후속 커널이 시스템 자원을 넘겨받는 오픈소스 도구 kmorph를 발표했습니다. Wang은 자체 시험에서 대기 상태의 Nginx가 장애 뒤 2초 안에 요청 처리를 재개했다고 밝혔으며, 실제 네트워크 복구 시간은 장치와 임대 상태에 따라 달라집니다. 사용하려면 Multikernel 설정을 포함한 별도 커널이 필요합니다.

Cong Wang은 2026년 11월 6일 21시 56분(UTC) Linux 커널 메일링 리스트에서 오픈소스 도구 kmorph를 발표했습니다. kmorph는 주 커널이 패닉하거나 멈추면 미리 부팅해 둔 후속 커널이 시스템 자원을 넘겨받게 합니다. 장애 뒤 새 커널을 처음부터 부팅하는 대신 이미 실행 중인 커널로 전환해 복구 시간을 줄이는 방식입니다.

바탕 기술인 Multikernel은 한 물리 장비에서 여러 Linux 커널이 각자 CPU, 메모리, 장치를 소유하게 하며, 커널끼리는 vsock으로 통신합니다. 주 커널에서 실행되는 kmorph는 후속 커널의 이미지를 준비하고 실행을 시작합니다. 후속 커널 안의 kmorphd는 주 커널의 응답을 감시합니다. 후속 커널은 CPU 한두 개와 메모리 일부를 배정받아 먼저 부팅되며, 주 커널이 정상 작동하는 동안에도 배정된 자원을 점유합니다.

kmorph 저장소 README의 기본 설정은 초당 10회 주 커널을 확인하고, 연속 0.5초 동안 응답이 없으면 인계를 시작합니다. 후속 커널은 주 커널이 소유한 CPU를 정지시키고 각각 멈췄는지 확인합니다. 하나라도 정지 상태를 확인하지 못하면 해당 인계 시도를 중단하고 다시 시도합니다. 이 절차는 이전 커널과 새 커널이 같은 CPU에서 동시에 실행되는 상황을 막습니다.

이어서 주 커널이 쓰던 PCI 장치를 인계합니다. reset_devices가 설정된 경우 드라이버의 접근을 막은 채 FLR이나 전원 상태 변경으로 장치를 초기화합니다. 초기화할 수 없는 장치는 PCI 버스 마스터 기능을 꺼 DMA를 멈춥니다. IOMMU가 여전히 주 커널의 페이지 테이블을 참조하는 시스템에서는 reset_devices 설정과 관계없이 드라이버를 막고 버스 마스터 기능을 끕니다. 장치가 모두 인계되고 멈춘 뒤에는 후속 커널이 IOMMU를 자신의 테이블로 전환합니다. 장치는 PCI 기능별로 처리하므로 일부 장치의 인계 실패가 다른 장치나 전체 전환을 막지는 않습니다.

장치마다 재설정 방법은 다릅니다. 후속 커널은 보조 버스 재설정을 지원하지 않으며, FLR이나 전원 상태 재설정 방법이 없는 장치는 버스 마스터 기능을 끄는 방식으로 처리합니다. 후속 커널을 준비한 뒤 새로 추가된 장치는 인계 목록에 들어 있지 않아 장애 당시 상태로 남습니다. 장치 인계가 끝나면 후속 커널은 네트워크 정체성을 복구하고 회수할 수 있는 CPU와 메모리를 추가합니다. 설정에 따라 메모리를 회수하기 전에 kdump와 호환되는 vmcore를 저장할 수도 있습니다.

배포판용 initramfs에서는 kmorphd가 인계를 기다립니다. 인계가 끝나면 initramfs의 전환 절차가 실제 루트 디스크를 마운트하고 pivot_root로 루트를 바꾼 뒤, 디스크에 있는 systemd를 실행합니다. systemd는 평소 부팅처럼 나머지 마운트와 서비스를 시작합니다. 계획된 커널 업그레이드도 같은 자원 인계 절차를 사용합니다. 이때는 주 커널이 살아 있을 때 쓰기 가능한 파일시스템을 동기화하고 동결한 다음 전환을 시작합니다.

운영자는 지정한 systemd 서비스를 후속 커널의 대기 환경에서 미리 실행할 수 있습니다. 예를 들어 Nginx는 실제 네트워크 장치와 디스크가 넘어오기 전에도 메모리 기반 환경에서 포트를 열어 둡니다. 대기 중에는 네트워크에 접근할 수 없고 기록한 상태도 메모리에만 남으므로, 영속적으로 보존할 데이터를 쓰지 않는 서비스에 적합합니다. 자체 mount namespace를 쓰는 일부 systemd 서비스는 루트 전환을 따라가지 못해 인계 뒤 재시작됩니다.

Wang은 프로젝트 발표문에서 자체 시험 결과 Nginx가 커널 장애 뒤 2초 안에 다시 요청을 처리했다고 밝혔습니다. 서비스와 연결된 클라이언트가 장애를 알아차리지 못하게 하는 것이 프로젝트의 목표입니다. 다만 README는 물리 NIC가 초기화 뒤 링크를 다시 협상하는 데 1초 이상 걸릴 수 있고, 전환 중 DHCP 임대가 만료되면 기존 임대를 복구하지 않는다고 설명합니다. 실제 네트워크 복구 시간은 장치와 임대 상태에 따라서도 달라집니다.

Wang은 기존 kdump가 충돌한 커널에서 캡처 커널로 kexec한 뒤 vmcore를 저장하고 운영 커널을 다시 부팅하는 두 번의 재부팅을 거친다고 설명했습니다. 대형 서버에서는 장애 시간이 수분에 이를 수 있다는 설명입니다. 발표문은 메인라인 Linux의 Kexec HandOver(KHO)와 Live Update Orchestrator(LUO)도 비교합니다. 두 기능은 kexec 재부팅을 거치고 이전 커널이 정상 작동할 때 상태를 저장해야 하므로 커널 충돌 복구에는 쓸 수 없다는 것이 Wang의 설명입니다. kmorph는 후속 커널을 미리 실행해 둔다는 점에서 다릅니다.

kmorph를 사용하려면 Multikernel 설정을 포함한 별도 커널이 필요합니다. 발표문과 프로젝트 문서는 x86-64와 ARM64를 지원 대상으로 밝히고, RISC-V 지원은 진행 중이라고 설명합니다. Wang은 프로젝트가 초기 단계라며 실제 하드웨어 시험과 설계 검토에 참여해 달라고 요청했습니다.

참고 자료

오류 제보