ut between that call and the running container, three programs do a relay. One of them commits suicide on purpose."
---

`kubelet` calls `containerd`. Container appears. But between that call and the running container, three programs do a relay. One of them commits suicide on purpose.

This article traces the relay: what each program does, why it exists, and what the process tree looks like after they're done.

```
kubectl set image deployment/api api=api:v2
  │
  ① kubectl → API Server → etcd (write new image)
  ② Deployment Controller → creates new ReplicaSet
  ③ ReplicaSet Controller → creates Pod objects
  ④ Scheduler → assigns Pod to a Node
  ⑤ kubelet picks up the Pod
  │
  ▼
containerd
  │ fork
  ▼
containerd-shim (middle process)
  │ fork → then exits (double fork)
  ▼
containerd-shim-runc-v2 (babysitter) ← reparented to PID 1
  │ exec
  ▼
runc
  │ set up namespaces, cgroups, chroot
  │ start container process
  │ exit (job done)
  ▼
container process (running)
  parent = containerd-shim-runc-v2
  grandparent = systemd (PID 1)
```

```
Steady state (containerd-shim and runc both exited):

systemd (PID 1)
  ├── containerd                         ← manager, talks over ttrpc socket
  └── containerd-shim-runc-v2           ← babysitter, waitpid() sleeping
          └── nginx (container PID 1)    ← your workload
```

`containerd` and `containerd-shim-runc-v2` are siblings under `systemd`. Not parent-child. They talk over a ttrpc socket, not through the process tree. `nginx` shows PID 1 inside the container's PID namespace. From the host, it has a normal PID like 50321.

> This is `containerd`'s internal machinery. K8s doesn't know any of this exists. For how K8s got to `containerd` in the first place, see [Container Runtime: A Divorce Story](/v2/container-runtime-evolution).

---

## `runc`: a builder, not a babysitter

`runc` is a CLI tool. It builds the container and exits. Sets up Linux namespaces, cgroups, chroot, starts the process, then it's gone.

The container is running. `runc` is already dead. Who's the parent now?

---

## Why three programs exist

The container needs a long-lived parent. Hold its stdio (for `kubectl logs`). Call `waitpid()` when it dies, collect the exit code, and pass it up so `kubectl get pod` can show `Completed` or `Error`. Respond to `containerd`'s queries (for `kubectl exec`, status checks). `runc` can't do this. It already exited.

Could `containerd` do it directly? Yes. But `containerd` gets restarted. Version upgrades, security patches, config changes. Every restart creates process management problems for its children. So the design was forced, one problem at a time (this is the order problems were discovered, not the order programs run):

1. Container needs a long-lived parent → `runc` can't stay
2. Make `containerd` the parent? → `containerd` restarts too often
3. Create a dedicated babysitter → **`containerd-shim-runc-v2`** is born
4. Babysitter must be independent of `containerd`'s process tree → needs double fork
5. Double fork requires a middle process that forks and immediately exits → **`containerd-shim`** is born

Every layer exists because the previous one wasn't enough.

---

## The orphan problem

Every Linux process has a parent. When a child dies, the parent must call `wait()` to clean it up. Without `wait()`, the dead child becomes a **zombie**. No longer running. No RAM usage. But still occupying a row in the process table (a PID slot). Zombies are not memory leaks. They're PID leaks.

A living orphan is worse. When a parent dies, the kernel reparents children to `systemd` (PID 1). `systemd` keeps them alive but doesn't know if they _should_ be alive. A runaway orphan process eats CPU and RAM until someone manually kills it or it exits on its own.

`containerd-shim-runc-v2` is the container's parent. But who parents `containerd-shim-runc-v2`? And how do you detach it from `containerd`'s process tree?

---

## The double fork trick

First, the names. They look almost identical, but they're two different programs:

| | `containerd-shim` | `containerd-shim-runc-v2` |
|---|---|---|
| Lifespan | Less than a second | Lives as long as the container |
| Purpose | Fork the babysitter, then exit | Guard the container |
| Analogy | Surrogate mother. Gives birth, leaves | Live-in nanny |

`containerd-shim` exists only to make `containerd-shim-runc-v2` an orphan. That's it.

Now the mechanism. `containerd` uses a classic Unix trick: **double fork**. Fork twice in a row.

1. `containerd` forks → `containerd-shim` (child)
2. `containerd-shim` forks → `containerd-shim-runc-v2` (grandchild)
3. `containerd-shim` exits immediately
4. `containerd-shim-runc-v2` is now an orphan
5. Linux kernel reparents `containerd-shim-runc-v2` to PID 1 (`systemd`)

"Parent dies, child dies too." Wrong. That's not how Linux works.

> Parent dies → child gets adopted by PID 1 → child keeps running.

The confusion comes from **shells**. When you close a terminal:

- Terminal closes → sends `SIGHUP` to bash
- Bash receives `SIGHUP` → forwards `SIGHUP` to all its children
- Children receive `SIGHUP` → default behavior is to exit
- Bash exits

The children didn't die because their parent died. They died because **bash actively killed them before dying.** That's shell behavior, not kernel behavior.

`nohup` works by ignoring SIGHUP:

```bash
nohup python script.py &
# bash closes → sends SIGHUP → python ignores it → python keeps running
# bash dies → python is orphan → kernel gives it to PID 1
```

`containerd-shim` exits without sending any signal. It's not a shell. So `containerd-shim-runc-v2` just becomes an orphan and keeps running.

```
Before (right after fork):

  containerd (PID 500)
    └── containerd-shim (PID 501)
          └── containerd-shim-runc-v2 (PID 502)
```

```
After (containerd-shim exits):

  containerd (PID 500)              ← no longer parent of anything
  systemd (PID 1)
    └── containerd-shim-runc-v2 (PID 502)   ← adopted by PID 1
          └── container process (PID 503)
```

`containerd` and `containerd-shim-runc-v2` are no longer in a parent-child relationship. Socket can disconnect and reconnect. Process tree can't.

### Why not just fork once?

> No `containerd` design doc spells out these trade-offs explicitly. What follows is inferred from the double fork pattern, the [iximiuz shim walkthrough](https://iximiuz.com/en/posts/implementing-container-runtime-shim/), and the [Container42 shim explainer](https://container42.com/2022/01/10/shim-shiminey-shim-shiminey/).

Without double fork, `containerd-shim-runc-v2` would be `containerd`'s direct child:

```
systemd (PID 1)
  └── containerd (PID 500)
        └── containerd-shim-runc-v2 (PID 502)    ← parent = containerd
```

The container is safe either way. Its parent is `containerd-shim-runc-v2`, not `containerd`. Even if `containerd` crashes, the container never notices. The problem is between `containerd` and `containerd-shim-runc-v2`:

- **During normal operation**, `containerd` receives SIGCHLD signals from every `containerd-shim-runc-v2`. It doesn't want those. It has other work. Pulling images, managing snapshots. Unwanted signals pollute its event loop.
- **`containerd`'s process table** is cluttered with child PIDs it has to track. More bookkeeping, more state to lose on crash.
- **On restart**, the new `containerd` process has no parent relationship with existing `containerd-shim-runc-v2` processes. It can reconnect via ttrpc, but it can't call `waitpid()` on processes that aren't its children. Linux has no system call to reassign a parent. The process tree is permanently broken until those processes exit.

Will anything crash without double fork? No. `systemd` catches orphans and reaps zombies. But `containerd`'s code gets tangled with process management it shouldn't be doing.

Double fork avoids all of this. `containerd-shim-runc-v2` is never `containerd`'s child. Not before restart, not after, not ever.

---

## What `containerd-shim-runc-v2` actually does all day

After `runc` exits and the container is running, `containerd-shim-runc-v2` sits there and does three things:

| Job | Channel | Why |
|---|---|---|
| Hold stdin/stdout/stderr | file descriptors | `kubectl logs` and `kubectl attach` need something to read from |
| Call `wait()` when container dies | process tree | Collects exit code so `kubectl get pod` can show `Completed` or `Error` |
| Report to `containerd` and respond to commands | ttrpc socket | `containerd` asks "is it still running?" or "kill it" |

`waitpid()` works through the process tree. Only the parent can collect the exit code. That exit code travels through `containerd` → `kubelet` → Pod status. It's why `kubectl get pod` shows `Error` or `Completed`. Reporting works through a ttrpc socket. A connection that can break and reconnect.

If `containerd` crashes, `containerd-shim-runc-v2` still collects the exit code (process tree is intact). It just can't report yet. When the new `containerd` reconnects the socket, `containerd-shim-runc-v2` delivers the result. Reaping and reporting are independent.

Most of the time `containerd-shim-runc-v2` is idle. But "idle" means something specific here.

### How `wait()` works

`waitpid()` is a blocking call. It blocks the caller until the child dies. But `containerd-shim-runc-v2` is written in Go. A Pod can have multiple containers (init, sidecar, main). Each container gets its own goroutine, each calling `waitpid()` on its own PID. One goroutine blocks. The others keep running. The process stays alive, still responding to ttrpc requests.

```go
// per-container goroutine, simplified
func watchContainer(pid int) {
    var status syscall.WaitStatus
    syscall.Wait4(pid, &status, 0, nil)  // blocks this goroutine

    // this goroutine resumes when the container dies
    reportExitCode(status)  // report to containerd via ttrpc
    cleanup()               // close stdio fds
}

// on container create:
go watchContainer(containerPID)  // non-blocking, new goroutine
```

No polling. No timer. No pub/sub. The kernel wakes the blocked goroutine the instant a container dies:

```
t=0   goroutine calls waitpid(nginx_pid) → goroutine sleeps
t=1   ...(shim process still alive, handling ttrpc, watching other containers)
t=999 nginx calls exit()
        → kernel runs do_exit()
        → marks nginx as zombie
        → checks nginx's parent → containerd-shim-runc-v2
        → kernel wakes the goroutine sleeping on waitpid() for this PID
        → waitpid() returns with exit code
```

The kernel doesn't maintain a subscriber list. Every process has exactly one parent, written in its `task_struct`. When a process dies, the kernel looks at that single parent pointer and wakes it up. The goroutine that was waiting on that specific PID resumes.

### kernel vs `systemd`: who notifies whom

kernel and `systemd` are not the same thing. kernel is the OS core running in kernel space. `systemd` is a regular process (PID 1) running in user space.

The notification always comes from the kernel. `systemd`'s only role is being the last-resort parent for orphans:

| Event | Who handles it |
|---|---|
| container dies | kernel wakes `containerd-shim-runc-v2` |
| `containerd-shim-runc-v2` dies | kernel wakes `systemd` |
| `systemd` dies | kernel panic, machine is dead |

`systemd` is a passive adopter. `containerd-shim-runc-v2` is an active guardian. `systemd` doesn't know or care what `containerd-shim-runc-v2` is. It just calls `wait()` when an adopted child dies. `containerd-shim-runc-v2` knows exactly what it's watching and reports the exit code back to `containerd`.

---

## v1 → v2: same job, better packaging

The core mechanism (double fork, reparent, wait, hold stdio) is identical in v1 and v2. What changed:

**v1: one `containerd-shim` per container**

- Pod with 3 containers → 3 `containerd-shim` processes
- 30 Pods x 2 containers average → 60 `containerd-shim` processes on one Node
- Each `containerd-shim` uses gRPC (HTTP/2 + protobuf) to talk to `containerd`. Heavy for small messages.

**v2: one `containerd-shim-runc-v2` per Pod**

- Pod with 3 containers → 1 `containerd-shim-runc-v2` process managing all three
- 30 Pods → 30 `containerd-shim-runc-v2` processes (not 60)
- Uses ttrpc (raw socket + protobuf) instead of gRPC. Lighter.

The naming convention also made runtimes pluggable:

- `containerd-shim-runc-v2` → uses `runc` (default)
- `containerd-shim-runsc-v2` → uses gVisor
- `containerd-shim-kata-v2` → uses kata

`containerd` picks the right binary based on the Pod's RuntimeClass. Adding a new runtime means dropping a new binary on the Node.

---

## References

- [Implementing Container Runtime Shim: runc (iximiuz)](https://iximiuz.com/en/posts/implementing-container-runtime-shim/) — shim daemonization, double fork walkthrough, stdio lifecycle
- [Shim-shiminey Shim-shiminey (Container42)](https://container42.com/2022/01/10/shim-shiminey-shim-shiminey/) — why containerd needs shims, lifecycle detachment, live restore
- [containerd runtime/v2 README (official, shim API and ttrpc design)](https://github.com/containerd/containerd/blob/main/core/runtime/v2/README.md)
- [Containerd组件 - containerd-shim-runc-v2作用 (cnblogs)](https://www.cnblogs.com/zhangmingcheng/p/17524721.html)
- [Zombie process (Wikipedia)](https://en.wikipedia.org/wiki/Zombie_process) — zombie vs orphan, process table entry, PID exhaustion
- [What are the differences between runc v1 and v2? (containerd Discussion #7407)](https://github.com/containerd/containerd/discussions/7407)
- [Shim v1 vs v2 architecture comparison (openEuler, Kata perspective)](https://www.openeuler.org/en/blog/gaohuatao/2021-04-09-isulad-shimv1-shimv2-diff.html)
