리눅스 커널에 컨테이너 객체가 생길까 — 조셉 바식의 ‘셀(cell)’ 제안
리눅스 커널에는 "컨테이너"라는 객체가 없습니다. 커널은 네임스페이스, cgroup, seccomp 같은 부품만 제공합니다. 조립은 Docker, Podman, LXC 같은 사용자 공간 도구가 맡습니다. 그래서 커널은 "이 프로세스가 어느 컨테이너에 속하는가"라는 질문에 답할…
리눅스 커널에는 "컨테이너"라는 객체가 없습니다. 커널은 네임스페이스, cgroup, seccomp 같은 부품만 제공합니다. 조립은 Docker, Podman, LXC 같은 사용자 공간 도구가 맡습니다. 그래서 커널은 "이 프로세스가 어느 컨테이너에 속하는가"라는 질문에 답할…
Docker Engine을 설치하고 나면 바로 몇 가지 불편과 위험이 드러난다. 일반 계정으로 docker ps를 치면 권한 오류가 나고, 컨테이너 로그는 기본 설정에서 크기 제한 없이 디스크를 채운다. Docker 데몬을 재시작하면…
처음 쓴 Dockerfile은 대개 동작은 하지만 코드 한 줄만 고쳐도 의존성 설치부터 다시 돌고, 이미지가 1GB를 넘기고, 컨테이너 안 프로세스가 root로 뜬다. 만든 이미지를 다른 서버로 옮기려 해도 레지스트리 주소와…
게스트에 소스를 올려 빌드하거나 호스트가 만든 산출물을 게스트에서 바로 읽으려면 디스크 이미지에 복사하는 것보다 호스트 디렉터리를 그대로 공유하는 쪽이 편하다. QEMU에는 이걸 하는 방법이 두 가지 있다. 오래된 virtio-9p(-virtfs)와, FUSE…
Docker는 root 권한으로 도는 dockerd 데몬에 명령을 보내는 구조라서, docker 그룹에 사용자를 넣는 순간 그 사용자는 사실상 root가 된다. docker run -v /:/host로 호스트 파일시스템 전체를 마운트할 수 있기 때문이다.…
4편까지 오면 타깃은 완성됐다. 남은 것은 이 타깃을 실제 개발에 쓰는 방법이다. 실물 보드에서 하던 일 — 드라이버를 고쳐 올리고, 부팅이 이상하면 붙잡아 들여다보고, 빌드 결과를 매번 굽지 않고 바로…
1편부터 4편까지는 디스크 이미지를 자르고, U-Boot을 빌드하고, 커널을 컴파일하고, 루트 파일 시스템을 손으로 채웠다. 제품용 타깃이라면 이 과정을 재현 가능하게 자동화해야 하는데, 그 자리에 쓰는 것이 Yocto다. 레시피와 설정 파일에서…
라즈베리파이 4용으로 뭔가를 고칠 때마다 보드에 SD 카드를 꽂았다 뺐다 하는 건 번거롭고, 보드가 손에 없으면 아예 막힌다. QEMU는 8.2까지 라즈베리파이 3B(raspi3b)가 최신이었는데 9.0부터 raspi4b 머신이 들어왔다. 다만 Pi 4는…
3편에서 커널이 ext4 루트를 마운트하는 데까지 갔지만 그 안이 mkfs 직후 상태라 No working init found로 멈췄다. 이제 그 빈 파티션을 채운다. 두 단계로 간다. 먼저 BusyBox 하나로 셸이 뜨는…
2편까지 오면 타깃에 부트로더가 올라가 디스크에서 파일을 읽어 실행하는 데까지 된다. 이제 그 자리에 올릴 커널이 필요하다. 실물 보드라면 벤더가 준 커널 소스를 받아 크로스 컴파일하고 SD 카드에 복사하는 단계인데,…