개요
컴퓨터 프로그램, 컴퓨터 시스템에서 shim이란, 특정 API에 대한 요청을 transparent하게 intercept해서 실행시키는 라이브러리를 의미한다. Shim은 오래된 API에 대한 지원이나, 새로운 API를 오래된 Application에서 사용하기 위해서 사용된다.
예를 들어서,LD_PRELOAD는 libc라이브러리와 같은 Shared library에 대한 API를 중간에서 가로채서 새로운 API에 제공한다. 이를 통해서 LD_PRELOAD를 통해서 Loading되는 Application은 Binary patch없어도, 새로운 API를 사용할 수 있다.
Docker에서 shim을 통해서, runC (Docker container을 생성하는 프로그램)에 대한 API요청을 contained-shim이 가로채서, containerd는 containerd-shim을 통해서 runC를 호출하고, containerd-shim은 생성된 Container을 계속해서 관리시킬 수 있도록 하였다.
Shim은 Level of indirection의 한 예시로 볼수 있다. Libc <- LD_PRELOAD -> Application나, runC <- Containerd-shim -> Containerd처럼 중간 레이어에 해당하는 새로운 API재정의 라이브러리를 통해서, Shim을 사용할 수 있도록 하는 것이다. (직접 접근이 아니라 새로운 계층을 통해서 접근)