특정 작업을 수행하기 위해 VirtualBox 내에 동일한 OS로 비슷한 스펙을 가진 VM을 여러 개 만들어야 할 일이 있을 것이다. 매번 OS를 설치하고 기본 패키지를 다운로드, 설치/설정을 반복하는 일이 번거롭고 시간을 뻇기는 부담으로 느껴진다면 이 방법을 한 번 써 봐도 좋겠다는 생각에서 정리해 둔다.


사전 준비


* VirtualBox가 설치된 호스트 머신

* template에 설치할 OS 이미지(ISO) 파일 준비, 여기서는 CentOS 7.3(1611) Minimal ISO


VirtualBox VM template 제작


1. 적당한 스펙의 VM(CPU1, Memory 1GB)을 새로 만들기

가상하드디스크는 VMDK 또는 VDI 형식을 선택


2. 저장소의 CDROM에 CentOS 7.3 ISO 파일 연결


3. VM 선택 후 시작(전원 켜기)


4. CentOS 7.3 설치


5. Network Manager 제거

  # systemctl stop NetworkManager

  # systemctl disable NetworkManager


6. 네트워크 설정 & reboot, 인터넷 연결 정상여부 확인

  # vi /etc/sysconfig/network-script/ifcfg-eth0

BOOTPROTO=static

TYPE=Ethernet

DEVICE=eth0

IPADDR=a.b.c.d

NETMASK=255.255.255.0

GATEWAY=a.b.c.x

DNS1=a.b.c.y

DNS2=a.b.c.z

ONBOOT=yes


7. 기본 업데이트 및 패키지(epel repo 사용을 전제로 함) 설치 & reboot

 # yum update -y

 # yum install -y epel-release https://www.rdoproject.org/repos/rdo-release.rpm

 # yum install -y net-tools bind-utils nc bzip2 yum-utils gcc kernel-devel dkms wget chrony

(gcc, kernel-devel, dkms는 linux용 VirtualBox Guest Addon을 빌드하기 위한 필수 패키지)


8. VirtualBox Menu > Insert Guest Addon CD image

 # mount /dev/cdrom /mnt

 # sh /mnt/VBoxLinuxAdditions.run

(reboot)


9. VM sealing(template 화 하기위한 봉인 작업. VMware에서의 template 작업과 비슷하지만 약간 다름)

 # vi seal.sh

#!/bin/bash 

#stop logging services 

/sbin/service rsyslog stop 

/sbin/service auditd stop 

#remove old kernels 

/bin/package-cleanup -y --oldkernels --count=1 

#clean yum cache 

/usr/bin/yum clean all 

#force logrotate to shrink logspace and remove old logs as well as truncate logs 

/usr/sbin/logrotate -f /etc/logrotate.conf 

/bin/rm -f /var/log/*-???????? /var/log/*.gz 

/bin/rm -f /var/log/dmesg.old 

/bin/rm -rf /var/log/anaconda 

/bin/cat /dev/null > /var/log/audit/audit.log 

/bin/cat /dev/null > /var/log/wtmp 

/bin/cat /dev/null > /var/log/lastlog 

/bin/cat /dev/null > /var/log/grubby 

#remove udev hardware rules 

/bin/rm -f /etc/udev/rules.d/70* 

#remove SSH host keys 

/bin/rm -f /etc/ssh/*key* 

#remove root users shell history 

/bin/rm -f ~root/.bash_history 

unset HISTFILE 

#remove root users SSH history 

/bin/rm -rf ~root/.ssh/

 # chmod +x seal.sh

 # vi /etc/sysconfig/network-scripts/ifcfg-eth0

BOOTPROTO=dhcp

TYPE=Ethernet

DEVICE=eth0

#IPADDR=a.b.c.d

#NETMASK=255.255.255.0

#GATEWAY=a.b.c.x

#DNS1=a.b.c.y

#DNS2=a.b.c.z

ONBOOT=yes

 # ./seal.sh

 # rm -f seal.sh

 # history -c

 # sys-unconfig


10. 만들어진 VM 이미지 파일(예를 들어 cent73-template.vdi 파일)을 ~/VirtualBox VMs/Cent73 template 디렉토리에서 /MyOSTemplates/ 등의 별도 디렉토리를 만들어서 복사해 두고, 해당 VM은 VirtualBox 콘솔에서 삭제한다.


VirtualBox VM template 을 활용한 VM 찍어내기


1. 원하는 스펙의 VM을 새로 만들기(VritualBox 콘솔)


하드디스크 선택 단계에서 '기존 가상 하드 디스크 파일 사용' 선택 직후, 반드시 아래 단계를 정확히 진행


1-1. 윈도우 탐색기, MacOS Finder 등을 실행하여, 앞서 저장해 둔 template 파일을 현재 만들어지고 있는 VM의 이미지 저장 디렉토리로 복사해 온다. 즉,

 * Source 파일: /MyOSTemplates/cent73-template.vdi

 * Destination 디렉토리: ~/VirtualBox VMs/Test VM from template - 1


1-2. 터미널 또는 커맨드 창에서 아래의 명령을 수행하여, 복사해 온 VM Image에 대한 UUID를 교체

 # VBoxManage internalcommands sethduuid ~/VirtualBox\ VMs/Test VM from template - 1/cent73-template.vdi



2. VirtualBox 콘솔로 다시 넘어가서


폴더 아이콘을 클릭하여 복사해 온 이미지파일(cent73-template.vdi) 선택, 만들기 클릭


3. VM 생성 전 단계에서 네트워크는 네트워크>어댑터 탭>고급>무작위모드>가상머신에 허용(또는 모두 허용)으로 설정


4. 모든 설정이 완료 되었으면 '시작'(전원 켜기) & VM 사용


- Barracuda -


저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들


노트북에 서로 다른 사설IP 대역(노트북의 랜카드와 동일한 브리징 네트워크의 IP가 아닌, 내부 사설 네트워크)로 가상네트워크를 구성해서 VM을 만들 경우가 있다. 이 경우 대개 고정IP와 함께 고정된 default gateway를 설정하게 되는데, 사무실과 집을 오가다 보면 매번 VM들의 default gateway를 변경해 주어야 한다.


이런 번거로움을 피하기 위해 VirtualBox 내에 Vyatta Router VM을 만들고, 각 VM들의 사설 IP대역에 맞는 interface(eth1, eth2, eth3, ...)를 각각 설정한 다음, VM에서는 Vyatta Router의 interface IP를 default gateway 로 설정해 둔다. 물론 Vyatta Router의 eth0는 인터넷이 가능한 IP 대역으로 Bridged Network로 구성하고, eth1/eth2/eth3 으로부터 eth0로 라우팅을 해 주어야 각 VM에서 Vyatta Router를 통해 외부로 접속이 가능할 것이다.


이 방법을 응용한다면 VMWare용 Vyatta Router Virtual Appliance나 다른 가상화 솔루션들을 사용할 경우나, Vyatta Router를 사용한 간단한 내부 네트워크를 동적으로 구성할 때도 도움이 될 만 하겠다.


아래에 그 방법에 대해 정리해 둔다.




Vyatta Router VM의 설치


  • Vyos.io 사이트에서 http://packages.vyos.net/iso/release/1.1.7/ 로 접속하여 iso 파일(vyos-1.1.7-amd64.iso)을 다운로드
    - 필요에 따라 다른 iso를 골라서 설치 사용하거나 ova 파일 자체를 appliance로 올려서 쓸수도 있다 
  • Virtual Box에서 linux 머신(CPU1, Ram 512, Disk 2GB)을 생성하고 ISO파일을 CD에 장착하고 Vyatta OS를 설치
    - VirtualBox에서의 VM 생성과 설치 방법에 대해서는 따로 설명하지 않는다
  • 사용할 네트워크에 맞게 네트워크 장치(NIC)를 생성한다. 위 그림에서와 같이 작업을 하려면 다음의 구성정보와 그림을 참고한다
    - 어댑터1: 브리지 어댑터, 무작위 모드: 모두 허용
    - 어댑터2, 3, 4: 호스트 전용 어댑터(사전에 만든 호스트 전용 네트워크 이름 지정, vboxnet0), 무작위 모드: 모두 또는 가상머신에 허용, 어댑터종류:아무거나...반가상네트워크도 가능)


어댑터2,3,4는 모두 동일하게 설정



Vyatta Router Interface 및 라우팅 설정



  • Vyos 설치가 완료되고 리부트한 후, 기본 설정된 관리자 계정 vyos(암호: vyos) 로 로그인한다
  • 초기 설정에 대해 configure, set 등의 명령으로 각각 인터페이스 생성과 설정을 수행하고 확인한다. configure 이후의 설정을 저장하려면 commit 다음에 save 를 반드시 하여야 한다

vyos@vyos:~$ configure

vyos@vyos# set interfaces ethernet eth0 description OUTSIDE

vyos@vyos# set interfaces ethernet eth0 address 192.168.0.201/16

vyos@vyos# set system gateway-address 192.168.0.1

vyos@vyos# set system domain-name 8.8.8.8

vyos@vyos# set service ssh port '22'

vyos@vyos# commit

vyos@vyos# save

Saving configuration to '/config/config.boot'...

vyos@vyos# exit

vyos@vyos:~$ show interfaces
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
eth0             192.168.0.201/16                  u/u  OUTSIDE
lo               127.0.0.1/8                       u/u  
                 ::1/128
vyos@vyos:~$ 
vyos@vyos:~$ configure
vyos@vyos# set interfaces ethernet eth1 description 10-NETWORK
vyos@vyos# set interfaces ethernet eth1 10.255.10.1/24
vyos@vyos# set interfaces ethernet eth1 description 20-NETWORK
vyos@vyos# set interfaces ethernet eth1 10.255.20.1/24
vyos@vyos# set interfaces ethernet eth1 description 30-NETWORK
vyos@vyos# set interfaces ethernet eth1 10.255.30.1/24

vyos@vyos# save

Saving configuration to '/config/config.boot'...

vyos@vyos# exit

vyos@vyos:~$ show interfaces
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
eth0             192.168.0.201/16                  u/u  OUTSIDE 
eth1             10.255.10.1/24                    u/u  10-NETWORK 
eth2             10.255.20.1/24                    u/u  20-NETWORK 
eth3             10.255.30.1/24                    u/u  30-NETWORK 
lo               127.0.0.1/8                       u/u  
                 ::1/128


  • 내부 사설망과 연결되는 개별 router 포트(eth1, eth2, eth3) 에 대해 다음과 같이 설정하고 저장한다

내부 사설망과 연결되는 개별 router port(eth1, 2, 3)에 대해 다음과 같이 설정한다

vyos@vyos:~$ configure

vyos@vyos# set nat source rule 10 source address 10.255.10.0/24

vyos@vyos# set nat source rule 10 outbound-interface eth0

vyos@vyos# set nat source rule 10 protocol 'all'

vyos@vyos# set nat source rule 10 translation address masquerade

vyos@vyos# set nat source rule 20 source address 10.10.255.0/24

vyos@vyos# set nat source rule 20 outbound-interface eth0

vyos@vyos# set nat source rule 20 protocol 'all'

vyos@vyos# set nat source rule 20 translation address masquerade

vyos@vyos# set nat source rule 30 source address 10.255.30.0/24

vyos@vyos# set nat source rule 30 outbound-interface eth0

vyos@vyos# set nat source rule 30 protocol 'all'

vyos@vyos# set nat source rule 30 translation address masquerade

vyos@vyos# commit

vyos@vyos# save

Saving configuration to '/config/config.boot'...

vyos@vyos# show nat source rule 10

 outbound-interface eth0

 protocol all

 source {

     address 10.255.10.0/24

 }

 translation {

     address masquerade

 }

[edit]

vyos@vyos# exit


  • Router의 정상작동은, 내부 사설망을 사용할 VM(네트워크 어댑터는 호스트 전용, Vyatta Router 의 eth1 등과 동일한 방식의 어댑터)을 생성하고 default gateway를 10.255.10.1  등 Router port의 IP로 설정하여 외부 인터넷으로 ping 이 도달되는지 확인해 보면 된다
  • Vyatta Router를 재시작하기 위해서는 명령어 상태에서 reboot 명령어를, 끄기 위해서는 단순히 poweroff 명령어를 실행한다


사설망 외부에서 내부로의 직접 접근(Port Forwarding)

  • 공유기를 통한 외부에서 내부로의 접근 방식과 동일한 개념으로 Port fordwarding을 설정하면 된다
  • 설정 방법과 과정을 예로 들어보면 아래와 같다(192.168.0.201:65022 -> 10.255.10.100:22, TCP/UDP DNAT 포워딩)
vyos@vyos:~$ configure
vyos@vyos# set nat destination rule 100 description PORT_FORWARD_TEST
vyos@vyos# set nat destination rule 100 destination address '192.168.0.201'
vyos@vyos# set nat destination rule 100 destination port 65022
vyos@vyos# set nat destination rule 100 inbound-interface 'eth0'
vyos@vyos# set nat destination rule 100 protocol tcp_udp
vyos@vyos# set nat destination rule 100 translation address '10.255.10.100'
vyos@vyos# set nat destination rule 100 translation port '22'
vyos@vyos# commit
vyos@vyos# save
Saving configuration to '/config/config.boot'...
vyos@vyos# show nat destination rule 100
 description SIP_FORWARD_TEST
 destination {
     address 192.168.0.201
     port 65022
 }
 inbound-interface eth0
 protocol tcp_udp
 translation {
     address 10.255.10.100
     port 22
 }
[edit]
vyos@vyos# exit


네트워크 대역에 DHCP 설정하기

* 필요에 따라 특정 대역에 대해 DHCP를 설정해야 할 필요가 있을 경우 다음과 같이 설정한다(추가: 2017-09)
vyos@vyos:~$ configure
vyos@vyos# set service dhcp-server shared-network-name NET10_POOL subnet 10.255.10.0/24 start 10.255.10.2 stop 10.255.10.80
vyos@vyos# set service dhcp-server shared-network-name NET10_POOL subnet 10.255.10.0/24 default-router 10.255.10.1
vyos@vyos# set service dhcp-server shared-network-name NET10_POOL subnet 10.255.10.0/24 dns-server 10.255.10.100
vyos@vyos# commit
vyos@vyos# save
vyos@vyos# show service dhcp-server
 disabled false
 shared-network-name NET10_POOL {
     authoritative disable
     subnet 10.255.10.0/24 {
         default-router 10.255.10.1
         dns-server 10.255.10.100
         lease 86400
         start 10.255.10.2 {
             stop 10.255.10.80
         }
     }
 }
[edit]
vyos@vyos# exit


한 걸음 더...

  • 노트북을 사용하는 네트워크 환경이 바뀌었는데 Vyatta Router의 eth0 주소와 각 포트의 라우팅 정보를 수시로 바꿔 주어야 하는 것은 상당히 불편하고 귀찮은 일일 것이다. 사실 본 글의 라우팅 구조를 생각해 낼 떄부터 이 내용을 결론으로 쓰기 위한 것이었는데 ...... 
    - VirtualBox VM관리 화면에서 Vyatta Router VM을 끈 후 복제(Vyatta Router Home 등의  다른 이름으로)
    - 복제할 때 Mac 주소를 자동생성하게(default이지만, 확인 필요) 설정, 단 다음 단계에서 링크가 아닌 '완전한 복제' 실행


     - 새로 만들어진 Vyatta Router VM에 로그인하여, 앞서 수행했던 configure 과정과 비슷한 내용을 다시 수행하는 것이 아니라 vi등의 편집기로 /config/config.boot 내용 중 원하는 부분(외부와 연결되는 eth0 네트워크 정보, default gateway, 4개의 NIC에 대한 MAC 주소-VirtualBox에서 자동할당한 MAC 주소)를 수정하고 reboot 하면 된다. 참고로 아래에 config.boot 파일의 수정해야 할 부분을 붉은 글씨로 따로 표시하였다


vyos@vyos:~$ cat /config/config.boot 

interfaces {

    ethernet eth0 {

        address 192.168.219.201/24

        description OUTSIDE

        duplex auto

        hw-id 08:00:27:8e:73:7a

        smp_affinity auto

        speed auto

    }

    ethernet eth1 {

        address 10.255.10.1/24

        description 10-NETWORK

        duplex auto

        hw-id 08:00:27:b5:91:0e

        smp_affinity auto

        speed auto

    }

    ethernet eth2 {

        address 10.255.20.1/24

        description 20-NETWORK

        duplex auto

        hw-id 08:00:27:6b:38:52

        smp_affinity auto

        speed auto

    }

    ethernet eth3 {

        address 10.255.30.1/24

        description 30-NETWORK

        duplex auto

        hw-id 08:00:27:60:d7:dd

        smp_affinity auto

        speed auto

    }

    loopback lo

...

}

nat {

    destination {

        rule 100 {

            description PORT_FORWARD_TEST

            destination {

                address 192.168.219.201

                port 65022

            }

            inbound-interface eth0

            protocol tcp_udp

            translation {

                address 10.255.10.100

                port 22

            }

        }

        rule 101 {

            description FORWARD_OSMASTER

            destination {

                address 192.168.219.201

                port 60160

            }

            inbound-interface eth0

            protocol tcp_udp

            translation {

                address 10.255.10.160

                port 22

            }

        }

...

    }

    source {

        rule 10 {

            outbound-interface eth0

            protocol all

            source {

                address 10.255.10.0/24

            }

            translation {

                address masquerade

            }

        }

        rule 20 {

            outbound-interface eth0

            protocol all

            source {

                address 10.255.20.0/24

            }

            translation {

                address masquerade

            }

        }

        rule 30 {

            outbound-interface eth0

            protocol all

            source {

                address 10.255.30.0/24

            }

            translation {

                address masquerade

            }

        }

    }

}

service {

    ssh {

        port 22

    }

}

system {

    config-management {

        commit-revisions 20

    }

    domain-name test.local

    gateway-address 192.168.219.1

    host-name vyos

...

vyos@vyos:~$ 



  • 이렇게 한다면, 업무 환경의 네트워크에 따라 Vyatta Router만 바꿔서 사용하므로, 수시로 업무 환경에 따라 VM의 네트워크 정보를 바꿔 주어야 했던 불편함은 깔끔하게 해결되지 않을까 한다



- Barracuda -


저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들


Linux host에서 가상화 지원 솔루션 중 VirtualBox를 설치하고 사용하는 경우에, 특히 OpenSuse 12.x 환경에서 virtualbox 를 설치하고, VM을 사용하고자 할 경우(ubuntu 등 기타 linux에서도 비슷하게 적용될 듯)에 주의 사항이 있다.


virtualbox를 https://www.virtualbox.org/wiki/Downloads 에서 다운로드 받고 설치, VirtualBox 기동 후 extpack 까지 설치하고 난 후, virtualbox 메뉴에서 vm을 생성하고 머신을 시작하려고 하면 "virtualbox kernel driver not installed (rc=-1908)" 라는 메시지 창이 뜨고 '/etc/init.d/vboxdrv setup' 을 실행하라고 경고창이 뜨게 된다. 이제 터미널 창에서 '/etc/init.d/vboxdrv setup' 이라고 실행하게 되는데......


이 때, 만약 커널 소스가 linux 에 설치되어 있지 않다면

/etc/init.d/vboxdrv setup

Stopping VirtualBox kernel modules          done

Recompiling VirtualBox kernel modules     failed

라고 오류가 발생되고 더 이상 진행이 되지 않는다. 또 경고창에 나타난 대로 아래와 같이 log를 조회해 보면 오류가 나타남을 알 수 있다.

# cat /var/log/vbox-install.log

Makefile: 181:  *** Error: unable to find the source of your current linux kernel. Specify KERN_DIR=<directorty> and run Make again. Stop.

...

 

이는, virtualbox가 설치되면 kernel module을 로드하기 위해서 해당 커널모듈을 컴파일하게 되는데, 커널 소스가 설치되지 않은 경우에 만날 수 있는 에러 상황이다.


터미널 명령으로 아래와 같이 실행하면 문제를 해결할 수 있다(root 권한으로 실행, 아래는 Suse 계열의 linux에 대한 명령이며, OS에 맞춰 yum, apt-get 과 같은 패키지 설치 명령을 사용하면 된다)

# zypper search kernel-source (=> OS에 따라 kernel-sources 로 나타나는 경우도 있음)

# zypper refresh

# zypper in -y kernel-source

# /etc/init.d/vboxdrv restart

# /etc/init.d/vboxdrv setup

Stopping VirtualBox kernel modules            done

Recompiling VirtualBox kernel modules       done

Starting VirtualBox kernel modules              done


저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들