Computer >> 컴퓨터 >  >> 소프트웨어 >> 가상 머신

VirtualBox: 공유 폴더 없이 NAT 네트워크에서 호스트-게스트 파일 전송하기

꽤 흥미로운 문제를 하나 소개합니다. 다소 복잡한 상황이기도 합니다. 여러분이 VirtualBox를 주력 가상화 도구로 사용하고 있다고 가정해 봅시다. 그런데 3D 가속에 문제가 생겨 게스트 화면이 검게 나오는 등의 증상을 겪고 있습니다. 제 이전 튜토리얼에서 보셨듯이, 해결책은 배포판 저장소에서 제공하는 게스트 애디션(guest additions)을 사용하는 것입니다. 하지만 이 저장소 패키지는 공식 ISO에서 제공하는 버전과 달리 공유 폴더 드라이버를 포함하지 않습니다. 즉, 공유 폴더 기능 자체를 사용할 수 없다는 뜻입니다.

여기에 상황을 더 얽히게 만들어 봅시다. 파일을 공유하고 싶은데, 예전에 다룬 '네트워크 & 공유' 튜토리얼처럼 접근하기엔 브리지(bridged) 네트워킹이 아닌 NAT를 사용 중이라 호스트에서 게스트 머신에 일반적인 방법으로는 접근할 수 없습니다. 게다가 Samba 같은 도구를 쓰고 싶지도 않으니 난이도는 한층 더 올라갑니다. 자, 그럼 공유 폴더 없이 NAT 환경에서 호스트에서 게스트로 파일을 전송하는 방법을 보여드리겠습니다. 인터넷을 거치는 편법 없이, 전부 로컬에서 처리합니다. 차례대로 따라와 주세요.

VirtualBox: 공유 폴더 없이 NAT 네트워크에서 호스트-게스트 파일 전송하기

문제 정의

핵심 문제는 다음과 같습니다. 겉보기에는 네트워크 어댑터를 브리지 모드로 바꿔야만 게스트 머신이 호스트에 보이게 됩니다. 하지만 특히 '시끄러운(noisy)' 가상 머신이라면 원치 않는 설정일 수 있고, 파일 공유 서버를 구축하는 등 추가 작업도 결코 가볍지 않습니다. 다른 선택지는 VirtualBox 공식 ISO를 사용해 게스트 애디션을 설치하고, 검은 화면 문제가 해결될 때까지 3D 가속을 끄는 것입니다. 그래야만 공유 폴더 기능을 쓸 수 있죠.

참고로 저장소 패키지를 사용하면 대부분의 기능은 정상 동작합니다. 그래픽 가속, 마우스 통합, 화면 크기 자동 조절, 클립보드 공유 등이 그렇습니다. 다만 공유 폴더만큼은 빠져 있습니다. 공유 폴더를 강제로 마운트하려고 하면 아래와 같은 오류가 출력됩니다.

mount -t vboxsf <share> <mount point>
mount: unknown filesystem type 'vboxsf'

해결책: 포트 포워딩

VirtualBox는 NAT 방식으로 구동되는 가상 머신에 고급 네트워크 규칙을 설정할 수 있게 해줍니다. 본질적으로 이는 공유기가 내부 IP 주소를 공인 IP로 변환하고 그 반대로 처리하는 방식과 다르지 않습니다. 실제로 VirtualBox가 바로 여러분의 라우터 역할을 하는 셈입니다. Docker에서 호스트 포트를 컨테이너 포트에 매핑했던 사례와 같은 원리로, 로컬 시스템에 접속하는 것처럼 보이지만 실제로는 컨테이너, 혹은 여기서는 가상 머신에 연결되는 것입니다.

설정 방법은 다음과 같습니다. 대상 가상 머신 > 설정(Settings)으로 이동합니다. 네트워킹(Networking) 탭에서 네트워크 유형이 NAT인 상태로, 하단의 고급(Advanced) 섹션을 펼친 뒤 포트 포워딩(Port Forwarding)을 클릭합니다. 그러면 필요한 정보를 입력할 수 있는 규칙 테이블이 열립니다.

호스트 IP(Host IP): 사용할 호스트 인터페이스의 IP 주소입니다. 인터페이스가 여러 개일 수 있지만 가장 안전한 방법은 localhost(127.0.0.1)를 사용하는 것입니다. 다른 인터페이스가 비활성화되어 있거나 외부 연결이 없어도 동작하기 때문입니다.
호스트 포트(Host Port): 실제 접속 시 사용할 '가상' 포트입니다. 예를 들어 SSH용으로 포트 2222를 호스트 포트로 매핑할 수 있습니다. 이 포트로 접속하면 테이블에 지정된 게스트 IP(Guest IP)의 해당 게스트 포트(Guest Port)로 연결되는 것입니다. 나머지 두 필드는 호스트 쪽과 마찬가지로 가상 머신 쪽 정보를 입력하는 곳입니다.

VirtualBox: 공유 폴더 없이 NAT 네트워크에서 호스트-게스트 파일 전송하기

VirtualBox: 공유 폴더 없이 NAT 네트워크에서 호스트-게스트 파일 전송하기

SSH로 연결하기

자, 이제 실제 연결 단계입니다. 'SSH는 리눅스용 아니냐'라고 물으실 수 있습니다. 맞습니다. 문제가 되는 시스템이 바로 리눅스이기 때문입니다. 윈도우에는 검은 화면 문제가 없으므로 ISO의 3D 가속 + 게스트 애디션이 문제없이 작동합니다. 그래서 리눅스를 다루는 것입니다.

이제 호스트에서 게스트로 SSH(2222 포트)를 통해 접속할 수 있습니다. 물론 첫 단계는 게스트 운영체제에 openssh-server가 설치되어 실행 중인지 확인하는 것입니다. 더불어 게스트의 방화벽이 외부에서 들어오는 연결을 차단하지 않는지도 점검해야 합니다. 준비가 되었으면 아래와 같이 테스트해 봅니다.

ssh -p 2222 roger@127.0.0.1
The authenticity of host '[127.0.0.1]:2222 ([127.0.0.1]:2222)' can't be established. ECDSA key fingerprint is SHA256:Eq0ow03sffLb7G49e3KNMgMrpVV/8wFfN6uicdxPnEL.
Are you sure you want to continue connecting (yes/no)?

VirtualBox: 공유 폴더 없이 NAT 네트워크에서 호스트-게스트 파일 전송하기

하지만 이것은 어디까지나 연결 테스트일 뿐입니다. 실제로 호스트에서 게스트로 파일을 복사하려면 SCP를 사용해야 합니다. 여기서도 커스텀 포트를 지정해야 하는데, 주의할 점이 있습니다. SSH는 소문자 -p로 포트를 지정하지만, SCP는 대문자 -P 플래그를 사용합니다. 참 묘하죠? 따라서 전체 명령은 다음과 같은 형태가 됩니다.

scp -P 2222 "file" roger@127.0.0.1:/home/roger/"location"/
"file"  100% 8244KB 135.0MB/s  00:00

VirtualBox: 공유 폴더 없이 NAT 네트워크에서 호스트-게스트 파일 전송하기

마무리

저는 이런 종류의 응용 트릭을 좋아합니다. 예전의 KVM & 브리지 네트워크 기술처럼 창의적이면서 재미있기 때문입니다. 언뜻 생각하면 브리지 네트워킹으로 전환하고 Samba나 NFS를 구축하거나, 이메일로 파일을 주고받는 등 번거로운 방법을 떠올리기 쉽습니다. 하지만 포트 포워딩과 SSH만으로 충분히 우회할 수 있습니다. 두 방식 모두 간단하고 시스템에 침습적이지 않으며, 필요 없어졌을 때 설정하거나 해제하기도 매우 쉽습니다.

자, 오늘은 많은 것을 배웠습니다. 저장소 게스트 애디션에서 누락된 기능, 고급 네트워크 규칙과 포트 포워딩 활용법, SSH와 SCP의 사용법, 그리고 두 도구가 포트 옵션을 다루는 미묘한 차이(-p와 -P)까지 살펴보았습니다. 문제 해결에는 늘 깔끔한 방법이 존재한다는 점을 기억하세요. 인내심을 갖고 체계적으로 접근한다면 말입니다. 그럼 안녕히 계세요.

즐거운 컴퓨팅 되세요.