вторник, 6 сентября 2016 г.

KVM qemu-agent, чтение\запись файлов (guest-file-*)

В предыдущей части были рассмотрены настройка qemu-agent и выполнение команд на VDS используя libvirt через qemu-agent.
Предлагаю теперь рассмотреть создание\чтение файла.
Для начала работы с файлом нужно его открыть и указать mode:
# virsh qemu-agent-command ubuntu16 '{"execute":"guest-file-open","arguments":{"path":"/tmp/privet.txt","mode":"w+"}}'
{"return":1001}
Если все хорошо, то вернется дескриптор файла - handle. В дальнейшем обращения к файлу будут осуществляться через его дескриптор (handle).
Закодируем данные, которые планируем поместить в файл, и сохраним их в переменную:
VAR=`echo "MY TEXT
OR SCRIPT
WHATEVER" | base64`
Теперь запишем это в файл:
# virsh qemu-agent-command ubuntu16 '{"execute":"guest-file-write","arguments":{ "handle": 1001,"buf-b64": "'$VAR'" } }'
{"return":{"count":27,"eof":false}}
Count указывает на кол-во успешно записанных байт.
Eof показывает был ли достигнут конец файла в процессе записи.
Обращаю внимание что в handle параметр передавался как int. Это важный момент для скриптов.

В текущий момент данные не записаны в файл, они находятся в буфере, и их необходимо записать на диск:
# virsh qemu-agent-command ubuntu16 '{"execute":"guest-file-flush","arguments":{ "handle": 1001 } }'
{"return":{}}
При успешном выполнении данной команды, она вернет "ничего" - это нормальная ситуация.

Теперь файл необходимо закрыть:
# virsh qemu-agent-command ubuntu16 '{"execute":"guest-file-close","arguments":{ "handle": 1001 } }'
{"return":{}}
В случае с guest-file-close "пустой возврат" так же говорит о успешном выполнении.

С записью понятно, очередь чтения из файла, так же для этого его нужно сначала открыть, затем прочесть:
# virsh qemu-agent-command ubuntu16 '{"execute":"guest-file-open", "arguments":{"path":"/etc/networks","mode":"r"}}'
{"return":1002}
# virsh qemu-agent-command ubuntu16 '{"execute":"guest-file-read", "arguments":{"handle":1002}}'
{"return":{"count":81,"buf-b64":"ZGVmYXVsdAkJMC4wLjAuMApsb29wYmFjawkxMjcuMC4wLjAKbGluay1sb2NhbAkxNjkuMjU0LjAuMApsb2NhbG5ldAkxODguMjI1Ljc2LjAK","eof":true}}
Count - кол-во прочитанных байт
buf-b64 - прочтенные данные в base64
# echo "ZGVmYXVsdAkJMC4wLjAuMApsb29wYmFjawkxMjcuMC4wLjAKbGluay1sb2NhbAkxNjkuMjU0LjAuMApsb2NhbG5ldAkxODguMjI1Ljc2LjAK"|base64 --decode
default         0.0.0.0
loopback        127.0.0.0
link-local      169.254.0.0
localnet        192.168.20.0
Нужно не забыть закрыть файл, вообще после любого успешного открытия файла всегда необходимо закрывать файлы, иначе на VDS-ке будут скапливаться открытые файлы:
root@ubuntu16:~# lsof /etc/networks 
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
qemu-ga 2165 root    8r   REG    8,1       81 786776 /etc/networks
Просмотреть список всех открытых файлов qemu агентом можно используя команду:
/usr/bin/lsof -p `/usr/bin/pgrep qemu-ga`
Закроем файл:
# virsh qemu-agent-command ubuntu16 '{"execute":"guest-file-close","arguments":{"handle":1002}}'
{"return":{}}
Пустой возврат говорит об успешном закрытии файла.

Мы читали "маленький" файл, что будет если прочитать "большой" файл? Например /etc/services
virsh qemu-agent-command ubuntu16 '{"execute":"guest-file-open", "arguments":{"path":"/etc/services","mode":"r"}}'
{"return":1003}
virsh qemu-agent-command ubuntu16 '{"execute":"guest-file-read", "arguments":{"handle":1003}}'
{"return":{"count":4096,"buf-b64":"МНОГО ДАННЫХ","eof":false}}
Функция guest-file-read прочитала блок размером 4096 байт, и как видно по eof, конец файла достигнут не был.
Для дальнейшего прочтения нужно использовать guest-file-read до тех пор пока не будет достигнут конец, eof:true.

После того как появится eof:true, команду guest-file-read можно продолжать использовать на файле:
# virsh qemu-agent-command ubuntu16 '{"execute":"guest-file-read", "arguments":{"handle":1003}}'
{"return":{"count":0,"buf-b64":"","eof":true}}
и она будет успешно завершать, но возвращать она будет 0 байт и пустой buf-b64.
Не забываем закрывать файл:
# virsh qemu-agent-command ubuntu16 '{"execute":"guest-file-close","arguments":{"handle":1003}}'
{"return":{}}

Комментариев нет:

Отправить комментарий