-
6. XenStore, Xenbus개발/가상화 2017. 1. 22. 13:40
Dom0의 장치드라이버인 Backend와 DomU의 장치드라이버인 Frontend가 서로 통신하기 위해선 각 상대 드라이버(Otherend) 상태와 연결 포트와 같은 정보들이 필요하다. 이런 정보들을 각 드라이버들마다 따로 정보를 관리하는 툴을 만들어서 처리 할 수 있겠지만, Xen에서는 이런 정보들을 Xenstore라는 자료구조를 통해 일괄적으로 관리할 수 있게 한다.
Xenstore에는 이런 정보들이 입력된다.Dom0에서 xenstore-ls를 입력하면 현재 활성화된 Domain의 목록과 각 Domain들이 갖고 있는 장치들의 종류와 상태, 위치, 타입 등등을 알 수 있다. 그림을 보면 "local/domain/[domain id]/[device type]/[driver name]"처럼 경로의 형태로 관리해서 눈으로 보기도 편하다. Xen에서는 경로로 되어있는 주소 값들을 간단히 자료구조화 해서 필요한 정보들을 쉽게 제공한다.
저장되어있는 값들을 분석해보자.
"/local/domain/1/store"는 Domain1이 Xen Store와 통신하기 위해 필요한 정보들을 갖고 있다. "/store/port"는 Xenstore용 포트로 1번을 두었고 "store/ring-ref"는 store와 연결된 페이지(mfn)을 매핑하는 grant table의 엔트리 번호가 "634199"번임을 의미한다.
"/local/domain/2/device/vbd/768" 경로에 담고 있는 값들은 Domain2의 Frontend Block Driver에 대한 정보들을 담고 있다. state는 1이고 device type은 "disk"이다. 여기서 Frontend, Backend들이 주로 참고하는 값은 "state"값이다.
Xenstore에서 갖고 있는 값들은 각 Frontend, Backend드라이버들이 연결 될 때 중요한 Dom0가 갖고 있는 Backend는 Frontend가 초기화 상태인지, 아니면 죽어가고 있는 상태(Dying)인지에 따라서 취해야 할 작업들이 존재한다. 각 드라이버들의 상태를 저장해둔 값이 state값이고 각 Backend와 Frontend 드라이버가 watch를 상대 드라이버에 경로 state값에 걸어준 후 값이 변경 될 때 마다 필요한 작업들을 실행하도록 콜백을 호출한다.
Xenstore와 각 Domain들이 값을 읽고 쓸 수 있는 연결 통로가 필요한데 이때 사용되는 것이 Xenbus이다. 컴퓨터에서 각 장치들끼리 연결 되기 위해 필요한 통로로 bus를 사용하는데 Xenbus는 bus의 소프트웨어 버전이라 생각하면 된다(소프트웨어적으로 구현된 bus는 Xenbus말고도 여러 개가 존재하는데 xenbus는 Xen환경에 최적화해서 만든 bus다)
Dom0와 DomU는 xenbus를 통해서 Xenstore에 접근해 각각의 장치 드라이버 초기화에 필요한 정보(state, ring-ref값 등등)를 얻고 이 정보들을 통해 Backend-Frontend를 xenbus로 연결한다. 이 xenbus를 통해서 각 드라이버들은 요청/응답을 받을 수 있는 루틴이 완성된다. 이때 사용되는 메커니즘이 Domain간 통신방법 포스트에서 설명한 Ring과 이벤트 채널이다. Xenbus는 심플한 두 매커니즘을 이용해 드라이버간의 연결을 담당한다.
'개발 > 가상화' 카테고리의 다른 글
QEMU와 KVM - 2 (1) 2017.11.11 QEMU와 KVM - 1 (0) 2017.11.01 5. 이벤트 채널 소개 (0) 2017.01.07 가상화기술의 대표적인 보안 문제 (0) 2016.12.10 4. Domain 장치 드라이버 개발 (0) 2016.11.27