공부하기싫어
article thumbnail

docker 시스템의 기반인 리눅스 기술들을 실습

 

 

  • chroot

 

 

chroot /tomato /binbash - chroot 명령으로 현재 디렉토리를 루트 디렉토리로 변경

 

특정 디렉토리를 루트 디렉토리로 변경하려면 shell 바이너리와 공유 라이브러리를 복사해야함

 

ldd /bin/bash

ldd /bin/bash - /bin/bash 의 공유 라이브러리 확인

linux-vdso.so.1 (0x00007ffd953b5000) -> 가상 라이브러리로  복사할 필요 없는 파일

libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f1ae91fe000) -> bash가 동작할 때 필요한 라이브러

libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1ae8fd6000) -> Linux 공통 라이브러리

/lib64/ld-linux-x86-64.so.2 (0x00007f1ae9398000) -> 동적 로더( loader ) -> 공유 라이브러리를 메모리에 로드하는 역할

 

이후 설정할 디렉토리에 공유 라이브러리가 복사될 디렉토리를 생성함

/tomato/lib/x86_64-linux-gnu

/tomato/lib64

 

이후 공유 라이브러리 파일들을 복사해줌

  • cp /lib/x86_64-linux-gnu/libtinfo.so.6 /tomato/lib/x86_64-linux-gnu/
  • cp /lib/x86_64-linux-gnu/libc.so.6 /tomato/lib/x86_64-linux-gnu/
  • cp /lib64/ld-linux-x86-64.so.2 /tomato/lib64

 

 이후 chroot 명령으로 / 디렉토리를 변경해준다

 

 

 

  • cgroup (control group)

프로세스들이 사용하는 시스템 자원의 사용 정보를 수집 및 제한 시키는 Linux 커널 기능

모든 프로세스에 대해 리소스 사용 정보 수집

제한 가능한 자원 - CPU, Memory, Network, Device, Block I/O

cgroup

cgroup 기본 디렉토리 - /sys/fs/cgroup

 

cgroup 종류 - docker는 cgroupv1 사용

docker 사용

 

cgroup 사용 가능한 서브 시스템

- blkio : 블록 장치(storage)에 대한 입/출력 제한

- cpu : 스케줄러를 이용해 해당 cgroup에 속한 프로세스 cpu 사용 시간 제한

- cpuacct : cgroup에 속한 cpu 자원 정보 생성

- cpuset : 개별 cpu 및 메모리 로드에 대한 cgroup 할당

- devices : cgroup 작업 단위로 장치에 대한 액세스 허용/거부

- freeze : cgroup 작업 일시 정지 또는 다시 시작

- memory : cgroup 에 속한 프로세스의 메모리 사용 제한

- net_cls : 네트워크 태그 지정

- ns : namespace 서브 시스템

 

cgcreate - cgdelete
cgset / stress

sudo sgset -r cpu.cfs_quota_us=30000 <그룹이름>

sudo cgset -r cou.max=30000 <그룹이름>

위 명령으로도 가능

 

my 그룹에 스트레스를 주는 명령을 백앤드로 실행하고 top 으로 확인하는 모습

7823 - 2 cpu 라고 stress info 가 나오고 top 에선 다음 번호인 7824 7825 의 root 유저로 실행중인 프로세스의 cpu 합이 30%를 넘지 않음

 

 

 

  • namespace

프로세스별로 별도의 커널 자원을 분할하는 Linux 커널 기능

LXC(LinuX Container) 기술의 근간

namespace 종류 - IPC, mnt, net, pid, pid_for_children, uts

cgroup 과 namespace

- cgroup : 프로세스 자원 사용량 제한 목적

- namespace : 프로세스가 볼 수 있는 자원 범위

container - 완전 격리된 프로세스

- cgroup 에 이해서 자원 사용량 제한

- namespace를 통해 볼 수 있는 자원 제한

 

  • namespace 종류

PID namespace

- 프로세스 id 정보를 격리

- namespace 외 다른 프로세스에 접근 불가능

 

Network namespace

- 네트워크 장치, IP 주소, 포트, 라우팅 테이블의 네트워크 리소스를 격리

- 가상 네트워크 장치 할당

 

User namespace

- 프로세스별로 UID, GID 정보 격리

 

Mount namespace

- 프로세스별로 마운트 되는 파일 시스템 격리

 

IPC namespace

- IPC(Inter-Process Communication) 격리, 다른 프로세스의 접근이나 제어를 방지

 

UTS namespace

- 호스트명이나 도메인 명 격리

 

 

  • unshare 명령

namespace 생성 명령unshare [옵션] [프로그램]-p : pid 생성-m : mount 생성-i : ipc 생성-f : child 프로세스 생성

echo $$ - 현재 pid 확인 (bash pid)

ps aux | head -n5 - 현재 상위 프로세스 정보 확인

namespace 를 생성하고 현재  pid 를 확인하면 1 로 초기화된 모습 - namespace 가 생성된 모습

ctrl + d 로 빠져나와 다시 현재 pid 를 확인하면 인스턴스의 pid 가 출력됨

 

tmpfs - 메모리 기반 임시 파일 시스템, 휘발성 공간으로 reboot/booting 시 소멸됨nsenter 명령 - namespace enter- 격리된 namespace 에 진입하는 명령- nsenter [option] [program] [argument]- t : PID- a : all namespace

 

 

 

  • union file systemt

Linux 에서 사용하는 일반적인 파일 시스템은 mount 를 하면 mount 된 내용만 확인할 수 있다

기존 mount point 에 대하여 새로운 파일 시스템으로 mount 하면 기존 파일시스템에 덮어씌워짐

 

union file system - 하나의 디렉토리 위치에 여러 개의 디렉토리를 마운트 하면 하나의 통합된 디렉토리처럼 보이게 하는 파일 시스템

docker image 와 docker container가 union file system 기반으로 관리되고 있음특징- image layer : 마지막 레이어를 제외하고 read-only 성격- copy-on-write : 변경된 내용만 저장

 

  • overlayFS

하나의 파일 시스템을 다른 파일 시스템 상단에 overlay

하단 파일 시스템에 상관없이 구성 가능 (단 redhat 계열에서는 XFS 만 하단 파일 시스템 지원)

docker 에서 사용하는 파일 시스템

lowerdir(Image layer) - read-only 영역, 쓰기 불가능, docker image 파일의 구조upperdir(Container layer) - read-write 영역, 쓰기 가능, docker container 생성 시 app에 의해 쓰기 되는 영역

 

 

읽기 전용 overlay 생성

mount filesys - overlay

mount point - /tmp/merged

lowerdir=/tml/lower1:/tmp/lower2

 

/tmp/merged 디렉토리에는 새로운 내용을 추가할 수 없음

merged

똑같이 a.txt b.txt 를 넣어놨는데 cat 하면 다르게 나옴

이해는 잘 안됨

read-only file system
read-write area

 

union filesystem mount
union filesystem umount