본문 바로가기

프로그래밍/기타

Vagrant 관련 이슈 글 모음

Docker 관련으로 된 글을 보던중 Vagrant를 알게 되어 Vagrant를 설치하게 되었다. Vagrant에 대한 설치는 도커 Docker 기초 확실히 다지기 이 글을 보고 Vagrant를 설치했다. 그러나 Vagrant를 설치 및 운영하다 보면 이슈사항이 나올것 같아서 개인 기록 및 공유 차원에서 이 글에 기록해두고자 한다. 그래서 이 글은 그런 이슈 사항이 나올때마다 갱신될 예정이다(근데 Vagrant 이건 발음이 어떻게 되나..베이그랜트? 바그랜트?)

 

1. Windows 10에서 위에 링크되어 있는 글을 보고 설치한뒤 centos/7 으로 VM을 하나 만들어서 vagrant ssh를 실행하니 vagrant@127.0.0.1: Permission denied (publickey,gssapi-keyex,gssapi-with-mic). 에러가 발생하면서 ssh에 대한 접속이 이루어지지 않았다. 이것에 대해 검색해보니 환경변수로 VAGRANT_PREFER_SYSTEM_BIN을 만든 뒤 이 변수에 값을 0을 주면 해결이 된다고 해서 이 방법을 써서 해결이 되었다. VAGRANT_PREFER_SYSTEM_BIN 환경변수가 궁금한 사람은 여기를 클릭해서 보면 된다.

 

2. 1번의 문제를 해결한뒤 ssh를 접속해보니 vagrant 란 계정을 디폴트로 만든뒤에 이 계정으로 접속이 되었다. 그러나 root 계정이 아니기 때문에 yum 명령을 이용해서 프로그램을 설치할려면 sudo 명령을 같이 써야 한다(ex: sudo yum ...) 이것이 불편해서 root 계정의 패스워드가 무엇인지 찾아봤는데 기본적으로 root 계정의 패스워드는 vagrant로 설정하고 있다. 그러나 현재는 Vagrantfile에서 root 계정의 패스워드를 설정하는 방법을 찾지는 못한 상황이다. VM을 만드는 시점에 root 계정의 패스워드를 지정하면 편할텐데 아직은 모르겠다.

 

3. Windows 10에서 Vagrant를 설치하니 Vagrant에서 box로 통하는 이미지들(docker로 하다보니 용어가 이미지로 되어버렸다)은 받아지는 위치의 기준이 C:\Users\사용자 계정\.vagrant.d 이 디렉토리 밑에 boxes라는 디렉토리에 받아지고 있었다. .vagrant.d 디렉토리가 Vagrant의 Home 디렉토리 역할을 하고 있다. 이 Home 설정 개념이 Java나 Maven과는 약간 다른데 Java나 Maven의 경우 JAVA_HOME과 MAVEN_HOME은 Java나 Maven이 설치된 디렉토리를 가르켜야 하지만 Vagrant의 경우는 그렇지가 않다(실제로 나는 Vagrant를 D:\Vagrant에 설치했다) 이 이미지를 받는 디렉토리가 C 드라이브에 있을 경우 C 드라이브 용량이 작아지는 상황이 벌어질수 있어서 위치를 바꾸었다. 위치르 바꿀때는 환경변수로 VAGRANT_HOME에 지정하면 된다(나는 VAGRANT_HOME을 D:\Vagrant_VMS\.vagrant.d 로 지정했다) 이때 주의점이 있다. VAGRANT_HOME에 매핑되는 디렉토리를 Vagrant가 설치된 디렉토리(나의 경우로 예를 들면 D:\Vagrant 가 된다)의 하위 디렉토리로 설정하면 안된다. Vagrant를 설치하면 Vagrant가 설치된 디렉토리는 일반 계정으로는 접근이 안되기 때문에 읽거나 쓰지 못하는 상황이 벌어져서 이미지를 다운로드 받지 못하게 된다. 그래서 위에서 언급한 설정으로 Vagrant 설치 디렉토리가 아닌 D:\Vagrant_VMS\.vagrant.d로 지정했다.

 

4. Vagrant를 이용하던 도중 vagrant up을 하던 과정에서 다음과 같은 에러가 발생되었었다..

 

D:/Vagrant/embedded/gems/2.2.7/gems/vagrant-2.2.7/lib/vagrant/util/io.rb:32:in `encode': "\xEC\x84" from CP949 to UTF-8 (Encoding::UndefinedConversionError)

 

이 에러 문구는 2.2.7 버전에서 나왔지만 사실 2.2.5 버전을 이용하던 도중 이 문제가 발생하여 2.2.7로 업그레이드하면 해결이 될까 싶어서 업그레이드를 했었지만 그래도 해결이 되지를 않았었다. 언어 코드 셋 문제인거 같아서 Vagrantfile을 수정해서 저장한뒤 해보기도 하고 Vagrantfile을 지운뒤에 다시 작성해서 작업해도 해결이 되지를 않았었다. 그래서 구글링을 한 결과 다음의 방법으로 이를 해결할 수 있었다(이 방법은 여기에서 참고했다)

 

Vagrant가 설치된 경로를 위에 에러문구를 기준대로 얘기하자면 D:/Vagrant에 설치되어 있는 상태이다. 에러 문구를 보면 D:/Vagrant/embedded/gems/2.2.7/gems/vagrant-2.2.7/lib/vagrant/util 디렉토리에 io.rb 란 파일이 있고 그 파일의 32번 라인 코드에서 문제가 발생한것인데 io.rb 파일을 Visual Studio Code 같은 본인이 자주 사용하는 문서 편집기 프로그램을 통해 파일을 열면 32번째 라인 코드에 다음과 같은 코드가 있다.

 

data << io.readpartial(READ_CHUNK_SIZE).encode("UTF-8", Encoding.default_external)

 

이 부분을 원본 코드 보관 차원에서 주석처리(io.rb 파일을 보면 알겠지만 #을 라인 앞에 붙이면 주석처리가 된다)한 뒤에 다음줄에 다음과 같이 넣어준다

 

data << io.readpartial(READ_CHUNK_SIZE).encode('UTF-8', invalid: :replace, undef: :replace, replace: '?')

 

두 코드를 비교해보면 encode 메소드 부분을 2개의 파라미터를 사용하는 메소드가 아니라 4개의 파라미터를 사용하는 encode 메소드를 사용하는 것을 알 수 있다. 이렇게 수정한뒤 vagrant up 을 진행하니 에러가 발생하지 않았다(io.rb 파일을 수정하고 저장하려 하니 관리자 권한이 필요하다는 에러가 나왔었다. 그래서 Visual Studio Code를 관리자 모드로 열고 파일을 수정했다)