После загрузки .img/.raw прогресс начнётся заново и покажет конвертацию в qcow2. Установочные .iso загружаются отдельно в разделе ISO.
Архив будет распакован автоматически. Virtuality найдёт внутри .img/.raw/.qcow2 и положит их в /var/lib/virtuality/disk-images. После загрузки .img/.raw запускается конвертация в qcow2. Установочные .iso загружаются отдельно в разделе ISO.
@@ -62,11 +62,11 @@
Raspberry / Orange Pi images
- Загрузи .img, дождись конвертации, затем в “Создать VM” выбери режим “Готовый диск”.
+ Загрузи .img или архив с .img, дождись распаковки/конвертации, затем в “Создать VM” выбери режим “Готовый диск”.
- Оригинал не трогаем
- Virtuality сохраняет исходник и создаёт рядом готовый qcow2-шаблон.
+ Архивы безопасно распаковываются
+ Поддерживаются .zip, .tar.gz и .tgz. Из архива берём только .img/.raw/.qcow2.
qemu-img convert -p -f raw -O qcow2 source.img source.qcow2
@@ -97,7 +97,7 @@
{% else %}
- | Образов пока нет. Загрузи .img, .raw или .qcow2. |
+ | Образов пока нет. Загрузи .img, .raw, .qcow2 или архив .zip/.tar.gz/.tgz. |
{% endfor %}
@@ -115,7 +115,7 @@
const statusLine = document.getElementById('upload-status');
const loadedLine = document.getElementById('upload-loaded');
const speedLine = document.getElementById('upload-speed');
- const allowedExtensions = ['.img', '.raw', '.qcow2'];
+ const allowedExtensions = ['.img', '.raw', '.qcow2', '.zip', '.tar.gz', '.tgz'];
function bytesText(bytes) {
if (!bytes) return '0 MB';
@@ -173,11 +173,11 @@
fileInput.addEventListener('change', function () {
const file = fileInput.files[0];
if (!file) {
- hint.textContent = 'Файл ещё не выбран. В этом разделе разрешены только .img, .raw и .qcow2.';
+ hint.textContent = 'Файл ещё не выбран. Разрешены .img, .raw, .qcow2, .zip, .tar.gz и .tgz.';
return;
}
if (!validDiskFile(file)) {
- hint.textContent = 'Неверный тип файла. Здесь можно выбрать только .img, .raw или .qcow2.';
+ hint.textContent = 'Неверный тип файла. Здесь можно выбрать только .img, .raw, .qcow2, .zip, .tar.gz или .tgz.';
fileInput.value = '';
return;
}
@@ -188,7 +188,7 @@
event.preventDefault();
const file = fileInput.files[0];
if (!validDiskFile(file)) {
- hint.textContent = 'Выбери образ установленной системы: .img, .raw или .qcow2.';
+ hint.textContent = 'Выбери образ установленной системы или архив: .img, .raw, .qcow2, .zip, .tar.gz или .tgz.';
return;
}
@@ -199,7 +199,7 @@
box.hidden = false;
button.disabled = true;
fileInput.disabled = true;
- resetProgress('Передача образа на сервер…', '0 MB из ' + bytesText(file.size));
+ resetProgress('Передача файла на сервер…', '0 MB из ' + bytesText(file.size));
xhr.upload.onprogress = function (event) {
if (!event.lengthComputable) {
@@ -213,7 +213,7 @@
percent.textContent = pct + '%';
loadedLine.textContent = bytesText(event.loaded) + ' из ' + bytesText(event.total);
speedLine.textContent = bytesText(speed) + '/s';
- if (pct >= 100) statusLine.textContent = 'Файл передан. Сервер сохраняет образ…';
+ if (pct >= 100) statusLine.textContent = 'Файл передан. Сервер сохраняет и при необходимости распаковывает архив…';
};
xhr.onload = async function () {