수업 64일차

galoo·2023년 10월 4일
0

HelloVision Dx Data School

목록 보기
58/72

✔ 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) 명령은 다른 시스템과 파일을 주고 받거나 백업을 하기 위해 여러 파일이나 디렉토리를 하나의 아카이브 파일로 생서하거나 추출하는 명령

형식

  • tar 기능 옵션 아카이브파일 파일이름

기능

  • c : 새로운 압축 파일 생성
  • t : 내용을 출력
  • x : 원본 파일을 추출
  • r : 새로운 파일을 추가
  • u : 수정된 파일을 업데이트

옵션

  • f : 아카이브 파일이나 테이프 장치를 지정하는데 파일명으로 -로 지정하면 tar대신 표준 입력에서 읽어들임
  • v : 처리하고 있는 파일의 정보를 출력
  • h : 심볼릭 링크의 원본 파일을 포함
  • p : 파일 복구 시 원래의 접근 권한을 유지
  • j : bzip2로 압축하거나 해제
  • z : gzip으로 압축하거나 해제
  • 가끔 tar 파일 압축 해제 안되는 경우 \rarr 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 도 해줘야 할 것이다.

실습

  • one.c 파일을 작성
    - vim one.c
    - i 누르고 작성
    #include <stdio.h>
    extern int two()
    int main(){
    	printf("go to module two\n");
        two();
        print("end of module one\n");
    }
    - 작성하고 esc, :wq! 입력해서 저장
  • two.c 파일도 생성해보자. vim two.c
#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 생성

  • 패키지 이름 : mariadb-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 : 자원의 사용량을 제어
profile
밀가루 귀여워요

0개의 댓글