Service gentoo virtualbox headless bridge

From 흡혈양파의 인터넷工房
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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 에 있는 서버로 지금 장난치고 싶지는 않다.