계속 자료 조사하고 소스 코드 컴파일하다 보니 순식간에 시간이 지나갔다.
사실 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 이용해서 커널 메시지 찍어보고 구글링하는 과정의 연속이어서 그런지 아직까진 가시적인 결과가 안 나온다. 이제 시간이 얼마 남지 않았으니 노력한 만큼 결과를 내기 위해 열심히 머리 굴려 봐야겠다.
'ZNS Isolation with Linux Container' 카테고리의 다른 글
| 마무리 (0) | 2022.10.09 |
|---|---|
| ZNS SSD 논문 번역 (0) | 2022.07.16 |
| Uftrace 사용법 (0) | 2022.07.10 |
| ZNS SSD에 관한 공부와 Zonefs 파일시스템 마운트 방법 (0) | 2022.07.10 |
| Linux Kernel Code Compile (0) | 2022.06.24 |