set -euo pipefail로 안전한 Bash 스크립트 작성하기

Bash 기본 동작은 명령 하나가 실패해도 스크립트가 멈추지 않고 다음 줄로 넘어간다. mkdir가 실패했는데 그다음 cd와 rm -rf *가 엉뚱한 디렉터리에서 실행되는 식의 사고가 여기서 나온다. set -euo pipefail은 이…

Continue Readingset -euo pipefail로 안전한 Bash 스크립트 작성하기

Bash 배열과 getopts로 커맨드라인 인자 제대로 다루기

쉘 스크립트에서 $1, $2를 순서대로 읽는 방식은 옵션이 두세 개만 넘어가도 순서를 착각하기 쉽고, 필수 옵션 누락 같은 실수를 걸러낼 방법이 없다. 공백으로 이어붙인 문자열을 IFS로 잘라 쓰는 방식도 값…

Continue ReadingBash 배열과 getopts로 커맨드라인 인자 제대로 다루기

Ubuntu unattended-upgrades로 보안 패치 자동 적용하기

보안 패치는 CVE가 뜬 순간이 아니라 담당자가 apt를 돌리는 순간에야 적용된다. 서버가 몇 대만 넘어가도 관리가 안 되고, 휴가나 주말 사이에 터진 취약점은 며칠씩 방치되기 쉽다. Ubuntu는 매일 자동으로 보안…

Continue ReadingUbuntu unattended-upgrades로 보안 패치 자동 적용하기

QEMU/KVM에서 virtio-net으로 네트워크 성능 끌어올리기

QEMU/KVM 게스트의 기본 에뮬레이트 NIC(e1000, rtl8139 등)은 물리 NIC 레지스터를 소프트웨어로 그대로 흉내 내, 패킷 하나마다 MMIO/PIO 접근이 VM Exit로 호스트에 트랩된다. 이 트랩 비용 때문에 처리량이 물리 NIC 대비…

Continue ReadingQEMU/KVM에서 virtio-net으로 네트워크 성능 끌어올리기

Python mmap으로 파일을 메모리처럼 다루기

파일 크기가 물리 메모리를 넘어서면 open().read()로 통째로 읽는 순간 프로세스 메모리가 그만큼 늘어나 OOM killer에 걸릴 수 있다. Python 표준 라이브러리 mmap은 파일을 프로세스의 가상 주소 공간에 매핑해서, 실제로 접근한…

Continue ReadingPython mmap으로 파일을 메모리처럼 다루기

ARM SVE(Scalable Vector Extension)로 가변 길이 벡터 연산 다루기

NEON은 레지스터 폭이 128비트로 고정돼 있어 배열 길이가 4의 배수가 아니면 스칼라 tail 루프를 따로 짜야 하고, 128비트부터 2048비트까지 벡터 폭이 다양한 ARM 생태계에서도 컴파일 타임에 고정된 128비트씩만 처리한다 —…

Continue ReadingARM SVE(Scalable Vector Extension)로 가변 길이 벡터 연산 다루기

kgdb로 원격 시스템 라이브 디버깅하기

커널이 패닉 없이 그냥 멈추거나, 특정 syscall 경로에서만 간헐적으로 이상 동작을 보이는 경우 printk만으로는 원인을 좁히기 어렵다. dmesg에 로그를 더 찍고 재현하고 다시 빌드하는 사이클은 타이밍에 민감한 버그일수록 무력해진다. 이럴…

Continue Readingkgdb로 원격 시스템 라이브 디버깅하기

라즈베리파이에서 SPI 통신으로 센서/디스플레이 다루기

라즈베리파이에서 ADC나 LED 매트릭스처럼 빠른 응답과 큰 데이터 전송량이 필요한 주변장치를 다룰 때 I2C(배선 2개, 수백 kHz, 슬레이브 주소 기반)는 속도와 주소 충돌 면에서 답답하다. SPI(Serial Peripheral Interface)는 MOSI/MISO를 따로…

Continue Reading라즈베리파이에서 SPI 통신으로 센서/디스플레이 다루기

리눅스 커널 futex로 유저스페이스 락 직접 구현하기

pthread_mutex 하나로도 충분히 락을 걸 수 있는데 왜 futex를 직접 만져야 할까. 사실 glibc의 pthread_mutex_lock 자체가 내부적으로 futex(2) syscall 위에 구현되어 있다 — 경쟁이 없을 때는 유저스페이스의 atomic CAS(compare-and-swap) 한…

Continue Reading리눅스 커널 futex로 유저스페이스 락 직접 구현하기