Linux에서 eBPF 프로그램과 BPF Map은 모두 커널 내부 객체(Kernel Object)입니다. 이러한 객체는 일반적인 파일처럼 디스크에 저장되는 것이 아니라 커널 메모리에 생성되어 관리됩니다.
하지만 운영 환경에서는 생성된 eBPF Program이나 BPF Map을 여러 프로세스가 공유하거나, 프로그램이 종료된 후에도 계속 사용할 수 있어야 하는 경우가 많습니다.
이를 위해 Linux는 bpffs(BPF File System) 라는 전용 가상 파일 시스템을 제공합니다.
bpffs는 eBPF 객체를 파일처럼 관리할 수 있도록 만들어진 특수 파일 시스템이며, Pinning 기능의 기반이 되는 핵심 구성 요소입니다.
이번 글에서는 bpffs의 개념과 구조, 동작 원리, Pinning과의 관계, 주요 명령어, 실무 활용 사례를 자세히 알아보겠습니다.
Linux bpffs란?
bpffs는 BPF(Berkeley Packet Filter) 객체를 관리하기 위한 Linux 전용 가상 파일 시스템(Virtual File System) 입니다.
기본 구조는 다음과 같습니다.
User Space
↓
bpffs
↓
BPF Program
BPF Map
BPF Link
↓
Linux Kernel
bpffs는 실제 디스크 파일을 저장하는 파일 시스템이 아니라, 커널 내부 객체를 사용자 공간에서 접근할 수 있도록 연결해 주는 역할을 합니다.
bpffs가 필요한 이유
만약 bpffs가 없다면 다음과 같은 문제가 발생합니다.
- 프로그램 종료 시 BPF 객체 삭제
- 다른 프로세스가 동일한 객체 접근 불가
- BPF Map 공유 어려움
- 운영 중인 Program 재사용 불가
bpffs를 사용하면 이러한 문제를 해결할 수 있습니다.
bpffs의 동작 원리
전체 흐름은 다음과 같습니다.
Application
↓
BPF Object 생성
↓
Pin
↓
bpffs
↓
Kernel Object 유지
↓
다른 Application 접근
bpffs는 커널 객체에 대한 참조(Reference)를 유지하여 여러 프로그램이 동일한 객체를 사용할 수 있게 합니다.
기본 마운트 위치
대부분의 Linux 배포판에서는 다음 경로를 사용합니다.
/sys/fs/bpf
예시
/sys/fs/bpf
├── xdp_prog
├── firewall
├── counter_map
├── trace_map
└── links
여기에 생성된 항목은 모두 Kernel Object를 가리킵니다.
bpffs 확인
현재 bpffs가 마운트되어 있는지 확인합니다.
mount | grep bpf
출력 예시
bpffs on /sys/fs/bpf type bpf
정상적으로 마운트되어 있으면 Pinning 기능을 사용할 수 있습니다.
bpffs 마운트
마운트되어 있지 않다면
sudo mount -t bpf bpf /sys/fs/bpf
또는
sudo mkdir -p /sys/fs/bpf
sudo mount -t bpf bpf /sys/fs/bpf
를 실행하면 됩니다.
bpffs에서 관리하는 객체
bpffs는 다양한 BPF 객체를 관리합니다.
대표적으로
- BPF Program
- BPF Map
- BPF Link
- BTF 객체
등을 저장할 수 있습니다.
Program 저장
Program Pin 예시
sudo bpftool prog pin id 10 /sys/fs/bpf/xdp_prog
확인
ls -l /sys/fs/bpf
출력 예시
xdp_prog
Program은 bpffs에 계속 유지됩니다.
Map 저장
Map도 동일하게 저장할 수 있습니다.
sudo bpftool map pin id 20 /sys/fs/bpf/counter_map
다른 프로그램도
/sys/fs/bpf/counter_map
을 이용하여 동일한 Map에 접근할 수 있습니다.
Link 저장
최근 Linux에서는 BPF Link도 Pinning이 가능합니다.
예를 들어
sudo bpftool link pin id 3 /sys/fs/bpf/xdp_link
Hook 연결 자체를 유지할 수 있습니다.
bpffs와 일반 파일 시스템의 차이
| 항목 | bpffs | 일반 파일 시스템 |
|---|---|---|
| 저장 대상 | Kernel Object | 일반 파일 |
| 디스크 저장 | X | O |
| 메모리 기반 | O | 일부 |
| Program 공유 | O | X |
| Map 공유 | O | X |
| Pinning | 지원 | 미지원 |
bpffs는 파일처럼 보이지만 실제로는 커널 객체를 참조하는 특수한 파일 시스템입니다.
bpffs와 Pinning의 관계
Pinning은 반드시 bpffs를 사용합니다.
동작 과정은 다음과 같습니다.
Program
↓
Pin
↓
bpffs
↓
Kernel Object 유지
즉,
Pinning 기능은 bpffs 위에서 동작합니다.
bpftool과 함께 사용
Program 목록
sudo bpftool prog show
Map 목록
sudo bpftool map show
Pinned Program 확인
sudo bpftool prog show pinned /sys/fs/bpf/xdp_prog
Pinned Map 확인
sudo bpftool map show pinned /sys/fs/bpf/counter_map
bpffs 사용 시 주의사항
운영 환경에서는 다음 사항을 주의해야 합니다.
- 사용하지 않는 객체 삭제
- 적절한 접근 권한 설정
- 이름 충돌 방지
- Pin 경로 관리
- 오래된 Program 정리
객체가 많아질수록 관리 정책을 마련하는 것이 좋습니다.
실무에서 자주 사용하는 명령어
bpffs 확인
mount | grep bpf
디렉터리 확인
ls -l /sys/fs/bpf
Program Pin
sudo bpftool prog pin id 10 /sys/fs/bpf/demo_prog
Map Pin
sudo bpftool map pin id 20 /sys/fs/bpf/demo_map
Pinned Program 확인
sudo bpftool prog show pinned /sys/fs/bpf/demo_prog
Pinned Map 확인
sudo bpftool map show pinned /sys/fs/bpf/demo_map
실무 사례
예를 들어 Cilium 기반 Kubernetes 클러스터를 운영한다고 가정해 보겠습니다.
다음과 같은 방식으로 bpffs를 활용할 수 있습니다.
- XDP Program을
/sys/fs/bpf/cilium_xdp에 Pin - 서비스별 통계를 Hash Map으로 생성
- Hash Map을
/sys/fs/bpf/service_map에 Pin - 관리 프로그램이 종료되어도 객체 유지
- 새로운 관리 프로세스가 기존 Map을 열어 통계 조회
- 서비스 중단 없이 네트워크 정책을 지속적으로 운영
이처럼 bpffs는 eBPF 객체를 장기간 유지하고 공유하는 핵심 역할을 수행합니다.
자주 묻는 질문
bpffs는 일반 파일 시스템인가요?
아닙니다. bpffs는 디스크에 파일을 저장하는 일반 파일 시스템이 아니라, 커널 내부의 eBPF 객체를 파일처럼 관리하기 위한 가상 파일 시스템입니다.
bpffs와 Pinning은 어떤 관계인가요?
Pinning은 bpffs를 기반으로 동작합니다. Program이나 Map을 Pin하면 /sys/fs/bpf 아래에 항목이 생성되고, 이를 통해 커널 객체를 계속 참조할 수 있습니다.
시스템을 재부팅하면 bpffs에 있는 객체는 유지되나요?
아닙니다. bpffs 자체는 다시 마운트할 수 있지만, 저장된 eBPF 객체는 커널 메모리에 존재하므로 재부팅하면 사라집니다. 부팅 후에는 프로그램을 다시 로드하고 Pin해야 합니다.
마무리
Linux bpffs(BPF File System)는 eBPF Program, BPF Map, BPF Link 등 커널 객체를 관리하기 위한 전용 가상 파일 시스템입니다. Pinning 기능의 기반이 되는 핵심 요소로, 여러 프로세스가 동일한 객체를 공유하고 운영 중에도 안정적으로 재사용할 수 있도록 지원합니다. eBPF 기반 시스템을 설계하거나 운영한다면 bpffs의 구조와 활용 방법을 반드시 이해해야 합니다.