카테고리 보관물: 가상화 기술

Hyper-V에서 OpenBSD 설치후 워프 환경 만들기

Hyper-V는 마이크로소프트에서 타입 1 하이퍼바이저로 만들어 제공하는 가상 머신 관리자입니다. 서버에서도 제공하는 기능으로 일반 사용자들이 쓰는 윈도우 7, 8, 8.1, 10, 11에서도 동작합니다. Hyper-V에 게스트 OS를 설치해서 쓰면 재부팅없이, 멀티부팅 하지 않아도 여러 운영체제를 한 PC에서 설치해서 쓸수 있습니다. 단, VT-x나 AMD-V와 같은 가상화 기술이 CPU에서 제공되어야 합니다. 이 기능은 10년 이내의 최신 CPU라면 대부분 지원하니 큰 제약은 아닙니다.

이 글에서는 Hyper-V 환경에서 OpenBSD를 설치후 웹서버, PHP, MariaDB를 설치해서 쓰는 과정을 해설해보겠습니다.

우선 https://www.openbsd.org/faq/faq4.html#Download 에서 최신 iso 파일을 다운로드받아와야 합니다. 2023년 7월 기준으로 최신 버전이 7.3인데요. 설치를 위해서 install73.iso를 각자가 가진 PC의 아키텍처로 다운로드 받습니다. 유닉스 세계에서는 AMD가 발표한 64비트 CPU 아키텍처를 우선 지원하기 시작해서 인텔 CPU도 64비트이면 AMD64로 받아야 합니다.

Hyper-V로 가상 머신을 생성합니다. 램은 호스트 OS 상황 봐가면서 적당히 설정하되 4096MB 정도면 좋은 것 같습니다. 참고로 가상 머신 생성할때 1세대로 할거냐 2세대로 할거냐 물어볼때 1세대로 생성하는게 부팅시 진행이 안되게 하는 현상을 방지할 수 있네요.네트워크 스위치는 기본으로 Hyper-V에 딸려온 것을 설정하구요. VHD도 잘 생성해둡니다. 가상 머신 생성시 위에 다운로드 받은 iso를 IDE 장치로 연결해줍니다.

생성이 되면 켜서 부팅시키고 OpenBSD를 설치합니다. 인스톨러가 지시하는대로 하면 되구요. 특기할 것은 파티션 나누기인데요. 기본으로 되어 있는 설정을 지우고 하시길 권합니다. 업체에서 서비스할 용도가 아니면 파티션 전체를 MBR로 두고 파티션 수동 모드로 가서 기존 파티션 다 지운후 VHD 최대 용량에서 스왑 파티션은 8GB 정도, 나머지는 다 마운트 포인트를 / 로 할당하면 됩니다. 다 되면 끄고, iso 마운트 해제가 안되어 있으면 해제하고 재부팅합니다.

지금까지의 과정을 간략하게 요약하면 아래와 같습니다.

(1) Hyper-V 설치
(2) 가상 머신 생성
(3) OpenBSD iso를 가상 머신에 탑재
(4) 설치
(5) 재부팅

이 흐름입니다.

위 흐름대로 설치후 재부팅해서 해야 할 게 있는데요. APM 설치와는 상관없는 과정이지만, 디렉토리 변경 등의 정보를 업데이트해서 보려면 좋은 OpenBSD 설정부터 설명합니다. 이 설정을 해두어야 경로를 바꿔서 어떤 디렉토리에 있는지 한눈에 살펴볼 수 있고 시스템 로케일도 설정할 수 있게 됩니다.

$ su
$ pkg_add install tcsh
$ rehash
$ cd ~
$ chsh
/bin/zsh 부분을 /usr/local/bin/tcsh 로 바꾸고 저장후 나옴
(커서를 /bin/zsh 부분에 두고 a나 i를 눌러 편집 가능. 고치고나서 :wq 입력하면 저장후 나옴)
$ vi .cshrc
set prompt = “내용” 이라고 된 부분을 아래처럼 고침
set prompt = “%n@%m::%~]# “
set prompt 부분이 다른 라인에도 있으면 고침
setenv LANG ko_KR.UTF-8
setenv LC_CTYPE en_US.UTF-8
고치고나서 :wq 입력후 빠져나옴
$ exit
재로그인
위에서 설명한 과정을 root 계정에도 해둠

이정도 설정해두면 APM 설치를 본격적으로 합니다.

패키지 설치
$ su
$ pkg_add install git # 선택사항
$ cd /usr
$ git clone https://github.com/OpenBSD/ports # 선택사항. 포트로 php와 mariadb를 설치하고 싶을때
$ pkg_add php
$ pkg_add mariadb-server

OpenBSD에는 기본 웹서버가 설치되어 제공됩니다. httpd라고 되어 있는데요. apache와 흡사하지만 조금 다른 웹서버로, 설정도 간편하고 좋습니다. 특히 SSL 설정을 할때, 도메인만 잘 입혀주면 인증도 되게 기정의 설정이 된게 좋습니다. 그런데 DDNS 서비스가 마땅치 않다면 HTTP로도 연결되게 설정할 수도 있는데요. 이 글에서는 HTTPS가 아닌 HTTP로 httpd를 설정하는 과정을 예시하겠습니다.

httpd 설정
$ su
$ cp /etc/examples/httpd.conf /etc/httpd.conf
$ vi /etc/httpd.conf
추가사항
$ mkdir /var/www/etc
$ cp /etc/resolv.conf /var/www/etc/
$ cp /etc/localtime /var/www/etc/
$ cp /etc/hosts /var/www/etc/
$ httpd -n
$ rcctl enable httpd
$ rcctl start httpd

php 설정
$ pkg_add php82-fpm
그외 모듈이 설치안되어 있으면 개별 모듈도 설치

MariaDB 설정
$ su
$ rcctl enable mysqld
$ rcctl start mysqld
$ rcctl check mysqld
$ mysql_install_db
$ mysql_secure_installation
$ vi /etc/my.cnf
[client-server]
socket=/var/run/mysql/mysql.sock
port=3306
$ mysql -u root -p
MariaDB [(none)]> CREATE DATABASE sampledb;
MariaDB [(none)]> CREATE USER ‘user2’@’localhost’ IDENTIFIED BY ‘PASSWORD’;
MariaDB [(none)]> use sampledb;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON sampledb.* TO ‘user2’@’localhost’;
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> show databases;
MariaDB [(none)]> EXIT

$ cd /var/www/htdocs
$ vi test.php
<?php
$conn = new mysqli(“localhost”, “user2”, “PASSWORD”);

if ($conn->connect_error) {
die(“연결실패: ” . $conn->connect_error);
}

echo “연결 성공”;
?>

웹브라우저에서
https://서버주소/test.php

연결 성공이라고 나오면 됨.

워프 설치
$ su
$ cd /var/www/htdocs
$ wget https://wordpress.org/latest.zip
$ pkg_add unzip
$ unzip latest.zip
$ mv wordpress wp
$ cd wp
$ mv wp-config-sample.php wp-config.php
$ vi wp-config.php
위에 MariaDB에서 생성한 db name, db user, db password 를 각각의 define() 구문에 입력
db host 정보는 localhost에서 127.0.0.1 로 바꿔야 할 수도 있음

위 단계 실행후 웹브라우저에서 https://사이트IP/wp 를 로드하여 설치과정 마무리
https://사이트IP/wp/wp-login.php 로 가서 로그인하고 관리자 페이지로 진입하면 일단 성공
다른 잔손질 (사이트 설정이나 프로필 설정 등) 을 해둔다.
(그런데 보안 문제로 잠시 플러그인이나 테마 메뉴에서 설치하고 싶은 플러그인, 테마를 열람하려고 Add New (또는 새로 추가) 메뉴로 들어가면 connection 문제를 보고하는 오류가 뜨고 워프 사이트에 게시된 테마, 플러그인 정보가 안뜨는데 이 경우 아래처럼 조치한다)

$ cd /var/www/htdocs/wp
$ vi wp-config.php
define( ‘FS_METHOD’, ‘direct’); 추가
$ chmod -R 777 wp-content
$ mkdir /var/www/etc
$ cp /etc/resolv.conf /var/www/etc/
$ cp /etc/localtime /var/www/etc/
$ cp /etc/hosts /var/www/etc/
$ rcctl restart httpd
$ recctl restart php82_fpm

워프 관리자로 돌아와 플러그인이나 테마 메뉴로 와서 Add New (또는 새로 설치) 메뉴로 들어오면 워프 사이트에서 보낸 목록이 표시됩니다. 그리고 위에 chmod 명령어로 wp-content 이하 디렉토리들을 전부 권한조정해서 설치도 됩니다.

트러블슈팅
대개 윗단계를 잘 거쳐와서 처리하면 httpd, PHP, MariaDB가 잘 돌고 워프 설치도 잘 됩니다. 그런데 OpenBSD는 chroot로 /var/www를 격리하는 체제로 보안을 높히는 것이 기본값이라 그냥 워프 설치해서 쓰면 플러그인이나 테마를 워프 사이트에서 받아와서 목록으로 표시하는 것이 오류가 납니다. 이 경우와 같이 별다른 오류 메시지 없이 작동이 잘못되면 오리무중이 되는데요. 아래 문서를 참고해서 wp-config.php에 define() 구문으로 디버그 모드를 지정하면 오류가 자세하게 나서 좋습니다.

https://developer.wordpress.org/themes/getting-started/setting-up-a-development-environment/

오류를 가지고 문의할때도 좋구요. 오류가 나는 참조된 파일들이 표시가 됩니다. 이 경우 워프 인클루드 파일들인데 해당 파일 내용을 참조하지 않고 이름만 봐도 대략 어떤 문제점이 오류를 나게 하는지, 파일이름을 보고 유추해볼 수도 있습니다. ftpext관련 문자열이 들어간 파일이름이 뜨면 wp-config.php에 define( ‘FS_METHOD’ , ‘direct’); 와 같은 구문을 추가해서 처리할때의 문제임을 테스트해볼 수 있습니다. 이는 개발시 필요한 정보라 배포된 직후 상태에서는 꺼져 있는 기능인데 define() 관련 구문을 잘 조정하면 오류 표시 단계를 정할 수 있다는게 위에 문서 중반부터 후반까지의 소개입니다.

어떤 경우 위의 해결에도 불구하고 또다른 secure connection 문제가 오류로 뜨면, 워프 사이트와 HTTPS 통신이 안되는 것을 의심해볼만한데요. 이 경우 SSL 통신에 필요한 파일을 유추해서, 또다른 기여 조건인 chroot로 /var/www를 격리할때, /etc/ 에 있는 네트워크 관련 설정파일이 안읽힌다고 판단이 되게 할 수 있습니다. 그러면 대략 /etc/hosts, /etc/localtime, /etc/resolv.conf를 /var/www/etc 로 복사해보면 될까? 와 같은 판단이 되어 문제 해결에 진전이 있게 되죠. /etc/hosts 파일은 IP 바인딩용이고, /etc/localtime은 SSL 만료인지 아닌지 식별용이고, /etc/resolv.conf는 외부 도메인을 해석하게 하는 네임서버 정보가 들어간 파일입니다. 이 판단이 적절한 선행 학습이 되면 자연스럽게 유추가 되는데요. 이 판단의 물꼬를 트려면 위 링크에 나온 DEBUG 관련 설정을 define() 구문에 해두고 오류가 뜬 페이지를 다시 로드하면 업데이트가 된 상태가 됩니다. 새로운 오류가 뜨면 고치고, 오류가 고쳐지면 성공이죠.

(1) 테마와 플러그인 설치 메뉴에서 문제가 있으면 FS_METHOD를 direct로 바꾼다
(2) chmod -R 777 wp-content
(3) /etc/hosts, /etc/localtime, /etc/resolv.conf 를 /var/www/etc에 복사
(4) php82_fpm, httpd 재시작

어느 정도 흐름은 보였는데 조금 설명이 불친절하지만 이해가 되실 것입니다. 아이디어 제시용이고, 위에 정리한 명령어 이외의 조치가 필요할 수도 있습니다.

이 글의 의의는 테스트 목적으로 가상 머신에 OpenBSD를 설치하고 워프를 돌게 하는 과정을 설명해보았습니다. 생각정리전에 해본대로 쓰느라 아주 가독성이 크지는 않으니 양해 부탁드립니다.

Hyper- V 구조론 2

이번 글에서는 보호 링 모드와 타입 1 하이퍼바이저의 전가상화 모드와 반가상화 모드를 살펴보겠습니다.

많은 CPU 구조는 하드웨어에 접근 권한을 차등을 두어 운영체제와 프로그램을 작동하게 합니다. 보호 링 모드라고 하는 이 구조는 시스템 폴트와 보안 취약점 공격의 위험성을 줄여줍니다. 전통적으로는 링 0부터 링 3까지 있구요. 링 0이 제일 접근 권한이 강하고, 링 3가 제일 약합니다. 링 0에서는 커널과 같이 하드웨어에 직접 접근해야 하는 계층이 돌고 링 1, 2에는 장치 드라이버가, 링 3에는 유저랜드 프로그램이 돕니다.

타입 2 하이퍼바이저는 링 0에 호스트 OS의 커널과 하이퍼바이저가 의존하는 VMM.sys 등의 파일이 자리해있고 링 1에 가상 머신과 게스트 OS, 추가 모듈이 돌아가며 링 3에 게스트 OS에서 도는 프로그램이 자리합니다.

반면 타입 1 하이퍼바이저는 링 0에 두고 게스트 OS가 링 1에 두는 것 같지만, 링 -1 라는 계층을 하나 더 추가하여 하이퍼바이저는 링 -1에서 돌고 게스트 OS는 링 0에서 돌게 하는 변화를 주었습니다. 이는 호스트OS와 같은 성능을 내도록 하기 위한 기법입니다.

타입 2인 경우 가상 머신의 커널 모드가 프로세서의 커널 모드에 동작을 취해야 하기에 그 요청을 트랩핑하여 호스트OS의 VMM에 전달해야 합니다. 이 과정에서 성능 저하가 있게 되는데요. 타입 1을 쓰면 하드웨어에 직접 접근하게 되어 레이턴시가 줄어들게 됩니다.

전가상화 기법은 하드웨어 에뮬레이션을 위해 이진 변환이나 링 압축 등의 기법을 쓰는 전통적인 방식으로 게스트OS의 수정없이 작동하지만, 물리적인 머신보다 느립니다. 반가상화 기법은 하이퍼바이저에서 제공하는 API로 하드웨어를 직접 접근하게 하여 게스트OS가 이를 이용해서 하드웨어에 처리하게 합니다. 이를 하이퍼콜이라고 합니다. 하이퍼바이저는 링 -1에서 돌기에 하드웨어와 직접 맞닿은 계층입니다.

링 -1 모드는 CPU의 가상화 기술에 의존하므로, 인텔의 경우 VT-x를, AMD의 경우 AMD-V를 바이오스나 UEFI에서 켜두어야 합니다. 켜두고 타입 1 하이퍼바이저를 설치하면 설치가 진행되고 실행해볼 수 있습니다.

Hyper-V 구조론 1

가상화 기술은 여러 유형이 존재하는데요. 제공하는 서비스에 따라 어플리케이션 가상화, 머신 가상화 등으로 구분됩니다. 우리가 관심을 두고 있는 Hyper-V는 머신 가상화로, 흔히 말하는 가상 머신을 돌리는 소프트웨어입니다.

가상 머신을 쓰는 이유는 다양한데 아래와 같습니다.

  • 서버에서 놀려두는 자원을 최대한 활용한다 – 이 말의 의미는 현재 쓰이고 있는 서버들의 사양이 높아서 CPU 코어 활용이나 램 등의 자원이 90% 안쓰이는 경우가 많습니다. 이 경우 남은 90%의 자원을 가상 머신을 돌리면서 활용하면 자원이 선용되고 기타 물리적 서버를 더 들이지 않아도 되므로 비용도 절약됩니다
  • 파워 유저의 경우 윈도우 이외의 운영체제를 돌릴 수 있게 됩니다. 멀티부팅을 하면 운영체제 간에 동시 작동이 어려운데 가상 머신을 쓰면 호스트 OS와 게스트 OS가 동시에 작동되어 편리합니다.

Hyper-V는 마이크로소프트에서 제공하는 머신 가상화 기술의 일종으로 가상 머신을 여러개 생성해서 쓸 수 있게 해줍니다. 윈도우 홈 에디션을 제외한 모든 데스크탑용 윈도우 최신 버전과 서버 버전에 포함되어 있습니다. 윈도우 데스크탑용 버전에서는 윈도우 기능 추가 기능을 써서 Hyper-V를 설치하고 쓸 수 있으며 설치와 운용을 하려면 CPU에서 제공하는 가상화 기술을 UEFI에서 활성화 시켜야 합니다.

  • SLAT 지원 64비트 CPU
  • VT-x나 AMD-V 지원 CPU
  • 최소 4GB 메모리

Hyper-V는 서버를 위한 서비스였으므로 사운드나 GPU 가속 기능이 지원이 안되었다가 지원이 일부 되게 바뀌었습니다. 그러나 라이브 뮤직 믹싱 프로그램, 고정밀 시간 (10밀리초 미만의 타이머를 이용하는 프로그램) 을 이용하는 프로그램은 문제가 있을 수 있다고 합니다.

대부분의 경우 윈도우 운영체제, 리눅스, BSD 등이 돌아가며 너무 오래된 운영체제는 안돌아갈 수 있습니다. 그러나 2023년 현재 구동에 필요한 운영체제들이 많아져서 큰 제한점은 없으며 실무에서 서버를 돌리는 용도로는 너무 오래된 운영체제는 필요없기에 서버 운용측면에서 활용도가 높습니다.

Hyper-V는 타입 1 하이퍼바이저입니다. 타입 1 하이퍼바이저는 CPU에서 제공하는 가상화 기술에 직접 접근해서 작동됩니다. 운영체제에 종속적인 작동을 하는 타입 2 하이퍼바이저에 비해 빠릅니다. 그러나 가상화 기술이 CPU에서 제공되어야 하기에 오래된 컴퓨터에서는 작동하지 않습니다.

링(ring) 개념의 이해가 필요한데요. 링 0은 하드웨어 계층에 가장 가까운 동작 모드로 CPU에 접근하는 권한이 제일 강한 모드입니다. 링 0에서 작동하는 경우 링 3에서보다 CPU에 직접 접근이 가능합니다. (링 1이나 링 2는 디바이스 드라이버가 작동한다고 알려져 있습니다) Hyper-V도 CPU 할당에 관여하는 하드웨어에 직접 접근이 필요한 타입 1 하이퍼바이저이기에 링 0에서 작동해야 하지만, OS 커널과 커널 모드 충돌이 발생할 수 있기에 링 -1 (ring minus one) 모드를 추가하여 작동하게 하였습니다.

타입 1 하이퍼바이저는 모노리딕 모드와 마이크로커널 모드라는 두가지 다른 모드를 지원하기도 합니다. 모노리딕의 경우 하이퍼바이저에 드라이버가 더해진 방식이고 마이크로커널의 경우 가상 머신에서 드라이버가 더해진 방식으로 후자가 레이턴시가 적습니다.

Hyper-V는 마이크로커널 방식의 타입 1 하이퍼바이저입니다.

일단 이 글에서는 이 정도로 정리해두겠습니다. 2편에서는 Hyper-V를 구성하는 각 계층의 해설과 간략한 기능을 정리해두겠습니다. 읽어주셔서 감사합니다.