Service gentoo virtualbox headless bridge

From 흡혈양파의 인터넷工房
Jump to: navigation, search
Gentoo host 운영에 대한 VirtualBox headless 및 bridge 세팅 및 동작

개요

이 문서는 Gentoo linux 위에서 VirtualBox 를 headless 로 운영할때 bridge 세팅에 대한 내용을 서술한다. 다음과 같은 상황을 전제조건으로 한다. 비슷한 상황에서도 작동할 것으로 예상되지만 100% 장담을 할 수는 없기때문에, 그런경우는 참고문서 정도로 사용해야 한다.

  • Gentoo 2016 host
  • kernel 4.6.2
  • virtualbox 5.0 이상
  • host 가 openrc
  • bridge 의 사용
  • 다른곳에서 미리 세팅한 VirtualBox 가상머신 이미지 세트


본 문서는 다른곳에서 이미 VBox 가상머신 이미지를 미리 세팅했다는 전제를 가지고 있다.


본 문서는 심하게 친절하지 않으므로 모르는 용어가 있다면 인터넷에서 검색을 해볼것을 권한다.


왜 굳이 귀찮게 Bridge를 사용하는가

본인은 다음과 같은 경우에 해당되었다.

  1. 서버가 죽었다. 수명이 11년이 된 서버. 아마도 원인은 파워불량
  2. 여분 서버를 할당하기 애매한 상황. 왜냐하면 내부가 10년전 gentoo linux 그대로...
  3. 이 상태를 그대로 살려서 사용하고 싶다. network 구성에 따라 nat 로 하나 더 IP 를 할당해서 port forwarding 을 하기 애매할때.


VirtualBox 의 설치

커널이 4.x 의 특정버전 이상이라면 VirtualBox 를 5.0 이상을 사용해야 한다. Gentoo Linux 로 운영되고 있는 서버에서 GUI 없이 바로 작동시킬 예정이기 때문에 다음과 같은 USE Flag 를 이용해서 VirtualBox 를 설치하도록 한다.

USE="-opengl -qt4 headless python vnc" emerge virtualbox-5.0.20.ebuild


VirtualBox 의 기본환경 세팅

일반 Desktop 에서 VirtualBox 를 세팅하는 경우라면 모를까.. Headless 로 사용하기 위해 gui 가 없기때문에 이미지등을 생성하는 과정이 어렵다. 기본적인 디렉토리부터 생성하는걸 권장한다. 어차피 root 계정에서 운영할 것이기 때문에 기본파일은 root 계정의 아래쪽으로 생성하는것으로 한다.

mkdir /root/.VirtualBox
mkdir /root/.VirtualBox/Machines
ln -s /root/.VirtoalBox /root/VirtualBox


기본 디렉토리가 hidden 으로 잡히기 때문에 향후 접근을 편하게 하기 위해서 별도의 심볼릭 링크를 걸도록 한다.

VurtualBox 의 기본 환경 xml 을 세팅하도록 한다. 아래의 파일 이름과 경로로 다음의 XML 을 참고하도록 한다.

/root/.VirtualBox/VirtualBox.xml
<?xml version="1.0"?>
<!--
** DO NOT EDIT THIS FILE.
** If you make changes to this file while any VirtualBox related application
** is running, your changes will be overwritten later, without taking effect.
** Use VBoxManage or the VirtualBox Manager GUI to make changes.
-->
<VirtualBox xmlns="http://www.innotek.de/VirtualBox-settings" version="1.12-linux">
  <Global>
    <ExtraData>
      <ExtraDataItem name="GUI/DetailsPageBoxes" value="general,system,preview,display,storage,audio,network,usb,sharedFolders,description"/>
      <ExtraDataItem name="GUI/GroupDefinitions/" value="m=2f39c30f-8326-4f64-a537-9650c505e48f,m=867647e8-292a-4214-82e9-14e9a0792677,m=061d606a-9499-4454-8c40-4f073d2e013a,m=52e12790-a7e0-42ff-8452-fad80f4c5e84,m=xxxxxxxx-cf4e-4a80-ad75-1c9504b50ab6"/>
      <ExtraDataItem name="GUI/HostScreenSaverDisabled" value="false"/>
      <ExtraDataItem name="GUI/Input/AutoCapture" value="true"/>
      <ExtraDataItem name="GUI/Input/HostKeyCombination" value="65505,65507"/>
      <ExtraDataItem name="GUI/LastItemSelected" value="m=VBOXMACHINENAME"/>
      <ExtraDataItem name="GUI/LastVMSelected" value="5747c3c8-93a0-4d22-9cc9-449791fbc6e0"/>
      <ExtraDataItem name="GUI/LastWindowPosition" value="2593,332,770,550"/>
      <ExtraDataItem name="GUI/RecentFolderCD" value="/root/Download"/>
      <ExtraDataItem name="GUI/RecentFolderFD" value="/root/Desktop"/>
      <ExtraDataItem name="GUI/RecentFolderHD" value="/root/.VirtualBox/Machines/VBOXMACHINENAME"/>
      <ExtraDataItem name="GUI/SplitterSizes" value="289,475"/>
      <ExtraDataItem name="GUI/SuppressMessages" value=",remindAboutAutoCapture,remindAboutWrongColorDepth,confirmInputCapture,remindAboutMouseIntegrationOff,remindAboutMouseIntegrationOn,remindAboutInaccessibleMedia,confirmVMReset,showRuntimeError.warning.DvdOrFloppyImageInaccessible,remindAboutMouseIntegration,warnAboutInaccessibleMedia,showRuntimeError.warning.HostAudioNotResponding,confirmResetMachine,confirmPowerOffMachine,confirmGoingSeamless,confirmGoingFullscreen"/>
      <ExtraDataItem name="GUI/TrayIcon/Enabled" value="false"/>
      <ExtraDataItem name="GUI/UpdateCheckCount" value="164"/>
      <ExtraDataItem name="GUI/UpdateDate" value="1 d, 2016-07-08, stable, 5.0.2"/>
      <ExtraDataItem name="HostOnly/vboxnet0/IPAddress" value="192.168.56.1"/>
      <ExtraDataItem name="HostOnly/vboxnet0/IPNetMask" value="255.255.255.0"/>
    </ExtraData>
    <MachineRegistry>
      <MachineEntry uuid="{xxxxxxxx-cf4e-4a80-ad75-1c9504b50ab6}" src="/root/.VirtualBox/Machines/VBOXMACHINENAME/VBOXMACHINENAME.vbox"/>
    </MachineRegistry>
    <MediaRegistry>
      <HardDisks/>
      <DVDImages/>
      <FloppyImages/>
    </MediaRegistry>
    <NetserviceRegistry>
      <DHCPServers>
        <DHCPServer networkName="HostInterfaceNetworking-vboxnet0" IPAddress="192.168.56.100" networkMask="255.255.255.0" lowerIP="192.168.56.101" upperIP="192.168.56.254" enabled="1"/>
      </DHCPServers>
    </NetserviceRegistry>
    <SystemProperties defaultMachineFolder="/root/.VirtualBox/Machines" defaultHardDiskFormat="VDI" VRDEAuthLibrary="VBoxAuth" webServiceAuthLibrary="VBoxAuth" LogHistoryCount="3" exclusiveHwVirt="true"/>
    <USBDeviceFilters/>
  </Global>
</VirtualBox>


위의 내용중에서 "VBOXMACHINENAME" 이라고 되어있는 부분을 주의하면 된다. 이 부분이 바로 당신의 가상머신에 대한 데이터를 VirtualBox 에 세팅하는 부부이 된다.


VirtualBox 에 이미지 세팅

당신의 VirtualBox 이미지를 "/root/.VirtualBox/Machines" 디렉토리에 압축을 풀어준다. 물론 본인의 세팅에 맞는 값을 넣는것은 필수.

cd /root/.VirtualBox/Machines
tar xf 압축파일의경로및파일명


압축을 풀고나면 당신의 VBOXIMAGE 디렉토리에는 다음과 같은 xml 파일이 하나 있을것이다.

VBOXMACHINENAME.vbox


이 파일을 편집해서 다음의 내용을 확인하는것이 좋다.

        <Adapter slot="0" enabled="true" MACAddress="08002716E576" cable="true" speed="0" type="82540EM">
          <DisabledModes>
            <NAT>
              <DNS pass-domain="true" use-proxy="false" use-host-resolver="false"/>
              <Alias logging="false" proxy-only="false" use-same-ports="false"/>
            </NAT>
            <InternalNetwork name="intnet"/>
            <NATNetwork name="NatNetwork"/>
          </DisabledModes>
          <BridgedInterface name="br0"/>
        </Adapter>


해당되는 가상머신에 대한 network 세팅이며 이중에서 가장 첫번째 network adaptor 에 대한 설정이다. 현재 브릿지모드로 세팅되어 있다.

<BridgedInterface name="br0"/>


이 부분이 중요한 부분임을 기억해두기 바란다. 이후 Gentoo linux Host 에서 세팅하게될 Bridge 세팅에 대한 host network device name 을 설정해야 한다. 본인의 경우는 br0 으로 세팅하기로 했다. 사람에 따라 다를 수 있으니 해당되는 부분은 미리 계획을 잡는것이 필요하다.


Host 버신의 Network 설정을 위한 계획

여기서부터는 다음과 같은 전제를 두고 설명하기로 한다. 브릿지 네트웍을 구성하는 데에는 아래의 내용과 같은 계획을 세우기로 한다.

  • host 머신의 랜카드 2장
  • host 머신의 bride device
    • name : br0
  • virtualbox 의 vnet device
    • name : vbox0
    • tap device


대부분 근래의 gentoo 머신은 genkernel 을 사용하고 있고 별다른 이상이 없다면 TUN/TAB module 은 설치가 되어있는듯 하다.


또한 최근의 virtualbox 패키지는 별도의 init 을 제공하고 있지 않다. 이때문에 openrc 의 local 를 사용할 예정이니 참고할것.


VirtualBox 의 TAP 세팅 및 openrc 의 local start 세팅

매번 시작할때마다 vbox0 을 시작해주는것이 좋기때문에 (문서 작성 시점에서는 별도의 자잘한 테스트는 하지 않았다. Live 상태였기 떄문에) 이 부분을 아예 시스템이 시작할때마다 실행되도록 세팅하도록 하자. 다음의 문서를 참고한다.

https://wiki.gentoo.org/wiki/OpenRC/Baselayout_1_to_2_migration/ko#local.start_.EA.B3.BC_local.stop


현재의 openrc 는 더이상 local.start 와 local.stop 이라는 파일을 지원하지 않기때문에 다음의 내용으로 파일을 생성하도록 하자. 파일의 내용은 같지 않아도 상관없다. 확장자만 ".start" 로 지정해주면 된다.

/etc/local.d/vboxnetadd.start
#!/bin/sh
VBoxTunctl -b -u root -t vbox0


이후 "chmod +x" 등의 명령을 이용해서 해당되는 *.start 파일을 실행가능한 상태로 바꿔주도록 하자. 다 끝났다면 해당되는 서비스(?)를 boot process 에 추가해 주도록 하자.

rc-update add local boot


대부분의 인터넷 문서에서는 "boot" 가 아니라 "default" 로 추가하는것을 얘기하고 있지만, 본인은 나름대로의 판단으로 이후에 세팅할 network 세팅 이전에 "vbox0" 이라는 virtual network device 가 세팅되어 있어야 가장 오차없는 동작을 확보할 수 있다고 생각하기 때문에 boot level 에 추가하였다.


지금까지 진행한 부분은 서버의 재부팅시 자동으로 시작되는 과정을 세팅한것이고, 이후의 세팅을 위해 바로 "vbox0" 을 생성하도록 하자.

VBoxTunctl -b -u root -t vbox0


"ifconfig vbox0 up" 이라는 명령어를 사용하고 ifconfig 을 통해 해당되는 device 가 존재한다는걸 확인했으면 virtual network device 는 올바르게 작동할거라고 간주해도 상관없다.


network Bridge 의 세팅(brctl)

다음의 문서를 우선적으로 참고한다.

https://wiki.gentoo.org/wiki/Network_bridge


위의 문서는 VirtualBox 따위는 고려하지 않은, 순수하게 2개의 물리적 network device 를 Bridge 하는것만 대상으로 하고 있다. 일단 패키지부터 설치하자.

emerge bridge-utils


Bridge 관련 패키지가 설치되었다면 다음과 같은 명령어를 통해서 당신의 브릿지를 우선 세팅하도록 하자.

rc-update delete net.당신의랜카드0번 boot
rc-update delete net.당신의랜카드1번 boot
rm /etc/init.d/net.당신의랜카드0번
rm /etc/init.d/net.당신의랜카드1번
brctl addbr br0
brctl addif br0 당신의랜카드0번
brctl addif br0 당신의랜카드1번
brctl addif br0 vbox0


위의 과정을 올바르게 거쳤다면 아마 명령실행을 통해 다음과 같은 결과를 확인할 수 있을것이다.

CORESHADOW ~ # brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.001517f21c08	no		enp1s0f0
							enp1s0f1
							vbox0


현재의 linux kernel 은 udev 와 더불어 더이상 eth0 또는 ethx 방식의 전통적인 network interface name 을 제공하지 않는다. host 머신의 물리 network inferface name 은 다음과 같은 방법으로 확인할 수 있다.

CORESHADOW ~ # dmesg | grep eth0
[    7.941879] igb 0000:01:00.0: eth0: (PCIe:2.5Gb/s:Width x4) 00:15:17:f2:1c:08
[    7.941882] igb 0000:01:00.0: eth0: PBA No: Unknown
[   10.835850] igb 0000:01:00.0 enp1s0f0: renamed from eth0


NIC 의 회사등에 따라 이름을 바뀔 수 있으니, 절대로 이 문서의 이름을 그대로 사용하면 안된다. 자신의 머신에 맞는 내용을 찾아서 적용할 수 있도록 한다.


network Bridge 의 세팅(Gentoo linux 의 설정)

https://wiki.gentoo.org/wiki/Network_bridge
http://gentoo-en.vfose.ru/wiki/VirtualBox#VirtualBox_Version_.3E.3D_2.1


위의 사이트에도 많은 내용이 적혀있지만 지금의 상황에 100% 들어맞는 내용은 아니다. 문서가 오래되었기 때문이다. 다음의 파일 내용을 세팅하도록 한다.

/etc/conf.d/net
tuntap_vbox0="tap"
tunctl_vbox0="-b -u root"
config_vbox="null"

config_enp1s0f0="null"
config_enp1s0f1="null"

bridge_br0="enp1s0f0 enp1s0f1 vbox0"

#config_br0="HOST머신의IP/HOST머신의SUBNET"
#routes_br0="default via HOST머신의GATEWAYIP"
config_br0="192.168.0.31/24"
routes_br0="default via 192.168.0.1"

brctl_br0="setfd 0"
brctl_br0="sethello 10"


이 파일은 다음과 같은 내용을 담고 있다.

  • enp1s0f0 라는 NIC 에는 IP 를 할당하지 않는다
  • enp1s0f1 라는 NIC 에는 IP 를 할당하지 않는다
  • virtual network device 인 vbox0 에는 IP 를 할당하지 않는다
  • vbox0 의 생성은 root 권한으로 한다
  • Bridge device 인 br0 에는 "enp1s0f0 enp1s0f1 vbox0" 3 개의 network device 를 묶어놓도록 한다.

맨 아래의 2줄은 매주 중요하다. bridge device 에 있어서 dhcp 에 대한 대기시간을 단축시켜준다고 한다.


Gentoo Host 시스템의 네트워크 설정파일이 마무리되었다면 다음의 명령을 실행해서 system 에서 항상 br0 가 실행될 수 있도록 한다.

ln -s /etc/init.d/net.lo /etc/init.d/net.br0
ln -s /etc/init.d/net.lo /etc/init.d/net.vbox0
rc-update add net.br0 default
rc-udpate add sshd default


이로서 시스템이 자동으로 시작되었을때 자동으로 br0 가 실행되게까지 만들었다.

/etc/init.d/net.br0 restart


위의 명령을 이용해서 브릿지를 시작하고 ping 을 통해 설정한 Bridge 환경이 제대로 동작하는지를 확인한다. ping 이 제대로 동작하고 외부에서 ssh 를 통한 접근을 host 머신으로 할 수 있다면 성공.


VirtualBox 의 Headless 사용

자 모든 준비는 끝났다. 일단 VirtualBox 의 환경에 가상머신이 제대로 등록되었는지부터 확인해보자.

CORESHADOW ~ # VBoxManage list vms
"VBOXMACHINENAME" {xxxxxxxx-cf4e-4a80-ad75-1c9504b50ab6}


내 가상머신은 일단 제대로 등록된듯 하다. 이제 가상머신을 headless 실행을 통해 background 로 실행해보자.

VBoxManage startvm VBOXMACHINENAME --type headless


물론 가상머신은 가능하면 내부적으로 static IP 로 세팅되어 있어야 한다.(앞단의 dhcp 에서 mac address 를 통한 IP 할당 세팅을 미리 해놓을 생각이 없다면)


이렇다는 전제하에 일정 시간이 지난후 가상머신으로 접속할 수 있는 수단(ssh 또는 rdp)을 통해서 해당되는 가상머신의 동작을 다시 확인하도록 한다.


참고:Headless 세팅

아래의 내용을 참고하면.. 100% 맞는것은 아니겠지만.. VBoxManage 로 어느정도의 컨트롤은 가능할것으로 보인다. 다만 사운드카드 및 USB 와 기타 잡다한 설정들이 있어서.. 본인은 다른 머신에서 GUI 로 가상머신 이미지를 미리 세팅하는쪽을 권장한다. (cloud 운영하는 분이라면 경우가 틀리겠지만)

https://forums.virtualbox.org/viewtopic.php?f=7&t=45911
VBoxManage createvm --name "WinXP1" --ostype WindowsXP --register --basefolder /mnt/VM/winxp/
VBoxManage modifyvm "WinXP1" --memory 256 --acpi on --boot1 dvd --nic1 nat
VBoxManage createhd --filename "/mnt/VM/winxp/WinXP1.vdi" --size 15000
VBoxManage storagectl "WinXP1" --name "IDE Controller" --add ide --controller PIIX4
VBoxManage storageattach "WinXP1" --storagectl "IDE Controller" --port 0 --device 0 --type hdd --medium "/mnt/VM/winxp/WinXP1.vdi"
VBoxManage storageattach "WinXP1" --storagectl "IDE Controller" --port 0 --device 1 --type dvddrive --medium /media/sdd1/software/de_windows_xp_professional_with_service_pack_3_x86_cd_vl_x14-73985.iso


VBoxManage modifyvm "CentOS6.3" --memory 1024 --acpi on --boot1 dvd --nic1 bridged --bridgeadapter1 eth0


VBoxHeadless --startvm "WinXP1"


참고문서


미해결점

  • openrc 의 local start 를 사용하지 않고 network device 를 생성하는법
    • 아마도.... net.vbox0 을 rc-update 로 올려주면 될거같기는 하지만.. IDC 에 있는 서버로 지금 장난치고 싶지는 않다.