macOS에서 UTM을 활용한 DevStack 구축 실습
작성자: 김일여
실습 일자: 2026년 10월 19일
보고서 작성: 2026년 10월 20일
1. 실습 목적
프로젝트에서 OpenStack을 사용하기 전에 직접 설치해보고 싶어서 맥북에 DevStack을 설치해보았다.
UTM으로 Ubuntu 가상 머신을 만들고, 그 안에서 DevStack 설치를 진행했다. 설치 후에는 CLI에서 서비스 목록을 확인하고, 웹 대시보드인 Horizon에도 접속해보았다.
아직 설치에 사용한 명령과 각 서비스의 역할을 모두 이해한 것은 아니어서, 이번에는 설치 과정과 막혔던 부분을 기록하는 데 집중했다.
2. 실습 환경
| 구분 | 구성 |
|---|---|
| 사용한 컴퓨터 | Apple Silicon MacBook |
| 가상화 도구 | UTM |
| 가상 머신 이름 | DevStack-Ubuntu |
| 운영체제 | Ubuntu Server 24.04.4 LTS |
| CPU 아키텍처 | ARM64 / aarch64 |
| 할당 자원 | CPU 4개, 메모리 8GB, 가상 디스크 80GiB |
| 호스트 이름 | devstack-lab |
| Ubuntu 로그인 계정 | ubuntu |
| DevStack 설치 계정 | stack |
| DevStack 설치 경로 | /opt/stack/devstack |
| DevStack 브랜치 | stable/2026.2 |
| VM IP 주소 | 192.168.64.4 |
맥북 안에 Ubuntu 가상 머신을 만들고, 그 안에 OpenStack을 설치하는 방식으로 진행했다.
MacBook / macOS
|
v
UTM
|
v
Ubuntu Server 가상 머신
|
v
DevStack으로 OpenStack 설치
|
+-- CLI에서 서비스 확인
+-- 브라우저에서 Horizon 접속
3. 설치 과정
3.1. Ubuntu 가상 머신 준비
UTM에서 Ubuntu 가상 머신을 만들었다. Apple Silicon 맥북을 사용하고 있어서 ARM64용 Ubuntu Server 설치 이미지를 사용했다.
Ubuntu 설치 후 로그인하고 다음 명령으로 운영체제와 IP 주소 등을 확인했다.
uname -m
cat /etc/os-release
hostname
ip -4 addr
처음에는 맥북 터미널과 Ubuntu 터미널이 헷갈렸다. 이후 설치 명령은 UTM 안의 Ubuntu에서 실행했다.
3.2. DevStack 소스 내려받기
Ubuntu에서 Git을 이용해 DevStack 소스를 내려받았다. 사용한 브랜치는 stable/2026.2이다.
git clone -b stable/2026.2 https://opendev.org/openstack/devstack
cd devstack
아래에 적은 명령은 설치하면서 사용한 주요 명령을 정리한 것이다.
3.3. stack 계정 만들기
DevStack 설치에 사용할 stack 계정을 만들기 위해 다음 스크립트를 실행했다.
sudo ./tools/create-stack-user.sh
이후 DevStack 소스를 /opt/stack/devstack에 준비하고, stack 계정으로 전환하여 설치를 진행했다.
sudo -iu stack
cd /opt/stack/devstack
설치하면서 ubuntu는 Ubuntu 로그인에 사용하는 계정이고, stack은 DevStack 설치에 사용하는 계정이라는 것을 알게 되었다.
3.4. local.conf 설정
설치 전에 local.conf 파일에 IP 주소와 설치 옵션 등을 설정했다.
주요 설정은 다음과 같다.
[[local|localrc]]
HOST_IP=192.168.64.4
LIBVIRT_TYPE=kvm
CIRROS_ARCH=aarch64
LOGFILE=/opt/stack/logs/stack.sh.log
LOG_COLOR=False
disable_service cinder c-api c-vol c-sch tempest
ARM64 환경에 맞춰 CIRROS_ARCH를 aarch64로 설정했다. 이번 설치에서는 Cinder와 Tempest를 사용하지 않도록 설정했다.
다음 비밀번호 항목도 별도로 설정했다. 실제 비밀번호는 보고서에 적지 않았다.
ADMIN_PASSWORD
DATABASE_PASSWORD
RABBIT_PASSWORD
SERVICE_PASSWORD
설정 항목을 하나하나 이해하면서 작성한 것은 아니어서, 각 옵션이 하는 일은 추가로 공부할 예정이다.
3.5. DevStack 설치 실행
설정을 마친 뒤 다음 명령으로 설치를 시작했다.
cd /opt/stack/devstack
./stack.sh
설치가 진행되면서 패키지 설치와 서비스 설정에 관한 로그가 많이 출력되었다. 설치가 끝난 뒤 로그에서 DevStack과 Ubuntu 버전 정보를 확인했다.
4. 설치하면서 막혔던 부분
4.1. 맥북 터미널과 Ubuntu 터미널 혼동
처음에는 맥북 터미널에서 /etc/os-release를 확인하려고 했는데 파일이 없다고 나왔다.
Ubuntu에서 실행해야 하는 명령을 macOS에서 실행한 것이었다. UTM의 Ubuntu 터미널로 이동하여 다시 실행했다.
이후에는 명령을 입력하기 전에 지금 맥북 터미널인지, Ubuntu 터미널인지 먼저 확인했다.
4.2. sudo 비밀번호 입력
계정 생성 과정에서 다음 메시지가 나왔다.
sudo: a password is required
비밀번호 입력 없이 실행하려던 명령이어서 진행되지 않았다. 일반 sudo 명령으로 다시 실행하고 Ubuntu 비밀번호를 입력하니 다음 단계로 넘어갔다.
처음에는 어떤 비밀번호를 입력해야 하는지도 헷갈렸다. 이때는 OpenStack 비밀번호가 아니라 Ubuntu 계정의 비밀번호를 입력했다.
4.3. 비밀번호 설정 실패
비밀번호를 설정하는 과정에서 다음 메시지들이 나왔다.
Password mismatch or shorter than 12 alphanumeric characters.
Setup not started.
AssertionError: Use English letters and digits only
당시 사용한 비밀번호 입력 보조 절차에서는 영문자와 숫자로 된 12자 이상의 비밀번호를 두 번 똑같이 입력해야 했다.
영어 입력 상태를 확인하고 조건에 맞춰 다시 입력하여 해결했다. 여기서 12자 조건은 당시 사용한 입력 보조 절차의 조건이다.
이후 다음 메시지가 나왔다.
Password saved. Ready to install.
처음에는 이 메시지를 보고 설치까지 된 것인지 헷갈렸는데, 비밀번호 저장이 끝나고 설치할 준비가 되었다는 뜻이었다. 실제 설치는 이후 ./stack.sh를 실행하여 진행했다.
4.4. 대문자로 명령 입력
명령이 대문자로 입력되어 command not found가 나온 적도 있었다.
Caps Lock과 입력 언어를 확인한 뒤 소문자로 다시 입력했다. 명령을 입력할 때 대소문자도 확인해야 한다는 것을 알게 되었다.
4.5. Horizon 접속 오류
설치가 진행 중일 때 Horizon에 접속했더니 다음 오류가 나타났다.
OfflineGenerationError
당시에는 설치에 문제가 생긴 것인지 걱정했는데, 설치가 끝난 뒤 새로고침하니 로그인 화면이 정상적으로 열렸다.
이 오류의 자세한 원인은 아직 이해하지 못했지만, 이번에는 설치가 끝난 뒤 다시 접속하여 해결되었다.
5. 설치 후 확인한 내용
5.1. CLI에서 서비스 확인
설치 후 다음 명령을 실행하고 OpenStack CLI를 사용했다.
cd /opt/stack/devstack
source openrc admin admin
이후 서비스 목록과 컴퓨트 서비스 상태를 확인했다.
openstack service list
openstack compute service list
Keystone, Glance, Nova, Neutron, Placement 등의 서비스가 목록에 표시되었다.
10월 20일 다시 확인했을 때도 nova-scheduler, nova-conductor, nova-compute가 enabled, up 상태로 나왔다.
enabled는 사용하도록 설정되어 있다는 뜻이고, up은 서비스가 동작 중인 것으로 확인된 상태라고 이해했다.
이미지, 네트워크와 VM 사양도 다음 명령으로 확인했다.
openstack image list
openstack network list
openstack flavor list
| 확인한 항목 | 결과 |
|---|---|
| 이미지 | cirros-0.6.3-aarch64-disk가 active 상태로 표시됨 |
| 네트워크 | private, public이 표시됨 |
| VM 사양 | flavor 목록이 표시됨 |
또한 다음 명령으로 실패한 서비스가 있는지 확인했다.
sudo systemctl --failed --no-pager
조회 결과 실패한 유닛은 없었다.
각 서비스가 정확히 어떤 일을 하는지는 더 공부해야 하지만, CLI에서 목록과 상태를 확인하는 방법을 사용해볼 수 있었다.
5.2. Horizon 접속
맥북 브라우저에서 다음 주소로 접속했다.
http://192.168.64.4/dashboard/
OpenStack Horizon 로그인 화면이 정상적으로 열렸다. 10월 20일 Ubuntu VM을 다시 실행한 뒤에도 접속되는 것을 확인했다.
192.168.64.4는 이번 실습에서 사용한 Ubuntu VM의 주소다.
5.3. 아직 확인하지 못한 부분
현재는 CLI에서 서비스 목록과 상태를 확인하고, Horizon 로그인 화면에 접속하는 것까지 진행했다.
OpenStack에서 테스트 VM을 만들고 정상적으로 부팅되는지, 네트워크 통신이 되는지는 아직 확인하지 못했다. 이 부분은 다음 실습에서 진행하려고 한다.
6. 배운 점
처음에는 설치 명령을 입력하면 바로 진행될 것이라고 생각했는데, 실제로는 실행 위치나 계정, 비밀번호 입력 같은 부분에서도 여러 번 막혔다.
특히 맥북 터미널과 Ubuntu 터미널을 구분하고, 어떤 계정으로 명령을 실행하는지 확인하는 것이 중요했다. 비밀번호를 입력할 때도 Ubuntu 비밀번호인지 OpenStack에서 사용할 비밀번호인지 구분해야 했다.
설치 후에는 CLI에서 서비스 목록을 확인하고 Horizon 로그인 화면에도 접속해보았다. 다만 화면이 열린다고 해서 모든 기능을 확인한 것은 아니며, VM 생성과 통신도 직접 해봐야 한다는 것을 알게 되었다.
아직 local.conf의 설정이나 stack.sh가 내부에서 하는 일을 모두 이해한 것은 아니다. 시험이 끝나면 이번 설치 과정을 다시 보면서 사용한 명령과 OpenStack 서비스들의 역할을 공부할 예정이다.
7. 다음에 해볼 내용
- OpenStack에서 테스트 VM 만들기
- 생성한 VM이 정상적으로 부팅되는지 확인하기
- VM의 네트워크 통신 확인하기
local.conf설정과stack.sh가 하는 일 공부하기- 실습 내용을 정리하여 OpenInfra Lab Kit 문서에 반영하기


