최종 발표까지 2주, 현재까지 진행 상황
계속 자료 조사하고 소스 코드 컴파일하다 보니 순식간에 시간이 지나갔다.
사실 Device Mapper 연동하고 나서는 계속 코드 분석하고 조금씩 수정해 나가는 과정이었다.
Device Mapper 관련된 코드가 있는 Linux/drivers/md 폴더 내의 파일을 이용한다.
주로 건드리는 파일은 구조체들이 선언되어 있는 dm-zoned.h, zone을 매핑하는 함수들이 있는 dm-zoned-target.c, 그리고 메타데이터 관련 함수들이 있는 dm-zoned-metadata.c이다.
어떻게 해야 Linux Container별로 입출력을 분리할 수 있을까? 하고 생각해 본 결과, Cgroup은 컨테이너별로 생성된다는 사실을 이용해 각 컨테이너들의 Cgroup이 저장된 주소를 일종의 Key로 사용할 수 있다는 결론을 내렸다. 물론 이 결론이 나기까지 거의 한 달 동안 코드와 구조체를 뒤져본 것 같다. 똑같은 페이지를 수백 번 왔다갔다해서 외울 지경이다.
아무튼, 원래 있던 구조체에 원소를 추가하면 그 구조체를 사용하는 커널의 다른 요소까지 건드릴 것 같아서 최대한 기존에 있는(전달받는) 파라미터 내의 구조체 속에서 정보를 찾아오려 했다. 아무래도 입출력에 관련된 함수들이다 보니 bio 구조체는 기본으로 전달받는 경우가 많았다. bio 구조체(blk_types.h 안에 있다) 내의 bi_blkg(struct blkcg_gq) 안의 blkcg(struct blkcg) 안의 css(struct cgroup_subsys_state)안에 있는 id와 cgroup 주소를 사용하기로 했고, 이 값을 저장하기 위해 dm-zoned.h 안의 zone 구조체에 id와 cgroup 포인터 변수를 추가해 받아왔다. 자꾸 Null값이 들어가는지 터지는 경우가 있어 예외 처리를 해 주었다.
현재는 받아온 cgroup 정보(id / address)를 어떻게 key값으로 만들어서 분리 할당해야 하는지를 고민중이다. Cgroup별로 zone을 할당하거나, Zone을 확인하여 이미 사용하는 Cgroup이 있으면 새로 zone을 할당하는 선택지가 있었다. 아마 후자로 진행할 듯 싶다.
공부한 건 엄청 많은데... 한 줄 고치고 컴파일하고, 에러 원인 찾으려고 계속 printk 이용해서 커널 메시지 찍어보고 구글링하는 과정의 연속이어서 그런지 아직까진 가시적인 결과가 안 나온다. 이제 시간이 얼마 남지 않았으니 노력한 만큼 결과를 내기 위해 열심히 머리 굴려 봐야겠다.