QEMU(arm64) 임베디드 리눅스 타깃 만들기 (1) — 타깃 디스크 이미지와 virt 보드 구성

임베디드 리눅스 개발은 보드가 손에 있어야 시작되는 일이 많다. 부트로더를 잘못 덮어써 보드를 못 쓰게 만들거나, SD 카드를 다시 굽느라 시간을 흘려보내거나, 사람 수보다 보드가 적어 순서를 기다리는 상황이 반복된다.…

Continue ReadingQEMU(arm64) 임베디드 리눅스 타깃 만들기 (1) — 타깃 디스크 이미지와 virt 보드 구성

unshare와 nsenter로 리눅스 네임스페이스 직접 다뤄보기

컨테이너가 "격리"된다고 할 때 그 격리를 실제로 만드는 건 커널의 네임스페이스다. 도커나 podman 없이도 unshare 명령 하나로 같은 격리를 만들 수 있고, 그렇게 해보면 컨테이너 런타임이 무엇을 조립하고 있는지가 훨씬…

Continue Readingunshare와 nsenter로 리눅스 네임스페이스 직접 다뤄보기

QEMU(arm64)에 라즈베리파이 올리기

라즈베리파이 OS의 설정을 조금 바꿔볼 때마다 SD 카드를 굽고 보드에 꽂고 전원을 넣는 건 느리다. 보드가 아직 손에 없거나, 망가뜨려도 되는 환경이 필요할 때도 있다. QEMU의 raspi3b 머신은 배포된 이미지를…

Continue ReadingQEMU(arm64)에 라즈베리파이 올리기

systemd-nspawn으로 경량 리눅스 컨테이너 직접 만들기

패키지 설치 스크립트를 깨끗한 배포판에서 검증하거나, systemd 유닛이 여러 개 도는 환경을 통째로 재현해야 할 때가 있다. 도커는 컨테이너당 프로세스 하나를 전제로 설계돼 있어 systemd를 PID 1로 올리려면 우회가 필요하고,…

Continue Readingsystemd-nspawn으로 경량 리눅스 컨테이너 직접 만들기

Ubuntu 22.04 LXC 컨테이너 사용하기

LXC(Linux Containers)는 리눅스 커널의 컨트롤 그룹(cgroup)과 네임스페이스만으로 격리된 실행 환경을 만드는 컨테이너 기술로, Docker가 내부적으로 쓰던 기반 기술이기도 하다. Docker처럼 이미지 레이어나 오케스트레이션 기능은 없지만, 그만큼 가볍고 VM에 가까운 방식으로…

Continue ReadingUbuntu 22.04 LXC 컨테이너 사용하기

libvirt로 가상머신 관리 자동화하기

virsh 명령을 손으로 하나씩 치면서 VM을 만들고 지우는 건 한두 대일 때는 괜찮지만, 스토리지 풀 준비·도메인 정의·스냅샷·정리까지 반복해야 하는 상황이라면 스크립트로 묶는 게 낫다. 이 글에서는 virt-install로 도메인 XML을 자동…

Continue Readinglibvirt로 가상머신 관리 자동화하기

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

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

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

QEMU/KVM 라이브 마이그레이션 원리와 실습

하이퍼바이저 호스트를 재부팅해야 할 때, VM을 끄고 다른 호스트에서 다시 켜는 cold migration은 서비스가 몇 분씩 죽는다. QEMU/KVM의 live migration은 VM을 실행 상태 그대로 유지하며 메모리/디바이스 상태를 다른 호스트로 옮기고…

Continue ReadingQEMU/KVM 라이브 마이그레이션 원리와 실습