Files

3.1 KiB
Raw Permalink Blame History

게스트의 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: L5807L5809.
  • Boundary: Guest Kernel (boundary): 게스트 커널 공간. VM Boundary 위쪽 계층이 전부 여기 있다. Evidence: L5815L5833.
  • PostgreSQL / Keycloak (service): 파일 연산을 요청하는 게스트 프로세스. Evidence: L5807L5809, L5885L5885, L5811L5813.
  • VFS (service): 열린 파일이 어느 filesystem 구현에 속하는지 보고 연산을 넘기는 공통 계층. Evidence: L5815L5817, L5905L5905.
  • ext4 / XFS (service): 파일과 디렉터리를 block 공간에 배치하는 게스트 filesystem. Evidence: L5819L5819.
  • Guest Page Cache (store): 게스트 RAM 에 있는 cache. write() 가 성공해도 데이터는 아직 여기까지만 확정된다. Evidence: L5821L5821.
  • Guest Block Layer (service): 파일 세계의 요청을 block device 세계의 요청으로 바꾸는 계층. Evidence: L5825L5825.
  • /dev/vda (device): 게스트 Linux 가 하나의 block device 로 인식하는 이름. Evidence: L5829L5829, L5879L5879.
  • virtio-blk Frontend (service): 그 가상 block device 를 제어하는 게스트 커널 driver. Evidence: L5831L5831, L5789L5789.
  • virtqueue (queue): 요청이 실리는 자리. 바로 아래가 VM Boundary 다. Evidence: L5833L5835.

Relationships

  • PostgreSQL / Keycloak → VFS: data. Evidence: L5811L5813, L5890L5890.
  • VFS → ext4 / XFS: data. Evidence: L5817L5819.
  • ext4 / XFS → Guest Page Cache: data. Evidence: L5819L5821.
  • Guest Page Cache → Guest Block Layer: writeback. Evidence: L5823L5825.
  • Guest Block Layer → /dev/vda: WRITE / FLUSH. Evidence: L5827L5829.
  • /dev/vda → virtio-blk Frontend: data. Evidence: L5829L5831.
  • virtio-blk Frontend → virtqueue: Virtio block request. Evidence: L5831L5833.