Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

QMP

QMP는 qemu 인스턴스와 커뮤니케이션하기 위한 애플리케이션으로, JSON 형태의 프로토콜을 이용한다.

QMP의 주요 기능은 다음과 같다.
  • text 기반의 가볍고 단순한 데이터 형식을 제공
  • 파싱하기 쉬운 JSON 데이터 형식 사용
  • 이벤트와 같은 비동기 메시지 지원
QMP는 QEMU 0.14 부터 지원한다. 2013년 5월 현재 qemu 버전은 1.4이다.

QMP Server 실행

QMP 서버 모드로 VM을 실행한다. QMP 모드로 VM을 실행하면, 대기 상태로 들어간다.
# qemu-system-x86_64 -m 512 -hda vm1.raw ... -qmp tcp:localhost:4444,server 
QEMU waiting for connection on: tcp:127.0.1.1:4444,server 

telnet을 이용해서 4444 포트로 접근한다. QMP 서버포트로 접근하면 VM이 실행되고, Qemu와 관련된 정보들을 확인할 수 있다.
# telnet localhost 4444
Trying 127.0.1.1...
Connected to localhost.
Escape character is '^]'.
{"QMP": {"version": {"qemu": {"micro": 0, "minor": 0, "major": 1}, "package": " (qemu-kvm-1.0)"}, "capabilities": []}}

인터넷 소켓 대신, 유닉스 도메인 소켓을 사용할 수 있다. 유닉스 도메인 소켓을 사용하면 로컬에서만 접근 할 수 있도록 제한할 수 있다. 보안을 강화하기 위한 목적으로 사용할 수 있을 테다.

# qemu-system-x86_64 -m 512 -hda vm1.raw ... -qmp unix:./qmp-sock4,server 
QEMU waiting for connection on: unix:./qmp-sock,server
이제 유닉스 도메인 소켓을 이용해서 통신하는 간단한 소켓 프로그램을 만들어야 한다. QMP 디렉토리에 python 기반의 프로그램을 사용하면 된다.

QMP 명령 사용

QMP는 입출력 모두 JSON 형식을 사용한다. 먼저 qmp_capabilities 명령을 이용해서, 명령 모드로 진입한다. C는 클라이언트 명령, S는 서버 응답을 의미한다.
C : {"execute": "qmp_capabilities"}
S : {"return": {}}

query-commands명령으로 QMP에서 지원하는 명령 목록을 확인할 수 있다.
C : {"execute": "query-commands"}}
S : {"return": 
           [{"name": "query-balloon"}, 
            {"name": "query-migrate"}, 
            {"name": "query-uuid"}, 
            {"name": "query-name"}, 
            {"name": "query-vnc"}, 
            {"name": "query-mice"}, 
            {"name": "query-status"}, 
            ....
            {"name": "quit"}]
    }

주요 명령들

2012년 6월 qemu 1.0 버전을 기준으로 QMP가 지원하는 명령들을 정리한다.

quit

VM을 즉시 종료한다.
  • 매개변수 : 없음
    C : {"execute": "quit"}
    S : {"return": {} }

eject

Removalbe 미디어를 꺼낸다. CD-ROM 디바이스에서 CD를 꺼내는 걸 생각하면 된다.
  • 매개변수
    • force : 강제로 명령을 적용. 지정하지 않을 경우 기본 값인 "false"가 적용된다.
    • device : 명령을 적용할 디바이스 이름
      C : {"execute": "eject", "argument": {"device":ide1-cd0}}
      S : {"return":{}}

change

Removale 미디어를 바꾼다. CD-ROM 디바이스에 CD를 바꿔끼는 걸 생각하면 된다.
  • 매개변수
    • device : 장치명
    • target : 미디어의 파일 이름
    • arg : 추가적인 매개변수
      C : { "execute": "change",
            "arguments": { "device": "ide1-cd0",
                           "target": "/srv/images/Fedora-12-x86_64-DVD.iso" } }
      S : { "return": {} }

screendump

VM 화면을 PPM 이미지로 저장한다.
  • 매개변수
    • filename : 저장할 이미지 파일 이름
      C : { "execute": "screendump", "arguments": { "filename": "/tmp/image" } }
      S : { "return": {} }

stop

VM의 작동을 중단한다. cont 명령을 이용해서 재 가동 할 수 있다.
  • 매개변수 : 없음
    C : { "execute": "stop" }
    S : { "return": {} }

cont

stop로 중단된 VM을 재 가동한다.
  • 매개변수 : 없음
    C : { "execute": "cont" }
    S : { "return": {} }

system_reset

시스템을 리셋 시그널을 보낸다. 시그널을 받은 운영체제는 리부팅을 수행한다.
  • 매개변수 : 없음
    C : { "execute": "system_reset" }
    S : { "return": {} }

system_powerdown

시스템에 shutdown 시그널을 보낸다.
  • 매개변수 : 없음
    C : { "execute": "system_powerdown" }
    S : { "return": {} }

device_add

디바이스를 추가한다. 온라인에서 추가할 수 있다. 지원하는 디바이스 목록은 qdev-device-use.txt에서 확인할 수 있다.
  • 매개변수
    • driver : 드라이버 이름
    • id : 유일한 디바이스 ID
      C : { "execute": "device_add", "arguments": { "driver": "e1000", "id": "net1" } }
      S : { "return": {} }

device_del

디바이스를 제거한다. 온라인에서 제거할 수 있다.
  • 매개변수
    • id : 디바이스 ID
      C : { "execute": "device_del", "arguments": { "id": "net1" } }
      S : { "return": {} }

cpu

기본 CPU를 설정한다.
  • 매개변수
    • index : CPU 인덱스 값
      C : { "execute": "cpu", "arguments": { "index": 0 } }
      S : { "return": {} }

migrate

URI로 마이그레이션 한다.
  • 매개변수
    • blk : block migration, 모든 디스크를 복사한다.
    • inc : 증분 디스크 복사.
    • uri : 목적지 uri
      C : { "execute": "migrate", "arguments": { "uri": "tcp:0:4446" } }
      S : { "return": {} }

migrate_cancel

마이그레이션을 취소한다.
  • 매개변수 : 없음
    C : { "execute": "migrate_cancel" }
    S : { "return": {} }

migrate_set_speed

마이그레이션을 위한 최대 속도를 설정한다.
  • 매개변수
    • value : 최대 속도. 초당 바이트 수
      C : { "execute": "migrate_set_speed", "arguments": { "value": 1024 } }
      S : { "return": {} }

set_password

vnc와 spice 프로토콜을 위한 비밀번호 설정
  • 매개변수
    • protocol : 프로토콜 이름
    • password : 패스워드
    • connected : keep, disconnect, fail
      C : { "execute": "set_password", "arguments": { "protocol": "vnc",
                                                     "password": "secret" } }
      S : { "return": {} }

expire_password

vnc와 spice 프로토콜을위한 패스워드 만료 기간을 설정한다.
  • 매개변수
    • protocol : 프로토콜 이름
    • time : 만료시간. now | never | +secs | secs 중 선택

qmp_capabilities

명령 상태로 진입한다. qmp 명령을 사용하기 전에 반드시 먼저 실행해야 한다.
  • 매개변수 : 없음
    C : { "execute": "qmp_capabilities" }
    S : { "return": {} }

qmp-version

QEMU의 버전정보를 반환한다.
  • 매개변수 : 없음
    C : { "execute": "query-version" }
    S : {
          "return":{
             "qemu":{
                "major":1,
                "minor":0,
                "micro":0
             },
             "package":""
          }
       }
2012년 6월 현재 1.0.0이다.

query-commands

QMP에서 사용할 수 있는 명령어 목록을 출력한다.
  • 매개변수 : 없음
    C : {"execute": "query-commands"}}
    S : {"return": 
               [{"name": "query-balloon"}, 
                {"name": "query-migrate"}, 
                {"name": "query-uuid"}, 
                {"name": "query-name"}, 
                {"name": "query-vnc"}, 
                {"name": "query-mice"}, 
                {"name": "query-status"}, 
                ....
                {"name": "quit"}]
        }

query-block

블럭 디바이스를 보여준다.
  • 매개변수 : 없음
    C : { "execute": "query-block" }
    S : {
          "return":[
             {
                "device":"ide0-hd0",
                "locked":false,
                "removable":false,
                "inserted":{
                   "ro":false,
                   "drv":"qcow2",
                   "encrypted":false,
                   "file":"disks/test.img"
                },
                "type":"hd"
             },
             {
                "device":"ide1-cd0",
                "locked":false,
                "removable":true,
                "type":"cdrom"
             },
             {
                "device":"floppy0",
                "locked":false,
                "removable":true,
                "type": "floppy"
             },
             {
                "device":"sd0",
                "locked":false,
                "removable":true,
                "type":"floppy"
             }
          ]
       }

query-blockstats

블럭 디바이스에 대한 입출력 정보를 보여준다.

C : { "execute": "query-blockstats" }
S : {
      "return":[
         {
            "device":"ide0-hd0",
            "parent":{
               "stats":{
                  "wr_highest_offset":3686448128,
                  "wr_bytes":9786368,
                  "wr_operations":751,
                  "rd_bytes":122567168,
                  "rd_operations":36772
               }
            },
            "stats":{
               "wr_highest_offset":2821110784,
               "wr_bytes":9786368,
               "wr_operations":692,
               "rd_bytes":122739200,
               "rd_operations":36604
            }
         },
         {
            "device":"ide1-cd0",
            "stats":{
               "wr_highest_offset":0,
               "wr_bytes":0,
               "wr_operations":0,
               "rd_bytes":0,
               "rd_operations":0
            }
         },
         {
            "device":"floppy0",
            "stats":{
               "wr_highest_offset":0,
               "wr_bytes":0,
               "wr_operations":0,
               "rd_bytes":0,
               "rd_operations":0
            }
         },
         {
            "device":"sd0",
            "stats":{
               "wr_highest_offset":0,
               "wr_bytes":0,
               "wr_operations":0,
               "rd_bytes":0,
               "rd_operations":0
            }
         }
      ]
   }

query-uuid

VM의 UUID를 보여준다.
  • 매개변수 : 없음
    C : {"execute": "query-uuid"}
    S : { "return": { "UUID": "550e8400-e29b-41d4-a716-446655440000" } }
    

query-chardev

문자장치의 정보를 확인할 수 있다.
  • 매개변수 : 없음
    C : {"execute":"query-chardev"}
    S : {"return": [
           {"filename": "vc", "label": "parallel0"}, 
           {"filename": "vc", "label": "serial0"}, 
           {"filename": "tcp:127.0.1.1:4444,server", "label": "compat_monitor0"}
           ]
         }

query-pci

PCI와 장치 정보를 보여준다.
C : { "execute": "query-pci" }
S : {
      "return":[
         {
            "bus":0,
            "devices":[
               {
                  "bus":0,
                  "qdev_id":"",
                  "slot":0,
                  "class_info":{
                     "class":1536,
                     "desc":"Host bridge"
                  },
                  "id":{
                     "device":32902,
                     "vendor":4663
                  },
                  "function":0,
                  "regions":[
   
                  ]
               },
               {
                  "bus":0,
                  "qdev_id":"",
                  "slot":1,
                  "class_info":{
                     "class":1537,
                     "desc":"ISA bridge"
                  },
                  "id":{
                     "device":32902,
                     "vendor":28672
                  },
                  "function":0,
                  "regions":[
   
                  ]
               },
               {
                  "bus":0,
                  "qdev_id":"",
                  "slot":1,
                  "class_info":{
                     "class":257,
                     "desc":"IDE controller"
                  },
                  "id":{
                     "device":32902,
                     "vendor":28688
                  },
                  "function":1,
                  "regions":[
                     {
                        "bar":4,
                        "size":16,
                        "address":49152,
                        "type":"io"
                     }
                  ]
               },
               {
                  "bus":0,
                  "qdev_id":"",
                  "slot":2,
                  "class_info":{
                     "class":768,
                     "desc":"VGA controller"
                  },
                  "id":{
                     "device":4115,
                     "vendor":184
                  },
                  "function":0,
                  "regions":[
                     {
                        "prefetch":true,
                        "mem_type_64":false,
                        "bar":0,
                        "size":33554432,
                        "address":4026531840,
                        "type":"memory"
                     },
                     {
                        "prefetch":false,
                        "mem_type_64":false,
                        "bar":1,
                        "size":4096,
                        "address":4060086272,
                        "type":"memory"
                     },
                     {
                        "prefetch":false,
                        "mem_type_64":false,
                        "bar":6,
                        "size":65536,
                        "address":-1,
                        "type":"memory"
                     }
                  ]
               },
               {
                  "bus":0,
                  "qdev_id":"",
                  "irq":11,
                  "slot":4,
                  "class_info":{
                     "class":1280,
                     "desc":"RAM controller"
                  },
                  "id":{
                     "device":6900,
                     "vendor":4098
                  },
                  "function":0,
                  "regions":[
                     {
                        "bar":0,
                        "size":32,
                        "address":49280,
                        "type":"io"
                     }
                  ]
               }
            ]
         }
      ]
   }

query-vnc

VNC 서버정보를 보여준다.
  • 매개변수 없음
vnc 서버모드로 실행했을 때.
C : { "execute": "query-vnc" }
S : {
      "return":{
         "enabled":true,
         "host":"0.0.0.0",
         "service":"50402",
         "auth":"vnc",
         "family":"ipv4",
         "clients":[
            {
               "host":"127.0.0.1",
               "service":"50401",
               "family":"ipv4"
            }
         ]
      }
   }

vnc 서버모드로 실행하지 않았을 때.
C : {"execute":"query-vnc"}
S : {"return": {"enabled": false}} 

query-spice

Spice 서버 정보를 보여준다.
  • 매개변수 없음
    C : { "execute": "query-spice" }
    S : {
          "return": {
             "enabled": true,
             "auth": "spice",
             "port": 5920,
             "tls-port": 5921,
             "host": "0.0.0.0",
             "channels": [
                {
                   "port": "54924",
                   "family": "ipv4",
                   "channel-type": 1,
                   "connection-id": 1804289383,
                   "host": "127.0.0.1",
                   "channel-id": 0,
                   "tls": true
                },
                {
                   "port": "36710",
                   "family": "ipv4",
                   "channel-type": 4,
                   "connection-id": 1804289383,
                   "host": "127.0.0.1",
                   "channel-id": 0,
                   "tls": false
                },
                [ ... more channels follow ... ]
             ]
          }
       }