해당 블로그는 개인의 공부를 목적으로 별도 정리하여 작성된 내용이므로, 잘못된 내용을 포함할 수 있습니다.
혹시나 틀린 내용이 있을 경우, 댓글로 말씀해주시면 계속하여 수정하겠습니다. 감사합니다.
UTM - Linux 가상머신에서 오프라인으로 PostgreSQL 설치 및 구축하기
1. 가상머신에 Cent OS 설치
본인 가상머신 설치 환경(OS) : [맥북 M1] - [UTM] - [CentOS-7-aarch64.iso]
- UTM 다운 : https://mac.getutm.app/
- 이미지파일 링크(미러 사이트) : https://mirror.kakao.com/centos/8-stream/isos/x86_64/
AMD64가 x86_64, Intel64 등 여러 이름으로 불리는것 처럼 AArch64 또한 비슷한 이유로 표현이 뒤섞여 있는데 아키텍처 개발사인 ARM Holdings의 공식 표현은 AArch64이다. ARM 측이나 오픈소스 개발 커뮤니티와 같은 엔지니어 집단에서는 AArch64라고 부르지만 Apple이나 Microsoft와 같은 일부 기업들은 ARM64라는 표기를 쓰는 경향이 있다.
설치과정
1) Virtualize / Emulate 가상화 방식 선택
- Virtualize (가상화 방식) : 호스트 시스템과 게스트 OS 사이에 하이퍼바이저가 있는 전통적인 가상화 방식
호스트 시스템에서 하이퍼바이저가 실행되며, 이 하이퍼바이저는 각 가상머신에 대한 리소스 할당 및 관리를 담당한다. 가상화를 통해 게스트 OS는 호스트 시스템의 하드웨어를 직접적으로 이용할 수 있다. 이는 일반적으로 성능 면에서 더 우수하며, 하이퍼바이저가 하드웨어 가상화 기술을 지원하는 경우 하드웨어 가속을 활용할 수 있다 (Apple Mac M1 칩은 하드웨어 가속 기능을 지원하므로, Virtualize 방식을 통하면 더 나은 좋은 성능을 기대할 수 있다)
- Emulate (에뮬레이트 방식) : 하드웨어 리소스의 동작을 소프트웨어로 대신하는 가상화 방식
하드웨어의 명령을 해석하고 호환 가능한 명령으로 변환하여 실행한다. 이는 원래 목적의 시스템과 호환성을 유지하기 위한 것이다. 에뮬레이터 안의 소프트웨어는 자신이 하드웨어를 통해 실행되는 것으로 알고 있지만, 사실은 다른 개발자가 만든 소프트웨어에 의해 실행된다. 가상머신이 직접적으로 하드웨어에 액세스하지 않기 때문에 가상화보다 성능이 떨어진다. 하지만 호스트 시스템의 아키텍쳐와 관계없이 여러 종류의 게스트 OS를 실행할 수 있다 (Apple Mac M1칩은 ARM 아키텍쳐를 사용하므로, ARM 에뮬레이션을 사용하여 ARM 기반의 게스트 OS를 실행할 수 있다)
- 요약) 에뮬레이션은 기존의 리소스나 하드웨어를 이용하지 않고 소프트웨어적으로 구현하여 특정 시스템을 돌릴 수 있게 하는 것이고 / 가상화는 기존의 리소스나 하드웨어를 활용하여 시스템을 돌릴 수 있게 하는 것
2) 온라인으로 설치하는 과정에서 yum 이 동작하지 않음
"could not retrieve mirrorlist~~ "와 같은 네트워크 에러가 발생했다. 외부로 핑이 날아가지 않았다.
(cat /etc/resolv.conf : 비어있는 상태였음)
- ifup ens00('00'부분은 버전마다 다름) 해서 vi /etc/sysconfig/network-scripts/ifcfg-ens~
ONBOOT = yes / BOOTPROTO=dhcp / DNS = 8.8.8.8 설정
- ONBOOT = yes : 시스템이 부팅될 때 해당 네트워크 인터페이스가 자동으로 활성화된다.
- BOOTPROTO=dhcp: 네트워크 인터페이스가 부팅될 때 DHCP 서버로부터 IP 주소를 동적으로 할당받는다. DHCP는 Dynamic Host Configuration Protocol의 약자로, 네트워크 장치가 IP 주소와 관련된 다양한 네트워크 설정을 자동으로 구성할 수 있게 해준다.
- DNS = 8.8.8.8: 시스템이 사용할 DNS 서버를 지정한다. "8.8.8.8"은 Google Public DNS의 IP 주소이다. Google Public DNS는 무료로 제공되는 공용 DNS 서비스로, 안정적이고 빠른 DNS 해결을 제공한다. 이러한 공용 DNS 서버를 사용하면 일반적으로 더 빠르고 안정적인 인터넷 연결을 얻을 수 있다. DNS 설정을 통해 시스템은 인터넷에서 호스트 이름을 해석할 때 이 DNS 서버를 쿼리하여 IP 주소를 가져온다.
=> 8.8.8.8 로 핑을 보내 네트워크 정상 확인
3) 맥북에서 ssh로 해당 서버 접속 (마우스 휠, 복붙, 화면 사이즈 조정 등이 안됨 <- 게스트 확장 설치하면 된다고 함)
- 가상머신에서 ip addr show 로 IP 확인 (=> dhcp 로 받아온 IP)
- 맥북 터미널에서 ssh root@받아온IP , root 계정으로 로그인
2. postgreSQL 설치 및 기본 구성 (온라인, 오프라인)
인터넷이 되는 환경(online, 집에서 Cent OS 가상머신에서 진행 - UTM)에서는 yum install을 통해 설치가 가능하다(인터넷이 되는 환경이므로) 이때, 아래의 2가지 순서를 따른다.
1) RPM Repository를 설치하고
2) PostgreSQL을 설치한다
sudo yum install -y [repository RPM 주소 / RPM 파일의 주소 ] ( -y 옵션은 yes 옵션으로 ~~ 하시겠습니까? 와 같은 질문들에 yes 고정 응답하고 넘어가게 해주는 옵션이다) |
이 경우, 설치링크는 아래 2개 중에서 고르면 된다.
- https://download.postgresql.org/
어디서 받아도 상관없다.
굳이 차이를 두자면, [ download.postgresql.org ]는 PostgreSQL 소프트웨어 및 관련 리소스를 제공하는 곳이고, [ yum.postgresql.org ]는 RPM 기반의 리눅스 시스템에서 PostgreSQL을 쉽게 설치하기 위한 RPM 패키지를 제공하는 것이라고 한다.
인터넷이 안 되는 경우(offline, 회사에서 진행 - Red Hat Enterprise Linux - RHEL 폐쇄망 환경)에는 rpm 파일을 직접 서버로 가지고 들어온 다음, rpm 명령어를 통해 설치하면 된다. 이때, 4가지 rpm 파일이 필요한데, 이들을 꼭 순서대로 설치해야한다.
1) postgresql15-libs : 데이터베이스 시스템의 라이브러리 제공, postgreSQL을 사용하는 애플리케이션을 개발하거나 컴파일할 때 필요한 라이브러리들을 포함한다. postgreSQL 클라이언트 및 서버 애플리케이션과의 상호작용을 위해 필요하다.
2) postgresql15 : 데이터베이스 서버를 제공한다. 데이터베이스 시스템의 핵심이며, 데이터 저장 / 쿼리 실행 / 인덱싱 등의 기능을 담당한다. 데이터베이스 엔진 자체를 설치하는데 사용된다.
3) postgresql15-server : 데이터베이스 서버를 시작하고 관리하는데 필요한 실행파일과 설정파일을 제공한다. 일반적으로는 postgresql15 패키지에 의존한다.
4) postgresql15-contrib : 추가기능 및 확장을 제공한다. 예를들어, 다양한 데이터 유형을 처리하는 추가함수, 외부 데이터 소스와의 연동을 위한 모듈, 데이터베이스 튜닝을 위한 도구 등을 포함한다.
어떤 이유인지 정확하게는 모르지만, 테스트삼아 각 파일들의 순서를 바꿔서 설치해보았으나, 에러를 뱉어내더라.
필요한 rpm 파일들은 공식 사이트에서 받아도 되고, 미러링 사이트에서 받아도 된다.
나의 경우는 https://download.postgresql.org/pub/repos/yum/15/redhat/rhel-7-aarch64/
위의 링크에서 필요한 4가지의 rpm 파일을 다운받았다(postgreSQL 15)
설치 명령어 예시, sudo rpm -ivh [rpm 파일]
- i : 패키지를 설치하고자 함
- v : 자세히를 의미, 설치과정에서 더 자세한 출력을 제공
- h : 패키지 아카이브가 풀리는 동안, 마크(#)를 표시하여 설치 진행 상황을 보여줌
추가로, 온라인 - 집에서 진행했을 경우에는 2번째 단계를 진행할 때, [ Requires : libzstd >= 1.4.0 ] 라는 에러가 나왔다(회사에서는 이런 에러 없이 순조롭게 진행되었다) 정확하게는 이해하지 못했지만, 두번째 단계인 postgresql13을 설치하는 단계에서 우선적으로 필요한 라이브러리가 있나보다(아마도, 4가지 rpm 파일을 순서대로 받아야하는, 종속성이 있는 것도 같은 맥락일 거라 생각했다)
위의 에러를 해결하기 위해서, epel-release를 추가로 설치하였다.
sudo yum install epel-release sudo yum install libzstd-devel |
epel-release : EPEL(Extra Packages for Enterprise Linux) 저장소를 시스템에 추가하기 위한 RPM 패키지이다. EPEL은 Red Hat Enterprise Linux (RHEL)와 CentOS와 같은 기업용 리눅스 배포판을 위한 추가 패키지 저장소이다. 기본 RHEL 및 CentOS 저장소에 비해 더 많은 소프트웨어 패키지를 제공한다. 이 저장소는 주로 커뮤니티에서 개발한 소프트웨어 및 패키지를 호스팅하며, 서드파티 및 추가 기능을 제공한다. 예를 들어, 개발 도구, 추가 라이브러리, 웹 서버, 데이터베이스 등의 패키지를 포함한다. epel-release 패키지를 시스템에 설치하면 EPEL 저장소가 시스템의 패키지 관리자에 등록되어 추가 패키지를 설치할 수 있다.
오프라인으로도 이런 문제가 생길 수 있을거라고 판단해서, rpm 파일의 링크를 찾아두었다.
- https://rpmfind.net/linux/rpm2html/search.php?query=libzstd
- https://rhel.pkgs.org/7/epel-aarch64/libzstd-1.4.2-1.el7.aarch64.rpm.html
현재 시스템에 postgreSQL 패키지가 잘 설치되었는지 확인한다.
rpm -qa | grep postgre 명령어를 통해 아래의 항목들이 잘 있는지 확인하였다. - postgresql15-server-15.6 ~~ - postgresql15-contrib-15.6 ~~ - postgresql15-libs-15.6 ~~ - postgresql15-15.6 ~~ |
initdb 명령어를 통해 기본 데이터베이스를 설치한다. 기본 데이터베이스는 postgres라는 이름으로 생성된다.
sudo /usr/pgsql-15/bin/postgresql-15-setup initdb |
initdb : PostgreSQL 데이터베이스 클러스터를 초기화하고 초기 설정을 수행한다. 데이터베이스 클러스터란 PostgreSQL에서 데이터 파일, 로그 파일, 설정 파일 등 데이터베이스 시스템이 작동하는 데 필요한 모든 파일과 프로세스의 집합을 의미한다. 기본적으로 아래 4가지 항목을 포함한다.
- 데이터 디렉토리 생성 : 데이터베이스 클러스터를 저장할 디렉토리를 생성한다. 이 디렉토리에는 데이터파일, 로그파일, 임시파일 등이 저장된다.
- 구성 파일 생성 : postgreSQL 서버의 구성을 지정하는 postgresql.conf 파일과 접속 규칙을 정의하는 pg_hba.conf 파일을 생성한다. 이러한 구성 파일을 수정하여 postgreSQL 서버의 동작을 제어한다.
- 시스템 테이블 생성 : postgreSQL 시스템 테이블을 생성하고 초기 데이터를 로드한다. 이 시스템 테이블에는 postgreSQL 서버의 메나 데이터 및 시스템 정보가 저장된다.
- 기타 초기화 작업 : 기타 초기화 작업을 수행하여 데이터베이스 클러스터의 시작을 준비한다. 이는 필요한 디렉토리 및 파일의 권한 성정, 기본 인코딩 및 로케일 설정 등을 포함한다. 이후에 따로 기록해두겠지만, 인코딩 및 로케일 설정의 경우 런타임에는 수정할 수 없어서 또는 디비가 구성되고는 바꿀 수 없어서 / 디비를 다시 설치해야하는 상황을 마주치곤 한다.
postgreSQL 서비스 등록 및 실행
(등록) sudo systemctl enable postgresql-15 - 서버가 부팅될 때, 자동으로 postgreSQL를 실행하도록 한다. (실행) sudo systemctl start postgresql-15 - 현재 세션에서 즉시 postgreSQL를 실행한다. |
systemctl : 시스템 서비스와 프로세스를 관리하는 명령어이다. 주로 시스템 초기화 및 관리 프레임워크인 systemd와 함께 사용된다.
- 서비스 시작 : systemctl start [service name]
- 서비스 중지 : systemctl stop [service name]
- 서비스 부팅 시 자동 시작 : systemctl enable [service name]
- 서비스 부팅 시 자동 시작 해제 : systemctl disable [service name]
postgreSQL DB 접속
sudo -u postgres psql |
postgreSQL 데이터베이스 생성
postgres=# create database 디비이름 encoding 'utf-8'; |
생성된 데이터베이스 조회
postgres=# \list |