From 018ca69a3bf3440248e3fa4cedc96033c2217c16 Mon Sep 17 00:00:00 2001 From: catborise Date: Sat, 7 Nov 2026 23:40:28 +0300 Subject: [PATCH] fix(storages): a volume a running VM uses is not cloned The copy was read while the guest wrote: a raw disk was copied with data of different instants, and a qcow2 one failed on qemu-img's image lock with a message that did not say why. Such a clone is refused, with the running VMs named, when it is queued and again before it runs. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Kk4h2TcUiaWmU5MUszYSea --- locale/tr/LC_MESSAGES/django.mo | Bin 195743 -> 195931 bytes locale/tr/LC_MESSAGES/django.po | 219 ++++++++++++------------ locale/zh/LC_MESSAGES/django.mo | Bin 183102 -> 183271 bytes locale/zh/LC_MESSAGES/django.po | 217 +++++++++++------------ storages/jobs.py | 5 +- storages/tests/test_volume_clone_job.py | 7 + vrtManager/storage.py | 10 ++ vrtManager/tests/test_volume_in_use.py | 21 +++ 8 files changed, 266 insertions(+), 213 deletions(-) diff --git a/locale/tr/LC_MESSAGES/django.mo b/locale/tr/LC_MESSAGES/django.mo index e761dca880d1ace42248f01ae47831122542d1bb..fe346aaf556e535b3ae64d4f91ec4ec7a6955364 100644 GIT binary patch delta 36114 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

*c9Jj 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, 2020\n" "Language-Team: Turkish (https://www.transifex.com/catborise/teams/110663/tr/)\n" @@ -2792,7 +2792,7 @@ msgstr "" msgid "Delete snapshot" msgstr "Anlık görüntüyü sil" -#: instances/jobs.py:317 vrtManager/instance.py:2297 +#: instances/jobs.py:317 vrtManager/instance.py:2300 #, python-format msgid "The VM has no external snapshot named %(name)s" msgstr "Sanal makinede %(name)s adında harici anlık görüntü yok" @@ -2827,7 +2827,7 @@ msgstr "Sanal makine artık işin çalıştığı sunucuda değil" msgid "Take snapshot" msgstr "Anlık görüntü al" -#: instances/jobs.py:385 instances/jobs.py:394 vrtManager/instance.py:1893 +#: instances/jobs.py:385 instances/jobs.py:394 vrtManager/instance.py:1896 #, python-format msgid "A snapshot named %(name)s already exists" msgstr "%(name)s adında bir anlık görüntü zaten var" @@ -3025,7 +3025,7 @@ msgstr "cloud-init tohumu, disk için bir dizin depolama havuzu gerektirir" msgid "This host offers no firmware %(firmware)s" msgstr "Bu sunucu %(firmware)s firmware'ini sunmuyor" -#: instances/jobs.py:838 vrtManager/instance.py:3029 +#: instances/jobs.py:838 vrtManager/instance.py:3032 msgid "This host offers no TPM 2.0: install swtpm on it" msgstr "Bu sunucu TPM 2.0 sunmuyor: üzerine swtpm kurun" @@ -5919,16 +5919,16 @@ msgstr "%(quota)s (%(total)s > %(limit)s)" msgid "None available device name" msgstr "Hiçbiri uygun aygıt adı değil" -#: instances/utils.py:434 +#: instances/utils.py:435 #, python-format msgid "%(hostname)s via %(address)s" msgstr "%(address)s üzerinden %(hostname)s" -#: instances/utils.py:473 +#: instances/utils.py:474 msgid "Invalid MAC address" msgstr "Geçersiz MAC adresi" -#: instances/utils.py:475 +#: instances/utils.py:476 msgid "More MAC addresses than networks" msgstr "Ağlardan daha fazla MAC adresi" @@ -8048,51 +8048,51 @@ msgstr "İmaj adı 120 karakterden fazla olamaz" msgid "Clone volume" msgstr "Birimi klonla" -#: storages/jobs.py:59 storages/jobs.py:70 +#: storages/jobs.py:60 storages/jobs.py:73 msgid "Name of volume already in use" msgstr "Birim adı zaten kullanılıyor" -#: storages/jobs.py:65 +#: storages/jobs.py:67 #, python-format msgid "The pool has no volume named %(name)s" msgstr "Havuzda %(name)s adında birim yok" -#: storages/jobs.py:67 +#: storages/jobs.py:69 msgid "An ISO image is not cloned" msgstr "ISO imajı klonlanmaz" -#: storages/jobs.py:79 +#: storages/jobs.py:82 msgid "Copying the volume" msgstr "Birim kopyalanıyor" -#: storages/jobs.py:91 +#: storages/jobs.py:94 msgid "" "The copy exists, but the job did not see it finish; check it, then resolve " "this job." msgstr "" "Kopya var, ancak iş bittiğini görmedi; kontrol edin, sonra bu işi çözün." -#: storages/jobs.py:92 +#: storages/jobs.py:95 msgid "The copy was not made" msgstr "Kopya oluşturulmadı" -#: storages/jobs.py:103 +#: storages/jobs.py:106 msgid "Upload ISO image" msgstr "ISO imajı yükle" -#: storages/jobs.py:118 +#: storages/jobs.py:121 msgid "Invalid file name" msgstr "Geçersiz dosya adı" -#: storages/jobs.py:120 +#: storages/jobs.py:123 msgid "Only .iso files can be uploaded" msgstr "Yalnızca .iso dosyaları yüklenebilir" -#: storages/jobs.py:122 +#: storages/jobs.py:125 msgid "Invalid file size" msgstr "Geçersiz dosya boyutu" -#: storages/jobs.py:124 +#: storages/jobs.py:127 msgid "Invalid chunk index or total chunks" msgstr "Geçersiz parça dizini veya toplam parça sayısı" @@ -9012,17 +9012,17 @@ msgstr "" "%(target)s (%(path)s): hedef sunucunun %(pool)s havuzunda zaten %(file)s " "dosyası var" -#: vrtManager/instance.py:375 +#: vrtManager/instance.py:378 #, python-format msgid "%(target)s (%(path)s): another disk is copied to %(dest)s" msgstr "%(target)s (%(path)s): başka bir disk %(dest)s konumuna kopyalanıyor" -#: vrtManager/instance.py:380 +#: vrtManager/instance.py:383 #, python-format msgid "%(target)s: the VM has no disk file to copy" msgstr "%(target)s: sanal makinenin kopyalanacak disk dosyası yok" -#: vrtManager/instance.py:384 +#: vrtManager/instance.py:387 #, python-format msgid "" "%(target)s (%(path)s) of the next start: the destination host does not share " @@ -9031,12 +9031,12 @@ msgstr "" "Sonraki başlatmanın %(target)s (%(path)s) diski: hedef sunucu bunu " "paylaşmıyor" -#: vrtManager/instance.py:388 +#: vrtManager/instance.py:391 #, python-format msgid "The disks cannot be migrated: %(problems)s" msgstr "Diskler taşınamaz: %(problems)s" -#: vrtManager/instance.py:401 +#: vrtManager/instance.py:404 #, python-format msgid "" "%(error)s; remove the partial disk copies from the destination host: " @@ -9044,14 +9044,14 @@ msgid "" msgstr "" "%(error)s; yarım kalan disk kopyalarını hedef sunucudan kaldırın: %(copies)s" -#: vrtManager/instance.py:418 +#: vrtManager/instance.py:421 #, python-format msgid "" "%(error)s; remove the partial disk copies from the destination host: %(left)s" msgstr "" "%(error)s; yarım kalan disk kopyalarını hedef sunucudan kaldırın: %(left)s" -#: vrtManager/instance.py:432 +#: vrtManager/instance.py:435 #, python-format msgid "" "The NVRAM file %(path)s is not in libvirt's NVRAM directory %(dir)s and " @@ -9060,26 +9060,26 @@ msgstr "" "%(path)s NVRAM dosyası libvirt'in NVRAM dizini %(dir)s içinde değil ve " "kopyalanamaz" -#: vrtManager/instance.py:441 +#: vrtManager/instance.py:444 #, python-format msgid "The destination host cannot see the NVRAM file %(path)s" msgstr "Hedef sunucu %(path)s NVRAM dosyasını göremiyor" -#: vrtManager/instance.py:517 +#: vrtManager/instance.py:520 #, python-format msgid "%(type)s disk, cannot be checked" msgstr "%(type)s disk, kontrol edilemiyor" -#: vrtManager/instance.py:557 +#: vrtManager/instance.py:560 #, python-format msgid "The destination host already has a VM %(key)s" msgstr "Hedef sunucuda zaten %(key)s sanal makinesi var" -#: vrtManager/instance.py:579 +#: vrtManager/instance.py:582 msgid "The VM was started on the source host during the migration" msgstr "Sanal makine taşıma sırasında kaynak sunucuda başlatıldı" -#: vrtManager/instance.py:595 +#: vrtManager/instance.py:598 #, python-format msgid "" "%(error)s; the VM may now be defined only on the destination host: check both" @@ -9088,7 +9088,7 @@ msgstr "" "%(error)s; sanal makine artık yalnızca hedef sunucuda tanımlı olabilir: iki " "sunucuyu da kontrol edin" -#: vrtManager/instance.py:601 +#: vrtManager/instance.py:604 #, python-format msgid "" "%(error)s; the VM is now defined on both hosts, remove it from the " @@ -9097,7 +9097,7 @@ msgstr "" "%(error)s; sanal makine artık iki sunucuda da tanımlı, hedeften kaldırın: " "%(undo_error)s" -#: vrtManager/instance.py:607 +#: vrtManager/instance.py:610 msgid "" "Snapshot names are 1-64 letters, digits, '.', '_' or '-' and do not start " "with '.'" @@ -9105,7 +9105,7 @@ msgstr "" "Anlık görüntü adları 1-64 harf, rakam, '.', '_' veya '-' karakterinden oluşur" " ve '.' ile başlamaz" -#: vrtManager/instance.py:1095 +#: vrtManager/instance.py:1098 msgid "" "A device other than a disk or NIC is in the boot order: change it in the XML " "editor" @@ -9113,104 +9113,104 @@ msgstr "" "Önyükleme sırasında disk veya NIC dışında bir aygıt var: bunu XML " "düzenleyicide değiştirin" -#: vrtManager/instance.py:1107 +#: vrtManager/instance.py:1110 msgid "Invalid Device Type for boot order" msgstr "Ön yükleme sırası için geçersiz aygıt türü" -#: vrtManager/instance.py:1110 +#: vrtManager/instance.py:1113 #, python-format msgid "Boot device %(dev)s is not in the definition" msgstr "Ön yükleme aygıtı %(dev)s tanımda yok" -#: vrtManager/instance.py:1130 +#: vrtManager/instance.py:1133 #, python-format msgid "CD-ROM %(dev)s is not in the running definition" msgstr "CD-ROM %(dev)s çalışan tanımda yok" -#: vrtManager/instance.py:1131 +#: vrtManager/instance.py:1134 #, python-format msgid "CD-ROM %(dev)s is not in the persistent definition" msgstr "CD-ROM %(dev)s kalıcı tanımda yok" -#: vrtManager/instance.py:1143 +#: vrtManager/instance.py:1146 #, python-format msgid "Media of %(dev)s changed in the running VM only: %(err)s" msgstr "%(dev)s ortamı yalnızca çalışan sanal makinede değişti: %(err)s" -#: vrtManager/instance.py:1154 +#: vrtManager/instance.py:1157 #, python-format msgid "ISO image %(image)s was not found" msgstr "ISO imajı %(image)s bulunamadı" -#: vrtManager/instance.py:1156 +#: vrtManager/instance.py:1159 #, python-format msgid "ISO image %(image)s is in more than one storage pool" msgstr "ISO imajı %(image)s birden fazla depolama havuzunda var" -#: vrtManager/instance.py:1263 +#: vrtManager/instance.py:1266 #, python-format msgid "Disk %(target_dev)s is not in the VM's definition" msgstr "Disk %(target_dev)s sanal makinenin tanımında yok" -#: vrtManager/instance.py:1391 +#: vrtManager/instance.py:1394 msgid "Please shutdown the instance then try to enable vCPU hotplug" msgstr "" "vCPU hotplug özelliğini etkinleştirmek için önce sanal makineyi kapatın" -#: vrtManager/instance.py:1678 +#: vrtManager/instance.py:1681 msgid "The VM has no video card" msgstr "Sanal makinede ekran kartı yok" -#: vrtManager/instance.py:1852 +#: vrtManager/instance.py:1855 msgid "" "The VM has external snapshots; internal snapshots cannot be mixed with them" msgstr "" "Sanal makinenin harici anlık görüntüleri var; dahili anlık görüntüler " "bunlarla karıştırılamaz" -#: vrtManager/instance.py:1884 +#: vrtManager/instance.py:1887 msgid "A snapshot with memory is not quiesced; it keeps the whole guest state" msgstr "" "Bellekli bir anlık görüntüde dosya sistemleri dondurulmaz; tüm konuk durumunu" " saklar" -#: vrtManager/instance.py:1886 +#: vrtManager/instance.py:1889 msgid "Only a running VM's file systems can be frozen" msgstr "Yalnızca çalışan bir sanal makinenin dosya sistemleri dondurulabilir" -#: vrtManager/instance.py:1888 +#: vrtManager/instance.py:1891 msgid "The QEMU guest agent is not connected; it freezes the file systems" msgstr "QEMU konuk aracısı bağlı değil; dosya sistemlerini o dondurur" -#: vrtManager/instance.py:1891 +#: vrtManager/instance.py:1894 msgid "" "The VM has internal snapshots; external snapshots cannot be mixed with them" msgstr "" "Sanal makinenin dahili anlık görüntüleri var; harici anlık görüntüler " "bunlarla karıştırılamaz" -#: vrtManager/instance.py:1896 +#: vrtManager/instance.py:1899 msgid "Newer snapshots exist after the last revert; delete them first" msgstr "" "Son geri dönüşten sonra daha yeni anlık görüntüler var; önce onları silin" -#: vrtManager/instance.py:1899 +#: vrtManager/instance.py:1902 msgid "No snapshot is current; revert to a snapshot first" msgstr "Geçerli anlık görüntü yok; önce bir anlık görüntüye geri dönün" -#: vrtManager/instance.py:1905 +#: vrtManager/instance.py:1908 #, python-format msgid "Eject the media from %(dev)s first" msgstr "Önce %(dev)s içindeki ortamı çıkarın" -#: vrtManager/instance.py:1907 +#: vrtManager/instance.py:1910 #, python-format msgid "Disk %(dev)s is not a file; external snapshots need file disks" msgstr "" "Disk %(dev)s bir dosya değil; harici anlık görüntüler dosya diskleri " "gerektirir" -#: vrtManager/instance.py:1915 +#: vrtManager/instance.py:1918 #, python-format msgid "" "The storage pools could not be refreshed, so their free space is unknown: " @@ -9218,21 +9218,21 @@ msgid "" msgstr "" "Depolama havuzları yenilenemedi, bu yüzden boş alanları bilinmiyor: %(err)s" -#: vrtManager/instance.py:1936 +#: vrtManager/instance.py:1939 msgid "Memory is saved only from a running VM" msgstr "Bellek yalnızca çalışan bir sanal makineden kaydedilir" -#: vrtManager/instance.py:1938 +#: vrtManager/instance.py:1941 msgid "The VM has no disk to keep its memory next to" msgstr "Sanal makinenin, belleğinin yanına kaydedileceği bir diski yok" -#: vrtManager/instance.py:1942 +#: vrtManager/instance.py:1945 #, python-format msgid "%(disk)s is not in a storage pool; memory is saved only into one" msgstr "" "%(disk)s bir depolama havuzunda değil; bellek yalnızca bir havuza kaydedilir" -#: vrtManager/instance.py:1973 +#: vrtManager/instance.py:1976 #, python-format msgid "" "Storage pool %(pool)s has %(free).1f GiB free; the snapshot needs %(size).1f " @@ -9243,7 +9243,7 @@ msgstr "" "%(size).1f GiB gerektiriyor (sanal makinenin oradaki disklerinin " "%%%(percent)g kadarı, en az %(minimum)g GiB, ve kaydediliyorsa bellek)" -#: vrtManager/instance.py:1991 +#: vrtManager/instance.py:1994 msgid "" "This snapshot was taken by an older version on a UEFI VM and cannot be " "reverted; delete it instead" @@ -9251,7 +9251,7 @@ msgstr "" "Bu anlık görüntü UEFI bir sanal makinede eski bir sürümle alındı ve geri " "dönülemez; bunun yerine silin" -#: vrtManager/instance.py:2021 +#: vrtManager/instance.py:2024 #, python-format msgid "" "The revert failed twice; try again in a moment (%(error)s). The VM is " @@ -9260,7 +9260,7 @@ msgstr "" "Geri dönüş iki kez başarısız oldu; biraz sonra tekrar deneyin (%(error)s). " "Sanal makine çalışıyor." -#: vrtManager/instance.py:2023 +#: vrtManager/instance.py:2026 #, python-format msgid "" "The revert failed twice; try again in a moment (%(error)s). The VM is shut " @@ -9269,13 +9269,13 @@ msgstr "" "Geri dönüş iki kez başarısız oldu; biraz sonra tekrar deneyin (%(error)s). " "Sanal makine kapalı." -#: vrtManager/instance.py:2186 +#: vrtManager/instance.py:2189 msgid "A disk moves when its VM is defined and running, paused or shut off" msgstr "" "Bir disk, sanal makinesi tanımlıyken ve çalışırken, duraklatılmışken veya " "kapalıyken taşınır" -#: vrtManager/instance.py:2188 +#: vrtManager/instance.py:2191 msgid "" "A disk of a VM with snapshots, a saved state or a running block job does not " "move" @@ -9283,7 +9283,7 @@ msgstr "" "Anlık görüntüleri, kaydedilmiş durumu veya çalışan bir blok işi olan sanal " "makinenin diski taşınmaz" -#: vrtManager/instance.py:2196 +#: vrtManager/instance.py:2199 #, python-format msgid "" "%(dev)s is not a disk file of the VM, the same in its running and next " @@ -9292,132 +9292,132 @@ msgstr "" "%(dev)s, sanal makinenin çalışan ve sonraki başlatma tanımlarında aynı olan " "bir disk dosyası değil" -#: vrtManager/instance.py:2201 +#: vrtManager/instance.py:2204 #, python-format msgid "%(dev)s does not move: only writable raw and qcow2 disks do" msgstr "%(dev)s taşınmaz: yalnızca yazılabilir raw ve qcow2 diskler taşınır" -#: vrtManager/instance.py:2208 +#: vrtManager/instance.py:2211 #, python-format msgid "%(dev)s does not move: no storage pool has %(path)s" msgstr "%(dev)s taşınmaz: hiçbir depolama havuzunda %(path)s yok" -#: vrtManager/instance.py:2210 +#: vrtManager/instance.py:2213 #, python-format msgid "%(dev)s does not move: it has a backing file" msgstr "%(dev)s taşınmaz: temel (backing) dosyası var" -#: vrtManager/instance.py:2213 +#: vrtManager/instance.py:2216 #, python-format msgid "%(pool_name)s is not an active pool of disk files of this host" msgstr "%(pool_name)s bu sunucunun etkin bir disk dosyası havuzu değil" -#: vrtManager/instance.py:2216 +#: vrtManager/instance.py:2219 #, python-format msgid "%(dev)s is in pool %(pool_name)s already" msgstr "%(dev)s zaten %(pool_name)s havuzunda" -#: vrtManager/instance.py:2220 +#: vrtManager/instance.py:2223 #, python-format msgid "Pool %(pool_name)s already has a file %(name)s" msgstr "%(pool_name)s havuzunda zaten %(name)s dosyası var" -#: vrtManager/instance.py:2244 +#: vrtManager/instance.py:2247 #, python-format msgid "The copy of %(dev)s ended before it was complete" msgstr "%(dev)s kopyası tamamlanmadan sona erdi" -#: vrtManager/instance.py:2289 +#: vrtManager/instance.py:2292 #, python-format msgid "%(error)s; remove %(dest)s if it is there: %(cleanup_error)s" msgstr "%(error)s; varsa %(dest)s dosyasını kaldırın: %(cleanup_error)s" -#: vrtManager/instance.py:2291 +#: vrtManager/instance.py:2294 #, python-format msgid "%(error)s; the VM may use %(dest)s now: check its disk %(dev)s" msgstr "" "%(error)s; sanal makine şu anda %(dest)s dosyasını kullanıyor olabilir: " "%(dev)s diskini kontrol edin" -#: vrtManager/instance.py:2298 +#: vrtManager/instance.py:2301 #, python-format msgid "The VM has no internal snapshot named %(name)s" msgstr "Sanal makinenin %(name)s adlı dahili anlık görüntüsü yok" -#: vrtManager/instance.py:2307 +#: vrtManager/instance.py:2310 msgid "The VM has a saved state; start it or remove the saved state first" msgstr "" "Sanal makinenin kaydedilmiş durumu var; önce başlatın veya kaydedilmiş durumu" " kaldırın" -#: vrtManager/instance.py:2309 +#: vrtManager/instance.py:2312 msgid "A snapshot job is still running on this VM; try again when it ends" msgstr "" "Bu sanal makinede hâlâ bir anlık görüntü işi çalışıyor; bittiğinde tekrar " "deneyin" -#: vrtManager/instance.py:2319 +#: vrtManager/instance.py:2322 msgid "Shut the VM down to revert to an internal snapshot" msgstr "Dahili bir anlık görüntüye geri dönmek için sanal makineyi kapatın" -#: vrtManager/instance.py:2417 +#: vrtManager/instance.py:2420 msgid "Cannot clone a VM whose NVRAM is not a file" msgstr "NVRAM'i dosya olmayan bir sanal makine klonlanamaz" -#: vrtManager/instance.py:2485 +#: vrtManager/instance.py:2488 #, python-format msgid "Clone failed (%(err)s); remove these copies by hand: %(path)s" msgstr "" "Klonlama başarısız oldu (%(err)s); bu kopyaları elle kaldırın: %(path)s" -#: vrtManager/instance.py:2495 +#: vrtManager/instance.py:2498 msgid "Shut the VM down before cloning it" msgstr "Klonlamadan önce sanal makineyi kapatın" -#: vrtManager/instance.py:2549 +#: vrtManager/instance.py:2552 #, python-format msgid "Clone failed (%(err)s); remove these copies by hand: %(leftovers)s" msgstr "" "Klonlama başarısız oldu (%(err)s); bu kopyaları elle kaldırın: %(leftovers)s" -#: vrtManager/instance.py:2560 +#: vrtManager/instance.py:2563 msgid "Live clone needs libvirt 11.10 or later; shut the VM down to clone it" msgstr "" "Canlı klonlama libvirt 11.10 veya sonrasını gerektirir; klonlamak için sanal " "makineyi kapatın" -#: vrtManager/instance.py:2563 +#: vrtManager/instance.py:2566 msgid "A VM with a TPM is cloned only shut down" msgstr "TPM'i olan bir sanal makine yalnızca kapalıyken klonlanır" -#: vrtManager/instance.py:2566 +#: vrtManager/instance.py:2569 #, python-format msgid "Disk %(dev)s is not a local file; shut the VM down to clone it" msgstr "" "Disk %(dev)s yerel bir dosya değil; klonlamak için sanal makineyi kapatın" -#: vrtManager/instance.py:2568 +#: vrtManager/instance.py:2571 #, python-format msgid "Disk %(dev)s is shareable; shut the VM down to clone it" msgstr "Disk %(dev)s paylaşılabilir; klonlamak için sanal makineyi kapatın" -#: vrtManager/instance.py:2573 +#: vrtManager/instance.py:2576 #, python-format msgid "Disk %(dev)s changes at the next start; shut the VM down to clone it" msgstr "" "Disk %(dev)s sonraki başlatmada değişiyor; klonlamak için sanal makineyi " "kapatın" -#: vrtManager/instance.py:2575 +#: vrtManager/instance.py:2578 msgid "Another job is running on the VM; clone it when that ends" msgstr "Sanal makinede başka bir iş çalışıyor; o bittiğinde klonlayın" -#: vrtManager/instance.py:2588 +#: vrtManager/instance.py:2591 #, python-format msgid "Volume %(name)s already exists in storage pool %(pool)s" msgstr "%(name)s birimi %(pool)s depolama havuzunda zaten var" -#: vrtManager/instance.py:2607 +#: vrtManager/instance.py:2610 #, python-format msgid "" "Storage pool %(pool)s has %(free).1f GiB free; the clone needs %(size).1f GiB" @@ -9427,20 +9427,20 @@ msgstr "" "gerektiriyor (kopyalanan diskler, artı bunların %%%(percent)g kadarı, en az " "%(minimum)g GiB)" -#: vrtManager/instance.py:2746 +#: vrtManager/instance.py:2749 msgid "A network interface that is a host device is removed in the XML editor" msgstr "Sunucu aygıtı olan bir ağ arabirimi XML düzenleyicide kaldırılır" -#: vrtManager/instance.py:2762 +#: vrtManager/instance.py:2765 #, python-format msgid "No network interface with MAC %(old_mac)s" msgstr "MAC adresi %(old_mac)s olan ağ arabirimi yok" -#: vrtManager/instance.py:2765 +#: vrtManager/instance.py:2768 msgid "A network interface that is a host device is changed in the XML editor" msgstr "Sunucu aygıtı olan bir ağ arabirimi XML düzenleyicide değiştirilir" -#: vrtManager/instance.py:2856 +#: vrtManager/instance.py:2859 msgid "" "A VM changes its PCI devices while it runs, or is shut off without a saved " "state" @@ -9448,14 +9448,14 @@ msgstr "" "Sanal makine PCI aygıtlarını çalışırken veya kaydedilmiş durumu olmadan " "kapalıyken değiştirir" -#: vrtManager/instance.py:2868 +#: vrtManager/instance.py:2871 #, python-format msgid "%(err)s; whether the VM has PCI device %(address)s now is not known" msgstr "" "%(err)s; sanal makinede şu anda %(address)s PCI aygıtının olup olmadığı " "bilinmiyor" -#: vrtManager/instance.py:2870 +#: vrtManager/instance.py:2873 #, python-format msgid "" "%(err)s; PCI device %(address)s: the VM is not running, its next start has it" @@ -9463,7 +9463,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: sanal makine çalışmıyor, sonraki başlatmada " "var" -#: vrtManager/instance.py:2872 +#: vrtManager/instance.py:2875 #, python-format msgid "" "%(err)s; PCI device %(address)s: the VM is not running, its next start does " @@ -9472,7 +9472,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: sanal makine çalışmıyor, sonraki başlatmada " "yok" -#: vrtManager/instance.py:2873 +#: vrtManager/instance.py:2876 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM has it, its next start has it" @@ -9480,7 +9480,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: çalışan sanal makinede var, sonraki " "başlatmada var" -#: vrtManager/instance.py:2875 +#: vrtManager/instance.py:2878 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM has it, its next start does " @@ -9489,7 +9489,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: çalışan sanal makinede var, sonraki " "başlatmada yok" -#: vrtManager/instance.py:2877 +#: vrtManager/instance.py:2880 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM does not have it, its next " @@ -9498,7 +9498,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: çalışan sanal makinede yok, sonraki " "başlatmada var" -#: vrtManager/instance.py:2879 +#: vrtManager/instance.py:2882 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM does not have it, its next " @@ -9507,34 +9507,34 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: çalışan sanal makinede yok, sonraki " "başlatmada yok" -#: vrtManager/instance.py:2913 +#: vrtManager/instance.py:2916 #, python-format msgid "The VM has no PCI device %(address)s" msgstr "Sanal makinede %(address)s PCI aygıtı yok" -#: vrtManager/instance.py:2931 +#: vrtManager/instance.py:2934 msgid "The VM has no USB controller" msgstr "Sanal makinede USB denetleyicisi yok" -#: vrtManager/instance.py:2950 +#: vrtManager/instance.py:2953 msgid "The VM has no such USB device" msgstr "Sanal makinede böyle bir USB aygıtı yok" -#: vrtManager/instance.py:2964 +#: vrtManager/instance.py:2967 #, python-format msgid "The VM has no network interface %(mac)s" msgstr "Sanal makinede %(mac)s ağ arabirimi yok" -#: vrtManager/instance.py:2995 +#: vrtManager/instance.py:2998 msgid "The VM has its own RNG device: change it in the XML editor" msgstr "" "Sanal makinenin kendi RNG aygıtı var: bunu XML düzenleyicide değiştirin" -#: vrtManager/instance.py:3022 +#: vrtManager/instance.py:3025 msgid "The VM has its own TPM: change it in the XML editor" msgstr "Sanal makinenin kendi TPM'i var: bunu XML düzenleyicide değiştirin" -#: vrtManager/instance.py:3041 +#: vrtManager/instance.py:3044 #, python-format msgid "Unknown crash action %(action)s" msgstr "Bilinmeyen çökme eylemi %(action)s" @@ -9935,6 +9935,13 @@ msgstr "" "%(name)s birimi kullanımda: bir sanal makinenin diski, bir temel (backing) " "dosya ya da bir anlık görüntünün dosyası" +#: vrtManager/storage.py:360 +#, python-format +msgid "The running VMs %(vms)s use volume %(name)s; shut them down to copy it" +msgstr "" +"Çalışan %(vms)s sanal makineleri %(name)s birimini kullanıyor; kopyalamak " +"için onları kapatın" + #: vrtManager/util.py:99 #, python-format msgid "The XML is not valid: %(err)s" diff --git a/locale/zh/LC_MESSAGES/django.mo b/locale/zh/LC_MESSAGES/django.mo index 64d26c988e95aee403b28c33e6e8841fe5fc7b07..fcd2dcc7b946a7e82670f1395dff56057852d901 100644 GIT binary patch delta 36111 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 Vr*YohKaKNylWO;uMSgE`{y%(B$;$u$ diff --git a/locale/zh/LC_MESSAGES/django.po b/locale/zh/LC_MESSAGES/django.po index d9d7f778..a9e25472 100644 --- a/locale/zh/LC_MESSAGES/django.po +++ b/locale/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-11-07 19:47+0000\n" +"POT-Creation-Date: 2026-11-07 20:40+0000\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -2693,7 +2693,7 @@ msgstr "虚拟机未定义;请检查这些卷,然后处理此任务:%(volu msgid "Delete snapshot" msgstr "删除快照" -#: instances/jobs.py:317 vrtManager/instance.py:2297 +#: instances/jobs.py:317 vrtManager/instance.py:2300 #, python-format msgid "The VM has no external snapshot named %(name)s" msgstr "虚拟机没有名为 %(name)s 的外部快照" @@ -2725,7 +2725,7 @@ msgstr "虚拟机已不在运行该任务的计算节点上" msgid "Take snapshot" msgstr "创建快照" -#: instances/jobs.py:385 instances/jobs.py:394 vrtManager/instance.py:1893 +#: instances/jobs.py:385 instances/jobs.py:394 vrtManager/instance.py:1896 #, python-format msgid "A snapshot named %(name)s already exists" msgstr "名为 %(name)s 的快照已存在" @@ -2901,7 +2901,7 @@ msgstr "cloud-init 种子需要为磁盘使用目录类型的存储池" msgid "This host offers no firmware %(firmware)s" msgstr "此主机不提供固件 %(firmware)s" -#: instances/jobs.py:838 vrtManager/instance.py:3029 +#: instances/jobs.py:838 vrtManager/instance.py:3032 msgid "This host offers no TPM 2.0: install swtpm on it" msgstr "此主机不提供 TPM 2.0:请在主机上安装 swtpm" @@ -5615,16 +5615,16 @@ msgstr "%(quota)s(%(total)s > %(limit)s)" msgid "None available device name" msgstr "没有可用的设备名称" -#: instances/utils.py:434 +#: instances/utils.py:435 #, python-format msgid "%(hostname)s via %(address)s" msgstr "%(hostname)s,经由 %(address)s" -#: instances/utils.py:473 +#: instances/utils.py:474 msgid "Invalid MAC address" msgstr "无效的 MAC 地址" -#: instances/utils.py:475 +#: instances/utils.py:476 msgid "More MAC addresses than networks" msgstr "MAC 地址数量多于网络数量" @@ -7619,50 +7619,50 @@ msgstr "镜像名称不能超过 120 个字符" msgid "Clone volume" msgstr "克隆卷" -#: storages/jobs.py:59 storages/jobs.py:70 +#: storages/jobs.py:60 storages/jobs.py:73 msgid "Name of volume already in use" msgstr "卷名已被使用" -#: storages/jobs.py:65 +#: storages/jobs.py:67 #, python-format msgid "The pool has no volume named %(name)s" msgstr "存储池中没有名为 %(name)s 的卷" -#: storages/jobs.py:67 +#: storages/jobs.py:69 msgid "An ISO image is not cloned" msgstr "ISO 镜像不会被克隆" -#: storages/jobs.py:79 +#: storages/jobs.py:82 msgid "Copying the volume" msgstr "正在复制卷" -#: storages/jobs.py:91 +#: storages/jobs.py:94 msgid "" "The copy exists, but the job did not see it finish; check it, then resolve " "this job." msgstr "副本已存在,但任务未看到其完成;请检查后处理此任务。" -#: storages/jobs.py:92 +#: storages/jobs.py:95 msgid "The copy was not made" msgstr "未创建副本" -#: storages/jobs.py:103 +#: storages/jobs.py:106 msgid "Upload ISO image" msgstr "上传 ISO 镜像" -#: storages/jobs.py:118 +#: storages/jobs.py:121 msgid "Invalid file name" msgstr "文件名无效" -#: storages/jobs.py:120 +#: storages/jobs.py:123 msgid "Only .iso files can be uploaded" msgstr "只能上传 .iso 文件" -#: storages/jobs.py:122 +#: storages/jobs.py:125 msgid "Invalid file size" msgstr "文件大小无效" -#: storages/jobs.py:124 +#: storages/jobs.py:127 msgid "Invalid chunk index or total chunks" msgstr "分块索引或分块总数无效" @@ -8536,201 +8536,201 @@ msgid "" "file %(file)s" msgstr "%(target)s (%(path)s):目标主机的存储池 %(pool)s 中已有文件 %(file)s" -#: vrtManager/instance.py:375 +#: vrtManager/instance.py:378 #, python-format msgid "%(target)s (%(path)s): another disk is copied to %(dest)s" msgstr "%(target)s (%(path)s):另一个磁盘已复制到 %(dest)s" -#: vrtManager/instance.py:380 +#: vrtManager/instance.py:383 #, python-format msgid "%(target)s: the VM has no disk file to copy" msgstr "%(target)s:虚拟机没有可复制的磁盘文件" -#: vrtManager/instance.py:384 +#: vrtManager/instance.py:387 #, python-format msgid "" "%(target)s (%(path)s) of the next start: the destination host does not share " "it" msgstr "下次启动的 %(target)s (%(path)s):目标主机不共享它" -#: vrtManager/instance.py:388 +#: vrtManager/instance.py:391 #, python-format msgid "The disks cannot be migrated: %(problems)s" msgstr "磁盘无法迁移:%(problems)s" -#: vrtManager/instance.py:401 +#: vrtManager/instance.py:404 #, python-format msgid "" "%(error)s; remove the partial disk copies from the destination host: " "%(copies)s" msgstr "%(error)s;请从目标主机删除不完整的磁盘副本:%(copies)s" -#: vrtManager/instance.py:418 +#: vrtManager/instance.py:421 #, python-format msgid "" "%(error)s; remove the partial disk copies from the destination host: %(left)s" msgstr "%(error)s;请从目标主机删除不完整的磁盘副本:%(left)s" -#: vrtManager/instance.py:432 +#: vrtManager/instance.py:435 #, python-format msgid "" "The NVRAM file %(path)s is not in libvirt's NVRAM directory %(dir)s and " "cannot be copied" msgstr "NVRAM 文件 %(path)s 不在 libvirt 的 NVRAM 目录 %(dir)s 中,无法复制" -#: vrtManager/instance.py:441 +#: vrtManager/instance.py:444 #, python-format msgid "The destination host cannot see the NVRAM file %(path)s" msgstr "目标主机看不到 NVRAM 文件 %(path)s" -#: vrtManager/instance.py:517 +#: vrtManager/instance.py:520 #, python-format msgid "%(type)s disk, cannot be checked" msgstr "%(type)s 磁盘,无法检查" -#: vrtManager/instance.py:557 +#: vrtManager/instance.py:560 #, python-format msgid "The destination host already has a VM %(key)s" msgstr "目标主机上已有虚拟机 %(key)s" -#: vrtManager/instance.py:579 +#: vrtManager/instance.py:582 msgid "The VM was started on the source host during the migration" msgstr "迁移期间虚拟机在源主机上被启动" -#: vrtManager/instance.py:595 +#: vrtManager/instance.py:598 #, python-format msgid "" "%(error)s; the VM may now be defined only on the destination host: check both" " hosts" msgstr "%(error)s;虚拟机现在可能只在目标主机上定义:请检查两台主机" -#: vrtManager/instance.py:601 +#: vrtManager/instance.py:604 #, python-format msgid "" "%(error)s; the VM is now defined on both hosts, remove it from the " "destination: %(undo_error)s" msgstr "%(error)s;虚拟机现在在两台主机上都有定义,请从目标主机删除它:%(undo_error)s" -#: vrtManager/instance.py:607 +#: vrtManager/instance.py:610 msgid "" "Snapshot names are 1-64 letters, digits, '.', '_' or '-' and do not start " "with '.'" msgstr "快照名称为 1-64 个字母、数字、'.'、'_' 或 '-',且不能以 '.' 开头" -#: vrtManager/instance.py:1095 +#: vrtManager/instance.py:1098 msgid "" "A device other than a disk or NIC is in the boot order: change it in the XML " "editor" msgstr "启动顺序中有磁盘或网卡以外的设备:请在 XML 编辑器中修改" -#: vrtManager/instance.py:1107 +#: vrtManager/instance.py:1110 msgid "Invalid Device Type for boot order" msgstr "启动顺序的设备类型无效" -#: vrtManager/instance.py:1110 +#: vrtManager/instance.py:1113 #, python-format msgid "Boot device %(dev)s is not in the definition" msgstr "启动设备 %(dev)s 不在定义中" -#: vrtManager/instance.py:1130 +#: vrtManager/instance.py:1133 #, python-format msgid "CD-ROM %(dev)s is not in the running definition" msgstr "CD-ROM %(dev)s 不在运行中的定义中" -#: vrtManager/instance.py:1131 +#: vrtManager/instance.py:1134 #, python-format msgid "CD-ROM %(dev)s is not in the persistent definition" msgstr "CD-ROM %(dev)s 不在持久定义中" -#: vrtManager/instance.py:1143 +#: vrtManager/instance.py:1146 #, python-format msgid "Media of %(dev)s changed in the running VM only: %(err)s" msgstr "%(dev)s 的介质仅在运行中的虚拟机中更改:%(err)s" -#: vrtManager/instance.py:1154 +#: vrtManager/instance.py:1157 #, python-format msgid "ISO image %(image)s was not found" msgstr "未找到 ISO 镜像 %(image)s" -#: vrtManager/instance.py:1156 +#: vrtManager/instance.py:1159 #, python-format msgid "ISO image %(image)s is in more than one storage pool" msgstr "ISO 镜像 %(image)s 位于多个存储池中" -#: vrtManager/instance.py:1263 +#: vrtManager/instance.py:1266 #, python-format msgid "Disk %(target_dev)s is not in the VM's definition" msgstr "磁盘 %(target_dev)s 不在虚拟机的定义中" -#: vrtManager/instance.py:1391 +#: vrtManager/instance.py:1394 msgid "Please shutdown the instance then try to enable vCPU hotplug" msgstr "请先关闭虚拟机,再启用 vCPU 热插拔" -#: vrtManager/instance.py:1678 +#: vrtManager/instance.py:1681 msgid "The VM has no video card" msgstr "虚拟机没有显卡" -#: vrtManager/instance.py:1852 +#: vrtManager/instance.py:1855 msgid "" "The VM has external snapshots; internal snapshots cannot be mixed with them" msgstr "虚拟机有外部快照;内部快照不能与其混用" -#: vrtManager/instance.py:1884 +#: vrtManager/instance.py:1887 msgid "A snapshot with memory is not quiesced; it keeps the whole guest state" msgstr "含内存的快照不会静默文件系统;它保存整个客户机状态" -#: vrtManager/instance.py:1886 +#: vrtManager/instance.py:1889 msgid "Only a running VM's file systems can be frozen" msgstr "只有运行中的虚拟机的文件系统可以冻结" -#: vrtManager/instance.py:1888 +#: vrtManager/instance.py:1891 msgid "The QEMU guest agent is not connected; it freezes the file systems" msgstr "QEMU 客户机代理未连接;文件系统由它冻结" -#: vrtManager/instance.py:1891 +#: vrtManager/instance.py:1894 msgid "" "The VM has internal snapshots; external snapshots cannot be mixed with them" msgstr "虚拟机有内部快照;外部快照不能与其混用" -#: vrtManager/instance.py:1896 +#: vrtManager/instance.py:1899 msgid "Newer snapshots exist after the last revert; delete them first" msgstr "上次还原后存在更新的快照;请先删除它们" -#: vrtManager/instance.py:1899 +#: vrtManager/instance.py:1902 msgid "No snapshot is current; revert to a snapshot first" msgstr "没有当前快照;请先还原到某个快照" -#: vrtManager/instance.py:1905 +#: vrtManager/instance.py:1908 #, python-format msgid "Eject the media from %(dev)s first" msgstr "请先弹出 %(dev)s 中的介质" -#: vrtManager/instance.py:1907 +#: vrtManager/instance.py:1910 #, python-format msgid "Disk %(dev)s is not a file; external snapshots need file disks" msgstr "磁盘 %(dev)s 不是文件;外部快照需要文件磁盘" -#: vrtManager/instance.py:1915 +#: vrtManager/instance.py:1918 #, python-format msgid "" "The storage pools could not be refreshed, so their free space is unknown: " "%(err)s" msgstr "无法刷新存储池,其可用空间未知:%(err)s" -#: vrtManager/instance.py:1936 +#: vrtManager/instance.py:1939 msgid "Memory is saved only from a running VM" msgstr "只能保存运行中的虚拟机的内存" -#: vrtManager/instance.py:1938 +#: vrtManager/instance.py:1941 msgid "The VM has no disk to keep its memory next to" msgstr "虚拟机没有可存放其内存的磁盘" -#: vrtManager/instance.py:1942 +#: vrtManager/instance.py:1945 #, python-format msgid "%(disk)s is not in a storage pool; memory is saved only into one" msgstr "%(disk)s 不在存储池中;内存只能保存到存储池中" -#: vrtManager/instance.py:1973 +#: vrtManager/instance.py:1976 #, python-format msgid "" "Storage pool %(pool)s has %(free).1f GiB free; the snapshot needs %(size).1f " @@ -8740,156 +8740,156 @@ msgstr "" "存储池 %(pool)s 可用 %(free).1f GiB;快照需要 %(size).1f GiB(其中虚拟机磁盘的 %(percent)g%%,至少 " "%(minimum)g GiB,若保存内存则另加内存)" -#: vrtManager/instance.py:1991 +#: vrtManager/instance.py:1994 msgid "" "This snapshot was taken by an older version on a UEFI VM and cannot be " "reverted; delete it instead" msgstr "此快照由旧版本在 UEFI 虚拟机上创建,无法还原;请将其删除" -#: vrtManager/instance.py:2021 +#: vrtManager/instance.py:2024 #, python-format msgid "" "The revert failed twice; try again in a moment (%(error)s). The VM is " "running." msgstr "还原两次失败;请稍后重试(%(error)s)。虚拟机正在运行。" -#: vrtManager/instance.py:2023 +#: vrtManager/instance.py:2026 #, python-format msgid "" "The revert failed twice; try again in a moment (%(error)s). The VM is shut " "off." msgstr "还原两次失败;请稍后重试(%(error)s)。虚拟机已关机。" -#: vrtManager/instance.py:2186 +#: vrtManager/instance.py:2189 msgid "A disk moves when its VM is defined and running, paused or shut off" msgstr "仅当虚拟机已定义且处于运行、暂停或关机状态时才能移动磁盘" -#: vrtManager/instance.py:2188 +#: vrtManager/instance.py:2191 msgid "" "A disk of a VM with snapshots, a saved state or a running block job does not " "move" msgstr "有快照、保存的状态或正在运行块任务的虚拟机的磁盘不能移动" -#: vrtManager/instance.py:2196 +#: vrtManager/instance.py:2199 #, python-format msgid "" "%(dev)s is not a disk file of the VM, the same in its running and next " "start's definition" msgstr "%(dev)s 不是该虚拟机在运行中的定义和下次启动定义中相同的磁盘文件" -#: vrtManager/instance.py:2201 +#: vrtManager/instance.py:2204 #, python-format msgid "%(dev)s does not move: only writable raw and qcow2 disks do" msgstr "%(dev)s 不能移动:只能移动可写的 raw 和 qcow2 磁盘" -#: vrtManager/instance.py:2208 +#: vrtManager/instance.py:2211 #, python-format msgid "%(dev)s does not move: no storage pool has %(path)s" msgstr "%(dev)s 不能移动:没有存储池包含 %(path)s" -#: vrtManager/instance.py:2210 +#: vrtManager/instance.py:2213 #, python-format msgid "%(dev)s does not move: it has a backing file" msgstr "%(dev)s 不能移动:它有后备文件" -#: vrtManager/instance.py:2213 +#: vrtManager/instance.py:2216 #, python-format msgid "%(pool_name)s is not an active pool of disk files of this host" msgstr "%(pool_name)s 不是此主机上活动的磁盘文件存储池" -#: vrtManager/instance.py:2216 +#: vrtManager/instance.py:2219 #, python-format msgid "%(dev)s is in pool %(pool_name)s already" msgstr "%(dev)s 已在存储池 %(pool_name)s 中" -#: vrtManager/instance.py:2220 +#: vrtManager/instance.py:2223 #, python-format msgid "Pool %(pool_name)s already has a file %(name)s" msgstr "存储池 %(pool_name)s 中已有文件 %(name)s" -#: vrtManager/instance.py:2244 +#: vrtManager/instance.py:2247 #, python-format msgid "The copy of %(dev)s ended before it was complete" msgstr "%(dev)s 的复制在完成前结束" -#: vrtManager/instance.py:2289 +#: vrtManager/instance.py:2292 #, python-format msgid "%(error)s; remove %(dest)s if it is there: %(cleanup_error)s" msgstr "%(error)s;如果 %(dest)s 存在请将其删除:%(cleanup_error)s" -#: vrtManager/instance.py:2291 +#: vrtManager/instance.py:2294 #, python-format msgid "%(error)s; the VM may use %(dest)s now: check its disk %(dev)s" msgstr "%(error)s;虚拟机现在可能在使用 %(dest)s:请检查其磁盘 %(dev)s" -#: vrtManager/instance.py:2298 +#: vrtManager/instance.py:2301 #, python-format msgid "The VM has no internal snapshot named %(name)s" msgstr "虚拟机没有名为 %(name)s 的内部快照" -#: vrtManager/instance.py:2307 +#: vrtManager/instance.py:2310 msgid "The VM has a saved state; start it or remove the saved state first" msgstr "虚拟机有保存的状态;请先启动它或删除保存的状态" -#: vrtManager/instance.py:2309 +#: vrtManager/instance.py:2312 msgid "A snapshot job is still running on this VM; try again when it ends" msgstr "此虚拟机上仍有快照任务在运行;请在其结束后重试" -#: vrtManager/instance.py:2319 +#: vrtManager/instance.py:2322 msgid "Shut the VM down to revert to an internal snapshot" msgstr "请关闭虚拟机后再还原到内部快照" -#: vrtManager/instance.py:2417 +#: vrtManager/instance.py:2420 msgid "Cannot clone a VM whose NVRAM is not a file" msgstr "NVRAM 不是文件的虚拟机无法克隆" -#: vrtManager/instance.py:2485 +#: vrtManager/instance.py:2488 #, python-format msgid "Clone failed (%(err)s); remove these copies by hand: %(path)s" msgstr "克隆失败(%(err)s);请手动删除这些副本:%(path)s" -#: vrtManager/instance.py:2495 +#: vrtManager/instance.py:2498 msgid "Shut the VM down before cloning it" msgstr "请先关闭虚拟机再克隆" -#: vrtManager/instance.py:2549 +#: vrtManager/instance.py:2552 #, python-format msgid "Clone failed (%(err)s); remove these copies by hand: %(leftovers)s" msgstr "克隆失败(%(err)s);请手动删除这些副本:%(leftovers)s" -#: vrtManager/instance.py:2560 +#: vrtManager/instance.py:2563 msgid "Live clone needs libvirt 11.10 or later; shut the VM down to clone it" msgstr "在线克隆需要 libvirt 11.10 或更高版本;请关闭虚拟机后再克隆" -#: vrtManager/instance.py:2563 +#: vrtManager/instance.py:2566 msgid "A VM with a TPM is cloned only shut down" msgstr "带 TPM 的虚拟机只能在关机时克隆" -#: vrtManager/instance.py:2566 +#: vrtManager/instance.py:2569 #, python-format msgid "Disk %(dev)s is not a local file; shut the VM down to clone it" msgstr "磁盘 %(dev)s 不是本地文件;请关闭虚拟机后再克隆" -#: vrtManager/instance.py:2568 +#: vrtManager/instance.py:2571 #, python-format msgid "Disk %(dev)s is shareable; shut the VM down to clone it" msgstr "磁盘 %(dev)s 是可共享的;请关闭虚拟机后再克隆" -#: vrtManager/instance.py:2573 +#: vrtManager/instance.py:2576 #, python-format msgid "Disk %(dev)s changes at the next start; shut the VM down to clone it" msgstr "磁盘 %(dev)s 在下次启动时会改变;请关闭虚拟机后再克隆" -#: vrtManager/instance.py:2575 +#: vrtManager/instance.py:2578 msgid "Another job is running on the VM; clone it when that ends" msgstr "虚拟机上有另一个任务正在运行;请在其结束后再克隆" -#: vrtManager/instance.py:2588 +#: vrtManager/instance.py:2591 #, python-format msgid "Volume %(name)s already exists in storage pool %(pool)s" msgstr "卷 %(name)s 已存在于存储池 %(pool)s 中" -#: vrtManager/instance.py:2607 +#: vrtManager/instance.py:2610 #, python-format msgid "" "Storage pool %(pool)s has %(free).1f GiB free; the clone needs %(size).1f GiB" @@ -8898,97 +8898,97 @@ msgstr "" "存储池 %(pool)s 可用 %(free).1f GiB;克隆需要 %(size).1f GiB(复制的磁盘,再加其 %(percent)g%%,至少" " %(minimum)g GiB)" -#: vrtManager/instance.py:2746 +#: vrtManager/instance.py:2749 msgid "A network interface that is a host device is removed in the XML editor" msgstr "作为主机设备的网络接口需在 XML 编辑器中删除" -#: vrtManager/instance.py:2762 +#: vrtManager/instance.py:2765 #, python-format msgid "No network interface with MAC %(old_mac)s" msgstr "没有 MAC 为 %(old_mac)s 的网络接口" -#: vrtManager/instance.py:2765 +#: vrtManager/instance.py:2768 msgid "A network interface that is a host device is changed in the XML editor" msgstr "作为主机设备的网络接口需在 XML 编辑器中修改" -#: vrtManager/instance.py:2856 +#: vrtManager/instance.py:2859 msgid "" "A VM changes its PCI devices while it runs, or is shut off without a saved " "state" msgstr "虚拟机只能在运行时或无保存的状态的关机时更改其 PCI 设备" -#: vrtManager/instance.py:2868 +#: vrtManager/instance.py:2871 #, python-format msgid "%(err)s; whether the VM has PCI device %(address)s now is not known" msgstr "%(err)s;虚拟机现在是否有 PCI 设备 %(address)s 未知" -#: vrtManager/instance.py:2870 +#: vrtManager/instance.py:2873 #, python-format msgid "" "%(err)s; PCI device %(address)s: the VM is not running, its next start has it" msgstr "%(err)s;PCI 设备 %(address)s:虚拟机未运行,下次启动时有它" -#: vrtManager/instance.py:2872 +#: vrtManager/instance.py:2875 #, python-format msgid "" "%(err)s; PCI device %(address)s: the VM is not running, its next start does " "not have it" msgstr "%(err)s;PCI 设备 %(address)s:虚拟机未运行,下次启动时没有它" -#: vrtManager/instance.py:2873 +#: vrtManager/instance.py:2876 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM has it, its next start has it" msgstr "%(err)s;PCI 设备 %(address)s:运行中的虚拟机有它,下次启动时有它" -#: vrtManager/instance.py:2875 +#: vrtManager/instance.py:2878 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM has it, its next start does " "not have it" msgstr "%(err)s;PCI 设备 %(address)s:运行中的虚拟机有它,下次启动时没有它" -#: vrtManager/instance.py:2877 +#: vrtManager/instance.py:2880 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM does not have it, its next " "start has it" msgstr "%(err)s;PCI 设备 %(address)s:运行中的虚拟机没有它,下次启动时有它" -#: vrtManager/instance.py:2879 +#: vrtManager/instance.py:2882 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM does not have it, its next " "start does not have it" msgstr "%(err)s;PCI 设备 %(address)s:运行中的虚拟机没有它,下次启动时没有它" -#: vrtManager/instance.py:2913 +#: vrtManager/instance.py:2916 #, python-format msgid "The VM has no PCI device %(address)s" msgstr "虚拟机没有 PCI 设备 %(address)s" -#: vrtManager/instance.py:2931 +#: vrtManager/instance.py:2934 msgid "The VM has no USB controller" msgstr "虚拟机没有 USB 控制器" -#: vrtManager/instance.py:2950 +#: vrtManager/instance.py:2953 msgid "The VM has no such USB device" msgstr "虚拟机没有此 USB 设备" -#: vrtManager/instance.py:2964 +#: vrtManager/instance.py:2967 #, python-format msgid "The VM has no network interface %(mac)s" msgstr "虚拟机没有网络接口 %(mac)s" -#: vrtManager/instance.py:2995 +#: vrtManager/instance.py:2998 msgid "The VM has its own RNG device: change it in the XML editor" msgstr "虚拟机有自己的 RNG 设备:请在 XML 编辑器中修改" -#: vrtManager/instance.py:3022 +#: vrtManager/instance.py:3025 msgid "The VM has its own TPM: change it in the XML editor" msgstr "虚拟机有自己的 TPM:请在 XML 编辑器中修改" -#: vrtManager/instance.py:3041 +#: vrtManager/instance.py:3044 #, python-format msgid "Unknown crash action %(action)s" msgstr "未知的崩溃操作 %(action)s" @@ -9361,6 +9361,11 @@ msgid "" "Volume %(name)s is in use: a VM's disk, a backing file or a snapshot's file" msgstr "卷 %(name)s 正在使用中:它是虚拟机的磁盘、后备文件或快照文件" +#: vrtManager/storage.py:360 +#, python-format +msgid "The running VMs %(vms)s use volume %(name)s; shut them down to copy it" +msgstr "正在运行的虚拟机 %(vms)s 使用卷 %(name)s;请先将其关闭再复制" + #: vrtManager/util.py:99 #, python-format msgid "The XML is not valid: %(err)s" diff --git a/storages/jobs.py b/storages/jobs.py index 3b930f46..71404c00 100644 --- a/storages/jobs.py +++ b/storages/jobs.py @@ -55,8 +55,10 @@ class CloneVolume(Kind): if op.user is None or not op.user.is_active or not op.user.is_superuser: raise PermissionDenied # a volume made outside the panel since the job was queued may have taken the name - if op.intent["target"] in _storage(op.params)[1].get_volumes(): + stg = _storage(op.params)[1] + if op.intent["target"] in stg.get_volumes(): raise util.OperationError(gettext_noop("Name of volume already in use")) + stg.refuse_running_copy(op.params["image"]) # the VM may have started since def plan(self, user, params): compute, stg = _storage(params) @@ -65,6 +67,7 @@ class CloneVolume(Kind): raise util.OperationError(gettext_noop("The pool has no volume named %(name)s"), name=params["image"]) if is_iso(params["image"]): raise util.OperationError(gettext_noop("An ISO image is not cloned")) + stg.refuse_running_copy(params["image"]) target = stg.clone_name(params["name"], params["format"] or stg.get_volume_format_type(params["image"])) if target in volumes: raise util.OperationError(gettext_noop("Name of volume already in use")) diff --git a/storages/tests/test_volume_clone_job.py b/storages/tests/test_volume_clone_job.py index 247bcc17..e89329ed 100644 --- a/storages/tests/test_volume_clone_job.py +++ b/storages/tests/test_volume_clone_job.py @@ -13,6 +13,7 @@ from operations.jobs import Context from operations.models import Claim, Operation, acquire from libvirt import libvirtError from storages.jobs import CloneVolume +from vrtManager import util class VolumeCloneJobTestCase(TransactionTestCase): @@ -64,6 +65,12 @@ class VolumeCloneJobTestCase(TransactionTestCase): response = self.client.post(url, {"cln_volume": "1", "image": image, "name": "copy", "submission_key": key}, follow=True) self.assertContains(response, why) + # a running guest's disk would be copied while it writes + self.stg.get_volumes.return_value = ["base.qcow2"] + self.stg.refuse_running_copy.side_effect = util.OperationError("The running VMs vm use volume base.qcow2") + response = self.client.post(url, {"cln_volume": "1", "image": "base.qcow2", "name": "copy", + "submission_key": "key-vol00004"}, follow=True) + self.assertContains(response, "The running VMs vm use volume base.qcow2") self.assertFalse(Operation.objects.exists()) def test_recovery(self): diff --git a/vrtManager/storage.py b/vrtManager/storage.py index eebd28dd..e75c8a9a 100644 --- a/vrtManager/storage.py +++ b/vrtManager/storage.py @@ -351,6 +351,16 @@ class wvmStorage(wvmConnect): return f"{target_file}.{vol_fmt}" return f"{target_file}.{file_suffix}" if file_suffix else target_file + def refuse_running_copy(self, name): + """A volume a running guest writes is not copied: the copy would mix + instants.""" + path, pool = self.get_volume(name).path(), self.pool.name() + # a disk names it by its path (an RBD image by pool/image) or by its pool and name + uses = "devices/disk/source[@file=$p or @dev=$p or @name=$p or (@pool=$pool and @volume=$v)]" + if vms := self.domains_using(lambda domain: domain.xpath(uses, p=path, pool=pool, v=name), running_only=True): + raise util.OperationError(gettext_noop("The running VMs %(vms)s use volume %(name)s; shut them down to copy it"), + vms=", ".join(vms), name=name) + def clone_volume( self, name, diff --git a/vrtManager/tests/test_volume_in_use.py b/vrtManager/tests/test_volume_in_use.py index 1e8c461f..8a5ed983 100644 --- a/vrtManager/tests/test_volume_in_use.py +++ b/vrtManager/tests/test_volume_in_use.py @@ -132,3 +132,24 @@ class DeleteVolumeTestCase(unittest.TestCase): conn, vols = storage([domain("u1", ["/pool/other.qcow2"])], [volume("/pool/disk.qcow2")]) conn.del_volume("disk.qcow2") vols["disk.qcow2"].delete.assert_called_once_with(0) + + +class RunningCopyTestCase(unittest.TestCase): + """A running guest's disk is not copied: the copy would mix instants.""" + + def test_each_way_a_disk_names_the_volume_refuses_its_copy(self): + for source in ("file='/pool/disk.qcow2'", "dev='/pool/disk.qcow2'", "protocol='rbd' name='/pool/disk.qcow2'", + "pool='pool' volume='disk.qcow2'"): + with self.subTest(source=source): + dom = MagicMock(**{"name.return_value": "vm"}) + dom.XMLDesc.return_value = f"" + conn, _ = storage([dom], [volume("/pool/disk.qcow2")]) + conn.pool.name.return_value = "pool" + with self.assertRaisesRegex(util.OperationError, "The running VMs vm use volume disk.qcow2"): + conn.refuse_running_copy("disk.qcow2") + conn.wvm.listAllDomains.assert_called_once_with(libvirt.VIR_CONNECT_LIST_DOMAINS_ACTIVE) + + def test_another_disk_does_not(self): + conn, _ = storage([domain("u1", ["/pool/other.qcow2"])], [volume("/pool/disk.qcow2")]) + conn.pool.name.return_value = "pool" + conn.refuse_running_copy("disk.qcow2")