작년에 거의 1년 정도를 투자해서 만든 가상화 기술 기반 보안 기술을 만들었습니다. 처음에는 프로토타입 수준이었지만 이제 결실을 맺어 릴리즈를 앞두고 있는데요, 항상 그렇듯이 릴리즈를 앞두고 요상한 문제를 만나 디버깅을 하고 있습니다. 

지금 3 주차에 접어 들었는데요, 버그의 현상은 시스템을 종료할 때 가끔 정상적인 종료가 안되고 멈추는 것입니다.

현상

실험 데이터를 바탕으로 종합해보면, 2 코어 4스레드인 CPU가 장착된 장비에서는 약 1/1000의 확률로 종료된 후에 다시 리부팅이 안되고 텍스트 모드 화면에서 커서만 깜빡입니다. 13코어 26스레드인 CPU 2개가 장착된 장비에서는 약 1/20의 확률로 종료가 정상적으로 종료가 안되고 같은 현상으로 멈춥니다. 

원래 systemd가 종료 시에 모든 프로세스를 죽인다는 메시지가 출력되고 종료가 시작되어야하는데, 이 부분 전에 멈춰서 종료가 더 이상 진행이 안되더라구요. ㅠㅠ

원인 분석을 위한 실험, 그리고 해결책...

사실 정확한 원인을 찾지 못했어요. ㅠㅠ 여러 실험을 반복한 결과, 가상화 기술 중 Extended Page Tagle(EPT)를 활성화하고 호스트의 일부 메모리를 매핑하지 않았을 때 문제가 발생한다는 것까지 파악했습니다만... 이 맵핑 안된 메모리 때문에 간혹 종료가 안되는 현상은 이해하기가 어렵더라구요. 

시스템 종료 시에 어떤 이유에서인지 해당 물리 메모리에 접근하는 부분이 있는 것 같은데... 정확하게 찾지 못해서 결국은 메모리를 매핑하지 않은 부분을 읽기 전용으로 매핑해서 우회했습니다. ㅠㅠ 

 기존의 KVM이나 Xen을 안쓰고 처음부터 만들었더니만, 역시 이런 저런 문제가 많이 생기네요. ㅠㅠ 

 다음에는 기존에 있는 걸 최대한 활용해야겠습니다. 그럼 좋은 하루 되세요. ;)


+ Recent posts