加入收藏 | 设为首页 | 会员中心 | 我要投稿 济源站长网 (https://www.0391zz.cn/)- 数据工具、数据仓库、行业智能、CDN、运营!
当前位置: 首页 > 教程 > 正文

通过网络配对模拟处理器QEMU的monitor

发布时间:2022-06-19 18:15:14 所属栏目:教程 来源:互联网
导读:QEMU是一套开源的模拟处理器,在GNU/Linux平台上使用广泛,本文我们将通过网络连接QEMU的监控器monitor. 1.QEMU monitor支持远程telnet访问: [root@kvm-host ~]# qemu-system-x86_64 -enable-kvm -smp 2 -m 1024 vm2.img -monitor telnet:10.1.77.82:4444,serv
  QEMU是一套开源的模拟处理器,在GNU/Linux平台上使用广泛,本文我们将通过网络连接QEMU的监控器monitor.
 
  1.QEMU monitor支持远程telnet访问:
 
  [root@kvm-host ~]# qemu-system-x86_64 -enable-kvm -smp 2 -m 1024 vm2.img -monitor telnet:10.1.77.82:4444,server,nowait
 
  关于这里-monitor的选项,做如下说明:
 
  tcp – raw tcp sockets  #下面第2点,我的举例是RAW TCP socket
  telnet – the telnet protocol is used instead of raw tcp sockets. This is the preferred option over tcp as you can break out of the monitor using Ctrl-] then typing quit. You can’t break out of the monitor like this after connecting with the raw socket option
  10.1.77.82 – Listen on this host/IP only. You can use 127.0.0.1 if you want to only allow connections locally. If you want to listen on any ip address on the server, just leave this blank so you end up with two consecutive colons ie “::” .
  4444 – port number to listen on.
  server – listening in server mode
  nowait – qemu will wait for a client socket application to connect to the port before continuing unless this option is used. In most cases you’ll want to use the nowait option.
  通过telnet连接到远程的QEMU monitor上,代码如下:
 
  jay@jay-linux:~$ telnet 10.1.77.82 4444
  Trying 10.1.77.82...
  Connected to 10.1.77.82.
  Escape character is '^]'.
  QEMU 1.7.50 monitor - type 'help' for more information
  (qemu) info kvm
  kvm support: enabled
  (qemu) info status
  VM status: running
  (qemu) help migrate
  migrate [-d] [-b] [-i] uri -- migrate to URI (using -d to not wait for completion)
                           -b for migration without shared storage with full copy of disk  --phpfensi.com
                           -i for migration without shared storage with incremental copy of disk (base image shared between src and destination)
  (qemu) ctrl + ] (断掉telnet连接)
  telnet> quit      (退出telnet)
  Connection closed.
  2.QEMU monitor支持RAW socket的远程访问,代码如下:
 
  [root@kvm-host ~]# qemu-system-x86_64 -enable-kvm -smp 2 -m 1024 vm2.img -monitor tcp:10.1.77.82:4444,server,nowait
 
  可以使用netcat去连接这个socket,代码如下:
 
  jay@jay-linux:~$ nc 10.1.77.82 4444
  QEMU 1.7.50 monitor - type 'help' for more information
  (qemu) info kvm
  info kvm
  kvm support: enabled
  (qemu) ^C
  自己写了个socket程序示例如连接monitor,效果如下:
 
  jay@jay-linux:~/workspace/c-cpp.git/c2013$ ./monitor_client
  sending command 'info kvm
  ' to remote qemu monitor
  output from qemu monitor: QEMU 1.7.50 monitor - type 'help' for more information
   ??,?
  output from qemu monitor: (qemu) info kvm
  kvm support: enabled
  (qemu)
  上面那个连接monitor的socket程序示例为:
 
  https://github.com/smilejay/c-cpp/blob/master/c2013/socket_qemu_monitor_client.c
 
  代码如下:
 
  /* socket_qemu_monitor_clinet.c
  * Connect to remote QEMU monitor socket and sending a command to the monitor.
  * author: Jay <smile665@gmail.com>
  */
  
  #include <sys/types.h>
  #include <sys/socket.h>
  #include <stdio.h>
  #include <netinet/in.h>
  #include <arpa/inet.h>
  #include <unistd.h>
  #include <stdlib.h>
  #include <string.h>
  
  int main(int argc, char *argv[])
  {
          int sockfd;
          int len;
          struct sockaddr_in address;
          int result;
          char *cmd = "info kvmn";
          char output[200];
  
          /* Create a socket for the client. */
          sockfd = socket(AF_INET, SOCK_STREAM, 0);
  
          /* Name the socket, as agreed with the server. */
          address.sin_family = AF_INET;
          address.sin_addr.s_addr = inet_addr("10.1.77.82");
          address.sin_port = htons(4444);
          len = sizeof(address);
  
          /* Now connect our socket to the server's socket. */
          result = connect(sockfd, (struct sockaddr *)&address, len);
  
          if(result == -1) {
                  perror("oops: socket connetion failed.");
                  exit(1); //phpfensi.com
          }
  
          /* We can now read/write via sockfd. */
          printf("sending command '%s' to remote qemu monitorn", cmd);
          write(sockfd, cmd, strlen(cmd));
          read(sockfd, output, sizeof(output));
          printf("output from qemu monitor: %sn", output);
          read(sockfd, output, sizeof(output));
          printf("output from qemu monitor: %sn", output);
          close(sockfd);
          exit(0);
  }。

(编辑:济源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读