본문 바로가기
개발 및 운영

linuxkit 시작

by Joseph.Lee 2021. 7. 30.

 최근 LinuxKit (https://github.com/linuxkit/linuxkit) 에 관심을 두고 있다.

이것이 무엇인지는 위 링크를 참고...^^

 

중점된 것만 한 줄 요약하면 필요한 기능들을 모아서(Docker Image) 하나의 OS를 만드는 것이다. 그리고 만들어진 OS는 불변(Immutable)하다.

 

조금 더 자세하게는,

 * Docker Image들을 사용하여 OS를 빌드하고, 실행시에도 각 이미지들은 containerd를 통해 컨테이너 내부에서 동작하므로 라이브러리 버전에 대한 이슈 등이 발생하지 않으며 (이 때문에 중복된 라이브러리 사용으로 용량 증가의 단점은 있을 수 있다)

* (아마도?) OS내부에서도 각 기능(컨테이너) 간 격리를 할 수도 있다.

 

불변하고 ssh등 접근이 불가하기에 attack surface 가 줄어들며, 필요한 기능을 시스템에서 바로 실행할 수 있는 장점이 있다.

 

앞으로 이걸 가지고 놀아볼(?) 생각이다.

 

그런데 단점으로는 소수의 인원들이 이 프로젝트를 관리하는데 그들 모두 풀타임 개발자가 아니라 적극적으로 유지관리 되지 않는다는 점이다.

참고:
* https://github.com/linuxkit/linuxkit/issues/3437

* https://github.com/linuxkit/linuxkit/issues/3447

그래도 꽤나 좋은 프로젝트 인거 같다. 관심 있으신 분들이 관리를 더 해주셨음 좋겠습니다.

 

---

 

linuxkit release에서 linuxkit 실행 파일을 받을 수 있다. 이는 docker 가 설치되었거나 docker cli가 사용 가능한 머신에서 실행 가능하다.

 

현재 아쉽게도 유지관리가 적극적이지 않은 탓에 example를 통해 이미지를 빌드하면 실패한다.

$ linuxkit build sshd.yml
Extract kernel image: docker.io/linuxkit/kernel:5.12.14
ERRO[0002] Metadata for targets/justin expired
WARN[0002] Error getting targets/justin: targets/justin expired at Thu Jun 11 16:05:18 +0200 2020
WARN[0003] Error getting targets/rolf: valid signatures did not meet threshold for targets/rolf
FATA[0003] Failed to extract kernel image and tarball: Could not pull image docker.io/linuxkit/kernel:5.12.14: Trusted pull for docker.io/linuxkit/kernel:5.12.14 failed: No valid trust data for 5.12.14

이 경우 yml파일에서

#trust:
#  org:
#    - linuxkit

이렇게 trust를 없애주면 된다.

 

그럼 아래와 같이 빌드가 된다.

$ linuxkit build sshd.yml
Extract kernel image: docker.io/linuxkit/kernel:5.12.14
Pull image: docker.io/linuxkit/kernel:5.12.14
Add init containers:
Process init image: docker.io/linuxkit/init:78fb57c7da07c4e43c3a37b27755581da087a3b6
Pull image: docker.io/linuxkit/init:78fb57c7da07c4e43c3a37b27755581da087a3b6
Process init image: docker.io/linuxkit/runc:bf1e0c61fb4678d6428d0aabbd80db5ea24e4d4d
Pull image: docker.io/linuxkit/runc:bf1e0c61fb4678d6428d0aabbd80db5ea24e4d4d
Process init image: docker.io/linuxkit/containerd:cc02c2af9c928c2faeccbe4edc78bd297ad91866
Pull image: docker.io/linuxkit/containerd:cc02c2af9c928c2faeccbe4edc78bd297ad91866
Process init image: docker.io/linuxkit/ca-certificates:4df823737c9bf6a9564b736f1a19fd25d60e909a
Pull image: docker.io/linuxkit/ca-certificates:4df823737c9bf6a9564b736f1a19fd25d60e909a
Add onboot containers:
  Create OCI config for linuxkit/sysctl:02d2bd74509fd063857ceb4c4f502f09ee4f2e0a
Pull image: docker.io/linuxkit/sysctl:02d2bd74509fd063857ceb4c4f502f09ee4f2e0a
  Create OCI config for linuxkit/rngd:bdabfe138f05f7d48396d2f435af16f5a6ccaa45
Pull image: docker.io/linuxkit/rngd:bdabfe138f05f7d48396d2f435af16f5a6ccaa45
Add service containers:
  Create OCI config for linuxkit/getty:ed32c71531f5998aa510847bb07bd847492d4101
Pull image: docker.io/linuxkit/getty:ed32c71531f5998aa510847bb07bd847492d4101
  Create OCI config for linuxkit/rngd:bdabfe138f05f7d48396d2f435af16f5a6ccaa45
  Create OCI config for linuxkit/dhcpcd:1033f340e2d42f86a60aab70752346f0045ea388
Pull image: docker.io/linuxkit/dhcpcd:1033f340e2d42f86a60aab70752346f0045ea388
  Create OCI config for linuxkit/sshd:add8c094a9a253870b0a596796628fd4ec220b70
Pull image: docker.io/linuxkit/sshd:add8c094a9a253870b0a596796628fd4ec220b70
Add files:
  root/.ssh/authorized_keys
Create outputs:
  sshd-kernel sshd-initrd.img sshd-cmdline

 

나는 VMWare를 사용하기 때문에 WSL에서 이런 식으로 사용한다.

 

먼저 VMWare 를 사용하기 위해 최초 1회

$ sudo ln -s '/mnt/c/Program Files (x86)/VMware/VMware Workstation/vmrun.exe' /usr/local/bin/vmrun

으로 vmrun 명령을 등록해 준 뒤

 

$ linuxkit build -format vmdk sshd.yml

명령을 통해 이미지를 빌드한다. 그럼 sshd.vmdk 가 생기는데 그 뒤

 

$ linuxkit run vmware sshd

명령을 실행하면 VMWare에서 실행된다.. 고 하고 싶었는데

 

File not found: /home/.../sshd.vmdk
This file is required to power on this virtual machine. If this file was moved, specify the new location.

 

이런 오류가 난다... /mnt/c/ 같이 windows와 공유되는 디렉터리에서 실행하고 vmdk는 browser 로 선택해줘야 한다..

 

그럼 10초도 안되어 부팅하고

 

 

 

만들어진 이미지는 kernel과 initramfs 으로 이루어져 있으며, 모든 시스템은 initramfs 위에 올라간다.

 

주의

* qemu 로 직접 실행할 때 메모리는 1024 MiB 이상 주어야 한다.. (128 ~ 256 에서는 부팅 때 크래시 나고, 512 에서는 부팅은 잘 되는데 동작을 안한다 (그래서 삽질 꽤나 했다..ㅠㅠ). 단순히 1024 이상 주니 잘 동작했다...)

* qemu 실행은 이렇게 했다. (Windows 기준)

qemu-system-x86_64 \
-smp 1 \
-m 1024 \
-machine q35,accel=hax:tcg \
-kernel $1-kernel -initrd $1-initrd.img \
-object rng-builtin,id=rng0 \
-device virtio-rng,rng=rng0 \
-append 'console=ttyS0' -hda disk.img \
-device virtio-net-pci,netdev=t0,mac=7e:9f:28:3e:7b:57 -netdev user,id=t0 \
-nographic

 

네트워크를 사용하려면 리눅스 머신에서 해야 하고 (windows에서도 방법이 있긴 있을 듯...)

random 디바이스 바꿔주고 accel을 kvm 으로 해주면 된다.

 

반응형

'개발 및 운영' 카테고리의 다른 글

SID (Samba) Format  (0) 2021.08.31
유용한 자료 INDEX  (0) 2021.08.20
Supermicro IPMI CD-ROM 마운트 안될 때  (0) 2021.07.24
Vue.js 문서 편집기 라이브러리 비교  (0) 2021.01.10
GPLv2 라이센스 관련  (0) 2020.11.26

댓글