Create TOC

2019년 6월 18일

Debian/사용 중인 linux를 VirtualBox로 옮기기

사용 중인 Debian linux를 VirtualBox로 옮기는 방법을 기록한다.

VirtualBox로 옮길 Debian linux의 mount 구조는 아래와 같다.

mount point device
/ /dev/sda1
/home /dev/sdb1
swap /dev/sdb2

디스크를 VDI로 복사

sda

드라이브 통채로 복사하기 위해서, 용량을 확인하고 그 크기만큼 VDI로 만든다.

$ sudo -s
# fdisk -l /dev/sda | grep bytes | head -1
Disk /dev/sda: 119.2 GiB, 128035676160 bytes, 250069680 sectors
# dd if=/dev/sda | VBoxManage convertdd stdin debian.vdi 128035676160 --format=VDI

sdb

rsync를 이용해서 백업한다. 우선 적당한 크기로(100GB) 이미지를 만들고 ext4로 포맷한 후 rsync로 데이터를 복사한다.

$ dd if=/dev/zero of=home.img bs=1M count=102400
$ sudo -s
# /sbin/mkfs.ext4 home.img
# mkdir /mnt/tmp
# mount -o loop home.img /mnt/tmp/
# rsync -av /home/* /mnt/tmp
# umount /mnt/tmp/

이미지를 VDI로 변환한다.

$ VBoxManage convertdd home.img home.vdi --format=VDI

VirtualBox 설정

가상머신 생성

원하는 사양으로 가상머신을 만든다.

속성
Name Debian
cpu 2 core
ram 4GB
SATA0 debian.vdi
SATA1 home.vdi

공유 폴더 설정

공유 폴더를 설정해두면 host <-> 가상 머신 사이에 파일 교환이 쉬워진다.

host share name option
/Users/foo/Downloads Downloads 자동 마운트 off, 항상 사용 on

headless 설정

headless로 가상머신을 사용할 경우 RDP나 ssh 연결 설정을 해야 한다.

RDP

VirtualBox 자체 RDP 기능을 사용할 수 있다.

$ VBoxManage modifyvm Debian --vrde on --vrdeport 13389

설정이 제대로 되었는지 확인한다.

$ VBoxManage showvminfo Debian | grep VRDE
VRDE:            enabled (Address 0.0.0.0, Ports 13389, MultiConn: off, ReuseSingleConn: off, Authentication type: null)
VRDE property: TCP/Ports  = "13389"

RDP로 접속할 때는 127.0.0.1의 13389 포트에 접속하면 된다.

ssh

localhost(127.0.0.1)의 4022 포트를 Debian VM의 22에 port forwarding 설정을 한다.

$ VBoxManage modifyvm Debian --natpf1 "ssh,tcp,,4022,,22"

설정이 제대로 되었는지 확인한다.

$ VBoxManage showvminfo Debian | grep Rule
NIC 1 Rule(0):   name = ssh, protocol = tcp, host ip = , host port = 4022, guest ip = , guest port = 22

접속 방법은 아래와 같다(id는 foo라고 가정한다).

$ ssh -p 4022 foo@127.0.0.1

headless 부팅

$ VBoxHeadless --startvm Debian
Oracle VM VirtualBox Headless Interface 5.2.30
(C) 2008-2019 Oracle Corporation
All rights reserved.

VRDE server is listening on port 13389

fzf를 사용한다면 아래와 같이 fvbox 함수를 정의해 사용할 수도 있다.

fvbox()
{
 local vm
 read -r vm <<< $(VBoxManage list vms | awk -F \" '{print $2}' | sort | fzf --layout=reverse-list --preview="VBoxManage showvminfo {} --machinereadable | grep \"^name=\\|^UUID=\\|^VMState=\\|^vrde=\\\|^vrdeports=\\|^Forwarding(\\|^SharedFolder\\|^description=\\|^ostype=\"" --preview-window=right:70%:wrap)

 if [ "$vm" = "" ]; then
  return;
 fi
 local running
 read -r running <<< $(VBoxManage showvminfo "$vm" --machinereadable | grep '^VMState='| awk -F = '{print $2}')
 if [ "$running" = "\"running\"" ]; then
  VBoxManage controlvm "$vm" savestate
 else
  nohup VBoxHeadless --startvm "$vm" > /dev/null 2>&1 &
 fi
}

가상머신 부팅 후 Linux 환경 수정

부팅시 "gave up looking for suspend/resume device" 오류

/etc/initramfs-tools/conf.d/resume 파일에서 RESUME 값이 잘못된 경우 발생한다. 아래와 같이 수정한다.

RESUME=/dev/sda1

수정이 끝나면 ramdisk 다시 만든다.

$ sudo update-initramfs -u

fstab 수정

/etc/fstab 에서 /homeswap 내용을 삭제하고, 아래와 갈이 /home 에 대한 내용을 추가한다.

/dev/sdb    /home   ext4    defaults    0   1

swap

적당한 크기의 swapfile을 만든다. 여기서는 메모리 크기와 동일하게 4GB로 만든다.

$ sudo -s
# dd if=/dev/zero of=/swapfile bs=1024 count=4194304
# chmod 600 /swapfile
# mkswap /swapfile
# swapon /swapfile

/etc/fstab 에 아래 내용을 추가한다.

/swapfile   swap    swap    defaults    0   0

hibernation

swap 정책을 변경한다.

sysctl -w vm.swappiness=1 

부팅 때 적용되도록 /etc/sysctl.d/swap.conf 파일을 수정한다.

vm.swappiness=1

uswsusp 를 설치한다.

$ sudo apt install uswsusp
$ sudo dpkg-reconfigure -pmedium uswsusp

"Continue without a valid swap space?" 질문에는 를, "Swap space to resume from:" 질문에는 swapfile을 선택한다.

hibernation 서비스 수정 하기 위해 복사한다.

$ sudo cp /lib/systemd/system/systemd-hibernate.service /etc/systemd/system/

/etc/systemd/system/systemd-hibernate.service 맨 마지막 줄을 아래와 같이 수정한다.

ExecStart=/bin/sh -c 's2disk && run-parts --regex .\* -a post /lib/systemd/system-sleep'

수정 사항을 적용한다.

$ sudo systemctl daemon-reload

ramdisk 다시 만든다.

$ sudo update-initramfs -u

아래와 같이 잘 동작하는지 확인한다.

$ sudo systemctl start systemd-hibernate.service

VirtualBox package 설치

VirtualBox guest 패키지를 설치한다.

$ sudo apt install virtualbox-guest-dkms virtualbox-guest-utils virtualbox-guest-x11

x11 설정

/etc/X11/xorg.conf 에서 기존에 사용하던 Monitor, Device 그리고 Screen Section은 다 삭제한다.

Section "ServerFlags"
    # Ctrl + Alt + Backspace
    Option  "DontZap"   "true"
EndSection

공유폴더

아래와 같은 명령으로 mount 되는지 확인한다.

$ sudo mount -t vboxsf -o uid=$UID,gid=$(id -g) Downloads /mnt/Downloads

uid, gid를 확인한다.

$ echo $UID $GID
1000 1000

/etc/fstab에 아래 내용을 추가한다.

# vbox
Downloads       /mnt/Downloads        vboxsf  defaults,uid=1000,gid=1000      0       0

재부팅

모든 설정이 끝나면 재부팅 후 모든 기능이 잘 동작하는지 확인해본다.