libguestfs / virt-v2v Goto Github PK
View Code? Open in Web Editor NEWVirt-v2v converts guests from foreign hypervisors to run on KVM
License: GNU General Public License v2.0
Virt-v2v converts guests from foreign hypervisors to run on KVM
License: GNU General Public License v2.0
Virt-v2v is a program that converts a single guest from a foreign hypervisor to run on KVM. It can read Linux and Windows guests running on VMware, Xen, Hyper-V and some other hypervisors, and convert them to KVM managed by libvirt, OpenStack, oVirt, Red Hat Virtualisation (RHV) or several other targets. It can modify the guest to make it bootable on KVM and install virtio drivers so it will run quickly. There is also a companion front-end called virt-p2v (https://github.com/libguestfs/virt-p2v) which comes as an ISO, CD or PXE image that can be booted on physical machines to virtualize those machines (physical to virtual, or p2v). Virt-v2v and virt-p2v have been in continuous development since 2007. For more information about virt-v2v and virt-p2v please read the respective manual pages. For virt-v2v, see the docs/ subdirectory in the source tree. BUILDING FROM SOURCE ====================================================================== To build from git: git submodule update --init autoreconf -i ./configure make To build from tarball: ./configure make You can run virt-v2v without installing it: ./run virt-v2v ... To run the tests: make check REQUIREMENTS ====================================================================== * libguestfs (https://libguestfs.org) * OCaml bindings for libguestfs * OCaml bindings for libvirt (https://gitlab.com/libvirt/libvirt-ocaml) * libnbd >= 1.10 (https://gitlab.com/nbdkit/libnbd) * The 'nbdinfo' and 'nbdcopy' programs from libnbd. * OCaml bindings for libnbd * nbdkit >= 1.27.4 (https://gitlab.com/nbdkit/nbdkit) * These nbdkit plugins and filters: + nbdkit-curl-plugin + nbdkit-file-plugin + nbdkit-nbd-plugin + nbdkit-null-plugin + nbdkit-python-plugin + nbdkit-ssh-plugin + nbdkit-vddk-plugin + nbdkit-cacheextents-filter + nbdkit-cow-filter + nbdkit-multi-conn-filter + nbdkit-rate-filter + nbdkit-retry-filter * qemu-nbd * qemu-img Optional, for enhancements to the basic program: * OCaml gettext * virtio-win (Windows virtio device drivers) Optional, used by the test suite: * guestfish * OCaml oUnit2
The release tarball is missing configure.sh and there is not a valid makefile in the release or git repo. Using GNU Make 4.3
~/virt-v2v-2.3.3 $ autoreconf -i
configure.ac: warning: AM_GNU_GETTEXT is used, but not AM_GNU_GETTEXT_VERSION or AM_GNU_GETTEXT_REQUIRE_VERSION
libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, 'build-aux'.
libtoolize: copying file 'build-aux/ltmain.sh'
libtoolize: putting macros in AC_CONFIG_MACRO_DIRS, 'm4'.
libtoolize: copying file 'm4/libtool.m4'
libtoolize: copying file 'm4/ltoptions.m4'
libtoolize: copying file 'm4/ltsugar.m4'
libtoolize: copying file 'm4/ltversion.m4'
libtoolize: copying file 'm4/lt~obsolete.m4'
m4/guestfs-c.m4:23: warning: The macro `AC_PROG_CC_STDC' is obsolete.
m4/guestfs-c.m4:23: You should run autoupdate.
./lib/autoconf/c.m4:1671: AC_PROG_CC_STDC is expanded from...
m4/guestfs-c.m4:23: the top level
configure.ac:34: installing 'build-aux/compile'
configure.ac:45: installing 'build-aux/config.guess'
configure.ac:45: installing 'build-aux/config.sub'
configure.ac:37: installing 'build-aux/install-sh'
configure.ac:37: installing 'build-aux/missing'
configure.ac:129: error: required file 'common/options/Makefile.in' not found
configure.ac:129: error: required file 'common/mlcustomize/Makefile.in' not found
configure.ac:129: error: required file 'common/mldrivers/Makefile.in' not found
configure.ac:129: error: required file 'common/mlgettext/Makefile.in' not found
configure.ac:129: error: required file 'common/mlpcre/Makefile.in' not found
configure.ac:129: error: required file 'common/mlstdutils/Makefile.in' not found
configure.ac:129: error: required file 'common/mlstdutils/guestfs_config.ml.in' not found
configure.ac:129: error: required file 'common/mltools/Makefile.in' not found
configure.ac:129: error: required file 'common/mlutils/Makefile.in' not found
configure.ac:129: error: required file 'common/mlv2v/Makefile.in' not found
configure.ac:129: error: required file 'common/mlxml/Makefile.in' not found
configure.ac:129: error: required file 'common/qemuopts/Makefile.in' not found
configure.ac:129: error: required file 'common/utils/Makefile.in' not found
Makefile.am:22: error: required directory ./common/mlstdutils does not exist
Makefile.am:22: error: required directory ./common/qemuopts does not exist
Makefile.am:22: error: required directory ./common/utils does not exist
Makefile.am:22: error: required directory ./common/mlutils does not exist
Makefile.am:22: error: required directory ./common/mlpcre does not exist
Makefile.am:22: error: required directory ./common/options does not exist
Makefile.am:22: error: required directory ./common/mlgettext does not exist
Makefile.am:22: error: required directory ./common/mlxml does not exist
Makefile.am:22: error: required directory ./common/mltools does not exist
Makefile.am:22: error: required directory ./common/mlcustomize does not exist
Makefile.am:22: error: required directory ./common/mldrivers does not exist
Makefile.am:22: error: required directory ./common/mlv2v does not exist
parallel-tests: installing 'build-aux/test-driver'
convert/Makefile.am: installing 'build-aux/depcomp'
autoreconf-2.71: error: automake failed with exit status: 1
virt-v2v$ sudo apt install libguestfs-dev libnbd-dev # you may want to add this to the instructions
virt-v2v$ autoreconf -i
m4/guestfs-libraries.m4:77: warning: macro 'AM_GNU_GETTEXT' not found in library
m4/guestfs-libraries.m4:77: warning: macro 'AM_GNU_GETTEXT' not found in library
m4/guestfs-c.m4:23: warning: The macro `AC_PROG_CC_STDC' is obsolete.
m4/guestfs-c.m4:23: You should run autoupdate.
./lib/autoconf/c.m4:1666: AC_PROG_CC_STDC is expanded from...
m4/guestfs-c.m4:23: the top level
virt-v2v$ ./configure
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether the compiler supports GNU C... yes
checking whether gcc accepts -g... yes
checking for gcc option to enable C11 features... none needed
checking whether gcc understands -c and -o together... yes
checking for stdio.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for strings.h... yes
checking for sys/stat.h... yes
checking for sys/types.h... yes
checking for unistd.h... yes
checking for wchar.h... yes
checking for minix/config.h... no
checking whether it is safe to define __EXTENSIONS__... yes
checking whether _XOPEN_SOURCE should be defined... no
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a race-free mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports the include directive... yes (GNU style)
checking whether make supports nested variables... yes
checking how to create a pax tar archive... gnutar
checking dependency style of gcc... gcc3
checking whether make supports nested variables... (cached) yes
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking how to print strings... printf
checking for a sed that does not truncate output... /usr/bin/sed
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking for fgrep... /usr/bin/grep -F
checking for ld used by gcc... /usr/bin/ld
checking if the linker (/usr/bin/ld) is GNU ld... yes
checking for BSD- or MS-compatible name lister (nm)... /usr/bin/nm -B
checking the name lister (/usr/bin/nm -B) interface... BSD nm
checking whether ln -s works... yes
checking the maximum length of command line arguments... 1572864
checking how to convert x86_64-pc-linux-gnu file names to x86_64-pc-linux-gnu format... func_convert_file_noop
checking how to convert x86_64-pc-linux-gnu file names to toolchain format... func_convert_file_noop
checking for /usr/bin/ld option to reload object files... -r
checking for objdump... objdump
checking how to recognize dependent libraries... pass_all
checking for dlltool... no
checking how to associate runtime and link libraries... printf %s\n
checking for ar... ar
checking for archiver @FILE support... @
checking for strip... strip
checking for ranlib... ranlib
checking command to parse /usr/bin/nm -B output from gcc object... ok
checking for sysroot... no
checking for a working dd... /usr/bin/dd
checking how to truncate binary pipes... /usr/bin/dd bs=4096 count=1
checking for mt... mt
checking if mt is a manifest tool... no
checking for dlfcn.h... yes
checking for objdir... .libs
checking if gcc supports -fno-rtti -fno-exceptions... no
checking for gcc option to produce PIC... -fPIC -DPIC
checking if gcc PIC flag -fPIC -DPIC works... yes
checking if gcc static flag -static works... yes
checking if gcc supports -c -o file.o... yes
checking if gcc supports -c -o file.o... (cached) yes
checking whether the gcc linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes
checking whether -lc should be explicitly linked in... no
checking dynamic linker characteristics... GNU/Linux ld.so
checking how to hardcode library paths into programs... immediate
checking whether stripping libraries is possible... yes
checking if libtool supports shared libraries... yes
checking whether to build shared libraries... yes
checking whether to build static libraries... yes
checking if 2.3 is a stable or development branch of virt-v2v... development
configure: virt-v2v version 2.3.3
--- Checking for external programs ---
checking for a sed that does not truncate output... (cached) /usr/bin/sed
checking for gawk... (cached) gawk
checking whether ln -s works... yes
checking for xorrisofs... /usr/bin/xorrisofs
checking for po4a-gettextize... no
checking for po4a-translate... no
checking for sqlite3... sqlite3
checking for zip... /usr/bin/zip
checking for unzip... /usr/bin/unzip
checking for valgrind... no
checking for pycodestyle... no
--- Checking for the C compiler environment ---
checking how to run the C preprocessor... gcc -E
checking for special C compiler options needed for large files... no
checking for _FILE_OFFSET_BITS value needed for large files... no
checking size of long... 8
checking if __attribute__((cleanup(...))) works with this compiler... yes
--- Checking for libraries used by virt-v2v ---
checking for pkg-config... /usr/bin/pkg-config
checking pkg-config is at least version 0.9.0... yes
checking for libguestfs >= 1.44... yes
checking for libnbd... yes
checking for gcc options needed to detect all undeclared functions... none needed
checking whether strerror_r is declared... yes
checking whether strerror_r returns char *... yes
checking for byteswap.h... yes
checking for errno.h... yes
checking for linux/magic.h... yes
checking for sys/mount.h... yes
checking for sys/socket.h... yes
checking for sys/statfs.h... yes
checking for sys/statvfs.h... yes
checking for sys/time.h... yes
checking for sys/types.h... (cached) yes
checking for sys/un.h... yes
checking for sys/vfs.h... yes
checking for sys/wait.h... yes
checking for windows.h... no
checking for fsync... yes
checking for posix_fadvise... yes
checking for statfs... yes
checking for statvfs... yes
checking for sync... yes
checking for sys/mkdev.h... no
checking for sys/sysmacros.h... yes
checking for xgettext... no
checking for msgcat... no
checking for msgfmt... no
checking for msgmerge... no
checking msgfmt is GNU tool... no
./configure: line 15128: syntax error near unexpected token `external'
./configure: line 15128: `AM_GNU_GETTEXT(external)'
installing libglib2.0-dev did not help
Hi Folks,
I ran into the following failure while trying to migrate a PhotonOS(https://vmware.github.io/photon/) guest with virt-v2v where virt-v2v complained of not being able to detect the distro of the guest. Logs:
Failed to determine unit we run in, ignoring: No data available
guestfsd: => inspect_get_distro (0x1e4) took 0.01 secs
libguestfs: trace: v2v: inspect_get_distro = "unknown"
i_root = /dev/sda3
i_type = linux
i_distro = unknown
i_osinfo = unknown
i_arch = x86_64
i_major_version = 5
i_minor_version = 0
i_package_format = unknown
i_package_management = unknown
i_product_name = VMware Photon OS 5.0
i_product_variant = unknown
i_windows_systemroot =
i_windows_software_hive =
i_windows_system_hive =
i_windows_current_control_set =
virt-v2v: error: inspection could not detect the source guest (or physical machine).
Assuming that you are running virt-v2v/virt-p2v on a source which is supported (and not, for example, a blank dis
k), then this should not happen.
Inspection field ‘i_distro’ was ‘unknown’.
rm -rf -- '/tmp/v2vnbdkit.bcTLgc'
rm -rf -- '/tmp/v2v.tCVBMC'
libguestfs: trace: v2v: close
Full logs gist: https://gist.github.com/prakashmishra1598/60e6f814b9fc5014ff3dae020e77303b
Based on discussions here: kubev2v/forklift#494 (comment), the support is needed at virt-v2v level and I wanted to continue the discussion here to understand the efforts required to add support for PhotonOS in virt-v2v
As documented virt-v2v
currently only supports virtio-blk
(viostor.sys
).
Check that you are presenting a virtio-blk interface (not virtio-scsi and not ide) to the guest.
https://libguestfs.org/virt-v2v.1.html#boot-failure:-0x0000007b
virt-v2v/convert/windows_virtio.ml
Line 61 in 315c016
This can cause problems in environments where only virtio-scsi
is supported.
Such environments are for example Hetzner Cloud and LXD VMs which are opinionated qemu-based VMs that exclusively use UEFI and only virtio devices (restricted to only virtio-scsi
type disks).
I've built virt-v2v (2.2.0 from downloads on libguestfs.org, but also from git head of tree, 2.3.5, and 2.2.0), but every build fails make check
at the same spot. I'm wondering if I have a too new/old version of the guestfs perl module?
All builds are done on an Ubuntu 22.04 system.
perl module in question is from the distro and is:
Package: libguestfs-perl
Version: 1:1.46.2-10ubuntu3
make check error:
SRCDIR=. LAYOUT=partitions-md ../../run --test ./make-fedora-img.pl
md_create: mdadm: bootdev: mdadm: Note: this array has metadata at the start and
may not be suitable as a boot device. If you plan to
store '/boot' on this device please ensure that
your boot-loader understands md/v1.x metadata, or use
--metadata=0.90
mdadm: Defaulting to version 1.2 metadata
mdadm: RUN_ARRAY failed: Invalid argument at ./make-fedora-img.pl line 103.
/root/stable-v2v/virt-v2v-2.2.0/run: command failed with exit code 22
make[3]: *** [Makefile:921: stamp-fedora-md.img] Error 22
make[3]: Leaving directory '/root/stable-v2v/virt-v2v-2.2.0/test-data/phony-guests'
make[2]: *** [Makefile:734: check-am] Error 2
make[2]: Leaving directory '/root/stable-v2v/virt-v2v-2.2.0/test-data/phony-guests'
make[1]: *** [Makefile:629: check-recursive] Error 1
make[1]: Leaving directory '/root/stable-v2v/virt-v2v-2.2.0/test-data'
make: *** [Makefile:849: check-recursive] Error 1
Converting a VMware guest from vmx+vmdk file failed claiming there is no disk:
$ virt-v2v -i vmx KR\ C,\ V8.3.OL_Build07.vmx -o qemu -os qemu -v -x
virt-v2v: virt-v2v 1.43.4 (x86_64)
libvirt version: 7.0.0
[ 0.0] Opening the source -i vmx KR C, V8.3.OL_Build07.vmx
VMX file:
.encoding = "windows-1252"
config.version = "8"
virtualHW.version = "7"
scsi0.present = "TRUE"
scsi0.virtualDev = "lsisas1068"
memsize = "2048"
mem.hotadd = "TRUE"
ide0:0.present = "TRUE"
ide0:0.fileName = "KR C, V8.3.OL_Build07.vmdk"
ethernet0.present = "TRUE"
ethernet0.connectionType = "bridged"
ethernet0.virtualDev = "e1000"
ethernet0.wakeOnPcktRcv = "FALSE"
ethernet0.addressType = "generated"
usb.present = "TRUE"
ehci.present = "TRUE"
sound.present = "TRUE"
sound.startConnected = "FALSE"
sound.fileName = "-1"
sound.autodetect = "TRUE"
mks.enable3d = "FALSE"
serial0.present = "TRUE"
serial0.fileType = "thinprint"
pciBridge0.present = "TRUE"
pciBridge4.present = "TRUE"
pciBridge4.virtualDev = "pcieRootPort"
pciBridge4.functions = "8"
pciBridge5.present = "TRUE"
pciBridge5.virtualDev = "pcieRootPort"
pciBridge5.functions = "8"
pciBridge6.present = "TRUE"
pciBridge6.virtualDev = "pcieRootPort"
pciBridge6.functions = "8"
pciBridge7.present = "TRUE"
pciBridge7.virtualDev = "pcieRootPort"
pciBridge7.functions = "8"
vmci0.present = "TRUE"
roamingVM.exitBehavior = "go"
displayName = "KR C, V8.3.OL_Build07"
guestOS = "windows7"
nvram = "KR C, V8.3.OL_Build06.nvram"
virtualHW.productCompatibility = "hosted"
printers.enabled = "TRUE"
easyInstall.keepFloppy = "TRUE"
extendedConfigFile = "KR C, V8.3.OL_Build07.vmxf"
numvcpus = "2"
cpuid.coresPerSocket = "2"
ethernet0.generatedAddress = "00:0c:29:b2:85:86"
tools.syncTime = "FALSE"
uuid.location = "56 4d 1f 4a 50 65 9e ae-4c 73 72 86 4c b2 85 86"
uuid.bios = "56 4d 1f 4a 50 65 9e ae-4c 73 72 86 4c b2 85 86"
cleanShutdown = "TRUE"
replay.supported = "FALSE"
unity.wasCapable = "FALSE"
replay.filename = ""
ide0:0.redo = ""
pciBridge0.pciSlotNumber = "17"
pciBridge4.pciSlotNumber = "21"
pciBridge5.pciSlotNumber = "22"
pciBridge6.pciSlotNumber = "23"
pciBridge7.pciSlotNumber = "24"
scsi0.pciSlotNumber = "160"
usb.pciSlotNumber = "32"
ethernet0.pciSlotNumber = "33"
sound.pciSlotNumber = "34"
ehci.pciSlotNumber = "35"
vmci0.pciSlotNumber = "36"
scsi0.sasWWID = "50 05 05 6a 50 65 9e a0"
vmotion.checkpointFBSize = "16777216"
usb:0.present = "TRUE"
usb:1.present = "TRUE"
ethernet0.generatedAddressOffset = "0"
vmci0.id = "761629234"
usb:1.deviceType = "hub"
usb:0.deviceType = "mouse"
ethernet0.linkStatePropagation.enable = "TRUE"
isolation.tools.hgfs.disable = "TRUE"
sharedFolder.maxNum = "1"
hgfs.mapRootShare = "FALSE"
sharedFolder0.present = "FALSE"
ide1:0.present = "FALSE"
floppy0.present = "FALSE"
parsed VMX tree:
namespace '':
encoding = "windows-1252"
cleanshutdown = "TRUE"
namespace 'config':
version = "8"
namespace 'cpuid':
corespersocket = "2"
displayname = "KR C, V8.3.OL_Build07"
namespace 'easyinstall':
keepfloppy = "TRUE"
namespace 'ehci':
pcislotnumber = "35"
present = "TRUE"
namespace 'ethernet0':
addresstype = "generated"
connectiontype = "bridged"
generatedaddress = "00:0c:29:b2:85:86"
generatedaddressoffset = "0"
namespace 'linkstatepropagation':
enable = "TRUE"
pcislotnumber = "33"
present = "TRUE"
virtualdev = "e1000"
wakeonpcktrcv = "FALSE"
extendedconfigfile = "KR C, V8.3.OL_Build07.vmxf"
namespace 'floppy0':
present = "FALSE"
guestos = "windows7"
namespace 'hgfs':
maprootshare = "FALSE"
namespace 'ide0:0':
filename = "KR C, V8.3.OL_Build07.vmdk"
present = "TRUE"
redo = ""
namespace 'ide1:0':
present = "FALSE"
namespace 'isolation':
namespace 'tools':
namespace 'hgfs':
disable = "TRUE"
namespace 'mem':
hotadd = "TRUE"
memsize = "2048"
namespace 'mks':
enable3d = "FALSE"
numvcpus = "2"
nvram = "KR C, V8.3.OL_Build06.nvram"
namespace 'pcibridge0':
pcislotnumber = "17"
present = "TRUE"
namespace 'pcibridge4':
functions = "8"
pcislotnumber = "21"
present = "TRUE"
virtualdev = "pcieRootPort"
namespace 'pcibridge5':
functions = "8"
pcislotnumber = "22"
present = "TRUE"
virtualdev = "pcieRootPort"
namespace 'pcibridge6':
functions = "8"
pcislotnumber = "23"
present = "TRUE"
virtualdev = "pcieRootPort"
namespace 'pcibridge7':
functions = "8"
pcislotnumber = "24"
present = "TRUE"
virtualdev = "pcieRootPort"
namespace 'printers':
enabled = "TRUE"
namespace 'replay':
filename = ""
supported = "FALSE"
namespace 'roamingvm':
exitbehavior = "go"
namespace 'scsi0':
pcislotnumber = "160"
present = "TRUE"
saswwid = "50 05 05 6a 50 65 9e a0"
virtualdev = "lsisas1068"
namespace 'serial0':
filetype = "thinprint"
present = "TRUE"
namespace 'sharedfolder':
maxnum = "1"
namespace 'sharedfolder0':
present = "FALSE"
namespace 'sound':
autodetect = "TRUE"
filename = "-1"
pcislotnumber = "34"
present = "TRUE"
startconnected = "FALSE"
namespace 'tools':
synctime = "FALSE"
namespace 'unity':
wascapable = "FALSE"
namespace 'usb':
pcislotnumber = "32"
present = "TRUE"
namespace 'usb:0':
devicetype = "mouse"
present = "TRUE"
namespace 'usb:1':
devicetype = "hub"
present = "TRUE"
namespace 'uuid':
bios = "56 4d 1f 4a 50 65 9e ae-4c 73 72 86 4c b2 85 86"
location = "56 4d 1f 4a 50 65 9e ae-4c 73 72 86 4c b2 85 86"
namespace 'virtualhw':
productcompatibility = "hosted"
version = "7"
namespace 'vmci0':
id = "761629234"
pcislotnumber = "36"
present = "TRUE"
namespace 'vmotion':
checkpointfbsize = "16777216"
source name: KR C, V8.3.OL_Build07
hypervisor type: vmware
VM genid:
memory: 2147483648 (bytes)
nr vCPUs: 2
CPU vendor:
CPU model:
CPU topology: sockets: 1 cores/socket: 2 threads/core: 1
CPU features:
firmware: bios
display:
video:
sound:
disks:
removable media:
NICs:
Bridge "ethernet0" mac: 00:0c:29:b2:85:86 [e1000]
virt-v2v: error: source has no hard disks!
virt-v2v 2.2.0 (as packaged in debian 12) fails to convert:
/vmfs/volumes/630cd6f1-0adec4cd-8b43-e0d55e25f3e4/bsanders win test/bsanders win test.vmx
using -it ssh
for VMware.
Specifically, the error in question:
virt-v2v -v -x -o local -of qcow2 -oa sparse -os /tmp/staging/esxi-host/converted/bsanders_win_test -on bsanders_win_test -i vmx -it ssh ssh://root@esxi-host/vmfs/volumes/630cd6f1-0adec4cd-8b43-e0d55e25f3e4/bsanders%20win%20test/bsanders%20win%20test.vmx
<snip of lots of debug output I can happily provide>
ssh 'root'@'esxi-host' test -f '/vmfs/volumes/630cd6f1-0adec4cd-8b43-e0d55e25f3e4/bsanders win test/bsanders win test-flat.vmdk'
sh: win: unknown operand
virt-v2v: error: This transport does not support guests with snapshots.
Either collapse the snapshots for this guest and try the conversion again,
or use one of the alternate conversion methods described in
virt-v2v-input-vmware(1) section "NOTES".
Unix.Unix_error(Unix.ENOENT, "unlink", "/tmp/v2v.dfNaCn/in0")
rm -rf -- '/tmp/vmx.lGuf8v'
rm -rf -- '/tmp/v2v.dfNaCn'
Note the test -f
command. The documentation [0] suggested to convert
characters to %20
, and in virt-v2v 1.4, this works as expected. The error message is inaccurate - this VM does not have snapshots.
The same ssh test line from v2v 1.4, note the subtle difference in quoting:
ssh 'root'@'esxi-host' test -f ''\''/vmfs/volumes/630cd6f1-0adec4cd-8b43-e0d55e25f3e4/bsanders win test/bsanders win test-flat.vmdk'\'''
[0] https://libguestfs.org/virt-v2v-input-vmware.1.html - "VMX: Construct the SSH URI"
check of the 'path' value against the source_re regex appears to fail, dropping the 'path' value into the super-old mode of adding
"-flat" to the vmdk filename. No such file has existed for quite a few modern versions of vmware.
Hi,
I'm migrating from virt-convert to virt-v2v. I encounter the following error :
$ virt-v2v -v -x -i ova cornac.ova -o libvirt
virt-v2v: virt-v2v 1.43.5 (x86_64)
libvirt version: 7.0.0
[ 0.0] Opening the source -i ova cornac.ova
qemu-img info json:'{ "file": { "driver": "raw", "offset": 512, "size": 512, "file": { "filename": "/tmp/v2vqemuimgtst110010.img" } } }' >/dev/null
qemu-img supports "offset" and "size" in json URLs: true
libguestfs: trace: set_verbose true
libguestfs: trace: set_verbose = 0
libguestfs: trace: get_backend
libguestfs: trace: get_backend = "direct"
tar -tf 'cornac.ova'
tar -xf 'cornac.ova' -C '/var/tmp/ova.b0jm2D' 'cornac.ovf'
ova: testing if cornac-sda.vmdk exists in cornac.ova
ova: file exists
tar tRvf 'cornac.ova'
libguestfs: trace: close
libguestfs: closing guestfs handle 0x55c1f751e7b0 (state 0)
virt-v2v: error: failed to parse line returned by tar: "bloc 0 : -rw-r--r--
bersace/bersace 3702 2020-11-12 15:16 cornac.ovf"
rm -rf '/var/tmp/ova.b0jm2D'
rm -rf '/var/tmp/null.v6fmgC'
This ova is generated with tar from https://gitlab.com/dalibo/cornac/-/blob/master/appliance/cornac.ovf and a vmdk generated by packer.
Do you have a clue on what is wrong with this .ova ?
Currently, when converting VMs, we've noticed that the firmware type field is missing in the output produced for both -o local
and -o kubevirt
options. Virt-v2v has the capability to determine the correct type from the disk, even when it's not explicitly specified in the configuration. By posting this output, we can ensure the VM is configured correctly.
When converting from OVA file that isnt specifing the firmware type in OVF configuration, the result yaml file contains the wrong firmware type.
attaching some conversion logs of VM with UEFI:
from the conversion steps it didnt recognize the UEFI type:
[ 105.9] Setting up the destination: -o kubevirt -os /var/tmp/v2v
[ 105.9] Assigning disks to buses
virtio-blk slot 0:
0 [scsi]
[ 105.9] Checking if the guest needs BIOS or UEFI to boot
but from the debug logs it does recognizing UEFI, for example:
First-stage UEFI bootloader, app2_description: Initial UEFI bootloader that handles chaining to a trusted full\nbootloader under secure boot environments. This package contains the\nversion signed by the UEFI signing service.
and we ended up having this yaml:
apiVersion: kubevirt.io/v1
kind: VirtualMachineInstance
metadata:
name: vm-mkzy
spec:
domain:
os:
firmware: bios
resources:
requests:
memory: 4096Mi
features:
cpu:
cores: 2
devices:
rng: {}
disks:
- disk:
bus: virtio
name: disk-0
volumes:
- hostDisk:
path: /var/tmp/v2v/vm-mkzy-sda
type: Disk
name: disk-0
terminationGracePeriodSeconds: 0
expected:
domain:
os:
firmware: uefi
Full conversion logs are attached.
virt-v2v-logs.txt
OS
Linux hostname 5.15.0-101.103.2.1.el8uek.x86_64 #2 SMP Mon May 1 20:11:30 PDT 2023 x86_64 x86_64 x86_64 GNU/Linux
OCaml
The OCaml toplevel, version 4.07.0
virt-v2v
GA and Latest Tags result in same error
Making all in lib
make[2]: Entering directory '/opt/virt-v2v/lib'
CC libmlv2vlib_a-dummy.o
OCAMLCMI config.cmi
OCAMLOPT config.cmx
OCAMLCMI types.cmi
OCAMLOPT types.cmx
OCAMLCMI utils.cmi
OCAMLOPT utils.cmx
File "utils.ml", line 253, characters 34-37:
Error: This expression has type int64 but an expression was expected of type
int32
make[2]: *** [Makefile:927: utils.cmx] Error 2
make[2]: Leaving directory '/opt/virt-v2v/lib'
make[1]: *** [Makefile:846: all-recursive] Error 1
make[1]: Leaving directory '/opt/virt-v2v'
make: *** [Makefile:764: all] Error 2
I tried looking at the lib/utils.ml file on 250 but i dont know OCaml language ;(
Any idea whats up here?
I want to convert an ovf2.0 ova file to libvirt format so that I can use it in virt-manager.
However, when I try to use the following command:
virt-v2v -i ova xxx.ova # xxx.ova is the filename
However, it seems like virt-v2v cannot understand the content of the .mf
file in the ova file.
The output is: (Some information has been replaced with xxx
)
virt-v2v: virt-v2v 1.44.2 (x86_64)
libvirt version: 8.0.0
[ 0.0] Opening the source -i ova ubuntu22.04-NetworkCourse-v0.1.ova
qemu-img info json:'{ "file": { "driver": "raw", "offset": 512, "size": 512, "file": { "filename": "/tmp/v2vqemuimgtst0b3733.img" } } }' >/dev/null
qemu-img supports "offset" and "size" in json URLs: true
libguestfs: trace: set_verbose true
libguestfs: trace: set_verbose = 0
libguestfs: trace: get_backend
libguestfs: trace: get_backend = "direct"
tar -tf 'xxx.ova'
tar -xf 'xxx.ova' -C '/var/tmp/ova.0bDvEc' 'ubuntu22.ovf' 'ubuntu22.mf'
libguestfs: trace: set_verbose true
libguestfs: trace: set_verbose = 0
libguestfs: trace: get_backend
libguestfs: trace: get_backend = "direct"
ova: orig_ova = xxx, top_dir = /var/tmp/ova.0bDvEc, ova_type = TarOptimized xxx
ova: processing manifest file /var/tmp/ova.0bDvEc/ubuntu22.mf
libguestfs: trace: close
libguestfs: closing guestfs handle 0x56393e07d3f0 (state 0)
libguestfs: trace: close
libguestfs: closing guestfs handle 0x56393e097710 (state 0)
virt-v2v: warning: unable to parse line from manifest file: "SHA256
(ubuntu22-disk001.vmdk) =
f99d291dc42a96f6f07a6df9d4f44xxxxxxecd20d913d61e609b68dcf779"
virt-v2v: warning: unable to parse line from manifest file: "SHA256
(ubuntu22.ovf) =
1aeb4c15217a0a92e3e08492551xxxxxx361a609976269c90b45c39164"
virt-v2v: warning: could not parse ovf:Name from OVF document
source name: xxx
hypervisor type: vmware
VM genid:
memory: 1099511627776 (bytes)
nr vCPUs: 1
CPU vendor:
CPU model:
CPU topology:
CPU features:
firmware: bios
display:
video:
sound:
disks:
removable media:
NICs:
virt-v2v: error: source has no hard disks!
rm -rf '/var/tmp/ova.0bDvEc'
rm -rf '/var/tmp/null.i3cg6v'
Hi Folks. I ran into the above mentioned error when trying to migrate a VM on vCenter that is running Windows Server 2012/2016 VMs.
Logs:
│ command: lvm 'lvs' '-o' 'vg_name,lv_name' '-S' 'lv_role=public && lv_skip_activation!=yes' '--noheadings' '--separator' '/' │
│ command: lvm returned 0 │
│ check_for_filesystem_on: /dev/sda1 (ntfs) │
│ command: mount '-o' 'ro' '/dev/sda1' '/sysroot//' │
│ command: mount returned 32 │
│ command: mount: stderr: │
│ mount: /sysroot: unknown filesystem type 'ntfs'. │
│ check_for_filesystem_on: /dev/sda2 (ntfs) │
│ command: mount '-o' 'ro' '/dev/sda2' '/sysroot//' │
│ command: mount returned 32 │
│ command: mount: stderr: │
│ mount: /sysroot: unknown filesystem type 'ntfs'. │
│ inspect_os: fses: │
│ inspect_get_roots: roots: │
│ guestfsd: => inspect_os (0x1e0) took 0.59 secs │
│ libguestfs: trace: v2v: inspect_os = [] │
│ virt-v2v: error: inspection could not detect the source guest (or physical │
│ machine). │
│ │
│ Assuming that you are running virt-v2v/virt-p2v on a source which is │
│ supported (and not, for example, a blank disk), then this should not │
│ happen. │
│ │
│ No root device found in this operating system image. │
│ rm -rf '/var/tmp/null.EqtLqY' │
│ libguestfs: trace: v2v: close │
│ libguestfs: closing guestfs handle 0x55690d7a9580 (state 2) │
│ libguestfs: trace: v2v: internal_autosync │
│ guestfsd: <= internal_autosync (0x11a) request length 40 bytes │
│ umount-all: /proc/mounts: fsname=/dev/root dir=/ type=ext2 opts=rw,noatime freq=0 passno=0
I came across this info on libguestfs-FAQ that said:
"mount: unsupported filesystem type" with NTFS in RHEL ≥ 7.2
In RHEL 7.2 we were able to add libguestfs-winsupport to the base RHEL distribution, but we had to disable the ability to use it for opening and editing filesystems. It is only supported when used with virt-v2v(1). If you try to use guestfish(1) or guestmount(1) or some other programs on an NTFS filesystem, you will see the error:
mount: unsupported filesystem type
This is not a supported configuration, and it will not be made to work in RHEL. Don't bother to open a bug about it, as it will be immediately CLOSED -> WONTFIX.
You may compile your own libguestfs removing this restriction, but that won't be endorsed or supported by Red Hat.
I just wanted to understand about what versions of virt-v2v support conversion of operating systems with an NTFS filesystem. I've tried with 1.44.x and 2.3.x with the same results
Hi,
sadly it's not possible anymore to use the option rhv-upload.
It's only possible to use basic auth with virt-v2v but since Ovirt 4.5 you don't have that option anymore.
Is there a way to use a different option for authentication?
i used the virt-v2v on
Alma 8.6
1.42 virt-v2v
libvirt 8.0
qemu 6.2
when i try to convert i get following info about GPO:
Windows vm have only local group policy and i disabled computer and user policy temp. When trying to boot the vm no disks found.
command i used:
virt-v2v -i ova test.ova -of qcow2 -on test.qcow2 -os convert
i can only boot when i change vd to hd and to disable the driver signature enforcement
do i miss something?
from what I understand the build fails because of ocaml 5.0.
using ocaml-libvirt-git, the build (either 2.2.0 or 2.3.4 or git) fails with:
make[2] : on entre dans le répertoire « /home/solstice/asp/AUR/virt-v2v/src/virt-v2v-2.3.4/common/mlstdutils »
CC libmlstdutils_a-dummy.o
OCAMLCMI guestfs_config.cmi
OCAMLCMI stringMap.cmi
OCAMLCMI stringSet.cmi
OCAMLCMI std_utils.cmi
OCAMLOPT guestfs_config.cmx
OCAMLC guestfs_config.cmo
OCAMLC stringSet.cmo
OCAMLOPT stringMap.cmx
OCAMLOPT stringSet.cmx
OCAMLC stringMap.cmo
OCAMLC std_utils.cmo
OCAMLOPT std_utils.cmx
File "std_utils.ml", line 344, characters 30-48:
344 | let rec assoc_lbl ?(cmp = Pervasives.compare) ~default x = function
^^^^^^^^^^^^^^^^^^
Error: Unbound module Pervasives
make[2]: *** [Makefile:1347: std_utils.cmo] Error 2
Note: This works correctly in 2.2.0 and 2.3.5. I've no expectations a fix will be created for 1.44.x. This issue is primarily for the benefit of others who might stumble across it via Google search, since it exists on the version shipped in Ubuntu LTS repositories. I've not tested it in other distros (but I think RHEL 7 and 8 ships with 1.4X.y).
If you create a VM in VMware with a SCSI disk, then clone it (in VMware), adjusting the guest hardware in the cloning wizard to set it's disk bus to SATA, the resulting VMX file will be written in such a way that virt-v2v (1.44.2!) is unable to find the disks (to be clear, the cloned/modified VM still boots in VMware). The resulting error is:
virt-v2v: error: source has no hard disks!
Attached are the initial VMX file, the VMX file after the clone/hardware adjustment, and the debug output of virt-v2v (all appended with .txt
to make github happy).
virt-v2v-output.txt
efi-windows2019-onedisksata-onenic.vmx.txt
efi-windows2019-onediskscsi-onenic.vmx.txt
Hello, I am just starting to use virt-v2v.
I was trying to convert a windows ova file to libvirt
.
In the process, virt-v2v was trying to install some drivers.
I kind of wish for a "vanilla" conversion, without any kind of modification of the guest.
Is it possible to disable the virtio?
I read the man page, however, I did not find any clue. Any ideas? Thanks in advance
When converting from VMware to KVM, we are getting below error
Mar 1 07:02:29 kvm_server java[1398844]: INFO [resource.wrapper.LibvirtConvertInstanceCommandWrapper] (Script-2:) (logid:) (virt-v2v source: vpx://administrator%40vsphere.local@vcenter/Datacenter/Cluster/Host?no_verify=1 79d6b370-988b-4ce8-93f4-c3f1cbc70e10 progress) virt-v2v: error: exception: libvirt: VIR_ERR_INTERNAL_ERROR: VIR_FROM_NONE:
Mar 1 07:02:29 kvm_server java[1398844]: INFO [resource.wrapper.LibvirtConvertInstanceCommandWrapper] (Script-2:) (logid:) (virt-v2v source: vpx://administrator%40vsphere.local@vcenter/Datacenter/Cluster/Host?no_verify=1 79d6b370-988b-4ce8-93f4-c3f1cbc70e10 progress) internal error: Missing essential config entry 'ethernet0.networkName'
"ethernet0.networkName" seems to be part of VM Advanced Options, but we can't set this option. Is there a way to maybe bypass / edit network config when using virt-v2v?
Hello,
As documented, virt-v2v currently not supports rocky Linux, and we have the following error :
virt-v2v: error: virt-v2v is unable to convert this guest type (linux/rocky)
As CentOS is replaced by Rocky in few environments, it will be really appreciated to add Rocky OS in supported OS.
Do you think it's possible ?
Thanks
hello, as I was checking for libguestfs projects related to Zanata for our migration to Weblate [1], I discovered this project.
The zanata.xml file says translations are handled in virt-v2v, but I can't find any track of this project in Zanata, does it really exists?
Looking at
virt-v2v/v2v/windows_virtio.ml
Lines 187 to 198 in 8cf4488
I am getting the following in centos 8 virt-v2v:
virt-v2v: warning: don't know how to install guest tools on ubuntu-20
I'd have thought just looking at the directories for that code to see if there is something there would be a reasonable generic solution?
[ 0.0] Setting up the source: -i vmx ssh://root@HOST/vmfs/volumes/datastore1/cos9/cos9.vmx
[ 2.3] Opening the source
[ 7.5] Inspecting the source
[ 48.6] Checking for sufficient free disk space in the guest
[ 48.6] Converting CentOS Stream release 9 to run on KVM
virt-v2v: error: no installed kernel packages were found.
This probably indicates that virt-v2v was unable to inspect this guest
properly.
If reporting bugs, run virt-v2v with debugging enabled and include the
complete output:
virt-v2v -v -x [...]
Cut from full log can be found here https://pastebin.com/Bi5v2gc5
rwmjones 17c6d52 reported the eBlockerVM-2.9.1-amd64.ova working on the latest after his commit, so I followed the install steps and installed virtv2v latest to /usr/local/bin/virt-v2v, hoping that it would work for me just like for rwmjones. It did not, because I get a
virt-v2v: error: libguestfs error: you must call guestfs_add_drive before
error instead. See details below. Question: how to get the eBlockerVM-2.9.1-amd64.ova conversion working?
which virt-v2v
/usr/local/bin/virt-v2v
/usr/bin/virt-v2v --version
virt-v2v 1.44.2
/usr/local/bin/virt-v2v --version
virt-v2v 2.3.3
export LIBGUESTFS_DEBUG=1 LIBGUESTFS_TRACE=1
/usr/local/bin/virt-v2v -v -x -i ova eBlockerVM-2.9.1-amd64.ova -of qcow2
libguestfs: trace: set_verbose true
libguestfs: trace: set_verbose = 0
libguestfs: trace: get_cachedir
libguestfs: trace: get_cachedir = "/var/tmp"
virt-v2v: virt-v2v 2.3.3 (x86_64)
libvirt version: 8.0.0
check_host_free_space: large_tmpdir=/var/tmp free_space=813592858624
[ 0.0] Setting up the source: -i ova eBlockerVM-2.9.1-amd64.ova
qemu-img info json:'{ "file": { "driver": "raw", "offset": 512, "size": 512, "file": { "filename": "/tmp/v2vqemuimgtstb82e23.img" } } }' >/dev/null
qemu-img supports "offset" and "size" in json URLs: true
libguestfs: trace: set_verbose true
libguestfs: trace: set_verbose = 0
libguestfs: trace: set_trace true
libguestfs: trace: set_trace = 0
libguestfs: trace: set_verbose true
libguestfs: trace: set_verbose = 0
libguestfs: trace: get_backend
libguestfs: trace: get_backend = "direct"
tar -tf 'eBlockerVM-2.9.1-amd64.ova'
tar -xf 'eBlockerVM-2.9.1-amd64.ova' -C '/var/tmp/ova.CdLB6P' 'eBlockerVM-2.9.1-amd64.ovf' 'eBlockerVM-2.9.1-amd64.mf'
ova: orig_ova = eBlockerVM-2.9.1-amd64.ova, top_dir = /var/tmp/ova.CdLB6P, ova_type = TarOptimized eBlockerVM-2.9.1-amd64.ova
ova: processing manifest file /var/tmp/ova.CdLB6P/eBlockerVM-2.9.1-amd64.mf
libguestfs: trace: close
libguestfs: closing guestfs handle 0x5567bd9367a0 (state 0)
libguestfs: trace: close
libguestfs: closing guestfs handle 0x5567bd948a40 (state 0)
tar xOf 'eBlockerVM-2.9.1-amd64.ova' 'eBlocker VM-disk001.vmdk' | sha256sum
tar xOf 'eBlockerVM-2.9.1-amd64.ova' 'eBlockerVM-2.9.1-amd64.ovf' | sha256sum
virt-v2v: warning: could not parse ovf:Name from OVF document
[ 7.0] Opening the source
libguestfs: trace: set_verbose true
libguestfs: trace: set_verbose = 0
libguestfs: trace: set_trace true
libguestfs: trace: set_trace = 0
libguestfs: trace: set_verbose true
libguestfs: trace: set_verbose = 0
libguestfs: trace: set_identifier "v2v"
libguestfs: trace: v2v: set_identifier = 0
libguestfs: trace: v2v: get_memsize
libguestfs: trace: v2v: get_memsize = 1280
libguestfs: trace: v2v: set_memsize 2560
libguestfs: trace: v2v: set_memsize = 0
libguestfs: trace: v2v: set_smp 8
libguestfs: trace: v2v: set_smp = 0
libguestfs: trace: v2v: set_network true
libguestfs: trace: v2v: set_network = 0
libguestfs: trace: v2v: launch
libguestfs: trace: v2v: max_disks
libguestfs: trace: v2v: max_disks = 255
libguestfs: trace: v2v: get_tmpdir
libguestfs: trace: v2v: get_tmpdir = "/tmp"
libguestfs: trace: v2v: version
libguestfs: trace: v2v: version = <struct guestfs_version = major: 1, minor: 46, release: 2, extra: , >
libguestfs: trace: v2v: get_backend
libguestfs: trace: v2v: get_backend = "direct"
libguestfs: launch: program=virt-v2v
libguestfs: launch: identifier=v2v
libguestfs: launch: version=1.46.2
libguestfs: launch: backend registered: unix
libguestfs: launch: backend registered: uml
libguestfs: launch: backend registered: libvirt
libguestfs: launch: backend registered: direct
libguestfs: launch: backend=direct
libguestfs: launch: tmpdir=/tmp/libguestfs7y9SCY
libguestfs: launch: umask=0002
libguestfs: launch: euid=1000
libguestfs: trace: v2v: launch = -1 (error)
virt-v2v: error: libguestfs error: you must call guestfs_add_drive before
guestfs_launch
rm -rf -- '/var/tmp/ova.CdLB6P'
rm -rf -- '/tmp/v2v.OLYbVO'
libguestfs: trace: v2v: close
libguestfs: closing guestfs handle 0x5567bd95acc0 (state 0)
libguestfs: command: run: rm
libguestfs: command: run: \ -rf /tmp/libguestfs7y9SCY
Instead of attempting to deduce what path to use based on trial and error, probe vCenter to obtain the current version, then massage the path (if necessary) accordingly. Set the 'default' behaviour to that of the most recent version to avoid having to constantly update to keep up with new vmware versions... then you only have to update when the newest version starts to behave differently.
Hi guys,
I created a Data center
SiteA
I have made two clusters
SiteA (3 nodes ovna1..3.example.com)
SiteA_UX (3 nodes ovnuxa1..3.example.com)
in the Data Center, they share the same Storage Domains
like
aa1_ovna_1
now I import vms like this
virt-v2v -i vmx /nfs/testmigvm01/testmigvm01.vmx -o ovirt-upload -oc https://admin@ovirt@[email protected]/ovirt-engine/api -os aa1_ovna_1 -op /home/migrate/testpw -oo rhv-cafile=/root/ansible-stuff/ca.pem -oo rhv-cluster=SiteA -of qcow2
It gives me an error (verbose isn't giving me more)
virt-v2v: error: internal error: invalid argument:
/tmp/v2v.CtVpBL/v2vtransfer.json: JSON parse error: end of file expected
near 'e'
I managed to get the v2vtransfer.json file copied before it gets deleted and don't understand why it is saying "end of file expected
near 'e'" (btw is there a way to avoid the deletion of the temporary files)
{"transfer_id": "bddd91a5-4a15-4d21-a3c1-882c056c794c", "destination_url": "https://ovnuxa01.example.com:54322/images/09e03d5b-542a-49ff-904c-369d17cd2423", "is_ovirt_host": false}
So it gives me a destination url of a node in the wrong cluster
As I have no vm running yet in the UX cluster I set all 3 nodes into maintenance, after doing so it works, cause the destination url is attached to a node in the right cluster.
{"transfer_id": "cd0ea4d4-d7d1-49f1-9d1c-e3e9cd86cf13", "destination_url": "https://ovna01.example.com:54322/images/f85c50a4-d85b-4866-8e21-79330aea96cf", "is_ovirt_host": false}
Maybe this is an ovirt bug and not an virt-v2v, not sure if ovirt gives the wrong url or virt-v2v does not send the parameter as it should
As a plus
changing it to
rhv-cluster=SiteA_UX
does not work as well, and for testing I am not able to set all SiteA Nodes to maintenance.
I hope u understand what I mean, if not, I am happy to give more details
get fail while convert EMC OneFS simulator(based on FreeBSD) with virt-v2v:
'''
[jianhong@fstest 9.1.0.0]$ virt-v2v -i ova 9.1.0.0.ova -o local -os tmp
[ 0.0] Opening the source -i ova 9.1.0.0.ova
[ 1.9] Creating an overlay to protect the source from being modified
[ 6.3] Opening the overlay
[ 14.6] Inspecting the overlay
virt-v2v: error: mount: mount_stub: /dev/mirror/root0: No such file or
directory
If reporting bugs, run virt-v2v with debugging enabled and include the
complete output:
virt-v2v -v -x [...]
'''
Application scenario:
deploy EMC OneFS simulator automatically for automate tests
see also: https://bugzilla.redhat.com/show_bug.cgi?id=1947291#c2
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.