Skip to main content

Vagrant ssh (với VirtualBox backend) hoạt động thế nào?

Vagrant là công cụ tuyệt vời để tạo máy ảo, với 3 câu lệnh, ta đã chui vào máy ảo mới tạo:

vagrant init
vagrant up
vagrant ssh

Bên dưới có rất nhiều "magic" xảy ra, đó là những giá trị mà Vagrant mang lại thay vì tạo máy ào bằng tay với VirtualBox/VMWare/KVM...

Vagrant ssh là câu lệnh thú vị và bất ngờ khi tìm hiểu: kết nối mạng từ máy thật (host) vào máy ảo (guest) như thế nào.

Test với máy ảo chạy fedora, không chỉnh sửa config gì sau khi vagrant init ngoài box:

  config.vm.box = "fedora/33-cloud-base"
  config.vm.box_version = "33.20201019.0"

Bật debug

Cách đơn giản để tìm hiểu 1 phần mềm bất kỳ là bật chế độ logging debug/verbose lên, vagrant không là ngoại lệ.

VAGRANT_LOG=info vagrant ssh

có các chế độ log nhiều hơn như VAGRANT_LOG=debug nhưng với info cũng đã đủ rồi:

$ VAGRANT_LOG=info vagrant ssh
 INFO global: Vagrant version: 2.2.6
 INFO global: Ruby version: 2.4.9
 INFO global: RubyGems version: 2.6.14.4
 INFO vagrant: `vagrant` invoked: ["ssh"]
...
 INFO subprocess: Starting process: ["/usr/local/bin/VBoxManage", "showvminfo", "63dfeb70-1337-4db3-84f4-4bf3514aa225"]
...
 INFO ssh: Invoking SSH: /usr/bin/ssh ["vagrant@127.0.0.1", "-p", "2222", "-o", "LogLevel=FATAL", "-o", "Compression=yes", "-o", "DSAAuthentication=yes", "-o", "IdentitiesOnly=yes", "-o", "StrictHostKeyChecking=no", "-o", "UserKnownHostsFile=/dev/null", "-i", "/Users/user/me/fedora/.vagrant/machines/default/virtualbox/private_key"]
Last login: Wed Feb 10 08:22:51 2021 from 10.0.2.2
[vagrant@localhost ~]$ 

vagrant ssh vào máy ảo qua lo (loopback interface), dùng 127.0.0.1 chứ không phải bất kỳ network interface nào khác.

VirtualBox networking modes

https://www.virtualbox.org/manual/ch06.html

VirtualBox có các networking modes sau:

Network Address Translation (NAT). (máy guest có thể kết nối internet)
NAT Network. (các máy guest có thể kết nôí đến nhau)
Bridged networking. (máy guest sử dụng network thật mà máy host đang dùng)
Internal networking. (???)
Host-only networking. (máy guest sẽ có địa chỉ IP mà máy host có thể truy cập)

NAT

Mặc định, vagrant sẽ dùng NAT, máy guest sẽ có thể kết nối internet, vagrant sẽ cấu hình port forwarding, từ 1 port nào đó trên máy host, tới port 22 trên máy guest, để có thể ssh: vagrant@127.0.0.1 -p 2222...

Port forwarding

Khi cần chạy 1 service mà muốn các máy trong mạng đều truy cập được, máy ảo cần thêm 1 interface ở mode: bridge, nó sẽ hoạt động như 1 máy thật trong mạng, với IP của mạng thật.

Khi cần chạy 1 service mà muốn máy host truy cập được, có thể forward port với NAT nói trên, hoặc tạo 1 host-only interface.

SSH Key

Một Vagrant box tải từ vagrant cloud sẽ đảm bảo nó có sẵn user vagrant, cho phép ssh qua 1 cặp SSH key cung cấp sẵn. Sau lần đầu ssh vào, vagrant sẽ sinh 1 cặp key mới và thay thế cặp key mặc định này. https://www.vagrantup.com/docs/boxes/base#vagrant-user

~/me/fedora/.vagrant/machines/default/virtualbox/private_key

Toàn bộ thông tin này có trong output bình thường của lệnh vagrant up khi chạy lần đầu:

$ vagrant up;                                                    [0]
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'generic/openbsd6'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'generic/openbsd6' version '2.0.6' is up to date...
==> default: A newer version of the box 'generic/openbsd6' for provider 'virtualbox' is
==> default: available! You currently have version '2.0.6'. The latest is version
==> default: '3.2.4'. Run `vagrant box update` to update.
==> default: Setting the name of the VM: openbsd_default_1613198270097_41776
==> default: Fixed port collision for 22 => 2222. Now on port 2200.
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 (guest) => 2200 (host) (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2200
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: 
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default: 
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!

Kết luận

Với những hiểu biết này, ta đã có thể tạo các máy ảo và dùng như vagrant, hay thậm chí tạo các vagrant box để tự dùng.

https://www.vagrantup.com/docs/boxes/base

Xem thêm

Hướng dẫn vagrant cơ bản tại https://www.familug.org/2020/02/vagrant.html

Comments

Popular posts from this blog

Tài liệu và hướng dẫn học Python

Để tiết kiệm thời gian, tốt nhất là đi học PyMI Updated: 130617 Sau đây là các tài liệu khuyên dùng: Vì nhiều lý do, nên học python2.7 tại thời điểm hiện tại (giờ là tháng 6/2013 - muốn biết tại sao thì tự tìm hiểu) python 3.5+ (giờ là tháng 2/2017) Chuẩn bị: 1. biết bật tắt máy 2. biết cài python 3. tập gõ 10 ngón - gõ 2 ngón hay 1 ngón cũng không sao, nhưng 10 ngón là cách dễ nhất để gõ nhanh nhất. Tài liệu - Nên dùng tài liệu tại trang chủ của Python làm chính, tham khảo thêm các tài liệu khác tại http://www.familug.org/2016/12/free-ebook.html Căn bản, mới học 1.1 Python PyMI.vn https://pymi.vn/tutorial/ 1.2. Python offical tutorial kết hợp làm bài tập trên HackerRank  (đề bài bằng tiếng Anh, nhưng Google translate 1 lúc cũng ra vì có nhiều ví dụ mẫu đi kèm). Học viên của Pymi.vn có rất nhiều học viên đã tự học với Learn Python the hard way nhưng chưa thấy ai thành công cả. Hai link dưới nên đọc sau khi đã nắm được những phần cơ bản của ngôn ngữ pytho...

The PyMiers

New FAMILUG