Kinvolk の Inspektor Gadget を触っていて、Node で確認すると BCC 使っていたのだけど、そのオプションに --mntnsmap というオプションが使われていた。

https://github.com/iovisor/bcc/commit/32ab858309c84c23049715aaab936ce654ad5792 のコミットで入っていた。
2020年5月に入っていたんですね…。Software Design で eBPF(というか BCC)連載を書いたのが2020年9月頃だったと思うのだが、この変更全く追えておらず…。

で、この --mntnsmap というオプションだが、名前の通り mount namespace + BPF Map を使ってコンテナのイベントだけにフィルタリングするオプション。 他にも cgroup でフィルタするオプションも入っている。

https://github.com/iovisor/bcc/blob/f458c3535b5d56b9e0f2841d4f42ba6951aa30bc/docs/special_filtering.md

結局 cgroup か mount namespace でコンテナか判断するようになったんですね。
このドキュメントの通りやると mount namespace 単位でトレースできる。

# bpftool map create /sys/fs/bpf/mnt_ns_set type hash key 8 value 4 entries 128 name mnt_ns_set flags 0
# tools/execsnoop.py --mntnsmap /sys/fs/bpf/mnt_ns_set
# unshare -m bash
# FILE=/sys/fs/bpf/mnt_ns_set
# if [ $(printf '\1' | od -dAn) -eq 1 ]; then
      HOST_ENDIAN_CMD=tac
  else
      HOST_ENDIAN_CMD=cat
  fi

# NS_ID_HEX="$(printf '%016x' $(stat -Lc '%i' /proc/self/ns/mnt) | sed 's/.\{2\}/&\n/g' | $HOST_ENDIAN_CMD)"
# bpftool map update pinned $FILE key hex $NS_ID_HEX value hex 00 00 00 00 any
# ping example.com
# /usr/share/bcc/tools/execsnoop --mntnsmap /sys/fs/bpf/mnt_ns_set
PCOMM            PID    PPID   RET ARGS
ping             757212 756973   0 /usr/bin/ping example.com
id               757286 756973   0 /usr/bin/id