2010-06-30 30 views
6

Tôi đã không thể tìm thấy bất kỳ tài liệu nào nêu rõ sự tồn tại của một API có thể được sử dụng để tự động hóa mọi thứ bên trong một khách qemu. Ví dụ: Tôi muốn khởi chạy quá trình bên trong máy khách từ máy chủ. Libvirt dường như không chứa chức năng như vậy.qemu tự động hóa khách

Trả lời

3

Theo như tôi biết, cách duy nhất để liên lạc với khách là qua cầu nối mạng.

+0

có nghĩa là tôi phải viết một công cụ chạy trên mỗi khách của tôi bỏ phiếu cho các lệnh ... – Raindog

+2

điều đó không đúng, bạn có thể sử dụng màn hình để gửi tổ hợp phím. đó cũng là một cổng song song và một cổng nối tiếp. –

0

Nếu bạn đang chạy Linux trong khách, bạn không thể chỉ sử dụng ssh/màn hình để khởi chạy các quá trình từ xa trên máy khách?

người Ngoài ra, tôi đã thấy viết giấy gói python sử dụng popen() để lấy stdin/stdout và sử dụng những để tự động hóa một số lệnh (tức là khi bạn nhìn thấy dấu nhắc đăng nhập, gửi tên đăng nhập để stdin của QEMU.

8

[Ghi chú:. Tự động hóa mà không cần sử dụng bất kỳ API ảo hóa Từ tôi blog post.]

bước 1:

Theo mặc định, qemu sử dụng SDL để hiển thị đầu ra VGA Vì vậy, bước đầu tiên là làm cho sự tương tác này với. qemu qua s tdio. Qemu cung cấp một tùy chọn cho việc này.

Từ docs qemu:

-nographic Thông thường, qemu sử dụng SDL để hiển thị đầu ra VGA. Với tùy chọn này, bạn hoàn toàn có thể vô hiệu hóa đầu ra đồ họa để QEMU là một ứng dụng dòng lệnh đơn giản. Cổng nối tiếp mô phỏng là được chuyển hướng trên bảng điều khiển. Do đó, bạn vẫn có thể sử dụng QEMU để gỡ lỗi nhân Linux với một bàn điều khiển nối tiếp.

Vì vậy, tất cả những gì bạn phải làm là gọi qemu với -nographic.

Qemu -nographic -hda guest.disk

Bước 2:

Bây giờ bạn có thể tương tác với khách của mình (hoặc quá trình Qemu) thông qua dòng lệnh, bạn phải tự động hóa tương tác này. Cách rõ ràng để làm điều này trong python là bắt đầu quá trình qemu (với -nographic) với subprocess module và sau đó giao tiếp với quá trình đó. Nhưng với sự ngạc nhiên của tôi, điều này không có tác dụng với tôi. Vì vậy, tôi đã tìm cách khác.

Sau đó, tôi phát hiện ra rằng công cụ tuyệt vời nhất cho loại công việc này là Expect. Nó là một công cụ tự động hóa cho các ứng dụng tương tác được viết bằng tcl.

This guide sẽ giúp bạn bắt đầu với kỳ vọng. Đây là kịch bản để chạy một khách với qemu bằng cách sử dụng Mong đợi.

#!/usr/bin/expect -f 

#starts guest vm, run benchmarks, poweroff 
set timeout -1 

#Assign a variable to the log file 
set log  [lindex $argv 0] 

#Start the guest VM 
spawn qemu -nographic -hda guest.disk 

#Login process 
expect “login: “ 
#Enter username 
send “user\r” 

#Enter Password 
expect “Password: “ 
send “user\r” 

#Do whatever you want to do with in the guest VM. (Run a process and write result to log) 

#poweroff the Guest VM 
expect “# “ 
send “shutdown -h now\r” 
+0

Bạn sẽ nhận được một trăm điểm cho câu trả lời này! Vì vậy, freaking tuyệt vời! Cảm ơn bạn! –

1

Bạn có thể tạo đường hầm ssh ngược từ máy khách đến máy chủ, sẽ chuyển hướng mỗi yêu cầu lưu trữ trên cổng cụ thể cho khách. Bằng cách này sẽ giúp bạn kiểm soát khách từ máy chủ.

3

QEMU Monitor có thể tương tác với hệ thống khách ở mức giới hạn bằng bảng điều khiển của riêng nó. Điều này bao gồm việc đăng ký đọc, kiểm soát chuột/bàn phím và nhận các vùng màn hình. Có một số QEMU Monitor Protocol (QMP) cho phép bạn chuyển các lệnh JSON đến và đọc các giá trị từ hệ thống khách.

0

Bạn có thể truy cập khách qua mạng bằng cách đặt cầu nối mạng hoặc sử dụng tùy chọn -hostfwd.

Cách sau đơn giản hơn. Nó cho phép bạn xuất khách tcp/udp cảng để lưu trữ. Bạn có thể ánh xạ cổng tcp của khách 22 để lưu trữ và quản lý khách như bạn quản lý các máy từ xa thực. Xem blog này Running qemu at background.

2

Tôi sử dụng python với pexpect để tương tác với các máy ảo được sinh ra bằng bảng điều khiển nối tiếp của chúng. Tôi thường tự động hóa các kịch bản có đến 128VM theo cách này, nhanh chóng hợp lý của nó. Tôi thường sử dụng virt-install để khởi tạo khách, và sử dụng "virsh console (domainname)" bằng cách sử dụng pexpect để có được "handle" cho mỗi console, vì vậy tôi có thể gửi các lệnh để cấu hình mạng, các công cụ khởi động/tiện ích/script, hoạt động giám sát, vv Khá ngọt về mặt tính đơn giản, và vì các kịch bản chỉ phát hành các lệnh shell, bạn không được tiếp xúc với các API thay đổi từ phiên bản sang phiên bản, ví dụ bảng điều khiển nối tiếp sẽ luôn ở đó. Đôi khi tôi sử dụng qemu trực tiếp, (gần đây tôi đang làm việc với QEMU mà libvirt không hỗ trợ vì nó quá mới), trong trường hợp đó, tôi sẽ có bảng điều khiển dành cho khách sử dụng cổng telnet để tôi có thể "telnet localhost portnumber" giao diện điều khiển thay vì "giao diện điều khiển virsh (tên miền)". Dù bằng cách nào, các kịch bản python với mô-đun pexpect để tương tác với các máy ảo là rất tốt.

1

PyQemu về mặt lý thuyết có thể làm điều này. Tôi đã sử dụng nó trong quá khứ, mặc dù nó trông giống như một dự án cũ bây giờ. Nó cung cấp một tác nhân python (tương đương với các công cụ khách VMWare) để chạy trên máy khách, giao tiếp với máy chủ thông qua cổng nối tiếp. Bạn có thể nhận proxy cho các mô-đun python đang chạy trong ngữ cảnh của máy ảo, và bất kỳ giao tiếp nào với chúng đều được sắp xếp trên cổng nối tiếp. Trong ví dụ sau, AutoIt đang được sử dụng để tự động hóa Notepad:

machine = PyQemu.GetProxy("win2k") 

# Wrap the machine object in another proxy representing the 'os' 
# module running inside the VM. 
os = PyQemu.vm.Module(machine,"os") 

# NOTE: This is running on the VM! 
os.system("notepad") 

# Get an IDispatch object representing the autoit ActiveX control 
autoit = PyQemu.vm.Dispatch(machine,"AutoItX3.Control") 

# See if a window is active on the VM 
state = autoit.WinActive("Untitled -") 

Nên biết trước: Do sử dụng cổng nối tiếp đó là xa nhanh chóng (bất kể các thiết lập tốc độ nối tiếp), vì vậy có lẽ tốt nhất để chuyển giao bất kỳ dữ liệu số lượng lớn bởi các phương tiện khác, ví dụ Hình ảnh đĩa ảo FAT.

Các vấn đề liên quan