2018년 8월 13일 월요일

Vagrant 사용 방법 (5)

지금까지는 인터넷에 공개되어 있는, public 형태의 이미지를 사용했었다.
이번에는 내가 만든, 나에게 맞춘, 나만의 이미지를 사용해 보도록 하자.

테스트를 위해서 인터넷에서 CentOS 7.2 를 다운로드 했다.
글을 쓰고 있는 현재 시점에서는 아래 링크에서 다운로드 했다.
http://vault.centos.org/7.2.1511/isos/x86_64/

virtualbox 에 새로 만들기를 클릭해서, 새로운 가상 머신을 만든다.


다운받은 CentOS 7.2 iso 파일을 통해서 설치를 진행하면 된다.


설치 완료 후, guest 머신에 개발을 위한 설정과 vagrant 를 위한 설정을 해줘야 한다.
guest 머신에 ssh 를 통해 접속하자.

root 로 로그인 후, 작업을 진행하자.
% su -
% yum groupinstall -y 'Development Tools'
% yum install -y kernel-devel perl wget

Ubuntu 경우는
% sudo apt-get install build-essential

virtualbox 에서 제공하는 "게스트 확장" 프로그램을 설치해야 한다.
"장치 - 게스트 확장 CD 이미지 삽입" 을 선택하면 iso 가 삽입된다.

참고로 위치는 이곳에 있다. (몰라도 된다)
/usr/share/virtualbox/VBoxGuestAdditions.iso


당연한 이야기 겠지만, IDE 컨트롤러가 있어야 한다.


iso 를 삽입했으니, 마운트를 해보자.
$ mount -r /dev/cdrom /media

설치를 하자.
$ /media/VBoxLinuxAdditions.run --nox11
그런데 에러가 발생했다.


kernel-devel의 특정 버전을 yum으로 설치하라는 내용이다.

이 포함되어 있다. 이 명령을 따라 kernel-devel을 설치하고 VBoxLinuxAdditions.run를 다시 실행하면 오류없이 설치가 된다.

설치하라고 하니까, 설치를 해야지 뭐.
% yum install kernel-devel-3.10.0-327.el7.x86_64


응? 에러나는데?
귀찮고 번거롭지만, 구글링을 해봐야겠다.
적당히 구글링을 해보니 찾을 수 있었다.

rpm 을 다운로드 하자.
% wget https://buildlogs.centos.org/c7.1511.00/kernel/20151119220809/3.10.0-327.el7.x86_64/kernel-devel-3.10.0-327.el7.x86_64.rpm

설치를 하자.
% rpm -Uvi kernel-devel-3.10.0-327.el7.x86_64.rpm

다시 시도를 해보자.
$ /media/VBoxLinuxAdditions.run --nox11


성공적으로 설치가 잘되었다.
만약 상위 버전이 존재한다고 메세지가 뜨면 그 버전을 삭제 후 다시 설치한다.
반드시 저 버전으로 설치를 해야 한다.

지금 진행중인 버전은 Cent OS 7.2 라서 kernel-devel-3.10.0-327 를 요구했다.
OS 버전마다 요구하는 kernel-devl 버전이 다를 수 있다.
아래 표에 정리해 놨으니 적당히 다운받도록 하자.

OSkernel-devel 버전Download 주소
CentOS 7.23.10.0-327https://buildlogs.centos.org/c7.1511.00/kernel/20151119220809/3.10.0-327.el7.x86_64/kernel-devel-3.10.0-327.el7.x86_64.rpm
CentOS 7.43.10.0-693https://buildlogs.centos.org/c7.1708.00/kernel/20170822030048/3.10.0-693.el7.x86_64/kernel-devel-3.10.0-693.el7.x86_64.rpm
CentOS 7.53.10.0-862http://mirror.centos.org/centos/7/os/x86_64/Packages/kernel-devel-3.10.0-862.el7.x86_64.rpm
Oracle Linux 7.23.8.13-98.7.1http://yum.oracle.com/repo/OracleLinux/OL7/UEKR3/x86_64/getPackage/kernel-uek-devel-3.8.13-98.7.1.el7uek.x86_64.rpm
Oracle Linux 7.44.1.12-94.3.9http://yum.oracle.com/repo/OracleLinux/OL7/UEKR4/x86_64/getPackage/kernel-uek-devel-4.1.12-94.3.9.el7uek.x86_64.rpm

다음 단계로 넘어가자.

구글링을 통해서 찾은 자료에서는 vboxadd 를 실행하라고 되어 있다.
$ /etc/init.d/vboxadd setup

그런데 아무리 찾아도 /etc 에는 vboxadd 가 없었다.
할 수 없이 / 에서 부터 찾아봤더니, /opt 에 있었다.
/opt/VBoxGuestAdditions-5.2.12/init/vboxadd

아무튼 난 저기에 있으니, 저걸 실행했다.
% /opt/VBoxGuestAdditions-5.2.12/init/vboxadd setup


성공적으로 설치가 잘 되었다.

일단 그룹을 생성하자.
$ groupadd -g 470 vagrant

"vagrant 라는 group 을 만들고, 그 group id 는 470 으로 지정해라" 라는 의미다.
왜 470 인가?
구굴링 하다 발견한 자료에서 저렇게 했길래 그냥 따라했다.
꼭 470 을 할 필요는 없다.
group id 를 부여하지 않으면, OS 에서 자동으로 부여를 할 것이다.

vagrant 계정을 추가하자.
$ useradd -g vagrant -u 470 vagrant
계정 id 도 470 으로 한다.

암호를 설정한다.
$ passwd vagrant
암호는 계정과 동일하게 vagrant 를 입력한다.
암호가 짧다고 뭐라뭐라 나올 수도 있다.
그냥 무시하고 하자.

vagrant 계정이 sudo 를 사용할 수 있도록 설정하자.
$ visudo

아래 내용을 추가해 넣자. (3줄)
Defaults    env_keep += "SSH_AUTH_SOCK"
Defaults:vagrant !requiretty
%vagrant        ALL=(ALL)       NOPASSWD: ALL

근데 어디에 넣어야 하나......
막상 visudo 를 실행하면, 어디에 해야 하지 라고 막막할 수도 있다.
그냥 가장 편하게 맨 마지막에 넣어도 된다.

근데..... 그냥 거기에 우아하게(graceful) 넣도록 노력했다.
파란색 글씨가 실제로 넣은 부분이다.

이렇게 한줄 넣고.
#
# Preserving HOME has security implications since many programs
# use it when searching for configuration files. Note that HOME
# is already set when the the env_reset option is enabled, so
# this option is only effective for configurations where either
# env_reset is disabled or HOME is present in the env_keep list.
#
Defaults    always_set_home

Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
Defaults    env_keep += "SSH_AUTH_SOCK"

이렇게 한줄 넣고.
#
# Adding HOME to env_keep may enable a user to run unrestricted
# commands via sudo.
#
# Defaults   env_keep += "HOME"

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
Defaults:vagrant !requiretty

이렇게 한줄 넣었다.
## Same thing without a password
# %wheel    ALL=(ALL)   NOPASSWD: ALL
%vagrant    ALL=(ALL)   NOPASSWD: ALL

vagrant 계정으로 변경하자.
% su - vagrant

ssh key 를 추가하자.
$ mkdir .ssh
$ curl https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub --output .ssh/authorized_keys
$ chmod 0700 .ssh
$ chmod 0600 .ssh/authorized_keys

ssh server 설정을 수정하자.
$ sudo vi /etc/ssh/sshd_config

만약 아래 내용이 주석으로 처리되어 있다면, 주석처리를 제거하자.
(# 을 지우라는 소리)
Port 22
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys
그런데, 실제로 테스트를 해보니, 주석을 제거하지 않아도 잘 작동한다.
주석처리되어 있으면 기본값으로 동작할텐데,
기본값이 위처럼 되어 있는거 같다.

그리고 부가적으로 패키지를 설치하자.

CentOS
% yum install vi vim gcc g++ emacs wget make readline-devel zlib-devel openssl-devel libxml2-devel

Ubuntu
% sudo apt install vi vim gcc g++ emacs wget make libreadline-dev zlib1g-dev libssl-dev libxml2-dev

설치는 모두 끝났으니, 다음으로 넘어가자.

디스크 사이즈를 줄이자.
% sudo dd if=/dev/zero of=/EMPTY bs=1M
% sudo rm -f /EMPTY

"장치에 남은 공간이 없음" 이라는 에러가 나올 수 있는데 무시하면 된다.
정확히 무슨 역할을 하는지는 잘 모르겠다.
아래 주소를 통해 관련 내용을 참고할 수 있다.
http://stackoverflow.com/a/24956805

서버를 종료하자.
% sudo shutdown -h now

다시 host 머신으로 돌아와서 작업을 마무리 하자.

내가 생성한 CentOS 7.2 가상머신이 리스트에 들어 있는지 확인한다.
% VBoxManage list vms

box 를 생성하자.
% vagrant package --output CentOS7.2.box --base CentOS7.2

Vagrantfile 를 작성하자.
% vagrant init CentOS7.2.box

가상머신을 실행해보자.
% vagrant up


혹시라도 위와 같은 에러가 발생하면, Vagrantfile 에 아래 내용을 넣자.
.ssh 디렉토리와 authorized_keys 파일 권한도 확인해 보자.
config.ssh.insert_key = false

이것도 저것도 안되면, Vagrantfile 에 아래 내용을 넣자.
config.ssh.username = "vagrant"
config.ssh.password = "vagrant"

그리고 가상머신은 start 가 정상적으로 되어진 상태이니까,
vagrant ssh 를 통해서 접속은 가능하니,
가상머신 내부에서 수정하고 싶은것도 수정은 가능하다.


성공적으로 잘 start 되었다.

==========================================================

ssh authorize 관련해서 오류가 발생한다면, key 를 확인해 봐야 한다.

guest 머신의 .ssh 디렉토리 권한은 0700 으로 되어 있어야 한다.
guest 머신의 .ssh/authorized_keys 파일 권한은 0600 으로 되어 있어야 한다.

Vagrantfile 파일이 있는 디렉토리에 .vagrant 라는 디렉토리가 존재한다.
.vagrant/machines/default/virtualbox/private_key

그 디렉토리에 private_key 파일이 존재하는데,
그 파일과 guest 머신의 .ssh/authorized_keys 파일이 쌍으로 이루어져 있어야 한다.

또한, private_key 파일은 권한이 0600 이어야 한다.



출처
https://www.vagrantup.com/intro/getting-started/index.html
http://adhoc.tistory.com/entry/Vagrant-Box-만들기
https://blog.asamaru.net/2015/10/14/creating-a-vagrant-base-box
https://www.kjwon15.net/wordpress/articles/computer/linux-computer/540
https://kldp.org/node/155210
http://stackoverflow.com/a/24956805
https://github.com/hashicorp/vagrant/issues/5186
http://www.gisremotesensing.com/2016/06/solution-vagrant-box-authentication.html

댓글 없음:

댓글 쓰기

화곡 어쩌라고, 굴사냥

석화찜(굴찜)을 먹으러 여의도로 갔다 그런데 재료가 모두 소진되었다고 마감이라고 한다 응? 다들 굴에 미쳤나? 굴을 찾아 헤매다 보니, 화곡까지 가게 되었다. 화곡은 처음 가본다. 첫인상은 "술집 겁네 많네" 피똥쌀때까지 마실 수 있...