1.1 sda
1.2 sdb
2 VirtualBox 설정
2.1 가상머신 생성
2.2 공유 폴더 설정
2.3 headless 설정
2.3.1 RDP
2.3.2 ssh
2.3.3 headless 부팅
3 가상머신 부팅 후 Linux 환경 수정
3.1 부팅시 "gave up looking for suspend/resume device" 오류
3.2 fstab 수정
3.3 swap
3.4 hibernation
3.5 VirtualBox package 설치
3.6 x11 설정
3.7 공유폴더
3.8 재부팅
사용 중인 Debian linux를 VirtualBox로 옮기는 방법을 기록한다.
VirtualBox로 옮길 Debian linux의 mount 구조는 아래와 같다.
mount point | device |
---|---|
/ | /dev/sda1 |
/home | /dev/sdb1 |
swap | /dev/sdb2 |
1 디스크를 VDI로 복사
1.1 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
1.2 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
2 VirtualBox 설정
2.1 가상머신 생성
원하는 사양으로 가상머신을 만든다.
속성 | 값 |
---|---|
Name | Debian |
cpu | 2 core |
ram | 4GB |
SATA0 | debian.vdi |
SATA1 | home.vdi |
2.2 공유 폴더 설정
공유 폴더를 설정해두면 host <-> 가상 머신 사이에 파일 교환이 쉬워진다.
host | share name | option |
---|---|---|
/Users/foo/Downloads | Downloads | 자동 마운트 off, 항상 사용 on |
2.3 headless 설정
headless로 가상머신을 사용할 경우 RDP나 ssh 연결 설정을 해야 한다.
2.3.1 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 포트에 접속하면 된다.
2.3.2 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
2.3.3 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
}
3 가상머신 부팅 후 Linux 환경 수정
3.1 부팅시 "gave up looking for suspend/resume device" 오류
/etc/initramfs-tools/conf.d/resume 파일에서 RESUME 값이 잘못된 경우 발생한다. 아래와 같이 수정한다.
RESUME=/dev/sda1
수정이 끝나면 ramdisk 다시 만든다.
$ sudo update-initramfs -u
3.2 fstab 수정
/etc/fstab 에서 /home 과 swap 내용을 삭제하고, 아래와 갈이 /home 에 대한 내용을 추가한다.
/dev/sdb /home ext4 defaults 0 1
3.3 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
3.4 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
3.5 VirtualBox package 설치
VirtualBox guest 패키지를 설치한다.
$ sudo apt install virtualbox-guest-dkms virtualbox-guest-utils virtualbox-guest-x11
3.6 x11 설정
/etc/X11/xorg.conf 에서 기존에 사용하던 Monitor, Device 그리고 Screen Section은 다 삭제한다.
Section "ServerFlags"
# Ctrl + Alt + Backspace
Option "DontZap" "true"
EndSection
3.7 공유폴더
아래와 같은 명령으로 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
3.8 재부팅
모든 설정이 끝나면 재부팅 후 모든 기능이 잘 동작하는지 확인해본다.