Python ctypes로 C 라이브러리 호출하기

파이썬으로 시스템 프로그래밍을 하다 보면 표준 라이브러리에 없는 저수준 기능이 필요한 순간이 온다. 특정 syscall을 직접 호출해야 하거나, 이미 검증된 C 라이브러리(.so)를 재사용하고 싶거나, 순수 파이썬으로는 느린 연산을 C로 짜둔…

Continue ReadingPython ctypes로 C 라이브러리 호출하기

AddressSanitizer(ASan) 동작원리

ASan(AddressSanitizer)을 켜고 프로그램을 돌리면 heap-buffer-overflow나 use-after-free가 발생한 순간 바로 크래시가 나면서 어느 함수의 몇 번째 줄에서, 어떤 malloc 호출로 할당된 메모리에 접근했는지까지 정확히 짚어주는 리포트가 뜬다. 일반적인 세그폴트는 침범한 메모리가…

Continue ReadingAddressSanitizer(ASan) 동작원리

Linux Kernel: Process Management

ps aux로 프로세스 목록을 보거나, 좀비(zombie) 프로세스가 쌓여서 시스템이 이상하게 동작하는 걸 겪어본 적이 있다면 "프로세스가 어떻게 뜨고, 어떻게 관리되고, 어떻게 사라지는가"를 커널 관점에서 이해할 필요가 생긴다. 유저 공간에서는 fork()/exec()…

Continue ReadingLinux Kernel: Process Management

systemd 서비스 유닛 파일 작성 실전 예제

서버에서 상시 실행되는 스크립트나 데몬을 만들 때 가장 흔한 실수는 nohup ./script.sh &나 crontab의 @reboot 항목으로 급하게 띄우는 것이다. 이런 방식은 서버가 재부팅되거나 프로세스가 죽었을 때 아무도 재시작해주지 않고, 로그는…

Continue Readingsystemd 서비스 유닛 파일 작성 실전 예제

quilt 기반 패치 세트를 자동으로 Git 커밋으로 변환하는 방법

quilt로 관리하던 패치 세트를 Git 저장소로 옮길 때, 흔히 patches 디렉터리를 하나씩 quilt push로 적용하고 그때마다 git add -u, git commit을 반복하는 방법을 쓴다. 패치가 몇 개 안 되면 괜찮지만,…

Continue Readingquilt 기반 패치 세트를 자동으로 Git 커밋으로 변환하는 방법

Valgrind로 메모리 누수 탐지하기

C/C++로 짠 프로그램에서 메모리 누수는 당장 크래시를 내지 않아서 더 골치 아프다. 며칠씩 켜두는 서버 프로세스가 서서히 메모리를 더 먹다가 결국 OOM으로 죽어야 그제서야 문제를 알아차리는 경우가 흔하다. 이 블로그에서는…

Continue ReadingValgrind로 메모리 누수 탐지하기

eBPF를 위한 라즈베리파이 커널 빌드 가이드

라즈베리파이 OS에는 이미 최신 커널이 올라가 있고, CONFIG_BPF_SYSCALL과 CONFIG_BPF_JIT도 기본으로 켜져 있어서 단순한 eBPF 프로그램은 커널을 새로 빌드하지 않아도 로드된다. 문제는 그다음부터다. bpftrace나 최신 BCC 도구 상당수는 BTF(BPF Type Format)…

Continue ReadingeBPF를 위한 라즈베리파이 커널 빌드 가이드

Docker 컨테이너와 VM의 차이와 선택 기준

"컨테이너는 가벼운 VM이다"라는 말을 흔히 듣는다. 틀린 말은 아니지만, 이 표현만 믿고 컨테이너에 VM 수준의 격리를 기대하면 곤란해진다. 신뢰할 수 없는 멀티테넌트 워크로드를 컨테이너 하나로 묶어뒀다가 커널 취약점 하나로 전체가…

Continue ReadingDocker 컨테이너와 VM의 차이와 선택 기준