✔ Process Management
systemd service
개요
- 리눅스의 시스템고 ㅏ서비스 관리자
- 이전의 Unix의 init 하던 역할을 수행
- 다양한 서비스 데몬을 실행하고 프로세스들의 상태를 유지하며 시스템의 상태를 관리
systemd unit
- systemd는 전체 시스템을 시작하고 관리하는 역할을 수행하고 유닛이라 부르는 구성 요소를 사용
- 관리 대상의 이름을
서비스이름.유닛종류
의 형태로 관리
종류
- service
- 시스템 서비스 유닛으로, 데몬을 시작하고 종료하고 재시작하고 로드
- target
- 유닛을 그룹핑
- automount
- 디렉토리 계층 구조에서 자동 마운트 포인트를 관리
- device
- 리눅스 장치 트리에 있는 장치를 관리
- mount
- 디렉토리 계층 구조에서 마운트 포인트를 관리
- path
- 파일 시스템의 파일이나 디렉토리 등 경로를 관리
- scope
- 외부에서 생성된 프로세스를 관리
- slice
- 시스템의 프로세스를 계층적으로 관리
- socket
- 소켓을 관리하는 유닛으로 AF_INET, AF_INET6, AF_UNIX Socket Stream(tcp), Datagram(udp), FIFO 지원
- swap
- 스왑 장치 관리
- timer
- 타이머와 관련된 기능을 관리
명령(systemd X -> systemctl)
- 형식 :
system ctl [옵션] [명령] [유닛이름]
- 옵션
- -a : all(a는 대부분 all임), 상태와 관계없이 유닛 전체 출력
- -t 유닛종류 : 지정한 유닛만 출력
- 명령
- start
- stop
- reload
- restart
- status
- enable
- disable
- is-active
- is-enabled
- isolate
- kill
실습
- 현재 동작 중인 유닛 출력 : systemctl
- cron 이라는 서비스 시작 : sudo systemctl start cron
- cron이 동작중인가? : systemctl is-active cron
- 유닛을 중지해보자 : systemctl stop cron
cgroup
- 자원 사용(cpu, memory, I/O 등)을 프로세스 그룹 단위로 제어할 수 있는 리눅스 커널 기능
cgroup 사용
- cgroup이라는 가상의 파일 시스템을 수동으로 마운트해서 사용하는 것이 가능
- libcgroup이라는 툴을 사용해서 그룹을 생성하고 사용
- 요즘에는 Docker, LXC 가상화, Libvert등의 소프트웨어를 이용
✔ 소프트웨어 관리
우분투 관리
개요
- 리눅스에서 소프트웨어는 소스 코드 형식 또는 바로 설치하여 사용할 수 있는 패키지 형태로 배포
- 바이너리 패키지로 배포하는 경우, 리눅스에서 주로 사용하는 패키지는 RPM과 deb 두 가지 형식인데, 우분투는 대부분 deb 형태로 배포하며, 레드햇 계열(redhat, feodra, coent os - rocky)은 RPM을 주로 사용
- 최근의 우분투는 deb대신에 스냅을 주로 이용
특징
- 바이너리 파일(실행 가능한 파일)로 되어 있어서 컴파일할 필요가 ㅇ벗음
- 패키지 파일이 관련 디렉토리에 바로 설치됨
- 패키지를 삭제할 때, 관련된 파일을 일괄 삭제할 수 있음
- 기존에 설치한 패키지를 삭제하지 않고 업그레이드 가능
- 설치 상태 검증 가능
- 의존성 있는 패키지도 자동 설치 : apt-get
- 이름
- 패키지명_버전_데비안리비전_우분투리비전_아키텍쳐.deb
- 아키텍쳐가 포함되는 경우가 있음 - Mac M1 프로세서
우분투 패키지 관리
- 이 명령을 알아야 하는 경우는 리눅스 시스템을 직접 핸들링하는 경우
- 리눅스를 직접 설치하거나 IaaS를 이용하는 경우
apt-cache
- APT 캐시에 질의하여 여러 가지 정보를 검색
- 형식
- apt-cache [옵션] 서브명령
- 옵션
- -f : 검색 결과로 패키지에 대한 전체 기록을 출력
- -h : 간단한 도움말을 출력
- 서브 명령
- stats : 통계 정보
- dump : 현재 설치된 패키지를 업그레이드
- search 키워드 : 캐시에서 키워드를 검색
- showpkg 패키지이름 : 패키지에 대한 의존성 정보와 역의존성 정보를 검색해서 출력
- show 패키지이름 : 패키지에 대한 정보를 간단하게 출력
- pkgnames : 사용 가능한 모든 패키지 이름을 출력
의존성?
- 작업을 수행하기 위해 필요한 다른 객체나 패키지
실습
- 캐시 정보 확인 :
apt-cache stats
- apt-get
- 형식 :
apt-get [옵션] 서브명령
- 옵션
- -d : 패키지를 내려받기만 수행
- -f : 의존성이 깨지는 패키지를 수정하려고 시도
- -h : 도움말 출력
- 서브 명령
- update : 패키지 저장소에서 새로운 패키지 정보를 가져옴(ubuntu에서는 패키지 설치할 때, 필수 항목)
- upgrade : 현재 설치된 패키지를 업그레이드(종종 의존성에 의한 실행 필요)
- install 패키지이름 : 패키지 설치 명령, -y 옵션주면 무조건 설치하는데, Docker 이미지 만들 때, 우분투에서 새로운 패키지 설치해야 할 때 필수
- remove 패키지이름
- download 패키지이름
- autoclean : 불완전하게 받았거나 오래된 패키지를 삭제
- clean : 캐싱된 모든 패키지를 삭제해서 디스크 공간을 늘림
- check : 의존성이 깨진 패키지를 확인
apt-get update
- /etc/apt/source.list
에 명시한 저장소로부터 패키지 정보를 읽어서 동기화를 수행
- 관리자 명령으로 수행
apt-get upgrade
- upgrade 앞에 -y를 붙이면 대화형으로 동작하는 것을 자동 수행 하도록 변경 가능
- 관리자 명령으로 수행
apt-get install 패키지이름
- 패키지를 설치할 때 사용하는 명령
- xterm 패키지를 설치하자 : sudo apt-get -y install xterm
- 대화형으로 동작하기에 Dockerfile 작성시에는 -y를 붙이자
apt-get remove 패키지이름
- 패키지에 대한 설정 파일은 남겨두고 apt-get purge 패키지이름
으로 수행하는 경우는 설정파일도 제거함
apt-get autoremove
- 자동 정리
apt-get clean
- 디스크 공간 정리
apt-get download 패키지
- 패키지만 다운로드
apt-get download-only source 패키지이름
- 소스 관련 명령
- 패키지 이름 가지고 소스를 다운로드 받음(다운로드 만)
apt-get source 패키지이름
- 소스 관련 명령
- 패키지 이름 가지고 소스를 다운받고 압축을 해제함
apt-get --compile source 패키지이름
- 소스 관련 명령
- 패캐지 이름을 가지고 소스 다운 뒤, 압축하고 컴파일 진행
압축
개요
- tar(tape archive) 명령은 다른 시스템과 파일을 주고 받거나 백업을 하기 위해 여러 파일이나 디렉토리를 하나의 아카이브 파일로 생서하거나 추출하는 명령
형식
기능
- c : 새로운 압축 파일 생성
- t : 내용을 출력
- x : 원본 파일을 추출
- r : 새로운 파일을 추가
- u : 수정된 파일을 업데이트
옵션
- f : 아카이브 파일이나 테이프 장치를 지정하는데 파일명으로 -로 지정하면 tar대신 표준 입력에서 읽어들임
- v : 처리하고 있는 파일의 정보를 출력
- h : 심볼릭 링크의 원본 파일을 포함
- p : 파일 복구 시 원래의 접근 권한을 유지
- j : bzip2로 압축하거나 해제
- z : gzip으로 압축하거나 해제
- 가끔 tar 파일 압축 해제 안되는 경우 → gzip으로 되어있는 경우가 있어서 저걸로 해결
자주 사용되는 옵션
- 아카이브 생성 : cvf
- 아카이브 내용 확인 : tvf
- 아카이브 업데이트 : uvf
- 아카이브 압축 해제 : xvf(多)
- 파일 추가 : rvf
vim을 설치해볼까?
sudo apt-get install -y vim
✔ Programming
git 설치
sudo apt-get install -y git
c programming
- gcc 컴파일러를 이용해서 compile 및 build
- gcc 컴파일러 설치 여부 확인 :
gcc
- 설치 :
sudo apt-get install gcc
- 작업 과정
- 소스코드 작성
- 소스 코드 컴파일(Compile) : 컴파일러가 문법에 맞게 작성되었는지 확인
- 빌드(Build) : 운영체제에서 실행 가능한 파일을 만드는 과정
- 실행(run)
- 컴파일 및 빌드 명령 :
gcc -o 바이너리파일경로 소스파일경로
- vim 소스코드파일명을 입력
vim hello.c
- i를 눌러 편집모드를 만든 뒤 작성
#include <stdio.h>
int main(){
printf("hello world!")
return 0;
}
- 다 작성하면 esc 눌러서 명령 모드로 만들고 :wq! 입력해서 저장하고 종료
컴파일 및 빌드 : gcc -o hello hello.c
- 리눅스는 shell에서 작업하기에 직접 명령어 입력 안되고, 경로를 다 입력해줘야 한다.
실행 : ./hello
- windows의 command line과는 다르다.
make
- 설정된 정보를 읽어서 여러 소스 파일을 컴파일하고 링크를 만들어서 최종 실행 파일을 만드는 명령
- 소스로 배포되는 많은 오픈 소스 프로젝트는 소스 코드와 함께 makefile이 같이 배포가 됩니다.
- 이 파일을 이용해서 실행 파일을 만듭니다.
sudo apt-get install make
도 해줘야 할 것이다.
실습
#include <stdio.h>
int two(){
printf("in module two\n");
printf("make file practice\n");
print("end of module two\n");
}
- 현재 디렉토리에 Makefile을 생성
vim makefile
TARGET=one OBJECTS=one.o tow.o ${TARGET} : ${OBJECTS} gcc -o ${TARGET} ${OBJECTS}
- 실행 파일명을 TARGET이라는 변수에 저장
- 목적 파일명을 OBJECTS라는 변수에 저장
- OBJECTS 파일을 가지고 TARGET이라는 실행 파일을 실행
one.o : one.c
gcc -c one.c
two.o : two.c
gcc -c two.c
- make 명령 수행
- 프로그램 실행 :
./one
java 설치와 프로그래밍
- java는 여러 jvm 기반의 언어를 사용할 떄와 빅데이터 에코 시스템을 사용할 때 필수
- python이나 r을 할 때, 자연어 처리 등을 하고자 하는 경우에 필요하다
- java 설치 확인
- java 실행 환경 확인(JRE, JVM(JRE의 구성요소임)) : java -version
- java 개발 환경 확인(JDK) : javac -version
- 패키지 : openjdk-8-jdk
- sudo apt-get install openjdk-8-jdk
- java 코드 작성 및 실행
- 자바는 파일명이 클래스 이름과 같아야 합니다.
- 하나의 파일에 여러 개의 클래스가 있다면 public 클래스의 이름과 같아야 합니다.
- public 클래스가 없다면, main 메서드를 가지 ㄴ클래스 이르믕 ㄹ사용하고 main 메서드를 가진 클래스가 없다면, 아무 클래스 이름이나 상관없다.
- 컴파일 : javac 소스파일명
- 실행 : java 클래스이름
- 이전과 동일하게 vim HelloJava 해서 코드 작성
- i 누르고 편집 실행
public class HelloJava{
public static void main(string [] args){
system.out.println("hello Java!");
}
}
- esc 하고 :wq!
- 이후
javac HelloJava.java
java HelloJava
파이썬 설치 및 프로그래밍
파이썬 설치
python3 로 확인
- 명령을 수행하면 설치가 되어 있는 경우 python 인터프리터가 동작
- 파이썬 업그레이드 :
sudo apt-get upgrade python3
- 실행할 때
python3 파일명
shell programming
- linux 명령어나 코드를 텍스트 파일 형태로 만들어서 바로 실행하도록 하는 프로그래밍
- 일반적으로 확장자는 sh
- 스크립트 파일을 실행할 때는
sh 파일경로
또는 파일경로를 이용해서 실행
vim name.sh
를 실행해서 name.sh를 작성
#! 는 shebang이라고 하는데 주석이 아니고 bash를 사용하겠다는 의미
#!/bin/sh
echo "사용자이름 : "$USER
echo "홈 디렉 :" $HOME
exit 0
- 실행은
sh name.sh
또는 chmode +x name.sh
하고 ./name.sh
로 실행
shell programming?
- operator의 영역
- 여러 번 수행하는 작업을 하나의 파일로 만들고 실행
- 별도의 컴파일러 없이 shell이 번역해서 수행
- 운영체제 작업 자동화
✔ Server
종류
- File Server : 파일을 제공하는 서버
- FTP가 대표적인 File Server Service의 종류
- Data Server
- 데이터베이스를 설치하고 외부에서 접속해서 데이터를 사용할 수 있도록 해주는 서버
- Remote Server
- 외부에서 접속해서 사용할 수 있도록 해주는 서버
- Telnet, SSH를 많이 사용
- Application Server
- 외부에서 요청을 전송하면, 처리하고 결과를 넘겨주는 서버
- Web Server
- URL로 접속해서 요청을 전송하면 처리하고 결과를 넘겨주는 서버
- Web Application Server(WAS)
- 요청을 URL 형태로 하고, 결과를 HTML이나 JSON 형태로 전송하는 서버
- API Server
- 요청을 받아서 처리하고 데이터를 전송해주는 서버
- 실제로 어떤 출력물을 만들어주는 것이 아니고, 응답을 받은 쪽에서 재가공 해서 사용할 수 있는 데이터를 제공하는 서버
- Proxy Server
- 내부의 요청을 받아서 외부에 접속해서 결과를 가져온 뒤, 내부에 다시 전달해주는 서버
- 보안때문에 주로 작성
Client $\rarr$ URL 형태의 요청 $\rarr$ Web Server(nginx, tomcat, apache server 등) $\rarr$ Application Server(Java, Pythoh, JS 등..) $\rarr$ API Server(Java, Pythoh, JS 등..) $\rarr$ Data Server(RDBMS, NoSQL, InMemoryDB..) $\rarr$ API Server $\rarr$ API Server $\rarr$ Application Server $\rarr$ Web Server(React, json, xml, jsp 등..) $\rarr$ Client
- 파일을 업로드하고 다운로드 할 때는 Application Server에서 File Server쪽으로 요청을 전송해서 다운로드 하거나 업로드
- 우리나라 대기업이 금융 기관에서 많이 구현하는 proxy server는 외부에 요청을 할 때, 직접 나가지 않고 Proxy Server에게 요청하도록해서 Proxy Server가 외부에 요청해서 응답을 받은 뒤, 결과를 전송하도록 해주는 서버
- Remote Server는 외부에서 내부의 컴퓨터를 관리하기 위한 목적으로 사용
- public cloud에 애플리케이션을 배포하고 관리를 할 떄는 Remote Server를 이용하는 것
- Public cloud를 공부할 때, 가장 먼저 생각하는 것 중의 하나가 원격 접속이 가능하도록 만드는 것
open ssh server 설치 및 접속
-
기존의 telnet은 데이터를 암호화해서 전송하지 않기 때문에, 보안상 위험이 존재해서 데이터를 암호화해서 전송하는 ssh를 주로 사용
-
설치
- sudo apt-get update
, sudo apt-get install openssh-server
-
방화벽에서 포트 개방 - 기본은 22
- sudo ufw allow ssh
-
자신의 IP 확인
- hostname -I
-
외부에서는 hostname 명령으로 나오느 IP의 22번 포트로 접속이 가능
-
virtual box는 NAT 설정을 해주어야 한다.
- 포트포워딩 확인
Maria DB Server 생성
실습
- 패키지 설치
- sudo apt-get update
- sudo apt-get install mariadb-server
- 마리아 데이터베이스는 서비스를 활성화 해주어야 합니다.
- systemclt status mariadb.service
- 마리아 데이터베이스에 루트 권한으로 접속
- sudo mysql
- 이후
show databases
와 같이 그냥 바로 작업 가능함
Web Server
- web server를 만들어주는 패키지는 nginx와 apache가 존재
- 예전에는 apache가 많이 사용되었는데, 최근에는 nginx도 많이 사용됨
apache 웹 서버 생성 및 접속
- 설치
- apache2
- 서비스 실행
- apache2
- 서비스 실행 확인
- 브라우저에서 확인 http://IP주소
- 리눅스 명령어 확인 : curl http//IP주소
- 웹 서버의 기본 디렉 :
/var/www/html
- main 페이지 변경해보자.
- 기본 디렉으로 이동 : cd /var/www/html
- 기존 시작 페이지를 삭제 : sudo rm index.html
- 새로운 시작 페이지를 설정 : `sudo ..
- 하나의 명령어를 작성할 떄는 crontab -e를 수행하고, 적절한 EDITOR
- 40 * * * * /usr/bin/date > ~sonic/cron.out
✔ Docker
컨테이너와 가상화
가상화
- Virtual Machine이라고 부르는 하드웨어 가상화를 이용해서 프로세스를 격리
- Virtual Box나 VMWare 같은 가상화 기술은 가상의 물리 서버를 만드는 것으로 애플리케이션을 독립된 가상머신 이미지에 배치함으로써 완벽하게 격리된 환경에서 실행
- 물리적인 대상을 소프트웨어로 대체한 개념으로 운영체제도 아무것이나 설치할 수 있고 그 위에 어떤 소프트웨어를 설치해도 상관 없음
물리적인 컴퓨터(서버) > HOST OS > Hypervisor >
GuestOS > 바이너리 /라이브러리 > 앱
GuestOS > 바이너리 /라이브러리 > 앱
GuestOS > 바이너리 /라이브러리 > 앱
- 각 앱은 분리된 GuestOS 이미지에서 실행
- 이미지 실행은 Hypervisor가 수행
- Vagrant가 대표적이 ㄴ도구로, 개발 및 테스트 환경에 적합하다.
- 단점 : 낮은 성능, 높은 자원 소비, 파일 크기가 큼
- 전가상화라고 부르던 방식임
반 가상화
- 하드웨어를 완전히 가상화하지 않는 방식
- 하드웨어가 하이퍼바이저에게 직접 명령을 전달하는 방식
물리적인 컴퓨터(서버) > Hypervisor > GuestOS > 바이너리 /라이브러리 > 앱
GuestOS > 바이너리 /라이브러리 > 앱
GuestOS > 바이너리 /라이브러리 > 앱
- GuestOS의 커널을 수정해야 하기 때문에, Open Source가 OS가 아니면 사용하기 어려움
- Xen이 대표적인 방식
컨테이터 가상화
- HOST OS위에 컨테이너 관리 소프트웨어를 설치해서 논리적으로 컨테이너를 나누어 사용하는 방식
물리적인 컴퓨터(서버) > HOST OS > 컨테이너 관리 소프트웨어 >
미들웨어 > 애플리케이션
미들웨어 > 애플리케이션
- 장점 : 오버헤드가 적어서 가볍고 속도가 빠르다.
- 단점 : 다양한 OS를 사용할 수 없고, 보안적으로 완전한 격리가 아님
- 컨테이너 관리 소프트웨어로 가장 많이 사용되던 것이 Docker 이다.
- HOST OS의 프로세스 수준에서 격리
- 각 컨테이너는 별도의 라이브러리를 가지기 때문에, 다른 컨테이너의 업데이트가 영향을 미치지 않는다.
Docker
개요
- Container 형 가상화 기술을 구현하기 위한 상주 애플리케이션과 이 애플리케이션을 조작하기 위한 명령형 도구로 구성되는 애플리케이션
- 프로그램과 데이터를 다른 프로그램과 데이터와 격리시키는 기능을 제공하는 애플리케이션
- 이를 컨테이너 가상화라고 한다.
- 이 컨테이너 다루는 기능을 제공하는 소프트웨어가 Docker이다.
특징
- Microservice 전환 및 DevOps, Testing 등 다양한 분야에서 활용
- 리눅스 컨테이너 구현체의 사실 상의 표준(de-facto)
docker는 linux를 사용
- Docker는 리눅스 기반에서만 사용 가능
- windows나 mac os에서도 docker를 구동시킬 수 있지만, 이 경우 내부적으로 리눅스가 사용되며, 컨테이너에서 동작시킬 프로그램도 리눅스용 프로그램
- windows에서 사용할 떄는 리눅스 커널을 설치해야 합니다.
- 사용하는 리눅스의 기술
- chroot : 특정 디렉을 최상위 디렉 root로 인식하게끔 설정하는 리눅스 명령
- namespace : 프로세스 자원을 관리하는 기능
- cgroup : 자원의 사용량을 제어