사용 중인 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 에서 /home 과 swap 내용을 삭제하고, 아래와 갈이 /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
재부팅
모든 설정이 끝나면 재부팅 후 모든 기능이 잘 동작하는지 확인해본다.