Tôi có một vấn đề khá thú vị cho bạn. Nó cũng khá convoluted. Giả sử bạn dùng VirtualBox làm công cụ ảo hóa ưa thích. Giả sử bạn gặp trouble với 3D acceleration - black screen và tất cả. Như bạn thấy trong tutorial của tôi, fix là dùng guest additions từ repo. Nhưng bộ repo này, do distro cung cấp, không giống additions từ ISO chính thức, không chứa driver shared folder. Nghĩa là bạn không có chức năng này.
Làm mọi thứ phức tạp hơn, giả sử bạn muốn share stuff. Chúng ta đã nói về điều này trong tutorial khác, tên network & sharing, nhưng bạn dùng NAT thay vì bridged networking, nên guest machine không accessible từ host bằng bất kỳ phương tiện bình thường nào. Và bạn không muốn dùng Samba hoặc tương tự, nên tình huống còn phức tạp hơn. Okay, tôi sẽ chỉ cho bạn cách transfer file từ host sang guest mà không có shared folder trong khi dùng NAT. Không Internet tomfoolery. Chúng ta làm tất cả local. Theo chân mình nhé.
Problem Statement
Như bạn thấy, chúng ta có issue mà seemingly chúng ta cần làm máy của mình visible hơn bằng cách bridge network adapter, điều này có thể không phải điều bạn muốn, đặc biệt nếu bạn có VM 'noisy', cộng với bạn có thể cần setup file sharing server và những gì, tất cả đều tốn nhiều hơn công sức tầm thường. Option khác là dùng VirtualBox ISO, disable 3D acceleration trong trường hợp cụ thể này - cho đến khi black screen issue biến mất, nhưng coi nó như proverbial problem của bất kỳ loại - và sau đó chúng ta có thể dùng shared folders feature.
Về chủ đề đó, nếu bạn dùng repo package, bạn sẽ có hầu hết mọi thứ - graphics acceleration, mouse integration, screen resizing, clipboard sharing, và những thứ khác - nhưng không có folders. Nếu bạn thử mount thủ công shared folder, bạn sẽ nhận được cái gì đó như:
mount -t vboxsf <share> <mount point>
mount: unknown filesystem type 'vboxsf'
Giải pháp: Port Forwarding
VirtualBox cho phép bạn cấu hình advanced network rule cho máy NAT-ed. Về bản chất, điều này không khác cách router của bạn hoạt động khi translate local IP address sang public-facing, và ngược lại. Thực tế, VirtualBox là router của bạn ở đây. Chúng ta cũng thấy điều này với Docker, nơi bạn có thể map host port sang container port, nên bạn thực tế access local system nhưng thực chất kết nối đến container, hoặc trong trường hợp này, VM.
Anyway, chọn VM > Settings. Dưới Networking, cho network type NAT, expand section Advanced xuống dưới. Sau đó click Port Forwarding. Sẽ mở một table nơi bạn input chi tiết cần thiết. Host IP - địa chỉ IP của interface bạn muốn dùng; bạn có thể có nhiều hơn một, nhưng giải pháp dễ nhất là dùng localhost (127.0.0.1), vì điều này sẽ hoạt động ngay cả khi interface khác down, hoặc bạn không có kết nối bên ngoài host. Host Port - sẽ là 'virtual' address bạn sẽ connect. Ví dụ, cho SSH, hint hint, chúng ta có thể map port 2222 làm Host Port. Nghĩa là nếu bạn kết nối đến port này, bạn sẽ thực chất kết nối đến Guest IP tại Guest Port liên quan được chỉ định trong table. Thật vậy, hai field kia là cho thông tin VM, giống như chúng ta làm với host.
Kết nối với SSH
Vậy là chúng ta có kết nối thực tế. Bạn có thể nói đợt, SSH là cho Linux! Vâng, vì chúng ta có vấn đề trong Linux. Không có black screen issue với Windows, nên 3D acceleration thingie + guest additions từ ISO sẽ chạy fine. Ergo, Linux.
Chúng ta giờ có thể kết nối từ host đến guest dùng SSH (trên port 2222). Nhưng tất nhiên, bước đầu là đảm bảo openssh-server được cài và chạy trong guest OS. Chúng ta cũng cần đảm bảo guest không dùng firewall chặn incoming connection. Bây giờ test xem sao.
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)?
Nhưng đây chỉ để test connectivity. Chúng ta thực sự cần SCP để copy file từ host vào guest. Ở đây cũng cần chỉ định custom port. Nhưng lưu ý: SSH dùng lowercase -p để chỉ port, trong khi SCP dùng uppercase -P flag cho port number. Go figure. Vậy toàn bộ thingie sẽ như:
scp -P 2222 "file" roger@127.0.0.1:/home/roger/"location"/
"file" 100% 8244KB 135.0MB/s 00:00
Kết luận
Tôi thích loại exercise này, vì chúng có thể innovative và fun - như trick KVM & bridged network của tôi. Nhìn đầu tiên, bạn có thể nghĩ bạn sẽ cần bridged networking, setup Samba hoặc NFS, hoặc email file, điều này có thể tedious. Thay vào đó, chúng ta workaround issue với port-forwarding và SSH, cả hai đều đơn giản, non-intrusive và rất dễ setup hoặc disable nếu không cần.
Vậy thì, chúng ta đã học khá nhiều hôm nay - về tính năng thiếu trong repo guest additions, dùng advanced networking rule và port forwarding, SSH và SCP và sự khác biệt tinh tế trong cách chúng dùng port number, và một vài khái niệm khác. Đó là tất cả. Nhớ, luôn có một cách neat để fix vấn đề, nếu bạn kiên nhẫn và methodical. Take care.
Chúc vui.