| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- basicrce3
- htmlinjection
- CodeEngn
- cloud
- 유석종교수님
- backjoon
- SISS
- pwnable
- cgroup
- c
- System
- mount
- Systemhacking
- Reversing
- Linux
- acc
- AWS
- fork-bomb
- 와이어샤크
- beebox
- Reflected
- bWAPP
- docker
- EC2
- 자료구조
- Dreamhack
- 백준
- wireshark
- python
- datastructure
- Today
- Total
Ctrl + Shift + ESC
컨테이너를 구성하는 리눅스 기술 본문
* 해당 포스트는 실무 초밀착 리눅스: 클라우드 환경 운영부터 성능분석까지 강의를 듣고 정리한 것입니다.
리눅스 배포판
리눅스 커널은 운영체제의 핵심이지만, 커널만으로는 사용자가 컴퓨터를 쉽게 조작하기 어렵다.
리눅스 배포판이란 리눅스 커널에 컴파일러, 셸, 윈도우 시스템, 그리고 각종 유틸리티와 응용 프로그램들을 포함하여 사용자가 바로 설치해서 사용할 수 있도록 패키징한 운영체제를 말한다.
주요 리눅스 계열을 비교하면 다음과 같은 표로 정리할 수 있다.
| 계열 | 특징 및 목표 | 패키지 관리 도구 | 대표 배포판 |
| Debian 계열 | • 오픈소스이며 안정성에 초점을 둔다 . • Ubuntu의 경우 사용 편의성과 LTS(Long Term Support, 5년) 지원을 목표로 한다 . • 서버와 데스크톱 환경 모두에서 널리 사용된다. |
• DPKG 기반 • apt-get / apt 명령어 사용 |
• Debian • Ubuntu • Linux Mint 등 |
| Red Hat / Fedora 계열 |
• Fedora: 6개월마다 새로운 버전을 릴리즈하며 신기술 도입이 빠르다 . • RHEL: 엔터프라이즈(기업) 서버 환경을 타겟으로 하며, 10년의 긴 릴리즈 사이클을 가진다. |
• RPM 기반 • yum (또는 dnf) 명령어 사용 |
• RHEL (Red Hat Enterprise Linux) • Fedora • CentOS • Amazon Linux 등 |
| SUSE 계열 | • 오픈소스이며 안정성에 초점을 둔다 . • 관리 목적으로 YaST라는 도구를 사용할 수 있다 . • 안전한 패키지 관리를 특징으로 한다. |
• RPM 기반 • zypper 명령어 사용 |
• openSUSE • SLES (SUSE Linux Enterprise Server) |
웹서비스 용도로는 Ubuntu, 엔터프라이즈 환경에서는 Redhat, SUSE와 같은 상용 배포판의 점유율이 높다.
엔터프라이즈 수준의 리눅스를 사용해보고 싶다면 LTS가 5년인 Fedora 계열의 Amazon Linux를 사용해보는 것도 좋다.
Android는 말할 것도 없고, iOS 또한 리눅스와 연관이 깊다. iOS와 Linux 모두 Unix라는 공통된 뿌리에서 나왔기 때문이다.
다만 Linux는 Unix와 유사하게 동작하도록 만들어진 Unix-like system이고, iOS는 Unix의 한 갈래인 BSD 계열에서 파생되었다.
자세한 내용이 궁금하다면 아래 위키를 참고하면 좋을 것 같다.
https://en.wikipedia.org/wiki/History_of_Unix
커널의 종류와 특징 (Monolithic vs Micro vs Hybrid)
커널이 서비스를 어떻게 처리하느냐에 따라 모놀리식, 마이크로, 하이브리드식으로 구분할 수 있다.

모놀리식 커널은 파일 시스템, IPC, 스케줄러, 디바이스 드라이버 등 운영체제의 주요 기능이 하나의 큰 커널 공간 안에서 모두 실행되는 구조이다.
구현이 간단하고, 서비스들이 같은 공간에 있어 통신 비용이 적으므로 성능이 우수하고 자원을 효율적으로 사용한다.
하지만 모든 기능이 하나로 묶여 있기 때문에, 커널 내의 작은 코드 오류 하나가 시스템 전체에 영향을 미쳐 시스템이 멈추는(커널 패닉) 현상이 발생할 수 있다.
대표 OS로는 Linux, 안드로이드가 있다.
마이크로 커널은 커널은 메모리 관리, 스케줄링 등 최소한의 기능만 담당하고, 파일 시스템이나 네트워크 같은 서비스는 사용자 공간으로 분리하여 개별 서버 형태로 실행한다.
안정성이 높지만, 모듈 간 통신 비용이 발생하여 성능이 떨어질 수 있다.
하이브리드 커널은 모놀리식과 마이크로 커널의 장점을 혼합한 형태이다.
따라서 모놀리식 커널에 비해 상대적으로 안정적입니다. 시스템 전체 재부팅보다는 문제가 생긴 앱만 재시작되는 형태가 많다.
하지만 여러 컴포넌트가 여전히 커널 공간에서 작동하므로 구조가 복잡하며, 두 커널 모델의 장점이 완전히 살아나지 않는다는 구조적 한계가 있다.
대표 OS로는 iOS가 있다.
리눅스 커널이란?

커널은 운영체제의 핵심 프로그램으로 운영체제의 다른 부분 및 응용 프로그램 수행에 필요한 서비스를 제공하고, 애플리케이션 소프트웨어와 하드웨어를 연결한다.
애플리케이션은 라이브러리를 통해 커널에 필요한 기능을 요청하는 시스템 콜(System Call)을 사용하여 커널 스페이스로 진입하고, 커널은 디바이스 드라이버를 통해 하드웨어의 입출력을 제어한다.
리눅스 커널의 주요 기능은 다음과 같다.
하드웨어 관리 및 추상화

리눅스 커널은 사용자 프로그램이 하드웨어의 구체적인 종류나 위치를 알지 못해도 사용할 수 있도록 하드웨어를 추상화한다.
디바이스 드라이버만이 하드웨어의 기능이나 프로토콜에 관여하며, 사용자 프로그램은 하드웨어 종속적인 작업이 필요 없다.
블록 I/O 레이어를 통해 파일 저장 매체의 종류를 고려하지 않고 사용할 수 있고, 실제 파일이 저장된 위치(디스크상에서 떨어져 저장된 경우 등)를 고려하지 않고 연속된 공간처럼 읽고 쓸 수 있다.
프로세스와 스레드 관리

리눅스 커널은 여러 프로그램이 효율적으로 CPU 자원을 공유하고 안전하게 실행될 수 있도록 관리한다.
프로세스 스케줄러는 CPU 코어 개수보다 더 많은 수의 프로그램이 동시에 실행될 수 있도록, 여러 프로세스가 시간을 나누어 CPU를 사용하게 한다.
또한 실행 중인 프로세스가 자신에게 할당되지 않은 메모리 영역에 접근하는 것을 차단하는 메모리 보호 기능과 메모리 주소 정보를 이용한 공격을 막기 위해 주소 공간 배치를 랜덤화하는 ASLR (Address Space Layout Randomization) 기능을 제공한다.
메모리 관리

리눅스 커널은 물리 메모리의 한계를 극복하고 각 프로세스에 독립적인 메모리 공간을 제공한다.
개별 프로세스에 가상의 연속된 메모리 공간을 제공하며, 페이징을 통해 실제 물리 메모리보다 큰 크기의 프로그램도 실행할 수 있도록 지원하며, 실제로는 물리 메모리 내에서 섞여서 할당되고 해제된다.
I/O 관리

리눅스 커널은 가상 파일 시스템 (VFS)을 통해 하부 시스템 구성에 상관없이 동일한 파일 입출력 형식으로 제어할 수 있게 한다.
또한 "모든 것은 파일이다"라는 개념 하에, 파일뿐만 아니라 소켓, 파이프 등 다양한 객체를 파일 디스크립터(정수 값, 예시: 0(Stdin), 1(Stdout), 2(Stderr))를 통해 접근하고 제어한다.
리눅스 실행 환경 구성하기
먼저, VirtualBox와 같은 가상 머신을 이용해 실행하는 방법이 있다.
아래와 같은 다양한 블로그 글을 참고하면 된다.
https://iam-joy.tistory.com/25
Oracle VM Virtualbox 이용해서 Ubuntu 서버 설치하기
Oracle VM Virtualbox 다운로드 https://www.virtualbox.org/ Oracle VM VirtualBox Welcome to VirtualBox.org! News Flash New January 16th, 2024VirtualBox 7.0.14 released! Oracle today released a 7.0 maintenance release which improves stability and fixes re
iam-joy.tistory.com
다음으로, 클라우드 환경에서 인스턴스를 통해 실행하는 방법이 있다.
개인적으로 EC2를 VSCode 환경에서 실행할 수 있다는 것이 매우 편리했다.
심지어 휴지통 기능으로 잘못 삭제한 파일을 복구한 경험도 있다.
https://ctrl-shit-esc.tistory.com/212
VSCode에서 SSH를 이용해 EC2에 접속하기
* 해당 포스트는 실무 초밀착 리눅스: 클라우드 환경 운영부터 성능분석까지 강의를 듣고 정리한 것입니다.실습 개요 여러 CLI와 GUI를 겪어본 결과, 터미널 환경에서 명령어로 모든 것을 연결하
ctrl-shit-esc.tistory.com
컨테이너를 구성하는 3가지 주요 리눅스 기술
cgroups
cgroups는 리눅스 커널의 기능으로, 프로세스들이 사용하는 시스템 자원의 사용량을 제한하고 격리하는 역할을 한다.
프로세스와 스레드로 점유하는 자원들의 사용에 제한을 건다.
- 핵심 역할: 시스템 내의 모든 프로세스에 대해 자원 사용 정보를 수집하고, 그룹별로 제한을 둔다.
- 제한 가능한 자원: CPU, 메모리(Memory), 네트워크(Network), 디바이스(Device), 블록 I/O(Block I/O) 등
- 활용 분야: 컨테이너 런타임(runc), 하둡(YARN), 안드로이드(Android) 등에서 자원을 효율적으로 분배하기 위해 사용
안드로이드의 경우, 사용자가 보고 있는 앱(Foreground)은, 자원 제한을 거의 두지 않고 보이지 않는 앱(Background)는 자원 사용을 제한하여 시스템 효율을 높인다.
cgroups는 자원을 제어하는 방식에 따라 v1과 v2로 나뉘며, 계층 구조를 가진다.

- cgroup v1: 컨트롤 대상이 되는 리소스(CPU, Memory 등)마다 개별적인 계층 구조(Hierarchy)를 만들어 관리
- cgroup v2: 통합된 계층 구조를 사용하여, 그룹을 나누고 각 그룹에 대해 여러 리소스 제한을 동시에 설정
더 자세한 내용이 궁금하다면 아래 내용을 참고하면 좋을 것 같다.
https://www.infoq.com/presentations/cgroup-v2/
cgroupv2: Linux's New Unified Control Group System
Chris Down goes over design decisions and deviations for cgroupv2 compared to v1, pitfalls and caveats one may encounter when migrating to cgroupv2, and practical information about how they are using cgroupv2 inside Facebook.
www.infoq.com
cgroups는 다양한 서브시스템을 통해 구체적인 자원 제어를 수행한다.
- cpu: 스케줄러를 이용해 해당 그룹에 속한 프로세스의 CPU 사용 시간(%) 제어
- memory: 프로세스의 메모리 사용량을 제어, 제한을 초과 시 OOM(Out Of Memory)이 발생해 프로세스 종료
- freezer: 그룹 내의 작업을 일시 중지하거나 다시 시작 (Docker의 docker pause 기능
- blkio: 블록 장치(HDD, SSD 등)에 대한 입출력 속도(I/O) 제한
- net_cls: 네트워크 트래픽 컨트롤러(tc)가 패킷을 식별할 수 있도록 태그(classid) 지정
- cpuset: 멀티 코어 환경에서 개별 CPU나 메모리 노드를 특정 그룹에 할당
- devices: 장치에 대한 접근 권한(허용/거부) 제어
다음 실습을 통해 cgroup에 대한 이해도를 높일 수 있다.
https://ctrl-shit-esc.tistory.com/208
cgroup으로 stress 명령어 CPU 사용 제한하기
* 해당 포스트는 실무 초밀착 리눅스: 클라우드 환경 운영부터 성능분석까지 강의를 듣고 정리한 것입니다. 실습 개요실제 시나리오: 새벽 2시에 주기적으로 데이터 베이스 서버 응답 성능이 크
ctrl-shit-esc.tistory.com
https://ctrl-shit-esc.tistory.com/209
cgroup으로 fork bomb 막아보기
* 해당 포스트는 실무 초밀착 리눅스: 클라우드 환경 운영부터 성능분석까지 강의를 듣고 정리한 것입니다.실습 시나리오포크 폭탄이란 프로세스가 지속적으로 자신을 복제함으로써 이용 가능
ctrl-shit-esc.tistory.com
namespaces

네임스페이스는 리눅스 커널의 기능으로, 프로세스별로 커널 자원을 분할하여 격리하는 기술이다. 이는 리눅스 컨테이너 기술의 근간이 되는 기술로, 각 컨테이너가 독립된 환경을 가질 수 있게 한다.
cgroups는 자원을 얼마나 사용할 수 있는지(How much you can use)를 제한한다면, namespaces는 자원 중 무엇을 볼 수 있는지(What you can see)를 제한한다. 즉, 프로세스가 시스템 내에서 볼 수 있는 범위를 격리한다.
리눅스 커널은 다양한 종류의 시스템 리소스를 격리할 수 있도록 여러 네임스페이스를 제공한다.
- PID 네임스페이스 (Process ID): 프로세스 ID(PID) 정보 격리, 네임스페이스 내부의 프로세스는 자신의 네임스페이스 외부에 있는 다른 프로세스에 접근하거나 볼 수 없음
- Network 네임스페이스 (net): 네트워크 장치, IP 주소, 포트, 라우팅 테이블 등 네트워크 리소스 격리, 각 컨테이너에 가상의 네트워크 장치를 할당하여 독립된 네트워크 환경 구성
- User 네임스페이스 (user): 프로세스별로 사용자 ID(UID)와 그룹 ID(GID) 정보 격리, 컨테이너 내부에서는 root 권한을 가지지만, 호스트 시스템에서는 일반 사용자로 인식되게 할 수 있음
- Mount 네임스페이스 (mnt): 프로세스별로 마운트되는 파일 시스템 격리, 컨테이너별로 서로 다른 파일 시스템 뷰를 가져 다른 컨테이너의 파일에 접근 불가
- IPC 네임스페이스 (ipc): 프로세스 간 통신(Inter-Process Communication) 자원 격리, 다른 프로세스의 공유 메모리 등에 접근하거나 제어 방지
- UTS 네임스페이스 (uts): 호스트명이나 도메인 명 격리, 각 컨테이너가 고유한 호스트 이름을 가짐
다음 실습을 통해 namespace에 대한 이해도를 높일 수 있다.
https://ctrl-shit-esc.tistory.com/215
실습을 통해 Linux namespace 이해하기
* 해당 포스트는 실무 초밀착 리눅스: 클라우드 환경 운영부터 성능분석까지 강의를 듣고 정리한 것입니다.Mount Namespace 격리하기해당 실습은 리눅스의 Namespace(특히 Mount Namespace) 기능을 직접 체
ctrl-shit-esc.tistory.com
union mount filesystem

일반적으로 리눅스에서 한 디렉터리에 파일 시스템을 마운트하면 기존 내용은 가려지고 새로운 내용만 보인다.
하지만 Union Mount를 통해 하나의 디렉터리 위치에 여러 개의 디렉터리를 겹쳐서 마운트하여, 마치 하나의 통합된 디렉터리처럼 보이게 한다. 작동 방식은 다음과 같다.
- Layering (계층화): 여러 레이어를 쌓아서 구성한다.
- Image Layer (하단): 마지막 레이어를 제외하고는 모두 Read-Only 상태이다.
- Container Layer (상단): 최상단 레이어는 읽기/쓰기가 가능하다.
- 파일 조회: 하위 레이어에 파일이 있더라도 상위 레이어에 같은 이름의 파일이 있다면 상위 레이어의 파일이 보인다.
파일 변경 시 원본을 직접 수정하지 않고, 변경된 파일만 상위 레이어(Writable)로 복사하여 저장하는 Copy-on-Write (CoW) 방식을 통해 저장 공간을 효율적으로 사용한다.
Docker는 Union Mount 기술을 적용하기 위해 overlay, btrfs, aufs, devicemapper 등 다양한 스토리지 드라이버를 지원한다.
그 중 OverlayFS는 하나의 파일 시스템을 다른 파일 시스템 상단에 덮어씌우는 방식이다. 하단 파일 시스템의 종류에 상관없이 구성 가능하다 (단, RedHat 계열은 XFS만 지원).
OverlayFS는 사용자가 보는 통합된 뷰인 Merged, 쓰기 가능한 영역인 Upperdir, 읽기 전용 베이스 이미지 영역인 Lowerdir로 구성되어 있다.

또한 Copy-on-Write 방식을 사용하는 파일 시스템인 BTRFS도 지원한다. BTRFS는 스냅샷, RAID, 자가 치유 기능 등을 지원한다.
BTRFS는 증분 백업(Incremental backup) 방식을 사용하여 스냅샷을 생성하고 관리한다. Docker에서는 서브볼륨과 스냅샷을 이용해 레이어를 관리한다.
다음 실습을 통해 union mount filesystem에 대한 이해도를 높일 수 있다.