Я беру строку, сгенерированную constructVirtBuilderCommand, и использую ее в качестве команды, необходимой моему серверу для генерации изображения в xen. Тем не менее, команда возвращает несколько вещей, так как она информирует вас о нескольких шагах, выполненных в libvirt в процессе загрузки образа, первая (и единственная) вещь, возвращаемая: "[2.5] Загрузка: http://libguestfs.org/download/builder/ubuntu-18.04.xz", но это только одна строка из всего вывода:
[3.2] Скачивание: http://libguestfs.org/download/builder/ubuntu-18.04.xz
[4.7] Планирование создания этого образа
[4.7] Распаковка
[14.7] Изменение размера (используя virt-resize) для расширения диска до 15.0G
[497.3] Установка команды firstboot: reboot
[497.7] Установка паролей
[510,8] Завершение работы
Output file: test.img
Output size: 15.0G
Output format: raw
Total usable space: 14.7G
Free space: 13.2G (99%)
Кажется, это вызывает у меня проблему. При этом команда не выполняется полностью перед возвратом. Кто-нибудь имел опыт решения этой проблемы? Изображение для меня не загружено - и если оно существует, оно существует только на мгновение, и файл внезапно исчезает, как только начинается загрузка другого изображения. Я попытался сделать несколько вещей, чтобы заставить моего клиента дождаться окончания загрузки изображения. Первое добавление «| grep Finishing» к концу команды. Второе, что я попробовал, было "> file.txt", чтобы сгенерировать этот файл ПОСЛЕ того, как команда полностью выполнена, это также не сработало.
Может кто-нибудь помочь мне понять, как заставить libvirt полностью выполнить эту команду? Это работает просто отлично, если я вручную ввожу его на свой сервер и через ssh. Спасибо!
private String constructVirtBuilderCommand()
{
String virt_builder_command = "sudo virt-builder ";
virt_builder_command += operating_system_comboBox.SelectedItem.ToString();
virt_builder_command += "-";
virt_builder_command += operating_system_version_comboBox.SelectedItem.ToString();
virt_builder_command += " --arch ";
virt_builder_command += operating_system_architecture_comboBox.SelectedItem.ToString();
virt_builder_command += " -o nodeand#.img --size ";
virt_builder_command += storage_textBox.Text;
virt_builder_command += "G --root-password password:toor --firstboot-command 'reboot'";
return virt_builder_command;
}
private void add_new_cluster_button_Click(object sender, EventArgs e)
{
if (new_cluster_name_textBox.Text != "")
{
String virtbuilder = constructVirtBuilderCommand();
String virtinstaller = constructVirtInstallCommand();
for (int i=0;i<Int32.Parse(number_of_vms_textBox.Text);i++)
{
String tmp_virtbuilder_command = virtbuilder.Replace("nodeand#", new_cluster_name_textBox.Text + i.ToString());
String tmp_virtbuilder_result = sshclient.CreateCommand(tmp_virtbuilder_command).Execute();
Console.WriteLine(tmp_virtbuilder_result);
}
label19.Text = "completed";
}
else
{
// some error message popup
}
}
РЕДАКТИРОВАТЬ:
1) Кажется, что продление времени ожидания помогает сделать его более подробным в команде. Но загруженный файл по какой-то причине удаляется на следующей итерации загрузки изображения. Если время ожидания увеличено с помощью: sshclient.ConnectionInfo.Timeout = TimeSpan.FromSeconds (1000);
Тогда я могу добраться до этой точки в выводе:
[3.2] Скачивание: http://libguestfs.org/download/builder/ubuntu-18.04.xz
[4.7] Планирование создания этого образа
[4.7] Распаковка
[14.7] Изменение размера (используя virt-resize) для расширения диска до 15.0G
Увеличение тайм-аута на большее время не требуется, поскольку все это должно выполняться довольно быстро. Я просто установил его на 1000 секунд, чтобы убедиться, что это не главная проблема.
2) Если вы хотите воссоздать ожидаемый вывод, введите: sudo virt-builder centos-7.1 --arch x86_64 -o testc0.img --size 15G - пароль-root-пароль: toor --firstboot-command 'reboot «
в терминал