• Home
  • About
    • lahuman photo

      lahuman

      열심히 사는 아저씨

    • Learn More
    • Facebook
    • LinkedIn
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

WSL2에서 VAGRANT로 Windows VirutalBox에 ubuntu VM 실행

07 Jan 2022

Reading time ~5 minutes

WSL2에서 VAGRANT로 ubuntu 설치 해보기

Kubernetes Advanced Networking Study를 위해서 vagrant를 windows에 설치했습니다. 그리고 vagrant ssh 명령어를 실행했을 때, private_key 파일에 권한이 너무 많이 오픈되었다는 오류를 만났습니다. windows 10에서는 해당 오류를 보안 설정에서 수정이 가능한다고 하지만, windwos 11에서는 해당 메뉴가 보이지 않았습니다. 이를 해결하기 위해서 삽집을 계속 하다가, 이럴꺼면 wsl2에서 vagrant를 실행하고 싶어 검색해 보니 How to run Vagrant + VirtualBox on WSL 2 (2021)를 찾았습니다. 이를 보고 따라한 과정을 정리하였습니다.

준비 사항

2022년도 1월 7일 기준으로 설치했습니다.

  • windows 11 (10 이상)
  • VirtualBox
  • wsl2
  • Vagrant
  • Vagrant plugin: virtualbox_WSL2
  • PowserShell 7.2 이상

1. VirtualBox 설치

VirtualBox 6.1.30 버전을 설치 했습니다.

이곳에서 다운로드를 받습니다.

Windows hosts를 클릭해서 VirtualBox-6.1.30-148432-Win.exe 를 다운 받은 후 설치를 합니다.

2. PowserShell 7.2 설치

이곳에서 다운로드를 받습니다.

저의 경우는 PowerShell-7.2.1-win-x64.msi 파일을 받아서 설치 했습니다.

3. wsl2 설치

windows 10에서는 복잡하게 설치해야 했던 wsl2를 windows 11은 Powsershell에서 아래 명령어로 설치 할 수 있습니다.

$ wsl --install

기본적으로 wsl2가 설치되며 Linux 배포판은 Ubuntu입니다.

설치 참고 자료

4. Vagrant 설치

wsl2를 관리자 모드로 실행합니다.

검색버튼을 누르고 Ubuntu로 검색하여서 관리자 권한으로 실행합니다.

wsl2 에서 다음 명령어로 vagrant를 설치 합니다.

$ curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
$ sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
$ sudo apt-get update && sudo apt-get install vagrant

이후 환경 변수에 다음을 추가 합니다.

# ~/.bashrc 에 VAGRANT_WSL_ENABLE_WINDOWS_ACCESS과 virtualbox 위치 추가
$ echo 'export VAGRANT_WSL_ENABLE_WINDOWS_ACCESS="1"' >> ~/.bashrc
$ echo 'export PATH="$PATH:/mnt/c/Program Files/Oracle/VirtualBox"' >> ~/.bashrc

# ~/.bashrc 다시 로드 처리
$ source ~/.bashrc

4.1 Install virtualbox_WSL2 plugin 설치

vagrant 설치가 완료 되었다면, virtualbox_WSL2 플러그인을 설치합니다.

$ vagrant plugin install virtualbox_WSL2

해당 플러그인은wsl2와 virtualbox 간의 ssh 연결 오류를 해결해 줍니다.

5. WSL2 에서 Vagrant 를 이용해서 Hello World VM 생성하기

Vagrant를 사용하기 위해서는 Windows 파일 시스템에서 진행해야 합니다. 다음 명령어로 Hello World 프로젝트를 실행합니다.

# Windows 밑에 사용자 디렉토리로 이동
$ cd /mnt/c/Users/<my-user-name>/

# projects/vagrant-demo 디렉토리 생성
$ mkdir -p projects/vagrant-demo
$ cd projects/vagrant-demo

#  Vagrant CLI를 이용해서 vagrantfile 생성
$ vagrant init hashicorp/bionic64
$ ls -l Vagrantfile

# Vagrantfile을 이용한 VM 생성
$ vagrant up

# SSH로 VM에 접근
$ vagrant ssh

6. WSL2 에서 KANS 1주차 VM 생성하기

앞의 긴 여정은 사실 KANS에서 진행할 1주차 VM 생성을 위한 작업이었습니다. 작업을 하면서 발생한 오류를 해결을 하였습니다.

Vagrantfile 파일은 가시다님이 제공해주시는 파일입니다.

내용을 간단하게 설명하면 아래와 같습니다.

Vagrant.configure("2") do |config|
  # 이미지 정보
  config.vm.box = "ubuntu/focal64"
  config.vm.box_version = "20211026.0.0"
  # 실행 shell 
  config.vm.provision "shell", inline: "echo 'sudo su -' >> .bashrc"
  config.vm.provision "shell", inline: "apt update"
  config.vm.provision "shell", inline: "apt install -y conntrack bridge-utils net-tools resolvconf jq tree"
  config.vm.provision "shell", inline: "echo 'nameserver 8.8.8.8' > /etc/resolvconf/resolv.conf.d/head"
  config.vm.provision "shell", inline: "resolvconf -u"
  # network 설정 
  config.vm.network "private_network", ip: "192.168.50.10"
  config.vm.network "forwarded_port", guest: 22, host: 60510, auto_correct: true, id: "ssh"
  # synced_folder 설정
  config.vm.synced_folder "./", "/vagrant", disabled: true
  # virtualbox 설정
  config.vm.provider "virtualbox" do |spec|
    # memory 설정
    spec.memory = "2048"
    # cpu 설정
    spec.cpus = "2"
    spec.linked_clone = true
  end
end

Vagrantfile을 curl로 받은 후 vagrant up 명령어를 실행하면 됩니다.

$ curl -O https://raw.githubusercontent.com/gasida/NDKS/main/1/Ubuntu/Vagrantfile
$ vagrant up

아래는 vagrant up 를 했을 때 발견된 오류들 입니다.

6.1 host-only 오류 해결하기

6.7. Host-Only Networking 참고해서 작업 하면 쉽게 해결할 수 있는 문제 입니다.

# 관리자 권한으로 실행해야 합니다.
$ sudo mkdir /etc/vbox/
$ sudo vi /etc/vbox/networks.conf

# * 를 포함해서 아래 내용을 등록 합니다.
# * 를 포함하지 않을 경우 오류가 발생합니다.
* 10.0.0.0/8 192.168.0.0/16

#  :qw 로 저장후 다시 vagrant up을 실행합니다.

6.2 VirtualBox에서 startvm --type headless error 오류 해결하기

Stderr: VBoxManage.exe: error: RawFile#0 failed to create the raw output file ../ubuntu-xenial-16.04-cloudimg-console.log (VERR_PATH_NOT_FOUND)을 참고하면, virtualbox 구성에서 직렬 포트를 OFF해서 해결이 되었다 합니다.

이는 VM 생성후 처리 해야하는 방식으로 저는 Vagrantfile에 spec.customize [ "modifyvm", :id, "--uartmode1", "disconnected" ]을 추가 하여 VM 생성과 함게 처리하였습니다.

Vagrant.configure("2") do |config|
  # 이미지 정보
  config.vm.box = "ubuntu/focal64"
  config.vm.box_version = "20211026.0.0"
  # 실행 shell 
  config.vm.provision "shell", inline: "echo 'sudo su -' >> .bashrc"
  config.vm.provision "shell", inline: "apt update"
  config.vm.provision "shell", inline: "apt install -y conntrack bridge-utils net-tools resolvconf jq tree"
  config.vm.provision "shell", inline: "echo 'nameserver 8.8.8.8' > /etc/resolvconf/resolv.conf.d/head"
  config.vm.provision "shell", inline: "resolvconf -u"
  # network 설정 i
  config.vm.network "private_network", ip: "192.168.50.10"
  config.vm.network "forwarded_port", guest: 22, host: 60510, auto_correct: true, id: "ssh"
  # synced_folder 설정
  config.vm.synced_folder "./", "/vagrant", disabled: true
  # virtualbox 설정
  config.vm.provider "virtualbox" do |spec|
    # memory 설정
    spec.memory = "2048"
    # cpu 설정
    spec.cpus = "2"
    spec.linked_clone = true
    # 직렬포트 disconnected 설정
    spec.customize [ "modifyvm", :id, "--uartmode1", "disconnected" ]
  end
end

6.3 ssh timeout 오류 발생시

ssh 접근시 timeout의 경우는 단순하게 VM이 완전히 기동되지 않아서 발생하는 문제일 가능성이 높습니다.

VirutalBox의 VM 상태를 확인하고 다시 vagrant up 명령어를 실행하면 정상 기동 되었습니다.

다른 방법으로 Vagrantfile에 아래와 같이 timeout 시간을 지정할 수 있습니다.

Vagrant.configure("2") do |config|
  # timout 변경 처리 기본 값은 300 입니다.
  config.vm.boot_timeout = 1800
  config.vm.box = "ubuntu/focal64"
  config.vm.box_version = "20211026.0.0"
  config.vm.provision "shell", inline: "echo 'sudo su -' >> .bashrc"
  config.vm.provision "shell", inline: "apt update"
  config.vm.provision "shell", inline: "apt install -y conntrack bridge-utils net-tools resolvconf jq tree"
  config.vm.provision "shell", inline: "echo 'nameserver 8.8.8.8' > /etc/resolvconf/resolv.conf.d/head"
  config.vm.provision "shell", inline: "resolvconf -u"
  config.vm.network "private_network", ip: "192.168.50.10"
  config.vm.network "forwarded_port", guest: 22, host: 60510, auto_correct: true, id: "ssh"
  config.vm.synced_folder "./", "/vagrant", disabled: true
  config.vm.provider "virtualbox" do |spec|
    spec.memory = "2048"
    spec.cpus = "2"
    spec.linked_clone = true
    spec.customize [ "modifyvm", :id, "--uartmode1", "disconnected" ]
  end
end

6.4 wsl2 에서 private-key Permissions 오류 발생시 또는 chmod 동작 안할 시 처리 방안

아래와 같은 오류가 발생한거나, /mnt/c/User/lahum 이하 디렉토리 또는 파일이 0777 권한을 가지고 있다면,

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0777 for '/home/lahuman/.ssh/private-key.pem' are too open.

/etc/wsl.conf 파일에 아래의 내용을 저장 하세요.

$ sudo vi /etc/wsl.conf

# 아래 내용 추가 후 저장
[automount]
enabled = true
options = metadata,uid=1000,gid=1000,umask=0022

이후 powsershell에서 wsl을 중지 후 다시 실행 합니다.

# wsl 종료 명령어
$ wsl --shutdown

6.5 ssh 접근 성공

험난 했던 문제들를 해결하고 드디어 vagrant ssh로 VM에 SSH 접근을 하였습니다.

작업을 하면서 많이 배우고 알게 된 귀중한 시간이었습니다.

마지막으로

스터디의 첫 시간을 준비하며 Vagrant를 처음 경험해보았는데, 신기하고 재미있었습니다. 그리고 terraform과 같은 회사에서 만든 프로젝트라는 것도 알게 되었습니다.

두 Tool의 차이는

  • Vagrant는 개발 환경 관리에 중점을 둔 도구 => 개발 환경을 위한 것
  • Terraform은 인프라 구축을 위한 도구 => 인프라 관리를 위한 것

라고 합니다.

마지막으로 앞으로의 Kubernetes Advanced Networking Study 여정도 많이 기대 됩니다.

참고 자료

  • How to run Vagrant + VirtualBox on WSL 2 (2021)
  • KANS[1기]
  • Stderr: VBoxManage.exe: error: RawFile#0 failed to create the raw output file ../ubuntu-xenial-16.04-cloudimg-console.log (VERR_PATH_NOT_FOUND)
  • 6.7. Host-Only Networking
  • troubleshooting


wsl2vagrantubuntu Share Tweet +1