IT
-
리눅스에 GUI가 설치되어있는 지 확인하는 방법 (명령어)2021.11.21
-
[born2beroot] monitoring 파트 정리22021.11.17
-
[born2beroot] monitoring 파트 정리12021.11.17
-
[born2beroot] 개념 정리 - 프로젝트 개요2021.11.15
-
[번역] 가상화(virtualization)란 무엇일까요?2021.11.15
[Github] 깃허브 왕초보 사용법 - 기본편1
회고록
"나도 사실 깃허브를 쓸 줄 몰랐다"
2학년 초반 팀플 조장선배가 이게 협업 툴이라며 알려줬어도 이게 뭐고...? 싶을 뿐이었다. 아무리 설명을 들어도 그냥 말 귀에 경 읽기 수준이 아니던가... 이런 고급 도구 쓰기도 힘들고 그냥 싫었다.
그러던 중 내가 컴퓨터에서 뭘 잘못 지워서 코드가 백업본 없이 싹~다 날아가버리는 경험을 하게 되었다. ㅋㅋㅋㅋ
그 이후로 코드 백업과 함께 깃허브의 필요성을 절실히 느끼게 되었다... 또 42서울이라는 대외활동을 하며 터미널과 깃을 이용하여 과제를 제출하다보니, 어느새 꽤 익숙해지게 되었다.
진짜 이상한게 학교에서 가르쳐주지도 않는 주제에 깃은 개발자에게 반드시 필요한 도구라고 한다. 학교에서 이런 걸 좀 가르쳐야하는 데 독학으로 배우긴 또 어렵고 귀찮다. 그렇지만 난 깃을 배우는게 정말! 꼭 필요하다고 생각한다. 이번 강좌를 통해 꼭 고급정보 잘 배워가길 바란다.
이 글을 읽는 여러분들은 아마 어렵더라도 깃허브를 배워야겠다는 생각에 찾아온 것일테다.
"fork? clone? push? commit? 잔디밭 깔기? 이게 다 대체 뭐고...."
"애초에 깃이 뭔데..? 진심 때려치고싶다."
등등 이런 생각이 들며 혼란스러웠을 것 누구보다 잘 안다. 그래서 왕초보의 눈높이에 맞는 쉬운 사용법 강좌를 쓴다. 여러분에게 많은 도움이 되길 바란다.
이번 기본편에서는 주로 이런 내용을 다룬다.
1. 깃이 무엇인가
2. 깃에서의 기본적인 기능들
3. 깃허브에 코드를 올리는 법 (feat. vscode)
4. 깃허브에서 다른 사람들의 코드 보기 (검색하기)
5. 내 깃허브 페이지 꾸미기
애초에 깃이 뭔가요
깃은 컴퓨터 파일의 변경사항을 추적하고 여러 명의 사용자들 간에 해당 파일들의 작업을 조율하기 위한 분산 버전 관리 시스템이다. 또는 이러한 명령어를 가리킨다 <출처 : 위키백과>
...라고 한다.
사실 이 말만 들어서는 잘 이해가 안된다. 그러면 이걸 한번 보자.
우리는 이렇게 하나의 작업물에 대해 버전을 여러 개 만든다.... 계속 수정해야할 일이 생기고, 그러면 새롭게 복사본을 만들어 거기서 또 내용을 수정한다. 제목에 '_수정1', '_수정2', '_최종' 등등을 붙여가며 말이다.
정말 비효율적이지 않은가? 그렇다고 한 작업물로 합쳐버리기에는, 유사 시 그전 버전으로 복구하기 힘들어 곤란한 걍우가 생긴다.
그럼 누군가는 이런 생각을 할 것이다.
"한 작업물에서 이전 버전을 바로 복구할 수 있게, 이전 버전에서 무엇이 수정되었는 지 알 수 있도록 버전관리를 하면 어떨까?"
축하한다. 당신은 방금 깃이라는 기술을 발명했다.
이렇게 "버전 관리"를 손쉽게 도와주는 기술이 바로 "깃(git)"이다.
또한 깃허브는 이 "깃(git)"이라는 기술을 사용하는 코드 저장소이다.
그러면 내 깃허브를 통해서, 어떤 식으로 깃 버전관리가 되는 지 맛만 보여주겠다.
다음은 내 깃허브 레포지터리 하나로 들어가 내가 뭘 수정해서 올릴 때 작성한 커밋메시지를 클릭해본 결과이다. (6_utilize_queue 부분)
내 코드가 지난번과 비교해서 어떤 부분이 달라졌는지까지 비교되어서 나온다. 이건 정말 굉장한 거다.
이를 활용하면 코드를 쉽게 이전 버전으로 복구할 수 있다고 한다. 더 많은 기능들이 있지만 일단 생략하고 넘어간다.
깃에서의 기본적인 기능들
깃에서 알아야할 기본적인 용어만 맛만 본다. 대강 이해만 하고 넘어가자.
* 저장소 (Repository)
프로젝트가 살고 있는 저장공간. 주로 repo라고 줄여서 부르기도 하며, 디렉토리(폴더)라고 부르기도 한다. 이 안에 코드, 텍스트, 이미지 등등을 저장할 수 있다.
* 커밋 (Commit)
커밋을 한다 = 그 시점의 자신의 레포 스냅샷을 찍어 체크포인트 깃발을 꽂아둔다.
보통 체크포인트가 그렇듯이 수정을 하다가도 원하는 체크포인트로 돌아가 복원할 수 있다.
* 브랜치 (Branch)
이건 주로 여러 명이 한 레포에 프로젝트를 만들어 협업할 때 중요하게 쓰이는 기능이다.
예를 들어, 3명이 팀프로젝트를 한다고 해당 프로젝트를 담을 레포(저장소) 하나를 만들었다고 해보자. 팀원 a, b, c는 각자 컴퓨터로 레포에 접근해 작업한다. 이때 a, b, c 3명이 동시에 같은 코드를 수정하거나 삭제해버렸다 해보자. 충돌이 생기고, 또 어디를 고쳤는지 어디를 복원해야하는지 알기 힘들어 정말 개판이 난다. 어쩌면 더이상 팀프로젝트가 아닌 머리채싸움이 될 수도 있다.
이걸 방지하기 위한 기능이 branch이다. 자신이 진행하는 프로젝트의 브렌치를 따서(Branch off) 자기버전을 만드는 거다. 작업이 끝나면 프로젝트 메인 디렉토리인 master에 브랜치를 'merge'하여 병합할 수 있다.
아래 이미지와 같이, 한 시점에서 복사본을 만들어 작업하다가 작업이 끝나면 원본에 합친다는 것으로 보면 된다.
(혼자 작업하는 경우엔 당장 쓰이는 기능은 아니다)
'IT > 튜토리얼 및 가이드' 카테고리의 다른 글
[입문자 튜토리얼] - C언어 소스 코드 파일 분리 2편 (feat. 헤더파일) (0) | 2021.12.19 |
---|---|
[입문자 튜토리얼] - C언어 소스 코드 파일 분리 1편 (feat. 코드를 깔끔하게) (0) | 2021.12.19 |
[Github] 깃허브 왕초보 사용법 - 기본편3 (0) | 2021.12.19 |
[Github] 깃허브 왕초보 사용법 - 기본편2 (0) | 2021.12.19 |
[번역] 가상화(virtualization)란 무엇일까요? (0) | 2021.11.15 |
리눅스에 GUI가 설치되어있는 지 확인하는 방법 (명령어)
원문의 글을 번역한 뒤 정리한 자료입니다. 참고바랍니다.
문제 시 바로 삭제하겠습니다!
질문이나 지적 환영합니다.
원문 링크 :
https://ostechnix.com/how-to-check-if-gui-is-installed-in-linux-from-commandline/
How To Check If GUI Is Installed In Linux From Commandline - OSTechNix
Do you want to detect if your Linux server has GUI? This guide explains various commandline methods to check if GUI is installed in Linux.
ostechnix.com
GUI (= Graphic User Interface) ↔ CLI (= Command Line Interface)
** DE (= Desktop Environment) : GUI 인터페이스 스타일 중 하나
- GUI : 그래픽 사용자 인터페이스 (기본적인 윈도우 환경, 데스크탑 환경 등등)
- CLI : 명령어 사용자 인터페이스 (커널 등등)
- DE : 데스크탑 환경. GUI 인터페이스 스타일 중의 하나
지금부터, 명령어를 통해 리눅스 시스템에 GUI가 설치되어있는 지 확인하는 여러가지 방법들을 소개한다.
1. X session이 시스템에 설치되어있는 지 확인
$ ls /usr/bin/*session
먼저, 위와 같은 명령어를 실행한다.
/usr/bin/dbus-run-session /usr/bin/gnome-session-custom-session
/usr/bin/gnome-session
만약 당신의 리눅스 시스템에 GUI 세션이 있다면, 위와 같은 결과가 나타날 것이다.
위 출력 결과를 보면, 해당 시스템에 GNOME이 깔려있다고 나온다.
만약에 시스템에 MATE가 설치되어 있다면, /usr/bin/mate-session 이라고 출력될 것이다.
LXDE에 대해서는, /usr/bin/lxsession 이라고 나온다.
만약에 해당 리눅스 시스템에 어떤 GUI도 설치되어 있지 않다면, 다음과 같은 결과를 보게 될 것이다.
/usr/bin/byobu-select-session /usr/bin/dbus-run-session
이 명령어는 오로지 데비안 기반의 시스템들에서만 작동한다. (우분투, 리눅스 민트, POP!_OS 등)
따라서 당신의 시스템이 RPM 기반의 시스템(Fedora, RHEL)이라면 다음과 같은 에러 메시지를 보게 될 것이다.
ls: cannot access '/usr/bin/*session': No such file or directory
이런 경우에는, 이 다음에 제시하고 있는 다른 방법을 시도해보자.
2. Xserver의 존재를 type 명령어를 이용해 확인
당신의 시스템에 GUI가 설치되어 있는지 확인하는 두번째 방법은, type 명령어를 이용해서 X server의 존재를 확인하는 것이다.
$ type Xorg
먼저, 위와 같은 명령어를 실행한다.
Xorg is /usr/bin/Xorg
GUI가 설치된 리눅스 환경에서는 다음과 같은 결과가 나타날 것이다.
-bash: type: Xorg: not found
CLI만 사용된 환경에서는, 다음과 같은 결과가 나타난다.
3. /usr/share/xsessions/ 의 내용을 ls 명령어를 이용해 확인
$ ls /usr/share/xsessions/
먼저, 위와 같은 명령어를 실행한다.
ubuntu.desktop
GUI가 설치된 우분투 리눅스 환경에서 나오는 출력결과 예시이다.
ls: cannot access '/usr/share/xsessions/': No such file or directory
CLI만 사용된 우분투 환경에서 나타나는 출력결과 예시이다.
4. dpkg와 grep 명령어를 이용해 확인
이 방법은 데비안 기반의 시스템들에서만 통하는 방법이다. 또한 당신은 다음과 같이 dpkg와 grep 명령어를 통해 GUI가 설치되어있는 지 확인할 수 있다.
$ dpkg -l | grep xserver
이 명령어는 설치된 모든 X11과 xserver 관련 패키지들을 나열한다.
다음은 우분투 리눅스 GUI 시스템에서의 출력 예시이다.
ii x11-xserver-utils 7.7+8 amd64 X server utilities
ii xserver-common 2:1.20.9-2ubuntu1.2~20.04.1 all common files used by various X servers
ii xserver-xephyr 2:1.20.9-2ubuntu1.2~20.04.1 amd64 nested X server
ii xserver-xorg 1:7.7+19ubuntu14 amd64 X.Org X server
ii xserver-xorg-core 2:1.20.9-2ubuntu1.2~20.04.1 amd64 Xorg X server - core server
ii xserver-xorg-core-hwe-18.04 3:14.5 amd64 Transitional package for xserver-xorg-core-hwe-18.04
ii xserver-xorg-hwe-18.04 3:14.5 amd64 Transitional package for xserver-xorg-hwe-18.04
ii xserver-xorg-input-all 1:7.7+19ubuntu14 amd64 X.Org X server -- input driver metapackage
ii xserver-xorg-input-libinput 0.29.0-1 amd64 X.Org X server -- libinput input driver
ii xserver-xorg-input-wacom 1:0.39.0-0ubuntu1 amd64 X.Org X server -- Wacom input driver
ii xserver-xorg-legacy 2:1.20.9-2ubuntu1.2~20.04.1 amd64 setuid root Xorg server wrapper
ii xserver-xorg-video-all 1:7.7+19ubuntu14 amd64 X.Org X server -- output driver metapackage
ii xserver-xorg-video-all-hwe-18.04 3:14.5 amd64 Transitional package for xserver-xorg-video-all-hwe-18.04
ii xserver-xorg-video-amdgpu 19.1.0-1 amd64 X.Org X server -- AMDGPU display driver
ii xserver-xorg-video-amdgpu-hwe-18.04 3:14.5 amd64 Transitional package for xserver-xorg-video-amdgpu-hwe-18.04
ii xserver-xorg-video-ati 1:19.1.0-1 amd64 X.Org X server -- AMD/ATI display driver wrapper
ii xserver-xorg-video-ati-hwe-18.04 3:14.5 amd64 Transitional package for xserver-xorg-video-ati-hwe-18.04
ii xserver-xorg-video-fbdev 1:0.5.0-1ubuntu1 amd64 X.Org X server -- fbdev display driver
ii xserver-xorg-video-fbdev-hwe-18.04 3:14.5 amd64 Transitional package for xserver-xorg-video-fbdev-hwe-18.04
ii xserver-xorg-video-intel 2:2.99.917+git20200226-1 amd64 X.Org X server -- Intel i8xx, i9xx display driver
ii xserver-xorg-video-nouveau 1:1.0.16-1 amd64 X.Org X server -- Nouveau display driver
ii xserver-xorg-video-qxl 0.1.5+git20200331-1 amd64 X.Org X server -- QXL display driver
ii xserver-xorg-video-qxl-hwe-18.04 3:14.5 amd64 Transitional package for xserver-xorg-video-qxl-hwe-18.04
ii xserver-xorg-video-radeon 1:19.1.0-1 amd64 X.Org X server -- AMD/ATI Radeon display driver
ii xserver-xorg-video-vesa 1:2.4.0-2 amd64 X.Org X server -- VESA display driver
ii xserver-xorg-video-vesa-hwe-18.04 3:14.5 amd64 Transitional package for xserver-xorg-video-vesa-hwe-18.04
ii xserver-xorg-video-vmware 1:13.3.0-3 amd64 X.Org X server -- VMware display driver
GUI가 없는 우분투 환경에서는, 다음과 같이 Xserver 관련 패키지 몇 개만을 볼 수 있을 것이다.
rc x11-xserver-utils 7.7+8 amd64 X server utilities
ii xserver-common 2:1.20.9-2ubuntu1.2~20.04.1 all common files used by various X servers
그러나, 이 방법은 신뢰성 있는 방법은 아니다. 왜냐하면, 당신이 dpkg나 apt와 같은 패키지 매니저 없이 DE(=Desktop Environment)를 설치했을 가능성이 있기 때문이다. 그런 경우에는, 이 방법으로 어떠한 결과도 반환받을 수 없다. 만약에 당신이 X서버를 설치한 뒤에 제거했더라도, Xserver가 설치되었다는 것만을 보여줄 것이다.
5. 리눅스에서 사용 중인 DE (데스크톱 환경)을 알아내는 방법
- 이건 추가적인 방법이다. 다음과 같은 명령어를 쓰면, 우리가 리눅스 GUI 시스템에서 현재 사용하고 있는 Desktop Environment를 쉽게 알아낼 수 있다.
$ echo $XDG_CURRENT_DESKTOP
ubuntu:GNOME
결과값에서 볼 수 있듯이, 현재 우분투 GNOME 데스크톱 환경을 사용하고 있다. 만약에 어떠한 DE도 갖고 있지 않다면, 아무 결과도 나오지 않을 것이다.
'IT > 개발 환경 및 설치' 카테고리의 다른 글
[ARM64] M1 맥북에서 윈도우 사용하기 (feat. Parrellels) (0) | 2022.07.04 |
---|---|
[ARM64] 맥북 M1 위에 설치한 리눅스 가상환경에서 vscode 설치하기 (0) | 2022.06.28 |
[오류] VM VirtualBox 시작 오류 (0) | 2022.02.24 |
[오류] 맥북 m1 : gdb 설치 오류 - Error: gdb: no bottle available! (0) | 2022.01.23 |
[born2beroot] monitoring 파트 정리2
[평가시트 원문] 더보기
Script monitoring
Remember: Whenever you need help checking something, the student being evaluated should be able to help you. The student being evaluated should explain to you simply:
- How their script works by showing you the code.
- What "cron" is.
- How the student being evaluated set up their script so that it runs every 10 minutes from when the server starts. Once the correct functioning of the script has been verified, the student being evaluated should ensure that this script runs every minute. You can run whatever you want to make sure the script runs with dynamic values correctly. Finally, the student being evaluated should make the script stop running when the server has started up, but without modifying the script itself. To check this point, you will have to restart the server one last time. At startup, it will be necessary to check that the script still exists in the same place, that its rights have remained unchanged, and that it has not been modified. If something does not work as expected or is not clearly explained, the evaluation stops here.Bonus
Evaluate the bonus part if, and only if, the mandatory part has been entirely and perfectly done, and the error management handles unexpected or bad usage. In case all the mandatory points were not passed during the defense, bonus points must be totally ignored.
Script monitoring
피평가자는 당신에게 다음의 내용들을 간단히 설명해야합니다 :
- 스크립트가 어떻게 동작하는 지 당신에게 코드를 보여주기
- "cron"이란 무엇인지
- 피평가자가 어떻게 스크립트를 설정했길래 그게 (서버가 시작된 이후로) 10분마다 한번씩 실행되는지
일단 스크립트가 올바른 동작을 한다는 게 검증되고 나서는, 피평가자는 그 스크립트가 매분마다 실행되도록 해야합니다. 그 스크립트가 동적인 값들과 함께 올바르게 작동한다는 것을 보장하기 위해서, 당신은 원하는 무엇이든 실행시킬 수 있습니다. 최종적으로, 피평가자는 그 스크립트가 스스로를 수정하지 않고도 서버가 시작되면 실행을 멈추게끔 만들어야합니다. 이 점을 확인하기 위해서는, 당신은 마지막으로 한번 서버를 재시작해야 할 것 입니다. 막 시작되었을 때, 그 스크립트가 아직 같은 장소에 존재하는 지, 권리(권한)가 바뀌지 않은 채로 남아있는지, 그리고 수정되지 않았는 지 반드시 확인해야합니다.
3. 스크립트 설명
#!/bin/bash_
printf "#Architecture: "
uname -srvmo
# 시스템 정보 확인
printf "#CPU physical : "
nproc --all
# 물리적 cpu의 개수 확인
printf "#vCPU : "
cat /proc/cpuinfo | grep processor | wc -l
# 가상머신에 할당된 물리적 CPU의 개수 확인
printf "#Memory Usage: "
free -m | grep Mem | awk '{printf"%d/%dMB (%.2f%%)\n", $3, $2, $3/$2 * 100}'
# 메모리 점유율 확인
printf "#Disk Usage: "
df -BM -a | grep /dev/mapper/ | awk '{sum+=$3}END{print sum}' | tr -d '\n'
printf "/"
df -H -a | grep /dev/mapper/ | awk '{sum+=$4}END{print sum}' | tr -d '\n'
printf "GB ("
df -BM -a | grep /dev/mapper/ | awk '{sum1+=$3 ; sum2+=$4 }END{printf "%d", sum1 / sum2 * 100}' | tr -d '\n'
printf "%%)\n"
# 디스크의 공간 및 디스크 사용률 확인
printf "#CPU load: "
mpstat | grep all | awk '{printf "%.2f%%\n", 100-$13}'
# CPU 사용률 확인
printf "#Last boot: "
who -b | sed 's/^ *system boot //g'
# 마지막으로 시스템 부팅한 시간 확인
printf "#LVM use: "
if [ "$(lsblk | grep lvm | wc -l)" -gt 0 ] ; then printf "yes\n" ; else printf "no\n" ; fi
# LVM이 사용되었는 지 여부 확인
printf "#Connections TCP : "
ss | grep -i tcp | wc -l | tr -d '\n'
printf " ESTABLISHED\n"
# TCP 연결을 확인
printf "#User log: "
who | wc -l
# 현재 로그인 중인 이용자의 수를 확인
printf "#Network: IP"
/sbin/ifconfig | grep broadcast | sed 's/inet//g' | sed 's/netmask.*//g' | sed 's/ //g' | tr -d '\n'
printf " ("
/sbin/ifconfig | grep 'ether ' | sed 's/.*ether //g' | sed 's/ .*//g' | tr -d '\n'
printf ")\\n"
# 현재 ip주소와 mac주소 확인
printf "#Sudo : "
grep -a 'sudo:' /var/log/auth.log | grep 'COMMAND=' | wc -l | tr -d '\n'
printf " cmd\n"
# sudo 명령어 사용 횟수 확인
exit 0
참고) 쉘 기본 명령어
(1) grep : 입력으로 전달된 파일의 내용에서, 특정 문자열을 찾고자할 때 사용
$ grep [OPTION] [PATTERN] [FILE]
예시 : grep "Apple" -> "Apple"이라는 문자열을 검색하고, 문자열이 존재하는 라인을 출력
(2) wc : word count, 문자/단어/줄 수 등을 출력
wc -l : 지정한 파일의 줄 수(line) 출력, 행수(row) 출력
응용 : grep "A" | wc -l
-> "A"라는 문자열이 포함된 문장의 개수를 센다.
(3) awk : 파일로부터 레코드(record)를 선택하고, 선택된 레코드에 포함된 값을 조작화하거나 데이터화
데이터 분류, 패턴 매칭 검사, 데이터 조작 및 연산 등의 액션 수행, 그 결과를 출력
$ awk [OPTION ...] [awk program] [ARGUMENT ...]
awk program 의 구조 -> pattern {action}
$ awk [OPTION ...] 'pattern {action}' [ARGUMENT ...]
- pattern, action 모두 생략 가능 (생략 시 디폴트 : pattern - 모든 레코드, action - print)
* 특별한 패턴 : "BEGIN", "END"
- awk가 BEGIN 패턴을 식별하면 입력데이터로부터 첫 번째 레코드를 처리하기 전에 "BEGIN"에 저장된 액션을 실행
- "END" 패턴은 "BEGIN"과 반대로, 모든 레코드를 처리한 다음 "END"에 지정된 액션을 실행
예시 :
$ awk 'BEGIN { print "TITLE : Field value 1,2"} {print $1, $2} END {print "Finished"}' file.txt
* printf 와 print의 차이점 : printf와 다르게, print는 개행까지 출력한다. 만일 개행을 빼고 싶다면 tr -d '\n' 명령어를 추가해줘야한다.
(4) tr : 문자 변환/삭제
지정한 문자를 변환하거나 삭제하는 데 사용되는 명령어. 특정한 문자를 다른 문자로 변환하거나 특정 문자를 제거하는 데 사용.
$ tr [옵션] 문자열1 [문자열2]
옵션 :
-d : 문자열1에서 지정한 문자를 삭제
-s : 문자열2에서 반복되는 문자를 삭제
-t : 문자열1을 문자열2의 길이로 자름
(5) sed : Stream Editor. 원본 텍스트 파일을 편집하는 명령어 (치환, 삭제 등)
- sed 's/문자열1/문자열2/g' : 출력 중 문자열1이 나오는 부분을 전부 문자열2로 치환한다.
(6) 조건문
1) if 문
if [ 조건절 ]
then
실행절
fi
2) if-else 문
if [ 조건절 ]
then
실행절
else
실행절
fi
3) if-elif-else 문
if [ 조건절 ]
then
실행절
elif [ 조건절 ]
then
실행절
else
실행절
fi
6. #CPU load : CPU 사용률 확인
mpstat | grep all | awk '{printf "%.2f%%\n", 100-$13}'
- cpu 사용량을
mpstat : 리눅스 CPU 사용량, 코어 별 사용률을 확인할 수 있는 명령어
- mpstat 만 실행 시, 1회에 한하여 CPU 사용률을 보여준다 (전체 코어 한번에)
mpstat을 통해 나온 결과 중, all(모든 cpu)이 나온 줄만 가져온다. 그리고 100에서 %idle (13번째 열)을 뺀 값 (= 현재 cpu 사용량)을 계산하여 출력한다.
* all : 모든 CPU
* %idle : 유휴한 CPU 시간 백분율 (유휴 시간)
- system idle 프로세스?
각 CPU마다 하나씩 실행되는 스레드로서, CPU의 잔여 프로세스 처치량을 %로 나타낸 값.
쉽게 얘기하면 '놀고있는 CPU'
ex) 이 값이 95라면, 현재 5%의 CPU가 사용되고 있으며 나머지 95%는 쉬고 있음을 뜻함
-> 현재 CPU 사용량 = 100% - system idle 프로세스
참고) mpstat의 각 열 항목에 대한 설명
** 설치 :
- 데비안 계열(우분투 등) : apt-get install sysstat
- 레드햇 계열(페도라, CentOS 등) : yum install sysstat
참고) mpstat에 대한 더 자세한 정보
7. #Last boot : 마지막으로 시스템 부팅한 시간 확인
who -b | sed 's/^ *system boot //g'
who : 현재 로그인하고 있는 사용자들의 정보를 출력하는 명령어
-b 옵션 : 마지막으로 시스템을 부팅한 시간
참고) 더 많은 who 옵션
who -b를 통해 가장 마지막으로 시스템을 부팅한 시간을 받아올 수 있다.
이떄 '~systemboot '을 제거하고 부팅시간만 나오게하기 위해서 sed 's/^ *system boot //g'으로 출력을 편집해준다.
8. #LVM use : LVM이 사용되었는 지 여부 확인
if [ "$(lsblk | grep lvm | wc -l)" -gt 0 ] ; then printf "yes\n" ; else printf "no\n" ; fi
- lsblk : 라뉵스 디바이스 정보를 출력하는 명령어. (옵션없이 사용할 시, 트리 형식으로 모든 스토리지 디바이스를 출력)
- '-gt' 옵션 : 비교연산자 (보다 큼).
ex) if [$a -gt $b]
여기 lsblk를 실행하여 나오는 결과에서, lvm이 나온 줄만 뽑아 그 개수를 센다 (grep lvm | wc -l)
그리고 그 개수가 0보다 크면 lvm이 사용된 것으로 간주하고 yes를 출력한다. 그렇지 않으면 no를 출력한다.
참고) 쉘스크립트에서 사용하는 비교연산자 정리
9. #Connections TCP : TCP 연결(개수)을 확인
ss | grep -i tcp | wc -l | tr -d '\n'
- ss : 네트워크 상태를 확인하기 위해 사용하는 명령어
이때, tcp가 나온 줄의 개수를 세기위해 grep -i tcp | wc -l 를 실행한다. 그리고 개행을 제거하여 출력한다.
(grep에 -i 옵션을 준 이유는 대소문자 구별없이 tcp라는 문자를 찾기위함)
10. #User log : 현재 로그인 중인 이용자의 수를 확인
who | wc -l
who 라는 명령어는 현재 시스템에 로그인 되어있는 유저들에 대한 정보를 출력한다.
따라서 who | wc -l 명령어를 통해, who에서 나오는 출력의 줄 수를 센다. 이것이 바로 유저의 수가 된다.
11. #Network: IP : 현재 ip주소와 mac 주소 확인
** ifconfig 명령어를 설치하지 않고 실행하면, 'command not found'라는 오류 메시지가 뜬다.
** ifconfig 설치 (우분투, 데비안)
$ sudo apt-get install net-tools
참고) centOS에서 ifconfig 설치
$ sudo yum install net-tools
(1) /sbin/ifconfig | grep broadcast | sed 's/inet//g' | sed 's/netmask.*//g' | sed 's/ //g' | tr -d '\n'
- ip 주소 출력
캡쳐본에서 빨간색으로 표시한 부분을 출력해야한다. 따라서 이에 맞게 문자열을 편집하여 출력하는 작업이 필요하다.
해당 줄에 broadcast가 있으므로, grep broadcast를 실행해서 그 줄을 불러온다. 그리고 sed와 tr-d를 이용해서 ip주소 앞뒤의 문자열들을 지워 ip주소만 남긴다.
(sed 's/inet//g'를 이용해서 ip주소 앞의 문자열을 지운다. 그리고 sed 's/netmask.*//g' | sed 's/ //g' | tr -d '\n'을 실행해서 뒤에 있는 문자열도 지워준다. 그러면 ip주소와 개행만 남는다. 이때 tr -d '\n'를 통해 개행을 지워주면 끝이다)
(2) /sbin/ifconfig | grep 'ether ' | sed 's/.*ether //g' | sed 's/ .*//g' | tr -d '\n'
- mac 주소 출력
캡쳐본에서 파란색으로 표시한 부분을 출력해야한다.
mac 주소 앞에 'ether '가 있으므로 grep을 통해 그 줄을 가져올 수 있다. 그리고 sed와 tr -d 를 통해 문자열을 편집해서, mac주소만 남겨서 출력하면 된다.
참고) 명령어 : ifconfig와 ip 비교
12. #Sudo : sudo 명령어를 사용한 횟수를 확인
grep 'sudo:' /var/log/auth.log | grep 'COMMAND=' | wc -l | tr -d '\n'
- /var/log 디렉토리에 있는 리눅스 로그 파일
- /var/log/auth.log : 사용자 로그인이나 사용된 인증방법같은 시스템 인증 정보가 기록된다.
sudo ufw status 명령어를 한번 사용할때마다 결과값이 1씩 증가하는 것을 볼 수 있다.
추가)
💡 grep 에 -a 옵션을 추가했다! (이거 안해서 리트함...)
grep 때문에 리트하게 되는 사태가 발생했다... 당연히 grep이 잘 될 줄 알았는데, sudo 명령어 시행 개수가 출력이 0으로 고정되서는 뭘해도 변하지 않았다. 그 전에는 해당 코드가 잘 돌아갔는데... 갑자기 명령어가 먹히지 않는 이유를 알 수가 없었다.
알고보니 로그 파일에 binary 문자가 존재해 grep이 제대로 되지않아 발생하는 증상이었다. 이때 뒤에 -a (또는 -text)를 붙이면 grep이 잘 되는 것을 확인할 수 있다.
4. 스크립트가 매분마다 실행되도록 만들기
참고) 크론탭 사용방법
10분마다 스크립트 실행 :
- sudo crontab -e
- */10 * * * * /monitoring.sh | wall
- */10 * * * * bash monitoring.sh | wall
매분마다 스크립트 실행 :
- sudo crontab -e
- * * * * * /root/monitoring.sh
초단위로 컨트롤 하려면
-> sleep []; 명령어
5. 스크립트를 수정하지 않고도 실행을 멈추게 만들기
- 이 점을 확인하기 위해서는, 마지막으로 한번 서버를 재시작한다.
- 막 시작되었을 때, 그 스크립트가 아직 같은 장소에 존재하는 지, 권리(권한)가 바뀌지 않은 채로 남아있는 지, 그리고 수정되지 않았는 지 반드시 확인해야 한다.
crontab -e 에서 해당 파일을 삭제하거나, crontab -r 를 사용, 해당 스크립트를 크론탭에서 삭제해버리면 된다
(단, monitoring.sh 수정하지 않은 상태에서)
참고자료 링크
https://harryp.tistory.com/1042
[Linux] mpstat - 리눅스 CPU 사용량, 코어 별 사용률 확인
안녕하세요. 업무를 수행 하다 리눅스 서버의 CPU 코어 별 사용량을 파일로 뽑아야 됐습니다. top로는 관련 작업이 어려워 찾아보던 중, mpstat 이란 명령어를 알게되어 공유해봅니다. 1. 설치 mpstat
harryp.tistory.com
https://gbworld.tistory.com/1102
system idle process(시스템 유휴시간 프로세스) 정체
system idle process(시스템 유휴시간 프로세스)는 악성코드나 바이러스는 아니며, 각 CPU마다 하나씩 실행되는 스레드로서 CPU의 잔여 프로세스 처치량을 %로 나타난 값입니다. 쉽게 얘기하면 '놀고 있
gbworld.tistory.com
https://hand-over.tistory.com/45
ifconfig 설치하기 - Ubuntu, CentOS
안녕하세요. CentOS, Ubuntu 최초 설치하고 나서 특정 버전 이후는 ifconfig 명령어가 설치되어있지 않습니다. (ifconfig 명령어를 입력하면 'Command not found'가 출력됨) ifconfig를 사용하지 않고 IP 주소를..
hand-over.tistory.com
https://newstars.cloud/427?category=320059
Linux 명령어 ss (Socket Statistics)
리눅스에서 네트워크 상태를 확인하기 위해 흔히 사용하는 명령어로는 netstat 를 들수 있는데, 대체 명령어로 ss도 사용할 수 있다. CentOS 6.x x64 에서 가능하니 참고! #ss [옵션] [필터] -a : 모든 포트
newstars.cloud
'IT > 42Seoul' 카테고리의 다른 글
[born2beroot] monitoring 파트 정리1 (0) | 2021.11.17 |
---|---|
[born2beroot] 개념 정리 - 프로젝트 개요 (0) | 2021.11.15 |
[GET_NEXT_LINE] 구현 예시 (0) | 2021.06.11 |
[GET_NEXT_LINE] 구현 준비 (0) | 2021.06.04 |
Libft 과제 시 유의점 (테스터기, protected, Makefile) (0) | 2021.05.31 |
[born2beroot] monitoring 파트 정리1
[평가시트 원문] 더보기
Script monitoring
Remember: Whenever you need help checking something, the student being evaluated should be able to help you. The student being evaluated should explain to you simply:
- How their script works by showing you the code.
- What "cron" is.
- How the student being evaluated set up their script so that it runs every 10 minutes from when the server starts. Once the correct functioning of the script has been verified, the student being evaluated should ensure that this script runs every minute. You can run whatever you want to make sure the script runs with dynamic values correctly. Finally, the student being evaluated should make the script stop running when the server has started up, but without modifying the script itself. To check this point, you will have to restart the server one last time. At startup, it will be necessary to check that the script still exists in the same place, that its rights have remained unchanged, and that it has not been modified. If something does not work as expected or is not clearly explained, the evaluation stops here.Bonus
Evaluate the bonus part if, and only if, the mandatory part has been entirely and perfectly done, and the error management handles unexpected or bad usage. In case all the mandatory points were not passed during the defense, bonus points must be totally ignored.
Script monitoring
피평가자는 당신에게 다음의 내용들을 간단히 설명해야합니다 :
- 스크립트가 어떻게 동작하는 지 당신에게 코드를 보여주기
- "cron"이란 무엇인지
- 피평가자가 어떻게 스크립트를 설정했길래 그게 (서버가 시작된 이후로) 10분마다 한번씩 실행되는지
일단 스크립트가 올바른 동작을 한다는 게 검증되고 나서는, 피평가자는 그 스크립트가 매분마다 실행되도록 해야합니다. 그 스크립트가 동적인 값들과 함께 올바르게 작동한다는 것을 보장하기 위해서, 당신은 원하는 무엇이든 실행시킬 수 있습니다. 최종적으로, 피평가자는 그 스크립트가 스스로를 수정하지 않고도 서버가 시작되면 실행을 멈추게끔 만들어야합니다. 이 점을 확인하기 위해서는, 당신은 마지막으로 한번 서버를 재시작해야 할 것 입니다. 막 시작되었을 때, 그 스크립트가 아직 같은 장소에 존재하는 지, 권리(권한)가 바뀌지 않은 채로 남아있는지, 그리고 수정되지 않았는 지 반드시 확인해야합니다.
1. 스크립트가 어떻게 동작하는 지 실행결과 보여주기
(나중에 내 monitoring.sh 실행결과 스크린샷 첨부)
2. "cron"이란 무엇인가
Command Run On (UNIX scheduler)
unix 운영체제에서 어떤 작업을 특정 시간에 실행시키기 위한 스캐쥴러이다.
일정 주기나 특정 시간에 예약된 명령어가 수행되도록 도와주는 기능이다.
예시를 들어보자.
하루에 한차례 특정 서버에 접속해서 데이터를 받아와야하거나, 새벽 3시에 특정 작업을 수행해야하는 상황이 있다고 하자. 그런데 이런 경우에는 매일 같은 작업을 직접하기 번거로울 수 있다. 아니면 그 시간에 작업을 처리하지 못해서 곤란한 상황이 생길 수 있다. 그럼 어떻게 하면 이 문제를 해결할 수 있을까?
바로 이때, cron을 사용하면 된다.
이렇게 반복적인 예약작업이 필요할 때 크론이 유용하게 쓰인다.
그리고 위와 같은 cron 작업을 설정하는 파일을 crontab 파일이라고 부른다.
참고) 크론탭 사용법
리눅스 크론탭(Linux Crontab) 사용법 :: JDM's Blog
* 이 포스팅은 네이버 블로그에서 작성(2013.04.01)한 내용을 옮겨온 것입니다. 오늘은 리눅스 크론탭에 대해 알아볼까 합니다. 음, 윈도우에서는 스케줄러와 비슷하다고 보면 되겠네요. "특정 시간
jdm.kr
https://blog.daum.net/binsolb/11365692
Cron이란 무엇인가
1. Cron이란 무엇인가 Cron은 간단한게 말해서 unix 운영체제에서 어떤 작업을 특정 시간에 실행시키기 위한 데몬이다. 예를 들어 하루에 한차례 특정 서버에 접속해서 데이터를 받아와야 한다든지,
blog.daum.net
3. 스크립트 설명
#!/bin/bash_
printf "#Architecture: "
uname -srvmo
# 시스템 정보 확인
printf "#CPU physical : "
nproc --all
# 물리적 cpu의 개수 확인
printf "#vCPU : "
cat /proc/cpuinfo | grep processor | wc -l
# 가상머신에 할당된 물리적 CPU의 개수 확인
printf "#Memory Usage: "
free -m | grep Mem | awk '{printf"%d/%dMB (%.2f%%)\n", $3, $2, $3/$2 * 100}'
# 메모리 점유율 확인
printf "#Disk Usage: "
df -BM -a | grep /dev/mapper/ | awk '{sum+=$3}END{print sum}' | tr -d '\n'
printf "/"
df -H -a | grep /dev/mapper/ | awk '{sum+=$4}END{print sum}' | tr -d '\n'
printf "GB ("
df -BM -a | grep /dev/mapper/ | awk '{sum1+=$3 ; sum2+=$4 }END{printf "%d", sum1 / sum2 * 100}' | tr -d '\n'
printf "%%)\n"
# 디스크의 공간 및 디스크 사용률 확인
printf "#CPU load: "
mpstat | grep all | awk '{printf "%.2f%%\n", 100-$13}'
# CPU 사용률 확인
printf "#Last boot: "
who -b | sed 's/^ *system boot //g'
# 마지막으로 시스템 부팅한 시간 확인
printf "#LVM use: "
if [ "$(lsblk | grep lvm | wc -l)" -gt 0 ] ; then printf "yes\n" ; else printf "no\n" ; fi
# LVM이 사용되었는 지 여부 확인
printf "#Connections TCP : "
ss | grep -i tcp | wc -l | tr -d '\n'
printf " ESTABLISHED\n"
# TCP 연결을 확인
printf "#User log: "
who | wc -l
# 현재 로그인 중인 이용자의 수를 확인
printf "#Network: IP"
/sbin/ifconfig | grep broadcast | sed 's/inet//g' | sed 's/netmask.*//g' | sed 's/ //g' | tr -d '\n'
printf " ("
/sbin/ifconfig | grep 'ether ' | sed 's/.*ether //g' | sed 's/ .*//g' | tr -d '\n'
printf ")\\n"
# 현재 ip주소와 mac주소 확인
printf "#Sudo : "
grep -a 'sudo:' /var/log/auth.log | grep 'COMMAND=' | wc -l | tr -d '\n'
printf " cmd\n"
# sudo 명령어 사용 횟수 확인
exit 0
참고) 쉘 기본 명령어
(1) grep : 입력으로 전달된 파일의 내용에서, 특정 문자열을 찾고자할 때 사용
$ grep [OPTION] [PATTERN] [FILE]
예시 : grep "Apple" -> "Apple"이라는 문자열을 검색하고, 문자열이 존재하는 라인을 출력
(2) wc : word count, 문자/단어/줄 수 등을 출력
wc -l : 지정한 파일의 줄 수(line) 출력, 행수(row) 출력
응용 : grep "A" | wc -l
-> "A"라는 문자열이 포함된 문장의 개수를 센다.
(3) awk : 파일로부터 레코드(record)를 선택하고, 선택된 레코드에 포함된 값을 조작화하거나 데이터화
데이터 분류, 패턴 매칭 검사, 데이터 조작 및 연산 등의 액션 수행, 그 결과를 출력
$ awk [OPTION ...] [awk program] [ARGUMENT ...]
awk program 의 구조 -> pattern {action}
$ awk [OPTION ...] 'pattern {action}' [ARGUMENT ...]
- pattern, action 모두 생략 가능 (생략 시 디폴트 : pattern - 모든 레코드, action - print)
* 특별한 패턴 : "BEGIN", "END"
- awk가 BEGIN 패턴을 식별하면 입력데이터로부터 첫 번째 레코드를 처리하기 전에 "BEGIN"에 저장된 액션을 실행
- "END" 패턴은 "BEGIN"과 반대로, 모든 레코드를 처리한 다음 "END"에 지정된 액션을 실행
예시 :
$ awk 'BEGIN { print "TITLE : Field value 1,2"} {print $1, $2} END {print "Finished"}' file.txt
* printf 와 print의 차이점 : printf와 다르게, print는 개행까지 출력한다. 만일 개행을 빼고 싶다면 tr -d '\n' 명령어를 추가해줘야한다.
(4) tr : 문자 변환/삭제
지정한 문자를 변환하거나 삭제하는 데 사용되는 명령어. 특정한 문자를 다른 문자로 변환하거나 특정 문자를 제거하는 데 사용.
$ tr [옵션] 문자열1 [문자열2]
옵션 :
-d : 문자열1에서 지정한 문자를 삭제
-s : 문자열2에서 반복되는 문자를 삭제
-t : 문자열1을 문자열2의 길이로 자름
(5) sed : Stream Editor. 원본 텍스트 파일을 편집하는 명령어 (치환, 삭제 등)
- sed 's/문자열1/문자열2/g' : 출력 중 문자열1이 나오는 부분을 전부 문자열2로 치환한다.
(6) 조건문
1) if 문
if [ 조건절 ]
then
실행절
fi
2) if-else 문
if [ 조건절 ]
then
실행절
else
실행절
fi
3) if-elif-else 문
if [ 조건절 ]
then
실행절
elif [ 조건절 ]
then
실행절
else
실행절
fi
1. #Architecture : 시스템 정보 확인
uname -srvmo
uname(unix name) - 시스템의 정보를 확인
사용된 옵션
s : 커널 이름을 출력
r : 운영체제의 배포 버전을 출력
v : 커널 버전 정보를 출력
m : 시스템의 하드웨어 타입 정보 출력
o : 운영체제 정보를 출력
참고) uname과 uname의 옵션 더보기
2. #CPU Physical : 물리적 cpu의 개수 확인
nproc --all
nproc과 nproc --all의 차이 (주의)
- nproc : 사용가능한 processing unit들을 출력한다
- nproc --all : 설치된 프로세서의 개수를 출력한다.
즉, nproc --all 을 실행할 경우, nproc만 실행했을 때의 cpu개수보다 더 많이 나올 수도 있다.
3. #vCPU : 가상머신에 할당된 물리적 CPU 개수 확인
cat /proc/cpuinfo | grep processor | wc -l
- vCPU : 가상머신에 할당된 물리적 cpu. (기본값으로, 가상머신은 각각 1개의 vCPU를 배정받는다)
- /proc/cpuinfo 파일을 통해, CPU 정보를 확인할 수 있다.
- /proc/cpuinfo에서는, 각각의 프로세서에 식별자를 부여한다 (0부터 시작).
그리고 각각의 프로세서 별로 정보를 표시한다.
cat /proc/cpuinfo 만 실행했을 경우 나오는 출력 예시 :
$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 37
model name : Intel(R) Core(TM) i3 CPU M 330 @ 2.13GHz
stepping : 2
cpu MHz : 933.000
cache size : 3072 KB
physical id : 0
siblings : 4
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 11
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx rdtscp lm constant_tsc arch_perfmon pebs bts xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 popcnt lahf_lm arat dts tpr_shadow vnmi flexpriority ept vpid
bogomips : 4256.49
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:
processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 37
model name : Intel(R) Core(TM) i3 CPU M 330 @ 2.13GHz
stepping : 2
cpu MHz : 933.000
cache size : 3072 KB
physical id : 0
siblings : 4
core id : 0
cpu cores : 2
apicid : 1
initial apicid : 1
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 11
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx rdtscp lm constant_tsc arch_perfmon pebs bts xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 popcnt lahf_lm arat dts tpr_shadow vnmi flexpriority ept vpid
bogomips : 4256.40
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:
processor : 2
vendor_id : GenuineIntel
cpu family : 6
model : 37
model name : Intel(R) Core(TM) i3 CPU M 330 @ 2.13GHz
stepping : 2
cpu MHz : 933.000
cache size : 3072 KB
physical id : 0
siblings : 4
core id : 2
cpu cores : 2
apicid : 4
initial apicid : 4
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 11
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx rdtscp lm constant_tsc arch_perfmon pebs bts xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 popcnt lahf_lm arat dts tpr_shadow vnmi flexpriority ept vpid
bogomips : 4256.43
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:
** /proc/cpuinfo 파일은 코어별로 정보가 표시되는데, 해당 정보의 개수를 세면 ("processor"가 나온 횟수) 코어의 수를 셀 수 있다.
☞ 따라서 grep "processor"을 통해 프로세서라는 문자열이 나온 문장을 모두 가져오고, wc -l을 통해 그 개수를 센다.
그렇게하면 프로세서의 개수를 셀 수 있다.
4. #Memory Usage : 메모리 점유율 확인
free -m | grep Mem | awk '{printf "%d/%dMB (%.2f%%)\n", $3, $2, $3/$2 * 100}'
free만 실행하면 다음과 같은 결과가 나온다.
% free
total used free shared buffers cached
Mem: 2061712 490924 1570788 0 60984 220236
-/+ buffers/cache: 209704 1852008
Swap: 587768 0 587768
이때 grep Mem을 사용하면 Mem이 포함된 문장을 한 줄 가져올 수 있다.
거기에서 두번째 필드($2)의 'total'과 세번쨰 필드($3)의 'used'의 값을 가져와서 예제화면에 맞게끔 출력한다.
또, (used / total) * 100 을 출력하여 메모리 점유율도 볼 수 있게끔 한다.
**어 근데 여기서 $3, $2가 아니라 $2, $3 순서가 아닌가? 되게 이상하다 나중에 다시 보도록!
5. #Disk Usage : 디스크의 공간 및 디스크 사용률 확인
df -BM -a | grep /dev/mapper/ | awk '{sum+=$3}END{print sum}' | tr -d '\n'
printf "\"
df -H -a | grep /dev/mapper/ | awk '{sum += $4}END{print sum}' | tr -d '\n'
printf "GB ("
df -BM -a | grep /dev/mapper/ | awk '{sum1+=$3 ; sum2+=$4}END{printf "%d", sum1/ sum2 * 100}' | tr -d '\n'
df : 파일 시스템의 디스크 공간 확인
옵션없이 실행할 경우 kilo byte 단위로 현재 마운트된 파일 시스템의 정보를 표시해준다.
$ df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 391616 0 391616 0% /dev
tmpfs 419276 0 419276 0% /dev/shm
tmpfs 419276 47592 371684 12% /run
tmpfs 419276 0 419276 0% /sys/fs/cgroup
/dev/xvda2 10473452 4410856 6062596 43% /
tmpfs 83852 0 83852 0% /run/user/1000
옵션 :
-a : 모든 파일 시스템을 출력
-B : 지정한 크기(SIZE)를 블록단위로 정하여 용량을 표시
이때, '-BM'은 사이즈를 1,048,576 바이트(=1024KB = 1MB)를 단위로 출력한다. (원래 기본단위는 1024 바이트이다)
-H : 1,000 단위로 용량을 표시 (e.g: 1.1G; 원래 1KB는 1,024 Byte지만 사용자가 보기 편하도록 하기 위함)
참고) 더많은 df 옵션
- /dev/mapper/
** device mapper : 리눅스 커널에 의해 제공되는 프레임워크이다. 이것은 물리적인 블록 디바이스들을 가상블록디바이스로 매핑하는 역할을 한다. 이것은 LVM(logical volume manager), RAIDs, 그리고 디스크 암호화를 위한 기초가 된다. 그리고 파일시스템 스냅샷과 같은 추가적인 기능들도 제공한다.
참고) LVM과 RAIDs
- df 실행결과 순서대로 파일시스템, 1M-blocks, Used, Available, Used % Mount on 의 정보가 표시된다
(1) df -BM -a | grep /dev/mapper/ | awk '{sum+=$3}END{print sum}' | tr -d '\n'
printf "\"
- 사용하고 있는 디스크 용량 출력
파일 시스템이 /dev/mapper/인 줄을 가져오면 현재 사용 중인 디스크가 여러개 나타난다.
이 중 세번째 열, 즉 사용된 용량(Used)들을 총 합해서, 현재 사용하고 있는 디스크의 용량(mb 단위)을 계산한다.
(이때, print는 printf와 다르게 개행을 포함하므로, tr -d '\n' 명령어를 통해 끝의 개행을 빼준다)
(2) df -H -a | grep /dev/mapper/ | awk '{sum += $4}END{print sum}' | tr -d '\n'
- 사용가능한 디스크 용량 출력 (GB 단위)
df를 -H 옵션과 함께 실행시켜주면 1k-blocks가 size로 바뀌어있다. 그리고 MB, GB 단위로 표시되어 있다.
이때 4번째 열에 있는 Available을 보면, 현재 마운트된 파일시스템에서 사용가능한 공간이 나온다.
따라서 /dev/mapper/에 있는 사용가능한 공간을 모두 더한 뒤 출력해준다. (print로 인한 개행을 뺴기 위해 tr -d '\n' 추가)
(3) df -BM -a | grep /dev/mapper/ | awk '{sum1+=$3 ; sum2+=$4}END{printf "%d", sum1/ sum2 * 100}' | tr -d '\n'
- 사용하고 있는 용량 / 사용가능한 디스크 용량의 비율 출력
참고자료 링크
https://blog.daum.net/binsolb/11365692
Cron이란 무엇인가
1. Cron이란 무엇인가 Cron은 간단한게 말해서 unix 운영체제에서 어떤 작업을 특정 시간에 실행시키기 위한 데몬이다. 예를 들어 하루에 한차례 특정 서버에 접속해서 데이터를 받아와야 한다든지,
blog.daum.net
리눅스 크론탭(Linux Crontab) 사용법 :: JDM's Blog
* 이 포스팅은 네이버 블로그에서 작성(2013.04.01)한 내용을 옮겨온 것입니다. 오늘은 리눅스 크론탭에 대해 알아볼까 합니다. 음, 윈도우에서는 스케줄러와 비슷하다고 보면 되겠네요. "특정 시간
jdm.kr
https://hippogrammer.tistory.com/79
[리눅스 명령어] uname
uname : 시스템의 정보 확인 시스템의 정보를 확인하는 명령어이다. 시스템의 이름, 사용중인 운영체제와 버전, 호스트명, 하드웨어 정보 등을 확인할 수 있다. uname명령어 [root@hyperledger] $ uname 이
hippogrammer.tistory.com
리눅스 특수 문자 정리(Linux Shell) :: JDM's Blog
* 이 포스팅은 네이버 블로그에서 작성(2013.02.19)한 내용을 옮겨온 것입니다. 음, 다른 내용이 아니고 리눅스로 개발할 때 초기 시절 각종 명령어와 쉘스크립트 속에서 허우적거렸던 적이 있었다.
jdm.kr
Why different CPU count from nproc and nproc --all in OpenVZ container?
I'm trying nproc and nproc --all in an OpenVZ container to count the number of CPU threads assigned to the vps by upstream provider. While nproc resulting 1, nproc --all resulting 24 CPU threads. May
unix.stackexchange.com
https://www.thegeekdiary.com/proccpuinfo-file-explained/
/proc/cpuinfo file explained – The Geek Diary
www.thegeekdiary.com
https://mentha2.tistory.com/82
리눅스(Linux) 문자, 단어, 행(row) 수 출력 명령어 (wc) 사용법
리눅스(Linux)에서 문자, 단어, 줄(line) 수를 출력하는 wc 명령어 사용방법에 대해 적어봅니다. 해당 명령어 프로그램은 표준 유닉스 프로그램으로서 대부분의 리눅스 배포판에서 사용할 수 있습니
mentha2.tistory.com
https://www.lesstif.com/lpt/linux-df-93127662.html
linux df 명령어 사용법
www.lesstif.com
How to get the percentage of memory free with a Linux command?
I would like to get the available memory reported as a percentage using a Linux command line. I used the free command, but that is only giving me numbers, and there is no option for percentage.
stackoverflow.com
https://recipes4dev.tistory.com/171
리눅스 awk 명령어 사용법. (Linux awk command) - 리눅스 파일 텍스트 데이터 검사, 조작, 출력.
1. awk 명령어. 대부분의 리눅스 명령들이, 그 명령의 이름만으로 대략적인 기능이 예상되는 것과 다르게, awk 명령은 이름에 그 기능을 의미하는 단어나 약어가 포함되어 있지 않습니다. awk는 최
recipes4dev.tistory.com
https://big-sun.tistory.com/23
Linux - df 명령어 옵션 정리
df : 파일 시스템 디스크 공간 확인 $ df ## 옵션 설명 -a : 모든 파일시스템을 출력한다. $ df -a -B : 지정용량을 블럭단위로 정하여 용량을 출력한다. $ df -B 4096 --total : 총합 total 라인을 추가하여..
big-sun.tistory.com
https://zidarn87.tistory.com/137
리눅스 명령어 / tr 명령어 - 문자 변환/삭제
리눅스 명령어 / tr 명령어 - 문자 변환/삭제 tr 명령어는 지정한 문자를 변환하거나 삭제하는 명령어입니다. 특정한 문자를 다른 문자로 변환하거나 특정 문자를 제거하는데 사용되는 명령
zidarn87.tistory.com
https://unix.stackexchange.com/questions/484659/what-does-this-command-do-sed-s-g
what does this command do sed 's/~/ /g'?
I am passing a set of 6 arguments initially to a script. Script.sh a b c d e f One of the commands in the script which is managing the arguments; comm=$(echo $1 |sed 's/~/ /g')
unix.stackexchange.com
'IT > 42Seoul' 카테고리의 다른 글
[born2beroot] monitoring 파트 정리2 (0) | 2021.11.17 |
---|---|
[born2beroot] 개념 정리 - 프로젝트 개요 (0) | 2021.11.15 |
[GET_NEXT_LINE] 구현 예시 (0) | 2021.06.11 |
[GET_NEXT_LINE] 구현 준비 (0) | 2021.06.04 |
Libft 과제 시 유의점 (테스터기, protected, Makefile) (0) | 2021.05.31 |
[born2beroot] 개념 정리 - 프로젝트 개요
[원문] 더보기
Project overview
The student being evaluated should explain to you simply:
- How a virtual machine works.
- Their choice of operating system.
- The basic differences between CentOS and Debian.
- The purpose of virtual machines.
- If the evaluated student chose CentOS: what SELinux and DNF are.
- If the evaluated student chose Debian: the difference between aptitude and apt, and what APPArmor is. During the defense, a script must display information all every 10 minutes. Its operation will be checked in detail later. If the explanations are not clear, the evaluation stops here.
프로젝트 개요
피평가자는 먼저 이것들을 간단히 설명해야합니다 :
- 가상 머신은 어떻게 동작하는가.
- 어떤 운영시스템을 선택했는가
- centOS와 Debian의 간단한 차이점들 (이 둘을 비교)
- 가상머신의 목적
- 만약 피평가자가 CentOS를 선택했을 경우 : SeLinux와 DNF가 무엇인가
- 만약 피평가자가 Debian을 선택했을 경우 :
aptitude와 apt 사이의 차이점, APPArmer이란 무엇인가, 디팬스 동안에 스크립트가 10분마다 정보를 출력해야한다. (이 동작은 이따가 평가 중에 더 자세히 체크하게될 것이다)
만약 설명들이 명확하지 않다면, 평가는 여기서 중단되어야 합니다.
이번 과제는 가상화 (virtualization)의 학습 및 구현을 주제로 합니다.
1. 가상 머신은 어떻게 동작하는 가
https://nsa901.tistory.com/73 참고 - (내 포스팅)
가상머신은 하이퍼바이저에 의해 동작한다. 하이퍼바이저를 통해 하드웨어의 가상화 등을 구성할 수 있으며, 실제 물리적 HW 자원을 배정받는다.
2. 어떤 운영 시스템을 선택했는가 : Debian
3. CentOS와 Debian의 간단한 차이점들
CentOS | Debian | |
공통점 | 둘 다 리눅스 배포판 중 하나이며, 서버나 그 이외의 많은 곳에서 널리 쓰임 | |
무엇인가? | Community Enterprise Operating System. 레드헷 엔터프라이즈 리눅스에 기반함 기업에 의 한 배포판 |
1993 중순에 먼저 개발됨. 가장 신뢰성 있는 최초의 리눅스 배포판 중의 하나 자발적 개인 커뮤니티에 의한 개포판 |
출시 스캐쥴 | 7 ~ 10년 주기로 maintainence 업데이트 이루어짐 (full update는 6년 정도) | 주로 1 ~ 2년 주기로 계속 출시 |
커뮤니티와 지원 | 이용자 커뮤니티 규모가 상대적으로 작다. (기업용이기 때문) | 재택용으로 많이 쓰이기 때문에 이용자 커뮤니티 규모가 크다. |
안정성 | 아주 안정적인 버전을 출시 | CentOs에 비해 상대적으로 덜 안정적임. 그러나 보안 업데이트가 더 최신임 |
소프트웨어 패키지 | 소프트웨어 패키지 지원이 적다. (기업용 패키지 위주로 지원함) | 많은 패키지를 제공함. (6만 개에 가까운 패키지) 그리고 무료임, APT 패키지 관리자를 통한 패키지 설치 및 업그레이드의 편리함 |
사용성 | 주로 기업용이고, 커뮤니티 지원이 적다. 따라서 초보자가 배우기 어려울 수 있다 | 커뮤니티 지원이 많고, 사용자 편의성이 크다. 초보자보다는 전문가에게 더 적합하다 |
4. 가상머신의 목적
- 다른 운영체제를 사용해야하는 경우
- 독립된 작업공간이 필요한 경우 (바이러스 회피, 백업)
- 하나의 머신에서 여러 명에게 운영체제 환경을 제공 (주로 서버에서)
5. 만약 피평가자가 CentOS를 선택했을 경우 : SELinux와 DNF가 무엇인가
보안, 패키지 관리
(1) SELinux : Security-Enhanced Linux
- 리눅스의 보안을 강화해주는 보안 강화 커널
- zero-day 공격 및 buffer overflow 등 어플리케이션 취약점으로 인한 해킹을 방지해주는 핵심 구성요소
(2) DNF : RPM 기반 리눅스 배포판을 위한 패키지 관리 도구
- Yum의 낮은 성능, 많은 메모리 사용량, 비효율적인 중복 의존성 해결 매커니즘 등의 문제를 해결하기 위해 개발됨
- RPM 패키지 매니저와 여러 지원 라이브러리를 이용하여 패키지 관리 작업을 수행한다.
6. 만약 피평가자가 Debian을 선택했을 경우
: aptitude와 apt 사이의 차이점, APPArmer란 무엇인가.
보안, 패키지 관리
(1) aptitude와 apt 사이의 차이점
Apt : Advanced Packaging Tool
소프트웨어의 설치와 제거를 처리하는 패키지 관리 툴이다.
초기에는 .deb 패키지를 관리하기 위해 만들었지만 현재는 rpm 패키지 매니저와도 호환된다.
apt는 그래픽 인터페이스 없이 명령어로 사용한다.
설치할 패키지 명을 입력하면, '/etc/apt/sources.list'에 지정된 소스 목록에서 해당 패키지 + 종속성 목록과 함께 찾아 자동으로 설치한다. 그렇기 때문에 어떤 패키지를 설치할 때 종속성 문제를 걱정하지 않아도 된다.
또 굉장히 유연해서 사용자가 직접 새로운 소스 목록을 추가하거나 시스템이 업그레이드 되도 해당 패키지를 업데이트 하지 않게 해 현재 버전을 계속 사용하는 등의 작업을 할 수 있다
Aptitude
Aptitude는 사용자 인터페이스를 추가해 사용자가 대화형으로 패키지를 검색해 설치, 제거할 수 있는 high-level 패키지 관리 도구다.
데비안을 위해 만들어졌지만 rpm 기반 패키지까지 확장된다.
그리고 텍스트 기반 대화형 인터페이스와 비대화형 command line 모드에서도 작동한다.
차이점
Aptitude가 더 방대하고 apt-get, apt-cache를 포함한 기능들을 포함한다.
apt-get이 패키지 설치, 업그레이드, 시스템 업그레이드, 종속성 검사 등을 한다면, aptitude는 이보다 더 많은 일을 할 수 있다. 설치된 패키지 목록, 패키지를 자동 또는 수동으로 설치하도록 표시, 업그레이드에 사용할 수 없는 패키지 보관 등이 있다.
이 외의 차이점 :
1. 어떤 패키지를 삭제할 때, aptitude는 사용되지 않는 패키지까지 삭제한다. 반면 apt 는 사용자가 '-auto-remove', 'apt-get autoremove'를 명시해줘야 한다.
2. 이거는 찾아보면서 되게 재밌었던 점인데, aptitude는 'why', 'why-not' 명령어를 이용해 어떤 동작이 왜 안되고 되는지를 볼 수 있다.
3. apt는 설치, 제거 중 충돌이 일어날 경우 종료되지만 aptitude는 해결 방법을 제시할 수 있다.
(2) APPArmer이란 무엇인가
AppArmor ("Application Armor")는 시스템 관리자가 프로그램 프로필 별로 프로그램의 역량을 제한할 수 있게 해주는 리눅스 커널 보안 모듈이다.
프로필들은 네트워크 액세스, raw 소켓 액세스 그리고 파일의 읽기, 쓰기, 실행 같은 능력을 허용할 수 있다. AppArmor는 강제적 접근 통제(MAC)를 제공함으로써 전통적인 유닉스 임의적 접근 통제(DAC) 모델을 지원한다. 이것은 리눅스 버전 2.6.36부터 포함되었으며, 개발은 2009년부터 캐노니컬 사에 의해 지원된다.
참고자료 링크
https://1gbits.com/blog/debian-vs-centos/
Debian vs CentOS: Differences You Should Know [Comparison]
Checkout these differences between Debian vs CentOS, that will help you to select the best one for further operations
1gbits.com
https://velog.io/@joonpark/aptitude-vs-apt
aptitude vs apt
Apt : Advanced Packaging Tool소프트웨어의 설치와 제거를 처리하는 패키지 관리 툴이다. 초기에는 .deb 패키지를 관리하기 위해 만들었지만 현재는 rpm 패키지 매니저와도 호환된다.apt는 그래픽 인터페
velog.io
https://ko.wikipedia.org/wiki/AppArmor
AppArmor - 위키백과, 우리 모두의 백과사전
AppArmor ("Application Armor")는 시스템 관리자가 프로그램 프로필 별로 프로그램의 역량을 제한할 수 있게 해주는 리눅스 커널 보안 모듈이다. 프로필들은 네트워크 액세스, raw 소켓 액세스 그리고 파
ko.wikipedia.org
https://www.educba.com/centos-vs-debian/
CentOS vs Debian - 12 Most Amazing Differences To Learn
In this article CentOS vs Debian, we will look at their Meaning, Head To Head Comparison,Key differences in a simple and easy ways.
www.educba.com
https://www.openlogic.com/blog/centos-vs-debian
CentOS vs. Debian: Key Similarities and Differences | OpenLogic by Perforce
In this blog, we compare CentOS vs. Debian, including the differences in architecture, package management, support, and more.
www.openlogic.com
https://www.youtube.com/watch?v=WlR0E1mEWg8
'IT > 42Seoul' 카테고리의 다른 글
[born2beroot] monitoring 파트 정리2 (0) | 2021.11.17 |
---|---|
[born2beroot] monitoring 파트 정리1 (0) | 2021.11.17 |
[GET_NEXT_LINE] 구현 예시 (0) | 2021.06.11 |
[GET_NEXT_LINE] 구현 준비 (0) | 2021.06.04 |
Libft 과제 시 유의점 (테스터기, protected, Makefile) (0) | 2021.05.31 |
[번역] 가상화(virtualization)란 무엇일까요?
가상화를 처음 접해본다면, 개념이 생소해서 이해하기 어려울 수 있습니다.
그래서 쉽고 재밌게 설명하는 외국 유튜버분의 영상 내용을 정리해보았습니다. 도움이 되기를 바랍니다.
영상 앞부분의 가상화와 하이퍼바이저에 대한 내용 위주로 정리했습니다.
버츄얼박스를 설치하고 가상머신을 만드는 과정은 적어놓지 않았으니 원본 영상을 참고하세요.
you need to learn Virtual Machines RIGHT NOW!! (Kali Linux VM, Ubuntu, Windows)
https://www.youtube.com/watch?v=wX75Z-4MEoM&t=451s
가상화란 무엇일까요?
가상화가 대체 뭐야?
'가상화'라는 단어는 말그대로, 현실에 있지 않은 것을 현실에 있는 것처럼 모방한다 혹은 모사한다, 라는 의미를 가집니다. '가상현실'을 생각하면 좀 더 이해가 쉽습니다.
이때, 컴퓨터에도 가상화라는 개념을 적용할 수 있습니다.
하드웨어를 모방해서 마치 진짜 또다른 하드웨어가 존재하는 것처럼 만드는 것입니다.
여기까지 봐도 아직은 '이게 무슨 얘기냐' 싶습니다. 그렇죠?
당신의 컴퓨터에 벌어지는 마법같은 일
그럼 좀 더 이해하기 쉽게끔, 실생활 얘기를 해봅시다. 우리 모두 컴퓨터를 가지고 있죠. 컴퓨터를 까보면 cpu, gpu, 메모리, 네트워크 카드 등등을 볼 수 있습니다. 하드웨어 뿐이에요. 그래서 우리는 '운영체제'를 설치하기 전까지는 컴퓨터를 사용할 수 없습니다. 운영체제(OS)는 우리로 하여금 하드웨어 자원들을 사용하여 여러 작업을 할 수 있도록 해줍니다.
이때 예시를 한번 들어볼까요. 당신이 원래 윈도우 운영체제를 사용해왔다고 칩시다. 그런데 어느날 갑자기 당신이 리눅스를 너무 배우고 싶어집니다. 해킹이든 뭐든 리눅스로 하고싶은 작업이 생겨서요.
그럼 이런 생각을 하게 될거에요.
'어 근데 이거 다른 운영체제니까 하드웨어도 다른거가 필요한거 아니야? 그럼 컴퓨터를 하나 새로 사야겠네. 거기다가 리눅스를 깔면 되겠다'
그런데 굳이 이럴 필요가 없어요! 가상 머신(VM)이 있다면요. 아주 마법같은 일들이 벌어집니다.
또 다른 컴퓨터를, 당신 컴퓨터 안에 넣어버리는 거에요. 뭐? 말도 안되죠? 그렇지만 충분히 가능합니다. 그러면 이 일들은 어떻게 가능한 걸까요?
"가상화", "가상머신"을 통해서 그런 일들을 할 수 있어요. 짱이죠. 그럼 그건 또 어떻게 하는걸까요?
바로, "하이퍼바이저"를 사용하면 됩니다.
좀 어려운 단어같죠? 그냥 어떤 응용프로그램의 이름이라고 생각하면 이해하기 쉬워요. 흔한 프로그램마냥 본인 운영체제에 설치해서 사용하면 되는 겁니다. VirtualBox 프로그램과 같은 것들이 바로 하이퍼바이저입니다.
하이퍼바이저가 하는 일은 그냥 이거에요. 당신 컴퓨터 안에 또다른 컴퓨터를 만들어주는 거죠. 여러 개도 가능해요
그럼 윈도우 내에 맥을 깔수도 있고 맥 안에 리눅스나 윈도우를 깔 수 도 있고... 가능성이 무궁무진합니다.
하이퍼바이저의 역할, 유형
먼저, 하이퍼바이저는 당신 컴퓨터 안에 가상의 컴퓨터를 하나 만듭니다. 그 가짜 컴퓨터는 자기가 진짜 컴퓨터인줄 알고 동작하는 거에요. 사실은 그렇지 않은데도요. 매트릭스 영화에서 마냥 매트릭스 안에 있는 것처럼 속고 있는거죠.
또 그 가짜 컴퓨터에는 가상의 하드웨어 요소들이 만들어져요. 사실 OS에서 진짜 하드웨어 자원을 빌려오는 거에 불과하지만요.
그래서 내부에 있는 가짜 컴퓨터 OS를 'Guest OS' 그리고 내 원래 컴퓨터 OS를 'Host OS'라고 합니다. 당신 집에서 손님(guest)이 당신(host, 집주인) 물건을 사용하도록 하듯이, 저 guest OS는 host OS의 허락을 맡고 그 자원을 사용하는거에요.
(물론 여기선 그 손님(게스트)이 그 집을 지집인 줄 착각한다는 점이 좀 웃기긴 해요)
여기까진 원래 OS가 있는 컴퓨터 내부에 또다른 컴퓨터를 설치하는 경우를 봤어요. 이걸 type2 하이퍼바이저라고 합시다.
그렇다면 type1 하이퍼바이저는 뭘까요? 이런 건 기업이나 회사에서 주로 볼 수 있습니다.
이건 기존에 있는 OS 위에 까는게 아니에요. 이땐 OS가 없는 컴퓨터에서, 하드웨어 바로 위에 하이퍼바이저를 설치합니다. (이때는 VirtualBox가 아닌 VMware ESXi등의 하이퍼바이저를 사용합니다)
하이퍼바이저는 어디에나 설치가능하지만, 이런 1형 하이퍼바이저는 주로 서버 쪽에서 사용합니다.
어떤 유형의 하이퍼바이저던 간에 하는 일은 동일해요. "가상화"를 이용해서 "가상머신"을 만든다는 거죠.
둘의 차이점이라 하면, 2형 하이퍼바이저에서는 기존 OS에 하드웨어 자원 공유를 요청한다는 점이에요. 반면에 1형 하이퍼바이저에서는 OS가 없다보니 그냥 OS의 허락없이도 자기맘대로 모든 자원을 사용할 수 있죠.
하이퍼바이저를 사용하는 이유
그럼 사람들은 왜 하이퍼바이저를 사용할까요? (= 가상 머신을 사용하는 이유)
주관적인 이유를 3가지 얘기해볼게요.
1. 해킹을 배우고 싶다!
가상 컴퓨터 환경을 만들어서 해킹을 하는게 가장 안전하고 좋은 방법이에요.
vm을 만들고 vpn을 연결하는게 이미 해킹 학습에서 권장되고 있습니다.
2. 다른 OS에 대해 배우고 싶다!
3. 아무거나 막 부수고 싶다!
가상 머신을 만들어서, 그 안에서 설정을 막 바꾸고 부수고 그래도 상관 없어요. 그냥 나중에 삭제하고 새로 만들어도 되니까요. 원래 OS(host OS)에 절대 영향을 주지 않아요. 즉, 이것저것 실험적인걸 해보기 딱이라는 거죠.
'IT > 튜토리얼 및 가이드' 카테고리의 다른 글
[입문자 튜토리얼] - C언어 소스 코드 파일 분리 2편 (feat. 헤더파일) (0) | 2021.12.19 |
---|---|
[입문자 튜토리얼] - C언어 소스 코드 파일 분리 1편 (feat. 코드를 깔끔하게) (0) | 2021.12.19 |
[Github] 깃허브 왕초보 사용법 - 기본편3 (0) | 2021.12.19 |
[Github] 깃허브 왕초보 사용법 - 기본편2 (0) | 2021.12.19 |
[Github] 깃허브 왕초보 사용법 - 기본편1 (1) | 2021.12.19 |