Làm cách nào để tự động khởi động và tắt máy VirtualBox?


52

Tôi cần chạy một hệ thống phần mềm dự định được cài đặt như một thiết bị trên một máy chuyên dụng. Để tiết kiệm năng lượng, tôi dự định chạy hệ thống trên VirtualBox VM.

Máy chủ lưu trữ là một hộp Linux tiêu chuẩn với hệ thống SysV-init, khách là một Linux được sửa đổi nhiều và tôi không muốn phải thay đổi nó thêm nữa. VirtualBox được sử dụng trong phiên bản OSE.

Tôi đã tìm ra cách khởi động VM khi máy chủ khởi động ( Chỉnh sửa: việc này được thực hiện, như Nikhil đã đề cập dưới đây, thông qua lệnh VBoxManager startvm), nhưng làm cách nào tôi có thể tắt VM một cách duyên dáng? Bất kỳ tập lệnh nào chạy trên máy chủ sẽ cần phải đợi cho đến khi khách hoàn toàn tắt máy.

Bất cứ ai có thể đề nghị làm thế nào, ví dụ, một tập tin dịch vụ làm điều này sẽ phải xem?


bạn có thể cung cấp cho tập lệnh khởi động để khởi động máy ảo trong khi khởi động
Người mới bắt đầu

Câu trả lời:


34

Bạn đã thử acpipowerbuttontừ bộ lệnh này?

VBoxManage controlvm        <uuid>|<name>
                            pause|resume|reset|poweroff|savestate|
                            acpipowerbutton|acpisleepbutton|

Chỉnh sửa sau khi đọc các bình luận:

Bạn có thể sử dụng acpidhoặc các tiện ích acpi khác để làm cho nó duyên dáng. Ngoài ra, bạn có thể cung cấp thêm thông tin về cách bạn tắt máy vào lúc này không?

Đồng bằng shutdownsẽ không chờ đợi những công việc còn dang dở, thời gian trì hoãn có thể quá lâu.

Tôi giả sử bạn không sử dụng trình quản lý cửa sổ, vì vậy hãy thử công cụ này .

Chỉ cần nhìn thấy daemon này . Bạn có thể thấy nó hữu ích.


Cảm ơn câu trả lời của bạn và chào mừng bạn đến với unix.stackexchange.com! Tuy nhiên, tôi e rằng câu trả lời của bạn cũng không giải quyết được vấn đề của tôi: acpipowerbutton mô phỏng nhấn nút nguồn trên máy thật, nhưng sau khi ban hành lệnh này trên máy chủ, VM sẽ lại mất một thời gian để tắt.
jstarek

4
Chắc chắn rồi. Vì vậy, bạn phải viết một vòng lặp để kiểm tra xem VM có còn chạy hay không. ACPI chính xác là cùng một phương pháp tôi sử dụng trong các tập lệnh của mình cho việc này. vboxmanage list runningvmscho đến khi VM của bạn biến mất
Nils

OK, trong khi tôi nghĩ rằng tôi sẽ giải quyết cho một trình bao bọc quản lý trong thực tế, +50 cho bạn để chỉ vào bản initscript!
jstarek

16

Thay vì tự viết mã này, hãy cân nhắc sử dụng Vagrant , được xây dựng để khởi tạo và kiểm soát các trường hợp hộp ảo. Các tài liệu này là tuyệt vời và tôi khuyên bạn nên kiểm tra nó hơn là cố gắng tự cuộn.

Cái dài và ngắn của nó là bạn tạo một tệp điều khiển đơn giản và sau đó chạy vagrant upđể bắt đầu nhiều phiên bản VirtualBox như bạn muốn. Bạn có thể sử dụng vagrant sshđể đăng nhập vào máy chủ và vagrant halttắt máy chủ (mà không chấm dứt). vagrant destroysẽ thoát khỏi các trường hợp.

Nó hỗ trợ cung cấp với con rối, Ansible hoặc Chef và cho phép bạn kiểm soát hầu hết các cài đặt cấu hình VBox được hiển thị.


2
Tôi là một người hâm mộ cuồng nhiệt, nhưng trong trường hợp này, bạn muốn nó trên trái đất để làm gì? OP đang chạy một thiết bị, không xây dựng hệ thống của riêng họ, do đó việc cung cấp hoàn toàn bỏ lỡ điểm. Và tại sao lại đi và tạo một 'hộp' tùy chỉnh ra khỏi thiết bị, chỉ để sử dụng một cách mơ hồ, khi về cơ bản bạn sẽ trải qua quá trình xây dựng hệ thống với hộp ảo để làm điều đó?
mc0e

10

Tôi có ứng dụng tương tự như bạn, với một điểm khác biệt: Tôi cần khởi động lại hệ thống và khôi phục từ ảnh chụp nhanh.

Những gì bạn quan tâm là chế độ không đầu .

Tôi có một vài dịch vụ như vậy nên tôi sử dụng đoạn script sau:

VBox_StopRestoreStart.sh

#!/bin/bash
if [ -z "$1" ]; then
        echo "Usage: $0 VMNAME_or_UUID"
        exit 1
fi
set -x
VBoxManage controlvm  "$1" poweroff  #enforce turnoff
VBoxManage snapshot   "$1" restorecurrent   #retore state
VBoxManage showvminfo "$1" | grep State   #display state to ensure
VBoxHeadless -s       "$1"  #run in headless mode in background

Làm thế nào tôi có thể tắt VM một cách duyên dáng?

NẾU bạn muốn tắt VM một cách duyên dáng, bạn có hai tùy chọn, tùy thuộc vào ứng dụng của bạn:

  • Giả lập "nút tắt" hoặc "nút ngủ" và chuẩn bị VM phản ứng với nó (để đóng một cách duyên dáng)
    • VBoxManage controlvm <uuid>|<VMname> acpipowerbutton
    • VBoxManage controlvm <uuid>|<VMname> acpisleepbutton
  • Lưu trạng thái VM để khôi phục sau đó
    • VBoxManage controlvm <uuid>|<VMname> savestate

MIPSO: Bạn có thể thấy hữu ích:

  • VBoxManage list vms - danh sách các vms có sẵn
  • rdesktop IP-ADDR:3389hoặc rdesktop-vrdp IP-ADDR:3389- khi bạn muốn có GUI (thậm chí từ xa ) khi bạn chạy ở chế độ không đầu:VBoxHeadless -s <uuid>|<VMname>
  • VBoxManage startvm - bắt đầu với GUI để gỡ lỗi cục bộ

Chương hướng dẫn sử dụng VirtualBox liên quan: Chương 7. Máy ảo từ xa - Từng bước: tạo máy ảo trên máy chủ không đầu

PS Nếu bạn quan tâm đến các giải pháp đã được triển khai đầy đủ tính năng, OpenStack có vẻ là sự lựa chọn thú vị.


10

Xem tài liệu quản lý VirtualBox VM tại http://www.virtualbox.org/manual/ch08.html

Để liệt kê các VM, sử dụng lệnh VBoxManage list vms

Để khởi động VM, sử dụng lệnh VBoxManage startvm

http://www.virtualbox.org/manual/ch08.html#vboxmanage-controlvm

Để kiểm soát VM, sử dụng VBoxManage controlvm

Tiểu ban controlvmcho phép bạn thay đổi trạng thái của một máy ảo hiện đang chạy. Sau đây có thể được chỉ định:

VBoxManage controlvm <vm> pausetạm thời đặt một máy ảo, mà không thay đổi trạng thái của nó cho tốt. Cửa sổ VM sẽ được sơn màu xám để cho biết VM hiện đang bị tạm dừng. (Điều này tương đương với việc chọn mục "Tạm dừng" trong menu "Máy" của GUI.)

Sử dụng VBoxManage controlvm <vm> resumeđể hoàn tác một lệnh tạm dừng trước đó. (Điều này tương đương với việc chọn mục "Tiếp tục lại" trong menu "Máy" của GUI.)

VBoxManage controlvm <vm> resetcó tác dụng tương tự đối với máy ảo khi nhấn nút "Đặt lại" trên máy tính thật: khởi động lại lạnh máy ảo, sẽ khởi động lại và khởi động lại hệ điều hành khách ngay lập tức. Trạng thái của VM không được lưu trước và dữ liệu có thể bị mất. (Điều này tương đương với việc chọn mục "Đặt lại" trong menu "Máy" của GUI.)

VBoxManage controlvm <vm> poweroffcó tác dụng tương tự trên máy ảo như kéo cáp nguồn trên máy tính thật. Một lần nữa, trạng thái của VM không được lưu trước và dữ liệu có thể bị mất. (Điều này tương đương với việc chọn mục "Đóng" trong menu "Máy" của GUI hoặc nhấn nút đóng của cửa sổ, sau đó chọn "Tắt nguồn máy" trong hộp thoại.)

Sau đó, trạng thái của VM sẽ là "Tắt nguồn".


Lưu ý rằng trên một số hệ thống, nó là vboxmanage(tất cả chữ thường).
Bắt đầu

2
Cảm ơn câu trả lời của bạn, nhưng thật không may, điều này không giải quyết được vấn đề của tôi: Tôi cần tắt máy khách một cách duyên dáng , tức là phát hành "tắt máy ngay bây giờ" bên trong khách và để chủ nhà đợi cho đến khi khách tắt máy hoàn toàn. Không có VBoxManage controlvmtiểu ban nào làm điều đó.
jstarek

Bạn có thể chắc chắn rằng bằng cách kiểm tra lại tất cả các vms đã tắt trong máy chủ trước khi máy chủ ngừng hoạt động. Nếu bạn cần kiểm soát máy chủ từ bên trong khách, thì virtualbox.org/manual/ch08.html#vboxmanage-guestcontrol nhưng điều này có thể không cung cấp cho bạn những gì bạn đang tìm kiếm. Bạn nên viết một kịch bản khởi động như /etc/init.d/vboxvms-servicetập lệnh trên hệ thống máy chủ, khi bắt đầu sẽ làm cho tất cả các vms bật và tắt, sẽ làm cho tất cả các vms đi xuống.
Nikhil Mulley

VBoxManage controlvm savestatelà một khả năng khác (ít nhất là google nói với tôi), nó lưu trạng thái máy và tắt nó sạch sẽ, nhưng vẫn không có cách nào để buộc máy chủ phải chờ.
Baarn

5

Đối với một hệ thống dựa trên systemd, bạn có thể thử điều này.

Bước # 1: tạo tệp dịch vụ

[Unit]
Description=VBox Virtual Machine %i Service
Requires=systemd-modules-load.service
After=systemd-modules-load.service

[Service]
User=user
Group=vboxusers
ExecStart=/usr/bin/VBoxHeadless -s %i
ExecStop=/usr/bin/VBoxManage controlvm %i savestate

[Install]
WantedBy=multi-user.target

Bước # 2: Kích hoạt tệp dịch vụ

$ sudo systemctl enable vboxvmservice@vm_name.service

Người giới thiệu


1
Nên bao gồm một câu trả lời ở đây và tùy ý cung cấp các liên kết đến thông tin chi tiết hơn. Mục tiêu liên kết biến mất mà không cần thông báo, làm cho câu trả lời của bạn trở nên vô giá trị.
Anthon

Vấn đề là tôi thực sự không thể sao chép toàn bộ tệp systemd trong liên kết 1 ở đây, hay tôi nên làm điều này?
Jan Rüegg

Thật không may, "thối liên kết" là một vấn đề lớn trong những trường hợp đó ... Tôi nghĩ, đối với hậu thế, hai dòng sau đây nắm bắt ý tưởng cơ bản đằng sau Liên kết của bạn: Đó là tạo ra một dịch vụ sử dụng VBoxHeadless -s %iđể khởi động và VBoxManage controlvm %i savestatedừng VM.
jstarek

Đã thử điều này trong Debian Jessie, nhưng nó không hoạt động. Đã tạo người dùng và nhóm, đặt quyền sở hữu tất cả các tệp (bao gồm / dev / vbox *). Nhưng khi dịch vụ bắt đầu, nó không thể tìm thấy VM, mặc dù tên này là đúng. Sau khi sử dụng script init bình thường.
mivk

3

Làm thế nào về việc gửi lệnh qua ssh từ máy chủ đến khách?

Tôi không chắc chắn nếu nó hoạt động và nếu bạn có thể kiểm tra trạng thái của máy sau đó hoặc nhận được một cái gì đó như trạng thái thoát, nhưng nó sẽ làm sạch ít nhất.


Suy nghĩ tốt, nhưng điều này sẽ đảm bảo rằng VM khách có thể truy cập qua mạng từ máy chủ, ít nhất là cổng ssh (22).
Nikhil Mulley

Về cơ bản, điều này sẽ hoạt động, thiết bị có thể đạt được trong toàn bộ mạng LAN thông qua mục nhập DNS của nó. Tuy nhiên, giả sử tôi đã viết một tập lệnh ssh'd vào thiết bị bất cứ khi nào máy chủ ngừng hoạt động - nó vẫn sẽ phải chặn (tạm dừng) cho đến khi khách tắt hoàn toàn. Đây chính xác là điểm của câu hỏi của tôi: Làm thế nào kịch bản có thể biết khi khách ngừng hoạt động, để nó có thể mang lại luồng điều khiển quay lại SysV-init và máy chủ có thể tiếp tục tắt?
jstarek

1
Nhận xét của bạn cho rằng mọi thứ sẽ hoạt động trơn tru trên hệ thống máy chủ chứ không phải trên hệ thống khách. Điều gì nếu cáp nguồn được cắm trên hệ thống máy chủ? Đó là một cuộc thảo luận khác nhau. SysV-init của bạn trên hệ thống máy chủ sẽ đợi tập lệnh dịch vụ dừng VM miễn là tập lệnh dịch vụ hiểu logic để tắt máy khách theo đúng cách (thực hiện tắt máy chủ từ xa hoặc tắt nguồn qua giao diện vbox) và sau đó mang lại trạng thái thành công hoặc thất bại trở lại giao diện điều khiển hoặc init.
Nikhil Mulley

1
Về: làm thế nào script biết khi khách ngừng hoạt động, hãy thử kiểm tra đơn giản xem vm được bật hay tắt từ giao diện VboxManager và nếu khách có ssh'able. Ngoài ra, đặt một số giám sát trên hệ thống máy chủ sẽ thực hiện xem VM có sẵn từ Vboxmanager và ssh'able của nó một cách kịp thời hay không.
Nikhil Mulley

1

Giải pháp của tôi: Trong shellscript này, 'root' là kẻ xâm lược và 'theuser' là chủ sở hữu của 'thevm'

Tôi biết các vms đã kết thúc khi đầu ra của lệnh VBoxManage list runningvmstrả về một chuỗi rỗng.

...
start(){
    su -c "VBoxHeadless --startvm thevm" -s /bin/bash theuser &
    # maybe another vbox command
}

stop(){
    su -c "VBoxManage controlvm thevm acpipowerbutton" -s /bin/bash theuser
    # maybe another vbox command
    while [ "`su -c 'VBoxManage list runningvms' -s /bin/bash theuser`" != "" ]
    do
        echo waiting for VMs to shutdown
        sleep 3
    done
}
...

1

Để bắt đầu vm:

VBoxManage startvm VMNAME --type headless

Để dừng vm:

VBoxManage controlvm VMNAME savestate

Liệt kê tất cả các vm đang chạy:

VBoxManage list runningvms

0

Có lẽ điều này sẽ giúp như là một phần của giải pháp.

VBoxManage list runningvms | tr -s '\" {' '%{' | cut -d '%' -f3  | while read uuid; do
   VBoxManage controlvm $uuid savestate; 
done

0

Tại sao bạn không đăng nhập vào khách của bạn và tắt máy từ đó?

Trừ khi bạn có lý do chính đáng để không cài đặt sshd và truy cập VM thực sự thông qua VBox, tôi sẽ tìm một tập lệnh chỉ phát hành một ssh shutdown -h now. Thành thật mà nói, tôi sẽ tạo một tập lệnh cho mọi máy tắt nó và thực hiện một số kiểm tra trong khi ở đó.

Chỉ cần đóng gói một tập lệnh /etc/init.d/shutdown_vm gọi một tập lệnh khác từ máy chủ lưu trữ, cuộc gọi sẽ chặn cho đến khi sẵn sàng. Quá trình này (như được mô tả) thêm một phụ thuộc linux vào máy khách nhưng loại bỏ sự phụ thuộc VBox tại máy chủ.

Cắt theo đuổi: bạn không cần phải truy cập VBox để tắt máy, nếu bạn có một số phương tiện truy cập (tức là ssh) thì HĐH sẽ luôn có một số phương tiện cho việc đó (tất nhiên là bật, thì khác)


Hai lý do: Thứ nhất, như đã nêu trong câu hỏi ban đầu, tôi không muốn thay đổi HĐH khách được sửa đổi nhiều nếu nó không thực sự cần thiết. Thứ hai, và quan trọng hơn, điều này nhằm cung cấp một cách rõ ràng để tự động tắt tất cả các máy ảo đang chạy nếu máy chủ bị tắt.
jstarek

@jstarek Nhưng bạn không phải sửa đổi hệ điều hành khách của mình nếu bạn không muốn (99,99% thời gian bạn có một số phương tiện để đăng nhập, hoặc đây có phải là ngoại lệ). Và chính xác đó là ý tưởng, nếu máy chủ ngừng hoạt động, tập lệnh thích hợp sẽ được gọi khi thay đổi thời gian chạy và điều này chỉ đăng nhập cho khách và tắt nó từ "bên trong", đó là điều mà dù sao đi nữa ... trước khi đi "vũ phu" lực lượng "đó là ...
estani
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.