The way on Ubuntu would be to use libvirt on top of KVM/QEMU/VirtualBox. Quoting the Arch Wiki:
Libvirt is collection of software that provides a convenient way to
manage virtual machines and other virtualization functionality, such
as storage and network interface management. These software pieces
include a long term stable C API, a daemon (libvirtd), and a command
line utility (virsh). A primary goal of libvirt is to provide a single
way to manage multiple different virtualization providers/hypervisors,
such as the KVM/QEMU, Xen, LXC, OpenVZ or VirtualBox hypervisors
(among others). Some of the major libvirt features are:
- VM management: Various domain lifecycle operations such as start, stop, pause, save, restore, and migrate. Hotplug operations for
many device types including disk and network interfaces, memory, and
cpus.
- Remote machine support: All libvirt functionality is accessible on any machine running the libvirt daemon, including remote machines.
A variety of network transports are supported for connecting remotely,
with the simplest being SSH, which requires no extra explicit
configuration.
- Storage management: Any host running the libvirt daemon can be used to manage various types of storage: create file images of various
formats (qcow2, vmdk, raw, ...), mount NFS shares, enumerate existing
LVM volume groups, create new LVM volume groups and logical volumes,
partition raw disk devices, mount iSCSI shares, and much more.
- Network interface management: Any host running the libvirt daemon can be used to manage physical and logical network interfaces.
Enumerate existing interfaces, as well as configure (and create)
interfaces, bridges, vlans, and bond devices.
- Virtual NAT and Route based networking: Any host running the libvirt daemon can manage and create virtual networks. Libvirt virtual
networks use firewall rules to act as a router, providing VMs
transparent access to the host machines network.
CLI management is done primarily using the virsh
command. There's an associated GUI front-end, called virt-manager
.
As for starting VMs automatically, assuming you have a VM named foo, to mark it for starting at boot:
virsh autostart foo
And to unmark it:
virsh autostart --disable foo
The Ubuntu LTS Server Guide has a chapter on libvirt.