3.1 KiB
3.1 KiB
게스트의 write() 가 virtqueue 에 실리기까지
Alternative text
게스트 사용자 공간의 PostgreSQL/Keycloak 에서 시작한 write() 가 게스트 커널의 VFS, ext4/XFS, Guest Page Cache, Guest Block Layer, /dev/vda, virtio-blk Frontend 를 거쳐 virtqueue 에 도달하는 위에서 아래로 읽는 흐름도.
Long description
위에서 아래로 읽는다. 맨 위 Guest Userspace 구역에 PostgreSQL / Keycloak 이 있고 write() 가 게스트 커널로 내려간다. Guest Kernel 구역 안에서 VFS 가 먼저 받고, ext4 / XFS 가 파일을 block 공간에 배치하고, Guest Page Cache 가 그 내용을 dirty page 로 받아 두었다가 writeback 으로 Guest Block Layer 에 내려보낸다. Guest Block Layer 는 그것을 WRITE 나 FLUSH 요청으로 바꿔 /dev/vda 에 걸고, virtio-blk Frontend 가 그 요청을 virtqueue 에 게시한다. virtqueue 아래의 VM Boundary 부터는 QEMU 와 호스트 계층이라 이 그림에서 잘랐다. 완료가 같은 virtqueue 로 되돌아오는 역방향은 SSOT 의 다른 절이 대는 사실이라 이 그림에 넣지 않았고 본문 문단이 맡는다.
Elements and evidence
- Boundary: Guest Userspace (boundary): 게스트 사용자 공간. 저장장치를 직접 다루지 않는다. Evidence: L5807–L5809.
- Boundary: Guest Kernel (boundary): 게스트 커널 공간. VM Boundary 위쪽 계층이 전부 여기 있다. Evidence: L5815–L5833.
- PostgreSQL / Keycloak (service): 파일 연산을 요청하는 게스트 프로세스. Evidence: L5807–L5809, L5885–L5885, L5811–L5813.
- VFS (service): 열린 파일이 어느 filesystem 구현에 속하는지 보고 연산을 넘기는 공통 계층. Evidence: L5815–L5817, L5905–L5905.
- ext4 / XFS (service): 파일과 디렉터리를 block 공간에 배치하는 게스트 filesystem. Evidence: L5819–L5819.
- Guest Page Cache (store): 게스트 RAM 에 있는 cache. write() 가 성공해도 데이터는 아직 여기까지만 확정된다. Evidence: L5821–L5821.
- Guest Block Layer (service): 파일 세계의 요청을 block device 세계의 요청으로 바꾸는 계층. Evidence: L5825–L5825.
- /dev/vda (device): 게스트 Linux 가 하나의 block device 로 인식하는 이름. Evidence: L5829–L5829, L5879–L5879.
- virtio-blk Frontend (service): 그 가상 block device 를 제어하는 게스트 커널 driver. Evidence: L5831–L5831, L5789–L5789.
- virtqueue (queue): 요청이 실리는 자리. 바로 아래가 VM Boundary 다. Evidence: L5833–L5835.
Relationships
- PostgreSQL / Keycloak → VFS: data. Evidence: L5811–L5813, L5890–L5890.
- VFS → ext4 / XFS: data. Evidence: L5817–L5819.
- ext4 / XFS → Guest Page Cache: data. Evidence: L5819–L5821.
- Guest Page Cache → Guest Block Layer: writeback. Evidence: L5823–L5825.
- Guest Block Layer → /dev/vda: WRITE / FLUSH. Evidence: L5827–L5829.
- /dev/vda → virtio-blk Frontend: data. Evidence: L5829–L5831.
- virtio-blk Frontend → virtqueue: Virtio block request. Evidence: L5831–L5833.