##### 가상화


가상화 != 에뮬레이션




1. Application 가상화

~ JVM


2. H/W 가상화

~ Hypervisor


3. Desktop 가상화

~ VNC, X-Window, Remote Desktop, Virtua Box, VMware, ...


4. Network 가상화

~ VPN, VLAN, SDN, ...


- 가상 NIC, 고유한 MAC addres 제공(IEEE에 등록된 실제 MAC) 

- 가상 스위치와 Auto Negotiation으로 연결

- 가상 Switch(MAC기반의 L2 스위치)

- Port Group (가상머신용, 서비스콜용, VMKernel용)


5. Server 가상화

~ 하드웨어 에뮬레이션, 전가상화/반가상화/OS자체 가상화



- Full-Virtualization : Guest OS는 하이퍼바이저의 존재를 알지 못함. Binary Transration기법으로 가상화

- Para-Virtualization : 하이퍼바이저에서 인식이 가능한 시스템콜(hyper-call)을 사용해 가상화

but, Windows에서는 커널 내부에 hypercall을 처리하지 않으므로 Guest OS커널을 수정해야 할 필요가 있음

=> Intel-VT, AMD-V 등 하드웨어 지원기술이 생김

but, H/W바로위에서 작동이 안되는 문제가 있음

=> VMI (Virtual Machine Interface) 등장


< 메모리 가상화 >

- PTE, Page Table Entry

- MMU (Memory Management Unit)

- TLB(Translation Looaside Buffer)


=> VMware의 VMKernel은 이 세가지를 Shadow Page Table로 관리한다. 

이 기능이 추후 memory overcommit기술로 발전한다.


a. TPS (Transparent Page Sharing)

: VM들이 사용하는 파일 중 공유 가능한 것들(겹치는 것들)을 공유할 수 있도록 하는 기술

작동중인 VM 몇개를 뽑아서 게스트 물리메모리 기반으로 Hashing을 수행함.

이를 Host의 물리메모리와 비교하여 같은 경우에 매핑주소를 수정하여 공유하도록 함


b. Memory Ballooning

- VMware Tool 중에 vmmenctl(메모리 컨트롤러 드라이버)

VMKernel과 private 채널로 메모리 상황을 공유

-  Host의 물리 메모리 부족 시, VM 들에게 있는 각 vmmenctl 드라이버에게 메모리 팽창을 요구

- VM들은 영문은 모르지만 일체 swapping을 수행하여 물리메모리를 확보


c. 하이퍼바이저 스와핑

: 가상머신 생성시, 메모리와 동일한 크기의 스왑파일을 생성하여 물리메모리 부족시 스와핑 수행


6. 스토리지 가상화

 ~ VMFS, VMDK, 논리적인 스토리지 pool 사용





##### QEMU


- 고속의 동적바이너리 변환기법(Dynamic Binary Translation)을ㅠ 사용

- x86이 아닌 하드웨어에서 x86기반의 리눅스를 실행하려는 목적으로 개발

- x86, power PC, SPARC, ARM 등의 프로세서를 지원


* note) Binary Translation ?

하나의 명령어 세트를 다른 명령어 세트로 변환해주는 처리

- Static Binary Translation : 모든 실행파일의 코드를 대상 아키텍처에서 한번에 변환

- Dynamic Binary Translation : 기본 실행 블럭의 단위만큼만 읽어서 변환


- GNU GPL, LGPL, BSD or GNU GPL v2, ...

- Hosted 방식의 가상화를 지원 : 전체시스템 에뮬레이션 / 사용자 모드 에뮬레이션


<기능>

a. 에뮬레이터 기능 : 물리적인 H/W 아키텍쳐 번환 없이 OS나 Program을 다른 H/W에서 돌아가도록 중계 역할을 수행

=> 소프트웨어적인 변환작업이 필요하므로 무조건 한번은 성능저하(최악)

b. 하이퍼바이저 기능 : KQEMU(or QUM86)을 통해 게스트 OS의 코드를 Host System의 CPU에서 직접 실행

=> 높은 성능

커널 코드는 동적 바이너라 변환을 통해 실행시키고, 사용자 코드는 네이티브 모드에서 실행하는 가속 모드를 지원

c. Xen이나 KVM 가상화 서포트 수행(변형된 형태의 QEMU가 지원함)


<구성요소>

- CPU 에뮬레이터

- 디바이스 에뮬레이터

- 일반 디바이스 처리기

- 머신 기술자

- 사용자 인터페이스




### KQEMU

: Guest/Host OS 아키텍처가 동일한 경우, 

x86기반의 게스트 OS에 대해 하드웨어 지원을 받아 유저모드와 일부 커널모드를 호스트 머신의 CPU에서 직접 실행

=> I/O등은 Host에서 적용되어 게스트OS의 성능을 향상



### QEUM KVM

: KVM에 최적화되어 qemu-kvm이라는 변형된 버전이 실행되며 x86 시스템에 대한 에뮬레이터 역할을 수행



### QEMU & Xen

: qemu-dm이라는 변형된 버전이 실행되며 XEN-HUM에서 디바이스 에뮬레이션과 일반 디바이스 간의 통신을 담당하여 I/O요청을 처리




### 네트워크 모드

: 에뮬레이션 된 NIC를 통해 VLAN을 생성할 수 있음(사용자 네트워킹, Tap 네트워킹, 소켓 네트워킹, VDC 네트워킹)


1. 사용자 네트워킹

: 기본적으로 생성되는 네트워크


- Host/Bridge 방식으로 가상의 인텔 E1000 PCI NIC 한개를 에뮬레이션

- 성능 낮음, ICMP 지원안됨, 외부에서 게스트로 직접접근 할 수 없음(포트포워딩이 필요함)


2. Tap 네트워킹

- 호스트 OS에서 먼저 생성한 뒤 게스트 OS에서 사용해야 함

- 성능 높음, root권한으로 QEMU를 실행해야 함


3. 소켓 네트워킹

- TCP/UDP 소켓을 이용해 게스트 OS사이에 VLAN을 생성


4. VDC 네트워킹

- 게스트 OS 사이에 virtual Distributed Ethernet 인프라를 사용





#####  KVM

: Kernal-based virual Machine


- 전가상화 방식을 사용하므로 하드웨어 지원이 필요함 (Intel-VT, AMD-V)

- x86 기반의 리눅스에서 구동

- 커널 모듈로 포함되어 있으며 Host에서는 하나의 프로세스로 간주되어 오버헤드가 적음


<구성>

- kvm.ko : 가상화 인프라스트럭쳐 코어를 위한 커널모듈

- kvm-intel.ko(kvm-amd.ko) : CPU 의존적 커널모듈

=> /proc/cpuinfo에서 vmx|svm같은 CPU와 커스터마이징 된 qemu-kvm이라고 하는 qemu 유틸리티가 지원되어야 함

* 명령어 : "egrep '(vmx|svm)' /proc/cpuinfo"


- 거의 모든 종류의 OS를 지원

- 다양한 저장장치를 지원

- 서버의 로컬저장소 : 게스트관리, 백업, 마이그레이션 쉬움, 성능은 점점 감소

- 물리디스크 : 비용이 많이 들지만 성능 좋음

- 로컬로 연결된 물리적 LUN : RAID에 사용

- LVM : 논리적 파티션

- iSCSI : IP-Over SCSI 프로토콜을 사용하여 TCP/IP 네트워크 상에서 SCSI를 사용해 

스토리지의 물리적인 위치에 상관없이 기존의 고성능, 고안정성 스토리지를 구축 가능

(IPSAN이라고 총칭하기도 함)

- Fiber Channel 기반의 LUN : SAN에서 사용되는 표준화 채널로 이루어진 LUN.

로컬 기반 SCSI뒤를 잇는 차세대 고속 인터페이스.

DC와 최대 8.6km 떨어진 곳에도 스토리지셋을 설치할 수 있음

성능, 안전, 비용모두 높음

- 등등 ...


<KVM 패키지 설치 시 설치되는 기본 패키지 들>

 libvirt

 가상화 솔루션 제어를 위한 API

 virt-manage

 가상화 솔루션 관리 및 모니터링 프로그램

 virt-viewer

 가상화 된 게스트 이미지를 읽어서 실행시키는 프로그램

 (이하, 옵션패키지)

 Virtualization Guide

 가이드 문서를 로컬에 설치해서 빠르게 참조할 수 있음

 Development Package

 가상화 관련 개발환경을 구축할 수 있는 패키지

 Etherboot 

 네트워크 부팅을 지원하는 패키지

 KVM debuggings tools

 디버깅 툴

 log4cpp

 로그 관련 기능을 제공

 기타


<KVM의 쉬운 운영을 위해 설치하는 패키지들>

 python-virtinst 

 게스트들을 쉽게 설치할 수 있도록하는 python 라이브러리로 구현된 프로그램인

 virt-install을 제공 

 libvirt

 리눅스 API

 Xen 및 KVM을 포함해서 다양한 가상화 기술 위에서 인터페이스를 제공 

 하이퍼바이저가 제공하는 공통된 기능들을 추상화 시킨 API를 제공

 (다양한 환경에서 사용이 가능)

 libvirt-python

 libvirt가 제공하는 기능을 파이썬에서 사용할 수 있게 API 제공 

 virt-manager

 가상머신 관리자

 가상머신을 운영하는데 필요한 기능을 GUI로 제공

 virt-install :CLI, virt-manager :GUI 

 virt io 패키지

 저장장치 및 NIC 제어를 지원해주는 패키지

 반가상화 드라이버 포함

 호스트를 통하지 않고 하드웨어를 직접 제어할 수 있음(I/O 지연 감소, 처리량 증가)

 KVM에서의 성능 저하를 해결할 수 있도록 도와줌



# 가상화 시스템 관리

- 가상화 보안

- 마이그레이션


1. 가상화 보안


- 사용할 서비스만을 설치하자. 서비스 최소화!

- 방화벽

- Do not touch Dom0 (user사용자로부터의 접근 허용을 X)

- 저장장치 보안 : 파티셔닝이나 LUM을 지정해 호스트 boot을 수정하지 못하게 해야함


2. 마이그레이션


- Load Balancing

- H/W failover

- 에너지 절감

- 기역간 Data Center migration


- offline migration : 실행중인 guest 들을 종료시킨 후 복제를 통해 마이그레이션

- live migration : 실행중인 게스트의 메모리 페이지를 모니터링 하면서 이전될 호스트 이미지 파일을 전송해야함.

최종적으로 아주 잠깐 Host를 중지시켜 dirty data(변경되는 값)을 일괄전송 후 마무리


* Host A -> Host B

(1) B를 연결하고 헤더 정보 전송, 리소스 분배 및 설정

(2) 마이그레이션 시작

(3) 메모리 내용을 최대한 비슷하게 이전

(4) iteration을 실행하여 반복적으로 변경되는 메모리를 B로 전송. 최대한 비슷할 때까지 계속 전송

(5) 거의 다 전송하면 잠깐 정지한 후 더티데이터 및 상태값 등을 전송

(6) 메모리 페이지 내용이 같아지면 Host B를 실행


* 마이그레이션 요구사항

- online으로 연결된 최소 두대의 호스트상에 설치된 게스트 일 것

- NFS, GFS2, TSCSI, Fiber Channel등은 공유 네트워크 저장장치를 사용하는 곳

- 동일한 OS, 동일한 버전, 동일한 업데이트 상태


* 체크리스트

네트워크로 연결된 상태들

공유네트워크 저장장치 사용

동일한 OS/버전/업데이트 상태

막히지 않은 포트, 동일한 브릿지 및 네트워크 상태

마운트 위치 및 디렉토리





##### XEN


- x86을 비롯해 다양한 프로세서 지원

- 반가상화(상대적으로 좋은 성능) 및 전가상화 지원

- 가상게스트를 관리하는 장치 드라이버를 Domain-0이라는 관리 가상 게스트에 부여하여,

하이퍼바이저가 동작함에 있어 오버헤드는 감소시키고 성능은 증가시킴

(Network Backend Driver, Block Backend Driver)



- Xen Hypervisor

- Domain 0

- Domain U



1. Xen Hypervisor

:  실행중인 게스트들의 CPU스케쥴링과 메모리 분배를 담당.

(게스트->H/W)로 가는 명령어를 처리하여 자신이 HW인 것처럼 보이게 함

네트워크, 외부저장장치, 오디오, 컴퓨터 시스템에 있는 일반적인 I/O는 지원하지 않음



2. Domain 0

: 수정된 리눅스 커널로 다른 가상 게스트들(도메인 U의 PV, HVM 게스트)과 통신하며 물리적 I/O 리소스에 접근 가능한 특별한 권한을 가진 가상 게스트

(Special Privileged Guest라고 함)


- Domain U의 시작, 중지, I/O 요청등의 모든 작업을 처리

- 하이퍼바이저에게 접근

- Domain U가 요청하는네트워크와 로컬 디스크 작업을 처리하는 드라이버인 Network Backend Driver와 Block Backend Driver를 제공


Network Backend Driver : Domain U로부터오는 모든 가상게스트들의 요청을 처리하는 로컬 네트워크 드라이버. H/W와 직접 통신

Block Backend Driver : Domain U의 요청에 따라 드라이브에서 데이터를 읽고 쓸 수 있는 로컬 스토리지와 통신


- Domain 0은 게스트들 보다 먼저 실행되어 있어야 함



3. Domain U

: 일반적으로 생성하는 Guest들로 I/O resource에 접근 권한이 없음


a. Domain U PV Guest (PV : Paravirtualized)

: 하이퍼바이저에게 게스트 OS가 동작하도록 OS를 수정H/W로 직접 접근하지 않고 하이퍼바이저를 통하도록 수정)해서 실행한 반가상화 게스트


   * 네트워크와 디스크에 접근하기 위해 드라이버가 존재하며 Domain 0에 요청



b. Domain U HVM Guest (HVM : Hardware-assisted Virtualization)

: 전가상화 게스트, OS 수정 없이 가상화하며 이를 위해 하드웨어 지원이 필요(Intel-VT, AMD-V)


- 가상화 된 게스트상에 PV드라이브가 없음

- Domain 0에 QEMU 데몬인 "qemu-dm"이 HVM게스트마다 실행되어 네트워크와 디스크 접근을 처리

- Xen Virtual Firmware(BIOS)를 통해 시스템 시작 시 Domain U HVM Guest를 초기화 함




4. 도메인 관리 및 제어 

: Domain 0은 다양한 데몬을 사용해 도메인을 관리/제어



- Xen 데몬 : Xen 환경의 System Manager 역할을 하는 파이썬 application.

 데몬에 의해 생성된 모든 요청은 Xm이 만든 XML RPC 인터페이스를 통해 전달


- Xm : 유저의 입력을 받아 XML RPC를 통해 Xen 데몬에게 전달하는 명령행 도구

- Xen 제어 library : Domain 0을 통해 데몬이 Xen Hypervisor와 통신할 수 있게하는 C library 

- qemu-dm : QEUM의 변형된 데몬으로 HVM 게스트들은 각각 Qemu demon이 필요함

네트워크, 디스크 요청을 처리해 완전한 가상 머신을 만듬 (네트워크, I/O에 접근하기위해 하이퍼바이저 외부에 Domain 0이 존재)





##### Xen Server

: Xen을 기반으로하는 서버 가상화 플랫폼


- Xen Hypervisor

- 다양한 OS와 HW를 지원

- GUI



1. XenCenter 

:  XenServer를 관리하는 콘솔 프로그램으로 CLI도 제공


2. XenServer Host 

: 게스트가 실행될 물리적 장비. XenServer Host의 CPU 및 메모리 자원을 이용해 게스트가 설치

로컬 스토리지를 제공(LVM, ext3), 원격 공유스토리지 (NFS. iSCSI)


3. Resource Pool

: 다수의 XenServer Host를 묶어서 관리. Migration, HA 등 값을 사용할 수 있음


* 스토리지 : 추상화된 계층구조를 가짐



- VDI 저장공간인 Storage Repository(SR)이 있음

- 로컬 스토리지(IDE, SATA, SCSI, SAS), 원격 스토리지(NFS, iSCSI, SAS, Fiber Channel)가 자원

- XenServer Host와 SR의 연결을 위해 PBD(Physical Block Devcice)를 사용 => 커넥터 역할을 수행

- 스토리지 저장소와 게스트간에 가상블록 장치(VBD, Virtual Block Device)를 게스트를 위한 가상의 볼륨 디스크를 제공


##### libvirt

: 가상화 플랫폼을 관리하는 Open Source API

다양한 가상화 기술에 사용(KVM, Xen, VMware, ESX, Hyper-V, LXC, ...)

C로 작성되었으며 다양한 언어에 바인딩 가능(Perl, Ruby, Java, PHP, ...)



* 원격의 가상머신 관리를 위해 libvirt는 libvirtd를 제공

=> 관리도구에서 로컬 libvirt와 원격의 libvirtd가 서로 통신하여 원격의 가상 머신에 관리 명령을 전달



##### virsh

: libvirt API를 바탕으로 만든 "virtual shell"

- CLI

- libvirt 설치 시에 함께 설치됨



##### XML Format

: libvirt나 virsh에서 가상머신, 스토리지, 네트워크를 생성하기 위해 명세를 XML 데이터를 설정

가상머신 관련, 네트워크 설정, 필터링 설정, 스토리지, 스토리지 암호화, 드라이버 적용, 호스트 장비 스냅샷



##### virt-install

: 가상머신 생성도구



##### virt-clone

: libvirt API를 이용해 가상머신 복제 도구



##### virt-viewer 

: 가상머신에 대한 원격 디스크가 탑제됨



##### virt-manager

: 하이퍼바이저와 가상화를 관리하는 GUI도구, 가상머신 생성 및 관리


 




'Virtualization + Cloud' 카테고리의 다른 글

CPU(x86) Ring Level  (0) 2015.12.29



##### UTM


- advanced Firewall

- IDS, Intrusion Detection System

- IPS, Intrusion Prevention System


- UTM, Unified Threat Management

- F/W과 VPN기능을 기반으로 여러 보안기능을 통합해 사용 가능


- F/W은 port 기반이므로, SSL 암호화 트래픽은 확인할 수 없음

- 차세대 방화벽에서는 웹애플리케이션의 가시화와 제어가 가능

- 하나의 port를 공유 사용하는 애플리케이션의 식별과 제어가 가능


- 기능 : 식별, 분류, 제어

- IP, 사용자별, 그룹별 식별가능

- Port, Protocols, Applications별 식별 가능    

- 실시간 감지/방어 가능

- Application의 우선순위 가능





##### VoIP

: VoIP, Voice over Internel Protocols. IP 네트워크 상에서 음성 통화를 실현하는 기술. 음성을 IP 패킷화.



### IP 전화

: VoIP 기술을 이용한 전화 서비스 및 그 네트워크 안에 존재하는 IP 기능을 가진 전화기


# IP 전화 이용

1. 인터넷 망 : ISP와 계약

2. 음성이 통과하는 사내 인터라넷 구축

: 최근 VoIP 서비스를 회사에서 구축해 사용

WAN 회선만 통신 사업자에게 대여, QoS 정책을 회사내에서 설계해 구현할 수 있음

3. 통신 사업자기 제공하는 서비스를 이용

: 통신 사업자의 데이터센터에 VoIP 서비스를 구축하며, 통신 사업자의 설비를 사용하고 사내에서는 라우터나 IP 전화만 설치되는 구조


# IP전화의 구성요소

- 중/대규모 거점의 IP전화는 서버룸에 설치된 음성서버를 거쳐서 통화가 이루어짐

- 소규모 거점의 IP전화는 음성서버가 없으므로 대/중규모의 음성서버가지 가서 경유되어 통화가 이루어짐



- VoIP G/W : 아날로그 전화기를 위한 장치

- 소프트 풀 : PC에서 SW를 설치하여 PC를 IP전화기로 사용

- IP 네트워크 망 : IP네트워크로 이루어진 네트워크 인프라 망. 음성패킷 우선순위 제어 및 대역폼 확보로 음성품질 담당

- VoIP 서버 : 음성의 호 제어나 단말 정보등을 가지는 음성서버




[서버/인프라를 지탱하는 기술]





'Network/Infra' 카테고리의 다른 글

스토리지 서버의 필요성  (0) 2015.12.28
MySQL Replication  (0) 2015.12.28
네트워크 보안 접근  (0) 2015.12.27
로드밸런싱 서버, 캐시 서버  (0) 2015.12.27
스토리지 프로토콜?  (0) 2015.08.13



### 보안 전체의 관점


1. 하드웨어 : 각종 서버 및 플랫폼

2. 소프트웨어 : 서버에 등록되어있는 인증정보나 노트북에 들어있는 기밀정보 등


- 내부범행

- 외부범행 : 부정칩입, 정보도청, spoofing, DoS, 컴퓨터바이러스





### DMS

: 공개 서버를 설치하는 전용공간으로 내부네트워크와 외부네트워크에서도 격리된 장소를 설치하여 외부/내부 범행의 피해를 막기위한 공간


1. 방화벽 사용(세가지 영역의 경계를 가짐)



- 방화벽타입 : S/W 제품, H/W 일체형

- 주요기능

a. 액세스제어(필터링)

사내 Network -> 외부 Network (허락된 applications packet만 통과)

외부 -> 사내 (허가된 applications, 사내에서 외부로 나갔다가 다시 돌아오는 패킷)

외부 -> DMZ (공개서버의 applications 패킷 허가)

DMZ -> 외부 (공개서버의 applications에 송신되었다가 돌아오는 패킷만 허가)

b. 주소변환기능으로 사내IP 감추기(사설<-공인)

c. 로그수집


* DB서버는 DMZ에 설치하면 안됨. Trusted Zone에 설치해야 함


2. 백신주입(보안 어플라이언스 도입 등)

: 방화벽 만으로는 컴퓨터 바이러스 등의 문제를 해결할 수 없음



### 내부 공격

: 방화벽은 자신을 거치지 않는 통신에 대해서는 수행되지 않음

- 부정침임

- 정보도청

- spoofing

- birus

- 정보유출


### 정보데이터의 암호화

: 데이터에 직접 암호화 및 액세스 컨트롤


### 물리보안

- 통합접속

- 플랩게이터

- 카드리더

- 각 구역별 카드리더

- Rock 열쇠






[서버/인프라를 지탱하는 기술]



'Network/Infra' 카테고리의 다른 글

MySQL Replication  (0) 2015.12.28
UTM, VoIP  (0) 2015.12.27
로드밸런싱 서버, 캐시 서버  (0) 2015.12.27
스토리지 프로토콜?  (0) 2015.08.13
[SDN] Ryu_OpenFlow 1.3 REST 연동  (0) 2015.05.11



### 로드밸런싱 서버


1. reverse proxy와 AP서버를 항상 1:1로 구성

2. mod-proxy_balancer

3. reverse proxy와 AP사이에 LVS(LVS + keepalived) 놓기





ex) mod_proxy_balancer 예

1. mod_proxy_balancer loading

2. Balancer Member Directive로 분산할 호스트 목록 정의

3, RewriteRule로 리버스 프록시 설정


<Proxy balancer://backend>

BalanceMember    http://192.168.0.100    loadfactor=10

</Proxy>






### 캐시서버


a. http 캐시

: HTTP Header로 갱신문서의 갱신 일시를 교환(FireFox: If-Modified-Since)


b. Squid 캐시서버

- HTTP, HTTPS, FTP 등에 이용되는 오픈소스 캐시서버




- squid를 이용한 리버스 프록싱 : 서버측의 문서를 시스템 측에서 squid로 캐시 가능



- squid는 주로 정적문서(css, js, HTML, ...)을 캐싱

- 동적문서도 가능 함

- HTTP 프로토콜 기반으로 URL을 키로 사용해 문서를 캐싱

- 사용자 정보를 갖는 문서는 cookie에 의한 세션 관리를 통해 동작함 => "state-less"함. "state-full"한 정보는 캐시하지 않음

페이지 전체를 캐시하는 경우 사용되며, 해당 단위의 크기에 맞게 캐시하는 예는 "memcached"가 수행


 * 두 대의 squid 분배는 mod_proxy나 LVS로 수행

- squid.conf



c. memcached에 의한 캐시


<개요>

- squid는 HTTP 프로토콜 레벨에서 캐시를 수행하므로 state-less하고 scalable 하여 애플리케이션의 구성 등에는 거의 의존하지 않음

- but, HTTP 레벨의 캐시가 절실하지 않은 상황에는 애플리케이션 내부에서 이용하는 데이터단위 크기로 캐시를 관리하는 캐시 서버 사용


<내용>

- C로 작성된 분산 캐시 서버

- 스토리지로 OS의 메모리 사용

- 클라이언트 라이브러리를 이용해 서버와 통신하여 객체를 사용할 수 있음

(C, C++, Java , Perl, Ruby, PHP, Python 등 다수의 언어 지원)

- 프로그램 내부에서 이용 (특정 데이터를 파일로 캐싱 하거나, 로컬 메모리상에 캐싱하는 경우)

- <Key, Value> 구조의 데이터

- 장애감지, 복구, ...





[서버/인프라를 지탱하는 기술]


'Network/Infra' 카테고리의 다른 글

UTM, VoIP  (0) 2015.12.27
네트워크 보안 접근  (0) 2015.12.27
스토리지 프로토콜?  (0) 2015.08.13
[SDN] Ryu_OpenFlow 1.3 REST 연동  (0) 2015.05.11
[SDN] Ryu_OpenFlow 1.3 트래픽모니터  (0) 2015.05.10

리눅스에서 프로세스 시작과 관련된 함수 

: system(), fork()


종료와 관련된 함수

: wait(), waitpid(), exit()





##### system()


#include <dtdlib.h>

int system(const char    *string);

프로그램 수행도중 새로운 명령이나 프로그램 수행 가능

string : 명령 (sleep 3, ls ...)



##### fork()


#include<unistd.h>

pid_t fork(void);


프로세스 생성

부모프로세스로부터 만들어지며, 부모 프로세스와 같은 공간의 코드를 수행하지만 자기자신만의 데이터 공간 및 FDT등의 실행 환경을 구성

고유한 PID를 갖고, 부모프로세스의 PID를  자신의 PPID에 저장

부모 프로세스로부터 시그널 등도 상속받음

부모프로세스의 함수와 자식 프로세스의 함수에서는 서로 다른 값을 반환하여, 각 프로세스에서 수행할 일을 구분하게 됨

(부모 return : 정상 시 자식프로세스 PID, 자식 return : 정상 시 0)


fork() 실패 시 -1 rerutn.

- 메모리 부족 : errno 변수에 ENOMEM 설정

- 자식 프로세스 개수의 제한 : errno변수에 EAGAIN 설정



##### wait() 

: 자식프로세스의 종료까지 책임이 부여되는 함수


#include <sys/types.h>

#include <sys/wait.h>

pid_t wait(int *stat_loc);


case 1. 자식프로세스가 존재하는 경우

wait() 호출 -> 자식프로세스가 시그널을 보낼 때 까지 부모프로세스의 수행 중지 -> 자식프로세스의 PID반환

case 2. 자식프로세스가 존재하지 않는 경우

wait() 호출 -> -1 반환 -> errno 변수에 ECHILD 설정

case 3. 부모 프로세스에서 자식 프로세스의 종료 원인을 자세히 알고싶은 경우

인수로 상태정보를 읽어 올 수 있는 변수를 넘겨줌 -> 종료 상태 확인(sys/wait.h의 매크로 사용)


<관련 매크로>

'System > Linux Kernel' 카테고리의 다른 글

CFS 구현의 핵심  (0) 2016.01.22
커널에서 원하는 값을 가지고오기 위해 clz를 하는 이유  (0) 2016.01.16
[Unix V6] 시스템 부팅  (0) 2015.12.19
Device Tree, 리눅스 커널 4.0  (0) 2015.08.29
메모리관리  (0) 2015.08.18

리눅스에서는 shell(base)를 통해 명령 및 프로그램을 실행

환경변수는 명령이나 프로그램을 수행하는 데 필요한 정보를 가짐


HOME : 현재 로그인 사용자의 홈 디렉토리

PATH  : 명령을 검색할 디렉토리 목록. 리눅스 명령에 대한 실행 파일의 위치가 포함

PS1 : 쉘 프롬프트

MANPATH : 온라인 매뉴얼 검색 디렉토리 목록

USERNAME : 로그인 사용자 명

HOSTNAME : 사용중인 시스템의 호스트 명


c에서 getenv("환경변수명"); 으로 값을 얻어올 수 있음

<-> putenv();



##### 사용자 계정정보

/etc/passwd : 리눅스에서 사용자 계정정보를 보관하는 파일

계정, UID, GID, 홈디렉토리, 로그인 쉘 등을 포함한 상세한 정보를 저장


# include <sys/types.h>


struct passwd *getpwuid(uid_t uid);

struct passwd *getpwnam(const char *name);


struct passwd {

char *pw_name;

uid_t pw_uid;

gid_t pw_gid;

...

}



### UID

: 리눅스 사용자 ID


1. Real UID : 실제 로그인 한 사용자 계정의 UID


getuid(), getgid(), setuid(), setgid()


2. Effective UID : 파일 접근의 효과를 가지고 있는 UID

일반적으로 Real UID와 동일하나 set-UID 퍼미션이 설정된 프로그램을 수행하면 일시적으로 변경이 가능하며,

파일 접근에 대한 권한을 설정할 수 있음


geteuid(), getegid()



### PID

리눅스에서 모든 명령은 파일로 정의되며, 명령을 수행한다는 것은 해당 파일을 실행하는 프로세스가 동작한다는 것을 의미


getpid() : 현재 프로세스 ID 출력

getppid() : 현재 프로세스의 부모 프로세스 ID 출력


### time 

리눅스에서는 시스템 시간을 clock tick으로 세며 다음과 같은 함수들을 제공


time() 초단위 시간으로 확인 가능

gettimeofday() 마이크로 초 단위의 시간까지 확인 가능

times() 프로그램의 실행 시간을 확인하는 함수

uname() 시스템 호스트 정보. 시스템의 이름이나 OS 종류 및 버전 등에 대한 정보가 필요할 경우 사용

localtime() time()에서 구한 시간을 연,월,일,시,분,초의 형식으로 계산해주는 함수


### 시스템 자원의 제한치 설정


int getrlimit(int resource, struct rlimit *r_limit);

int setrlimit(int resource, const struct rlimit *r_limit);


struct rlimit {

rlim_t    rlim_cur;        // 현재 설정된 소프트 제한 값 확인

rlim_t    rlim_max;        // 절대적 제한치

};


<설정 가능한 리소스 종류>

RLIMIT_CPU

RLIMIT_FSIZE

RLIMIT_DATA

RLIMIT_STACK

RLIMIT_CORE

RLIMIT_NPROC

RLIMIT_NOFILE

RLIMIT_MEMLOCK



'System > Linux OS ' 카테고리의 다른 글

.exrc  (0) 2016.04.23
lsof  (0) 2015.12.24
strace, ltrace  (0) 2015.12.24
gcc / gdb  (0) 2015.12.24
man  (0) 2015.12.24


##### lsof

현재 동작 중인 모든 프로세스에 대한 오픈된 파일 보기


* 리눅스에서는 모든걸 파일로 관리하므로 유용하고 다양하게 쓰이는 명령어임


ex) 


$ sudo lsof -p 1052

특정한 1052번 프로세스가 오픈한 파일들의 목록


$ sudo lsof -i:22

네트워크가 연결되어있는 호스트나 포트로 확인


$ lsof -s /tmp

특정 파일 또는 디렉토리와 관련한 프로세스 찾기



'System > Linux OS ' 카테고리의 다른 글

.exrc  (0) 2016.04.23
리눅스 환경변수와 UID, PID, 시스템자원의 제한  (0) 2015.12.24
strace, ltrace  (0) 2015.12.24
gcc / gdb  (0) 2015.12.24
man  (0) 2015.12.24



##### strace

프로그램이 실행되는 동안 수행되는 시스템콜을 추적하는 도구

디버깅 초기에 문제를 확인하거나 메모리 문제 같은 운영체제 관련 문제를 추적할 때 사용


$ strace -help

usage: strace [-CdffhiqrtttTvVxxy] [-I n] [-e expr]...

              [-a column] [-o file] [-s strsize] [-P path]...

              -p pid... / [-D] [-E var=val]... [-u username] PROG [ARGS]

   or: strace -c[df] [-I n] [-e expr]... [-O overhead] [-S sortby]

              -p pid... / [-D] [-E var=val]... [-u username] PROG [ARGS]


-f : 자식프로세스도 추적

-tt / -T : 타임 스탬프 표시 / 실지 함수호출 시간 표시

-v : 상세 출력 모드

-p PID : 이미 실행중인 프로세스 추적

-o 파일명 : 추적 결과 파일에 저장

-e trace=### : ###에 해당되는 내용 출력

ex) -e trace=open



$ strace /bin/pwd

시스템콜 이름, 매개변수, 반환값





$ sudo strace -p $(pgrep ssh)        // ssh 포트그룹을 식별하여 ssh 프로세스의 시스템 콜 확인


> select 함수에서 waiting


> 다른 곳에서 ssh를 통해 접속


> accept 함수로 떨어지면서 정상정으로 ssh 접속 수행




$ sudo strace -e trace=process -p $(pgrep ssh)      // ssh 동작 중 프로세스 관련 시스템 콜 부분만 뽑아 보기


> 프로세스가 수행되는 중인 정보만 나옴


> ssh 접속


> clone 시스템 콜이 동작하여 프로세스가 생성됨


> $ exit 명령을 사용하여 ssh 접속 종료


> ssh 접속 종료후의 프로세스 관련 내용 출력





##### ltrace 

프로그램이 실행되는 동안 호출되는 동적(공유) 라이브러리 함수를 추적하는 도구

strace와 유사

동적 라이브러리만 추적하므로 파악하기는 쉽지만, 문제의 원인을 찾기가 어려움


-u username : username의 권한으로 명령 실행하면서 라이브러리 추적 (관리자 권한 필요)

-tt / -T : 타임 스탬프 표시 / 실지 함수호출 시간 표시

-v : 상세 출력 모드

-p PID : 이미 실행중인 프로세스 추적

-o 파일명 : 추적 결과 파일에 저장

-e {[+|-][라이브러리 함수명][라이브러리 파일명]} : 해당 내용만 출력



$ ltrace cat /etc/passwd


> 함수들과 인수들의 값을 동적으로 확인



$ sudo ltrace -e malloc+free+select -p $(pgrep ssh)        // ssh 동작 중 -e 옵션으로 malloc+free+select 부분만 출력



> ssh 접속이 되면 해당 부분만 출력


> ssh 접속 종료에도 해당 정보만 출력



 

'System > Linux OS ' 카테고리의 다른 글

리눅스 환경변수와 UID, PID, 시스템자원의 제한  (0) 2015.12.24
lsof  (0) 2015.12.24
gcc / gdb  (0) 2015.12.24
man  (0) 2015.12.24
리눅스 커널 커밋(commit)하기 - ing  (0) 2015.12.23


##### gcc 

: GNU Compiler CollectionGNU의 C 컴파일러

(이름이 바뀜, 이전엔 C Compiler 였나..?)


ANSI + POSIX



### 과정 및 옵션

.c -> 컴파일(전처리①, 문법검사/코드최적화 -> .o -> 링크 -> .exe


① 컴파일과정 - 전처리 옵션

-I : 헤더파일 위치지정 옵션, 표준 디렉토리(/usr/include) 외의 헤더파일의 위치 지정에 사용

-D : Dname, name에 지정된 심볼을 1로 정의, 조건부 컴파일에서 유용하게 사용 됨


② 컴파일과정 - 문법검사/코드최적화

-O : "ON", 컴파일러 최적화 옵션으로 최적화 단계(0~3)를 N으로 지정


③ 링크과정

-L : 라이브러리 파일이 위치하는 경로를 지정

-l + string : 컴파일 시 string으로 입력한 경로의 라이브러리 파일을 추가

* 라이브러리 파일은 ".so" or ".a"

* 라이브러리 파일의 이름은 "lib"로 시작

* 표준 라이브러리는 "/usr/lib"에 존재

ex) 수학 표준 라이브러리 libm.a or libm.so 사용시 "-lm"을 사용해야 함

gcc -o exam_mlib ex exam_mlib.c -lm


④ 기타

g : 실행파일에 표준 디버깅 정보 포함, gdb, DDD 등 디버거 이용 시 사용

wall : gcc가 제공하는 모든 경고를 사용,

시스템과 네트워크 프로그램 및 커널기반의 프로그램 작성 시 해당 옵션을 사용하는 게 좋음



### 라이브러리


1. 정적 라이브러리

소스파일 생성(.c) -> 오브젝트파일 생성(.o) -> 라이브러리파일생성(.a)

  vi static.c                gcc -c static.c                ar rb lib##.a  static.o


2. 동적 라이브러리

소스파일 생성(.c) -> 재배치 가능한 오브젝트파일 생성(.o) -> 라이브러리파일생성(.a)

  vi shared.c              gcc -c -fPIC shared.c                        ld -shared -o lib##.so shared.o


* 공유 라이브러리 파일 이용 시 메모리에 미리 올라가져 있어야 사용할 수 있으며, 환경변수 설정 후 사용할 수 있게 됨됨

사용자 home의 .bashrc파일에 저장하여 매번 실행해야하는 불편함을 줄일 수 있음




### sysinfo를 활용하여 간단한 프로그램 작성


$ man 2 sysinfo


$ vi test_sysinfo.c


$ gcc -o sysinfo sysinfo.c


$ ./sysinfo



##### gdb 


* gdb를 이용하여 파일을 디버깅하려면 실행파일이 디버그모드로 컴파일 되어 있어야 함 (-g 옵션 사용)


명령어 참고. 

https://sourceware.org/gdb/current/onlinedocs/gdb/index.html#Top

http://egloos.zum.com/psyoblade/v/2653919




'System > Linux OS ' 카테고리의 다른 글

lsof  (0) 2015.12.24
strace, ltrace  (0) 2015.12.24
man  (0) 2015.12.24
리눅스 커널 커밋(commit)하기 - ing  (0) 2015.12.23
Linux LVM  (0) 2015.08.12


### man 

: 개발자를 위한 리눅스 매뉴얼



man [section #no] 라이브러리 함수명 or 시스템 콜이름


section #no. 1 : 시스템 콜 매뉴얼

     2 : 라이브러리 함수 매뉴얼





$ man --help

Usage: man [OPTION...] [SECTION] PAGE...




### time system call 매뉴얼


$ man 2 time





SYNOPSIS : 문법

DESCRIPTION : 설명

RETURN VALUE




### memset() 함수 매뉴얼


$ man 3 memset





'System > Linux OS ' 카테고리의 다른 글

strace, ltrace  (0) 2015.12.24
gcc / gdb  (0) 2015.12.24
리눅스 커널 커밋(commit)하기 - ing  (0) 2015.12.23
Linux LVM  (0) 2015.08.12
[Linux] 리눅스 모니터링  (0) 2015.04.22

+ Recent posts