가상 환경 위 리눅스로 자동화 스크립트 만들기

윤뿔소·2024년 7월 17일
0

CS 지식 / 다양한 팁

목록 보기
10/20
post-thumbnail

리눅스 세팅하기

리눅스 가상 머신 설치하기

저는 사용성이나 성능이 Parallels가 월등하지만, 비용 절감을 위해 UTM을 썼었습니다.
맥 OS 12 이상, 메모리 4GB, 저장공간 20GB를 할당한 뒤 가상 머신 생성을 실행했습니다.

image

저는 찐 개발자가 되고 싶어 CLI인 Server로 다운 받을 겁니다. UTM 설치 후 Ubuntu Server Mac Silicon 전용 24.04 LTS 버전의 ISO를 다운받았습니다.
다운 받고, UTM를 설치하며 다운 받은 ISO를 연결하면 아래 화면이 나옵니다.

image

SSH 설정 및 계정 생성

실행하고 환경 설정 및 설치가 끝나고, 세팅이 나옵니다. 세팅 중, 루트 계정 설정과 SSH 서버를 설정했습니다.

스크린샷 2024-07-16 15 17 09

SSH 서버를 설정한 뒤 리부팅을 하고, 다시 실행해보면

image

아주 잘 나옵니다. SSH 서버도 확인해봤습니다.

sudo systemctl status ssh
image

이제 계정을 추가해보겠습니다. 계정 추가 명령어는 sudo adduser [username]이므로 이렇게 입력하고 추가 계정을 만들어보겠습니다.

image

아주 잘 만들어졌습니다. 저는 미리 taeyeon이라는 계정을 만들었기에 이걸로 진행하겠습니다.


이제 로컬 컴퓨터에서 가상 환경에 접속해보겠습니다. 그러려면 가상 환경의 IP를 알아야합니다. ip a를 입력해 아이피를 알고, 추가한 계정의 username을 입력하고 접속해보겠습니다.

image

아주 잘됩니다. 여기서 이제 디렉토리 및 설정을 시작하겠습니다.

디렉토리 및 권한 설정

/scrap 디렉토리 생성 및 권한 설정하는 명령어는 아래와 같습니다.

# mkdir는 생성 명령어
sudo mkdir /scrap
# chmod는 권한 부여 명령어
sudo chmod 764 /scrap

또한 생성됐는지 보려면 아래 명령어를 따릅니다.

# ls는 디렉토리를 살펴보고, 옵션 -l, -ld 등은 그 디렉토리의 정보를 나타냅니다.
ls -l /
ls -ld /scrap
image

아주 잘 뜹니다! 리스트에 scrap이 뜨고, 권한이 drwxrw-r--, 즉, 764로 정해졌습니다.

궁금증 : 디렉토리에 왜 권한을 주는걸까? 왜 권한이 저렇게 생겼을까?

파일 및 디렉토리의 보안을 유지하고, 적절한 사용자 및 그룹이 특정 작업을 수행할 수 있도록 제어하기 위함입니다. 한마디로 데이터를 지키기 위해서 입니다.
또한, 리눅스 파일 권한은 8진수로 표현되며, 각 숫자는 특정 권한을 나타냅니다. 764 권한이 drwxrw-r--로 치환되는 과정은 아래와 같습니다.

drwxrwxrwx
  • 첫 번째 문자: 파일 타입 (d = 디렉토리, - = 일반 파일, l = 심볼릭 링크 등)
  • 다음 세 문자: 파일 소유자의 권한 (읽기 r, 쓰기 w, 실행 x)
  • 그 다음 세 문자: 파일 소유 그룹의 권한 (읽기 r, 쓰기 w, 실행 x)
  • 마지막 세 문자: 기타 사용자의 권한 (읽기 r, 쓰기 w, 실행 x)

각 권한의 문자는 8진수로 변환됩니다.

  • 읽기 권한 (r): 4
  • 쓰기 권한 (w): 2
  • 실행 권한 (x): 1

이를 조합하여 권한을 작성합니다.

  • 없음 (-): 0
  • 실행 (x): 1
  • 쓰기 (w): 2
  • 쓰기 및 실행 (wx): 3
  • 읽기 (r): 4
  • 읽기 및 실행 (rx): 5
  • 읽기 및 쓰기 (rw): 6
  • 읽기, 쓰기, 실행 (rwx): 7

764를 다시 역산해봅니다.

  • 7: 소유자의 권한 = rwx (읽기, 쓰기, 실행)
  • 6: 그룹의 권한 = rw- (읽기, 쓰기)
  • 4: 기타 사용자의 권한 = r-- (읽기)

날짜 설정 및 날짜 출력

서울 시간대로 시간을 먼저 설정해봅니다. 명령어는 아래와 같습니다. 아주 간단합니다.

# timedatectl는 시간대를 설정하는 명령어입니다.
sudo timedatectl set-timezone Asia/Seoul
date

결과는 아래와 같습니다.

image

Node.js 설치 및 확인

이제 Node.js를 깔아 JS를 실행해보겠습니다. Node.js를 설치하는 방법은 여러 가지가 있습니다. NVM, Apt 패키지 사용 등 다양한 방법이 있는데 가장 간단한 방법인 Apt 패키지와 NodeSource를 이용해 깔아보겠습니다. 명령어는 아래와 같습니다.

# CURL은 서버와 통신할 수 있는 커맨드 명령어 툴이자 웹개발에 매우 많이 사용되고 있는 무료 오픈소스입니다. CURL을 설치합니다.
sudo apt-get install -y curl
# 셋업 스크립트를 설치합니다. 최신 LTS 버전을 설치합니다.
curl -fsSL https://deb.nodesource.com/setup_lts.x -o nodesource_setup.sh
# 설치 스크립트 실행합니다.
sudo -E bash nodesource_setup.sh
# Node.js를 설치합니다.
sudo apt-get install -y nodejs
# 확인합니다.
node -v
image

아주 잘 깔아졌습니다! 이제 JS파일을 실행해보겠습니다. scp 명령어를 이용해 네트워크 통신하여 파일을 주고 받아봅시다.

scp index.js [가상 환경 유저 네임]@[가상 환경 IP}]:[가상 환경 경로]
image

이렇게 뜨면 성공했습니다. 실행해보겠습니다.

image

아주 잘 뜹니다. ls 명령어를 사용하고 보니 index.js 가 있고, node로 실행해보니 잘되는 모습입니다.

리눅스 명령어 학습 및 쉘 스크립트(자동화) 작성

리눅스 모니터링 명령어 학습

  1. top : 시스템의 전체적인 성능 상태를 실시간으로 모니터링. CPU 사용량, 메모리 사용량, 각 프로세스의 자원 사용량 등
  2. vmstat : 시스템의 메모리, 프로세스, 블록 I/O 등의 상태를 보고.
  3. sar : sysstat 패키지의 기능. CPU 사용률을 1초 간격으로 3번 수집해 보고.
  4. netstat : net-tools 패키지의 기능. 네트워크 연결, 라우팅 테이블, 인터페이스 통계 등의 정보를 보여줌.

CPU 사용량, 가상 메모리 사용량, 네트워크 사용량을 측정하는 쉘 스크립트 작성

쉘 스크립트 작성법은 이 블로그를 참고했습니다. 작성하기위해 nano 명령어를 이용해 monitor_resources.sh 파일을 만들어 보겠습니다.

image

이러한 편집기가 나옵니다. #!/bin/bashshebang으로 스크립트를 실행할 때 사용할 인터프리터를 지정하는 역할을 합니다.

저 파일을 실행 시키기 위해 ./monitor_resources.sh를 입력했더니 접근이 거부당했습니다. 아까 배웠던 chmod를 이용해 실행 권한을 주고 실행시킵니다. chmod +x monitor_resources.sh

image

됐습니다! 이제 시작해보겠습니다.

#!/bin/bash

# CPU 사용량 측정 (top 사용)
top -bn1 | grep "Cpu(s)" | awk '{printf("CPU 사용률 : %.1f%%\n", 100 - $8)}'

# 가상 메모리 사용량 측정 및 출력 (swpd)
vmstat | awk 'NR==3 {printf("가상 메모리 사용량 : %s kB\n", $3)}'

# 네트워크 사용량 측정 (RX/TX 바이트)
ifconfig enp0s1 | grep "RX packets" | awk '{printf("RX 사용률 : %s\n", $5)}'
ifconfig enp0s1 | grep "TX packets" | awk '{printf("TX 사용률 : %s\n", $5)}'

CPU는 top, 가상 메모리는 vmstat, 네트워크 사용량 측정은 ifconfig를 사용해 넘겼습니다.

처음 보는 명령어들이 있어 정리하고 가겠습니다.

  • grep : 주어진 패턴과 일치하는 줄을 검색. ex) grep "Cpu(s)" => Cpu(s)와 일치하는 줄 찾기
  • awk : 문자열을 추출하고 사용
  • printf : 출력 함수. echo와 같은 역할
    • %sprintf의 형식 지정자. ,뒤의 문자를 출력함
  • $n : n번째 필드를 고름
image

아주 잘 나옵니다! 이제 알람을 구현해보겠습니다. sh에도 조건문이 있어서 조건문을 사용해 구현해보겠습니다.

알림 스크립트 작성

먼저 작성하기 전 필요한 변수들을 선언하겠습니다.

# CPU 사용량 측정 (top 사용)
# top -bn1 | grep "Cpu(s)" | awk '{printf("CPU 사용률 : %.1f%%\n", 100 - $8)}'
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print 100 - $8}')
echo "CPU 사용률 : $cpu_usage%"

# 가상 메모리 사용량 측정 및 출력 (swpd)
# vmstat | awk 'NR==3 {printf("가상 메모리 사용량 : %s kB\n", $3)}'
memory_usage=$(vmstat | awk 'NR==3 {print $3}')
echo "가상 메모리 사용량 : $memory_usage kB"

# 네트워크 사용량 측정 (RX/TX 바이트)
# ifconfig enp0s1 | grep "RX packets" | awk '{printf("RX 사용률 : %s\n", $5)}'
# ifconfig enp0s1 | grep "TX packets" | awk '{printf("TX 사용률 : %s\n", $5)}'
rx_usage=$(ifconfig enp0s1 | grep "RX packets" | awk '{print $5}')
tx_usage=$(ifconfig enp0s1 | grep "TX packets" | awk '{print $5}')
echo "RX 사용률 : $rx_usage"
echo "TX 사용률 : $tx_usage"

cpu_threshold=70 # 예시 기준: 70%
swap_threshold=50000 # 예시 기준: 50,000 kB
network_threshold=10240 # 예시 기준: 10 MB/s

재사용할만한 것들을 다시 변수로 지정해주고, 한계점들을 정의해주었습니다.

# CPU 사용률 경고
if (( $(echo "$cpu_usage > $cpu_threshold" | bc -l) )); then # bc -l는 부동 소수점 없애기(연산)
  echo "Warning: CPU 사용량이 70%가 넘었습니다."
fi

# 가상 메모리 사용량 경고
if (( $memory_usage > $memory_threshold )); then
  echo "Warning: 가상 메모리 사용량이 50,000 kB가 넘었습니다."
fi

# 네트워크 사용량 경고
if [ "$rx_usage" -gt $network_threshold ] || [ "$tx_usage" -gt $network_threshold ]; then
  echo "Warning: 네트워크 사용량이 10 MB가 넘었습니다."
fi

조건에 따라 알림이 나오도록 echo를 사용했습니다. 조건문을 사용해 조건이 활성화 되면 나오도록 했습니다.
이제 여기에 조건에 해당하면 로그 파일 생성 및 슬랙 웹훅이 실행되도록 붙여줄 겁니다.

crontab 동작 방식 설정 및 알림 설정

먼저 알림이 나오도록 조건을 붙인 곳에 슬랙 웹훅을 보내는 기능과 로그 파일이 생성되도록 만들어 줍니다.

# 로그 디렉토리와 파일 설정
LOG_DIR="/home/taeyeon/monitoring"
LOG_FILE="$LOG_DIR/$(date '+%Y%m%d-%H%M%S').log"
mkdir -p $LOG_DIR
touch $LOG_FILE

# CPU 사용률 경고
if (( $(echo "$cpu_usage > $cpu_threshold" | bc -l) )); then
  echo "Warning: CPU 사용량이 70%가 넘었습니다."
  curl -X POST -H 'Content-type: application/json' --data '{"text":"J169 CPU is now ALARM: usage is over 70%"}' '[주소]'>
fi

# 가상 메모리 사용량 경고
if (( $memory_usage > $memory_threshold )); then
  echo "Warning: 가상 메모리 사용량이 50,000 kB가 넘었습니다."
  curl -X POST -H 'Content-type: application/json' --data '{"text":"J169 Memory is now ALARM: usage is over 70%"}' '[주소]'>
fi

# 네트워크 사용량 경고
if [ "$rx_usage" -gt $network_threshold ] || [ "$tx_usage" -gt $network_threshold ]; then
  echo "Warning: 네트워크 사용량이 10 MB가 넘었습니다."
  curl -X POST -H 'Content-type: application/json' --data '{"text":"J169 Network is now ALARM: usage is over 10MB"}' '[주소]'>
fi
  1. 로그 디렉토리와 파일 설정
    • 로그 파일을 작성할 디렉토리 LOG_DIR를 따로 정의
    • YYYYMMDD-HHMMSS 형태로 저장하기 위해 date를 사용해 작성 및 .log 붙이기
    • mkdir -p $LOG_DIR : LOG_DIR 디렉토리 생성
    • touch $LOG_FILE : 로그 파일 생성
  2. 조건에 붙은 것
    • curl -X POST ~ : 조건이 해당될 시 슬랙에 전송하는 웹훅 실행

실행해보면 이제 슬랙에 뜰 겁니다.

image

아주 잘됩니다!

crontab을 설정

crontab을 설정해 동작 1분마다 실행되도록 설정하겠습니다. 실행어는 crontab -e입니다.

image

1분이 지나고 스크립트가 실행돼 따로 직접 실행되지 않았는데, 스크립트가 실행돼 monitoring이 생긴 모습입니다.

CPU나 메모리 사용률을 강제로 높이는 방법

아주 간단합니다. stress 패키지를 설치해 실행시키면 됩니다.

# 설치
sudo apt install stress

# 과부하 사용법 (cpu, vm 동시에)
stress --cpu 8 --vm 8 --vm-bytes 1G --io 4 --timeout 60
image

아주 잘되는 모습입니다. 결과값이 2개인 것은 알아보기 어려워서 2개 동시에 실행시켜서 잘 보이게 했던 거라 넘기면 됩니다.

참고자료

profile
코뿔소처럼 저돌적으로

0개의 댓글