저는 사용성이나 성능이 Parallels가 월등하지만, 비용 절감을 위해 UTM을 썼었습니다.
맥 OS 12 이상, 메모리 4GB, 저장공간 20GB를 할당한 뒤 가상 머신 생성을 실행했습니다.
저는 찐 개발자가 되고 싶어 CLI인 Server로 다운 받을 겁니다. UTM 설치 후 Ubuntu Server Mac Silicon 전용 24.04 LTS 버전의 ISO를 다운받았습니다.
다운 받고, UTM를 설치하며 다운 받은 ISO를 연결하면 아래 화면이 나옵니다.
실행하고 환경 설정 및 설치가 끝나고, 세팅이 나옵니다. 세팅 중, 루트 계정 설정과 SSH 서버를 설정했습니다.
SSH 서버를 설정한 뒤 리부팅을 하고, 다시 실행해보면
아주 잘 나옵니다. SSH 서버도 확인해봤습니다.
sudo systemctl status ssh
이제 계정을 추가해보겠습니다. 계정 추가 명령어는 sudo adduser [username]
이므로 이렇게 입력하고 추가 계정을 만들어보겠습니다.
아주 잘 만들어졌습니다. 저는 미리 taeyeon
이라는 계정을 만들었기에 이걸로 진행하겠습니다.
이제 로컬 컴퓨터에서 가상 환경에 접속해보겠습니다. 그러려면 가상 환경의 IP를 알아야합니다. ip a
를 입력해 아이피를 알고, 추가한 계정의 username을 입력하고 접속해보겠습니다.
아주 잘됩니다. 여기서 이제 디렉토리 및 설정을 시작하겠습니다.
/scrap
디렉토리 생성 및 권한 설정하는 명령어는 아래와 같습니다.
# mkdir는 생성 명령어
sudo mkdir /scrap
# chmod는 권한 부여 명령어
sudo chmod 764 /scrap
또한 생성됐는지 보려면 아래 명령어를 따릅니다.
# ls는 디렉토리를 살펴보고, 옵션 -l, -ld 등은 그 디렉토리의 정보를 나타냅니다.
ls -l /
ls -ld /scrap
아주 잘 뜹니다! 리스트에 scrap
이 뜨고, 권한이 drwxrw-r--
, 즉, 764로 정해졌습니다.
파일 및 디렉토리의 보안을 유지하고, 적절한 사용자 및 그룹이 특정 작업을 수행할 수 있도록 제어하기 위함입니다. 한마디로 데이터를 지키기 위해서 입니다.
또한, 리눅스 파일 권한은 8진수로 표현되며, 각 숫자는 특정 권한을 나타냅니다. 764 권한이 drwxrw-r--
로 치환되는 과정은 아래와 같습니다.
drwxrwxrwx
d
= 디렉토리, -
= 일반 파일, l
= 심볼릭 링크 등)r
, 쓰기 w
, 실행 x
)r
, 쓰기 w
, 실행 x
)r
, 쓰기 w
, 실행 x
)각 권한의 문자는 8진수로 변환됩니다.
이를 조합하여 권한을 작성합니다.
764를 다시 역산해봅니다.
rwx
(읽기, 쓰기, 실행)rw-
(읽기, 쓰기)r--
(읽기)서울 시간대로 시간을 먼저 설정해봅니다. 명령어는 아래와 같습니다. 아주 간단합니다.
# timedatectl는 시간대를 설정하는 명령어입니다.
sudo timedatectl set-timezone Asia/Seoul
date
결과는 아래와 같습니다.
이제 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
아주 잘 깔아졌습니다! 이제 JS파일을 실행해보겠습니다. scp
명령어를 이용해 네트워크 통신하여 파일을 주고 받아봅시다.
scp index.js [가상 환경 유저 네임]@[가상 환경 IP}]:[가상 환경 경로]
이렇게 뜨면 성공했습니다. 실행해보겠습니다.
아주 잘 뜹니다. ls
명령어를 사용하고 보니 index.js
가 있고, node
로 실행해보니 잘되는 모습입니다.
top
: 시스템의 전체적인 성능 상태를 실시간으로 모니터링. CPU 사용량, 메모리 사용량, 각 프로세스의 자원 사용량 등vmstat
: 시스템의 메모리, 프로세스, 블록 I/O 등의 상태를 보고.sar
: sysstat
패키지의 기능. CPU 사용률을 1초 간격으로 3번 수집해 보고.netstat
: net-tools
패키지의 기능. 네트워크 연결, 라우팅 테이블, 인터페이스 통계 등의 정보를 보여줌.쉘 스크립트 작성법은 이 블로그를 참고했습니다. 작성하기위해 nano
명령어를 이용해 monitor_resources.sh
파일을 만들어 보겠습니다.
이러한 편집기가 나옵니다. #!/bin/bash
은 shebang
으로 스크립트를 실행할 때 사용할 인터프리터를 지정하는 역할을 합니다.
저 파일을 실행 시키기 위해 ./monitor_resources.sh
를 입력했더니 접근이 거부당했습니다. 아까 배웠던 chmod
를 이용해 실행 권한을 주고 실행시킵니다. chmod +x monitor_resources.sh
됐습니다! 이제 시작해보겠습니다.
#!/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
와 같은 역할%s
은 printf
의 형식 지정자. ,
뒤의 문자를 출력함$n
: n번째 필드를 고름아주 잘 나옵니다! 이제 알람을 구현해보겠습니다. 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
LOG_DIR
를 따로 정의YYYYMMDD-HHMMSS
형태로 저장하기 위해 date
를 사용해 작성 및 .log
붙이기mkdir -p $LOG_DIR
: LOG_DIR
디렉토리 생성touch $LOG_FILE
: 로그 파일 생성curl -X POST ~
: 조건이 해당될 시 슬랙에 전송하는 웹훅 실행실행해보면 이제 슬랙에 뜰 겁니다.
아주 잘됩니다!
crontab
을 설정crontab
을 설정해 동작 1분마다 실행되도록 설정하겠습니다. 실행어는 crontab -e
입니다.
1분이 지나고 스크립트가 실행돼 따로 직접 실행되지 않았는데, 스크립트가 실행돼 monitoring
이 생긴 모습입니다.
아주 간단합니다. stress
패키지를 설치해 실행시키면 됩니다.
# 설치
sudo apt install stress
# 과부하 사용법 (cpu, vm 동시에)
stress --cpu 8 --vm 8 --vm-bytes 1G --io 4 --timeout 60
아주 잘되는 모습입니다. 결과값이 2개인 것은 알아보기 어려워서 2개 동시에 실행시켜서 잘 보이게 했던 거라 넘기면 됩니다.