[Linux] Linux 심화

2024. 11. 29. 00:06·System

2024.07.08

 

cgroup

cgroup은 리눅스 커널에서 제공하는 기능으로, 프로세스 그룹에 대한 시스템 리소스 사용을 관리할 수 있게 해준다.


이를 통해 특정 프로세스 그룹이 사용할 수 있는 CPU, 프로세스, 디스크 I/O, 네트워크 대역폭 등을 제한하거나 할당할 수 있다.

 


주요 기능

리소스 제한 : 프로세스가 사용할 수 있는 자원을 제한하여 시스템 전체의 안정성을 보장한다.
리소스 우선 순위 : 중요한 프로세스에 더 많은 자원을 할당하고, 덜 중요한 프로세스의 자원을 제한한다.
리소스 계정 : 프로세스 그룹별로 자원 사용량을 모니터링하고, 통계 정보를 제공한다.
리소스 격리 : 서로 다른 프로세스 그룹 간의 자원 사용을 격리하여, 한 그룹의 자원 사용이 다른 그룹에 영향을 미치지 않도록 한다.

 


cgroup의 구조

cgroup은 계층 구조를 갖게 되고 각 계층은 특정한 자원 유형에 대해 설정할 수 있는 컨트롤러로 구성된다.


- cpu : CPU 사용량을 제한하거나 보장.
- cpuacct : CPU 사용량을 모니터링.
- memory : 메모리 사용량을 제한하고, 메모리 사용 통계를 제공.
- blkio : 블록 I/O(디스크 I/O) 사용량을 제한하고 모니터링.
- net_cls : 네트워크 트래픽을 분류하고 제한.
- freezer : 프로세스를 일시 중지하거나 재개.
- devices : 장치 접근을 제어.
- hugetlb : 큰 페이지 메모리 사용량을 제한.
- perf_event : 성능 이벤트를 모니터링.


cgroup 실습 환경 세팅

sudo apt-get install cgroup-tools stress

 


cgroup CPU 제한 실습

sudo cgcreate -g cpu:/cpulimit
echo 50000 | sudo tee /sys/fs/cgroup/cpulimit/cpu.max
sudo cgexec -g cpu:/cpulimit stress --cpu 2 --vm 1 --timeout 30s &
top
sudo cgdelete -g cpu:/cpulimit

 

 

cgroup Memory 제한 실습

sudo cgcreate -g memory:/memorylimit
echo $((512 * 1024 * 1024)) | sudo teee /sys/fs/cgroup/memorylimit/memory.max
sudo cgexec -g memory:/memorylimit stress --vm-bytes 1024M --vm 1 --timeout 30s &
watch -n 0.5 cat /sys/fs/cgroup/memorylimit/memory.current
sudo cgdelete -g memory:/memorylimit

 


Namespace

Linux의 Namespace는 프로세스가 시스템 리소스를 격리하여 사용할 수 있도록 하는 커널 기능이다.


- 시스템 자원의 충돌을 방지하고, 각 프로세스나 프로세스 그룹이 독립된 환경에서 실행될 수 있도록 한다.
- 주로 컨테이너 기술에서 사용되며, 다양한 유형의 네임스페이스가 존재한다.

 


Namespace 실습 환경 세팅

sudo apt-get update
sudo apt-get install -y util-linux

 


1. Mount Namespace (mnt)

파일 시스템 마운트를 격리하고, 각 네임스페이스는 자신의 파일 시스템 트리를 가지고 있어 다른 네임스페이스와 독립적을 파일 시스템을 마운트하거나 언마운트할 수 있다.

sudo unshare --mount /bin/bash
mkdir /mnt/test
mount -t tmpfs none /mnt/test
echo "Hello from Mount Namespace" > /mnt/test/hello.txt
cat /mnt/test/hello.txt
exit
ls /mnt/test

 


2. Process ID Namespace (pid)

프로세스 ID를 격리하고 각 네임스페이스는 독립된 프로세스 ID 공간을 가지므로, 네임스페이스마다 동일한 pid를 가질 수 있다.
이를 통해, 네임스페이스 내에서 pid 1번 프로세스를 실행할 수 있으며, 이는 주로 init 프로세스로 사용된다.

sudo unshare --pid --fork /bin/bash
ps -e
echo $$
exit
ps -e
echo $$



3. Network Namespace (net)

네트워크 장치, IP 주소, 포트 번호 등을 격리한다.
각 네임스페이스는 독립된 네트워크 스택을 가지며, 네임스페이스 간에 네트워크 장치를 독립적으로 설정할 수 있다.
이는 가상 네트워크 인터페이스 및 라우팅 테이블을 구성하는 데 사용할 수 있다.


4. User Namespace (user)

사용자와 그룹 ID를 격리한다.
각 네임스페이스는 독립된 사용자 ID 및 그룹 ID를 가질 수 있으며, 이를 통해 비루트 사용자가 네임스페이스 내에서 루트 권한을 가질 수 있게 한다.

sudo unshare --user /bin/bash
id
touch /root_test_file
ls -l /root_test_file
exit
sudo rm /root_test_file



5. IPC Namespace (ipc)

각 네임스페이스는 독립된 IPC 공간을 가지므로, 다른 네임스페이스와의 충돌 없이 메시지 큐, 세마포어 등을 사용할 수 있다.



6. UTS Namespace (uts)

호스트 이름 및 도메인 이름을 격리한다.
각 네임스페이스는 독립된 호스트 이름과 도메인 이름을 가질 수 있다. 이는 컨테이너화된 환경에서 시스템 식별 정보를 별도로 설정하는 데 유용하다.

hostname
sudo unshare --uts /bin/bash
hostname kakao-영어이름
hostname
exit
hostname

chroot

chroot는 "change root"의 약자로, 프로세스의 루트 디렉토리를 변경하여 격리된 파일 시스템 환경을 제공한다.

 

특정 디렉토리를 루트 디렉토리처럼 취급하여, 해당 디렉토리 외부에 접근하지 못하게 한다.
위 개념을 chrootjail 이라고 한다.
이는 제한된 환경에서 테스트를 하거나 보안 목적으로 사용되기도 하지만 추후에 학습할 Docker에서도 사용되는 명령이다.



chroot 실습 환경 세팅

sudo mkdir -p /mychroot/{bin,lib,lib64,dev,etc,proc,sys}
sudo cp /bin/* /mychroot/bin/
for lib in $(ldd /bin/bash /bin/ls /bin/caat | grep -o '/lib[^ ]*'); do sudo cp --parents "$lib" /mychroot; done



가상 파일 시스템 마운트

sudo mount -t proc proc /mychroot/proc
sudo munt -t sysfs sys /mychroot/sys
sudo mount --bind /dev /mychroot/dev



chroot 환경 진입

sudo chroot /mychroot /bin/bash
ls /
echo "Hello from chroot!" > /etc/kakao
at /etc/kakao
exit



환경 정리

sudo unmount /mychroot/proc
sudo unmount /mychroot/sys
sudo unmount /mychroot/dev
sudo rm -rf /mychroot

 


Unix Domain Socket (UDS)

유닉스 도메인 소켓은 동일한 호스트 내에서 프로세스 간 동신 (IPC) 을 위한 메커니즘 중 하나이다.


TCP/IP 네트워크 소켓과 유사하지만 네트워크를 통해 데이터를 전송하지 않고 로컬 파일 시스템을 통해 통신을 한다.


주요 특징

1. 로컬 통신
- 유닉스 도메인 소켓은 동일한 호스트 내에서 실행되는 프로세스들 간의 통신을 지원한다.
- 네트워크를 통해 데이터를 전송하지 않기 때문에 네트워크 소켓에 비해 성능이 더 빠르다.


2. 파일 시스템을 이용한 주소 지정
- UDS는 파일 시스템 경로를 사용하여 소켓을 식별하며 /tmp/mysocket과 같은 파일 경로를 사용한다


3. 데이터 전송 속도
- 네트워크 계층을 거치지 않기 때문에 TCP/IP 소켓보다 더 빠른 데이터 전송이 가능하다. 이는 네트워크 스택의 오버헤드를 줄이기 때문이다.


4. 보안
- 파일 시스템의 권한 설정을 통해 접근 제어를 할 수 있다. 이를 통해 특정 사용자나 프로세스만 소켓에 접근하도록 제한할 수 있다.



vim server.py
vim client.py

 


server.py

import socket
import os
SOCKET_FILE = "/tmp/mysocket"
if os.path.exists(SOCKET_FILE):
  os.remove(SOCKET_FILE)
server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
server.bind(SOCKET_FILE)

server.listen(1)
print("서버가 클라이언트를 기다리고 있습니다...")

conn, addr = server.accept()
print("클라이언트 연결 수락")
while True:
  data = conn.recv(512)
  if not data:
    break
  print("클라이언트로부터 받은 데이터:", data.decode())
  conn.sendall(data)

conn.close()



client.py

import socket
SOCKET_FILE = "/tmp/mysocket"
client = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
client.connect(SOCKET_FILE)
message = "안녕하세요, 서버!"
client.sendall(message.encode())
data = client.recv(1024)
print("서버로부터 받은 데이터:", data.decode())
client.close()

 

python3 server.py
python3 client.py

 



pid 확인 가능

python3 server.py &
ps -e

 



OverlayFS

리눅스 커널에서 지원하는 파일 시스템으로, 여러 디렉토리를 하나의 계층적 파일 시스템으로 병합하여 제공하는 기능을 한다.


읽기 전용 파일 시스템에 쓰기 가능한 레이어를 추가하여, 기본 파일 시스템을 변경하지 않고도 파일을 수정하거나 추가할 수 있게 한다.

 


주요 특징

1. 파일 시스템 계층화
읽기 전용 및 쓰기 가능한 계층을 병합하여 사용한다.


2. 스냅샷 및 버전 관리
파일 시스템의 상태를 쉽게 스냅샷으로 저장하고 필요 시 복원 가능하다.

3. 컨테이너
Docker와 같은 컨테이너 기술에서 이미지 레이어링을 위해 사용한다.



파일 시스템 구조

1. Lowerdir : 읽기 전용 FS, Docker에서 이미지가 사용하는 디렉토리이다.
2. Upperdir : 쓰기 전용 FS, Docker에서 컨테이너 레이어 전용 디렉토리이다.
3. Workdir : Lowerdir, Upperdir의 변경사항을 추적하기 위한 디렉토리이다. 단순 저장되는 내용이 없어보이지만, Docker환경에서는 해당 디렉토리가 없으면 정상작동하지 않는다.
4. Merged : Lowerdir + Upperdir 합쳐 만든 현재 상태의 FS 디렉토리이다.



작동 방식

1. 새로운 파일 생성 : Upperdir에 파일이 생성된다.
2. 기존 파일 읽기 : 파일리 Upperdir에 있으면 먼저 읽고, 없으면 Lowerdir에서 읽는다.
3. 기존 파일 수정 : 파일이 Upperdir에 없으면 Lowerdir에서 Upperdir로 복사한 후 수정된다.
4. 파일 삭제 : 파일이 Upperdir에 있으면 삭제되고, Lowerdir에 있는 경우 Upperdir에 삭제 마커가 생성된다.



OverlayFS 

sudo mkdir -p /lower /upper /work /merged
echo "Lowerdir 입니다" | sudo tee /lower/lowerfile.txt
echo "Upperdir 입니다" | sudo tee /upper/upperfile.txt
sudo mount -t overlay overlay -o lowerdir=/lower,upperdir=/upper,workdir=/work /merged
ls /merged

>> merged에서 lowerfile.txt와 upperfile.txt 확인
cat /merged/lowerfile.txt
cat /merged/upperfile.txt
echo "Mergeddir 입니다" | sudo tee /merged/meregdfile.txt
ls /upper

sudo umount merged
sudo rm -rf /lower /upper /merged /work


merge위에서 파일들을 가져오는 데 실제 작동방식은 Upperdir, Lowerdir를 참조한다.
chroot로 merged가 root로 설정돼서 작동된다.

반응형

'System' 카테고리의 다른 글

[Linux] Linux 명령어  (0) 2024.11.28
Git Commit Convention  (1) 2024.11.28
[Linux] Linux 개론  (1) 2024.11.28
[Network] TCP/UDP 패킷 확인하기  (0) 2024.11.28
[Network] 네트워크 개론  (1) 2024.11.28
'System' 카테고리의 다른 글
  • [Linux] Linux 명령어
  • Git Commit Convention
  • [Linux] Linux 개론
  • [Network] TCP/UDP 패킷 확인하기
ssu_dev
ssu_dev
  • ssu_dev
    ssu
    ssu_dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (98)
      • Cloud (10)
      • HCI (2)
      • Algorithm (54)
      • Programming (13)
      • Computer Science (5)
      • System (6)
      • Trouble Shooting (6)
      • Work (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 인기 글

  • 태그

    구현
    bfs
    BOJ
    투포인터
    Pod Scheduling
    Karpenter
    EKS
    자료구조
    OS
    플로이드 워셜
    Java
    dfs
    node scaling
    Deque
    cs
    Stack
    docker
    sort
    K8s
    priorityqueue
  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
ssu_dev
[Linux] Linux 심화
상단으로

티스토리툴바