diff --git a/man/virt-install.pod b/man/virt-install.pod index a1229c8..4c7b0e3 100644 --- a/man/virt-install.pod +++ b/man/virt-install.pod @@ -357,36 +357,6 @@ Mount the ISO and probe the directory. This requires running virt-install as roo =back -Some distro specific url samples: - -=over 4 - -=item Fedora/Red Hat Based - -http://download.fedoraproject.org/pub/fedora/linux/releases/21/Server/x86_64/os - -=item Debian - -http://ftp.us.debian.org/debian/dists/stable/main/installer-amd64/ - -=item Ubuntu - -http://us.archive.ubuntu.com/ubuntu/dists/wily/main/installer-amd64/ - -=item Suse - -http://download.opensuse.org/distribution/11.0/repo/oss/ - -=item Mandriva - -ftp://ftp.uwsg.indiana.edu/linux/mandrake/official/2009.0/i586/ - -=item Mageia - -ftp://distrib-coffee.ipsl.jussieu.fr/pub/linux/Mageia/distrib/1 - -=back - =item B<--pxe> Use the PXE boot protocol to load the initial ramdisk and kernel for starting @@ -421,21 +391,6 @@ file: --initrd-inject=/path/to/my.ks --extra-args "ks=file:/my.ks" -=item B<--os-variant> OS_VARIANT - -Optimize the guest configuration for a specific operating system (ex. -'fedora18', 'rhel7', 'winxp'). While not required, specifying this -options is HIGHLY RECOMMENDED, as it can greatly increase performance -by specifying virtio among other guest tweaks. - -By default, virt-install will attempt to auto detect this value from -the install media (currently only supported for URL installs). Autodetection -can be disabled with the special value 'none'. Autodetection can be -forced with the special value 'auto'. - -Use the command "osinfo-query os" to get the list of the accepted OS -variants. - =item B<--boot> BOOTOPTS Optionally specify the post-install VM boot configuration. This option allows @@ -592,7 +547,7 @@ bus types. =item B -Sets the removable flag (/sys/block/$dev/removable on Linux). Only +Sets the removable flag (/sys/block/$dev/removable on GNU/Linux). Only used with QEMU and bus=usb. Value can be 'on' or 'off'. =item B @@ -672,7 +627,7 @@ How guest should react if a write error is encountered. Can be one of =item B -Serial number of the emulated disk device. This is used in linux guests +Serial number of the emulated disk device. This is used in GNU/Linux guests to set /dev/disk/by-id symlinks. An example serial number might be: WD-WMAP9A966149 @@ -695,7 +650,7 @@ invocation is: --filesystem /source/on/host,/target/point/in/guest -Which will work for recent QEMU and linux guest OS or LXC containers. For +Which will work for recent QEMU and GNU/Linux guest OS or LXC Linux containers. For QEMU, the target point is just a mounting hint in sysfs, so will not be automatically mounted. @@ -1635,45 +1590,6 @@ C<~/.cache/virt-manager/virt-install.log> even if this parameter is omitted. =head1 EXAMPLES -Install a Fedora 20 KVM guest with virtio accelerated disk/network, -creating a new 10GiB qcow2 file, installing from media in the hosts -CDROM drive. This will use Spice graphics by default, and launch autolaunch -a graphical client. - - # virt-install \ - --connect qemu:///system \ - --virt-type kvm \ - --name demo \ - --memory 500 \ - --disk size=10 \ - --cdrom /dev/cdrom \ - --os-variant fedora13 - -Install a Fedora 9 plain QEMU guest, using LVM partition, virtual networking, -booting from PXE, using VNC server/viewer, with virtio-scsi disk - - # virt-install \ - --connect qemu:///system \ - --name demo \ - --memory 500 \ - --disk path=/dev/HostVG/DemoVM,bus=scsi \ - --controller virtio-scsi \ - --network network=default \ - --virt-type qemu - --graphics vnc \ - --os-variant fedora9 - -Run a Live CD image under Xen fullyvirt, in diskless environment - - # virt-install \ - --hvm \ - --name demo \ - --memory 500 \ - --disk none \ - --livecd \ - --graphics vnc \ - --cdrom /root/fedora7live.iso - Run /usr/bin/httpd in a linux container guest (LXC). Resource usage is capped at 512 MiB of ram and 2 host cpus: @@ -1699,7 +1615,7 @@ The host dir "/home/test" will be mounted at --init /bin/sh Install a paravirtualized Xen guest, 500 MiB of RAM, a 5 GiB of disk, and -Fedora Core 6 from a web server, in text-only mode, with old style --file +Parabola from a web server, in text-only mode, with old style --file options: # virt-install \ @@ -1708,7 +1624,7 @@ options: --memory 500 \ --disk /var/lib/xen/images/demo.img,size=6 \ --graphics none \ - --location http://download.fedora.redhat.com/pub/fedora/linux/core/6/x86_64/os/ + --location https://repo.parabola.nu/iso/latest/ Create a guest from an existing disk image 'mydisk.img' using defaults for the rest of the options. diff --git a/man/virt-xml.pod b/man/virt-xml.pod index 3a684f4..aef814f 100644 --- a/man/virt-xml.pod +++ b/man/virt-xml.pod @@ -286,53 +286,10 @@ Clear the previous definition of domain 'winxp', change it to 'host-model' # virt-xml winxp --edit --cpu host-model,clearxml=yes --confirm -Change the second sound card to model=ich6 on 'fedora19', but only output the diff: - - # virt-xml fedora19 --edit 2 --sound model=ich6 --print-diff - -Update the every graphics device password to 'foo' of the running VM 'rhel6': - - # virt-xml rhel6 --edit all --graphics password=foo --update - -Remove the disk path from disk device hdc: - - # virt-xml rhel6 --edit target=hdc --disk path= - Change all disk devices of type 'disk' to use cache=none, using XML from stdin, printing the new XML to stdout. # cat | virt-xml --edit device=disk --disk cache=none -Change disk 'hda' IO to native and use startup policy as 'optional'. - - # virt-xml fedora20 --edit target=hda \ - --disk io=native,startup_policy=optional - -Change all host devices to use driver_name=vfio for VM 'fedora20' on the remote connection - - # virt-xml --connect qemu+ssh://remotehost/system \ - fedora20 --edit all --hostdev driver_name=vfio - -Hotplug host USB device 001.003 to running domain 'fedora19': - - # virt-xml fedora19 --update --add-device --hostdev 001.003 - -Add a spicevmc channel to the domain 'winxp', that will be available after the next VM shutdown. - - # virt-xml winxp --add-device --channel spicevmc - -Create a 10G qcow2 disk image and attach it to 'fedora18' for the next VM startup: - - # virt-xml fedora18 --add-device \ - --disk /var/lib/libvirt/images/newimage.qcow2,format=qcow2,size=10 - -Hotunplug the disk vdb from the running domain 'rhel7': - - # virt-xml rhel7 --update --remove-device --disk target=vdb - -Remove all graphics devices from the VM 'rhel7' after the next shutdown: - - # virt-xml rhel7 --remove-device --graphics all - Generate XML for a virtio console device and print it to stdout: # virt-xml --build-xml --console pty,target_type=virtio diff --git a/setup.py b/setup.py index 89916b5..cff1031 100755 --- a/setup.py +++ b/setup.py @@ -338,7 +338,6 @@ class configure(distutils.core.Command): self.libvirt_package_names = None self.kvm_package_names = None self.askpass_package_names = None - self.preferred_distros = None self.stable_defaults = None self.default_graphics = None self.default_hvs = None @@ -356,8 +355,6 @@ class configure(distutils.core.Command): template += "hv_packages = %s\n" % self.kvm_package_names if self.askpass_package_names is not None: template += "askpass_packages = %s\n" % self.askpass_package_names - if self.preferred_distros is not None: - template += "preferred_distros = %s\n" % self.preferred_distros if self.stable_defaults is not None: template += ("stable_defaults = %s\n" % self.stable_defaults) diff --git a/virt-manager.spec b/virt-manager.spec index 2dfe413..2bb07e4 100644 --- a/virt-manager.spec +++ b/virt-manager.spec @@ -7,14 +7,8 @@ %global qemu_user "qemu" %global libvirt_packages "libvirt-daemon-kvm,libvirt-daemon-config-network" %global kvm_packages "" -%global preferred_distros "fedora,rhel" %global default_hvs "qemu,xen,lxc" -%if 0%{?rhel} -%global preferred_distros "rhel,fedora" -%global stable_defaults 1 -%endif - # End local config @@ -49,9 +43,6 @@ Requires: vte291 Requires: gtk-vnc2 Requires: spice-gtk3 -%if 0%{?rhel} == 7 -Requires: gnome-icon-theme -%endif BuildRequires: python @@ -116,10 +107,6 @@ machine). %global _kvm_packages --kvm-package-names=%{kvm_packages} %endif -%if %{preferred_distros} -%global _preferred_distros --preferred-distros=%{preferred_distros} -%endif - %if %{libvirt_packages} %global _libvirt_packages --libvirt-package-names=%{libvirt_packages} %endif @@ -141,7 +128,6 @@ python setup.py configure \ %{?_kvm_packages} \ %{?_libvirt_packages} \ %{?_askpass_package} \ - %{?_preferred_distros} \ %{?_stable_defaults} \ %{?_default_hvs} diff --git a/virt-manager.spec.in b/virt-manager.spec.in index 8c4a811..6497f52 100644 --- a/virt-manager.spec.in +++ b/virt-manager.spec.in @@ -7,14 +7,8 @@ %global qemu_user "qemu" %global libvirt_packages "libvirt-daemon-kvm,libvirt-daemon-config-network" %global kvm_packages "" -%global preferred_distros "fedora,rhel" %global default_hvs "qemu,xen,lxc" -%if 0%{?rhel} -%global preferred_distros "rhel,fedora" -%global stable_defaults 1 -%endif - # End local config @@ -49,10 +43,6 @@ Requires: vte291 Requires: gtk-vnc2 Requires: spice-gtk3 -%if 0%{?rhel} == 7 -Requires: gnome-icon-theme -%endif - BuildRequires: python BuildRequires: intltool @@ -116,10 +106,6 @@ machine). %global _kvm_packages --kvm-package-names=%{kvm_packages} %endif -%if %{preferred_distros} -%global _preferred_distros --preferred-distros=%{preferred_distros} -%endif - %if %{libvirt_packages} %global _libvirt_packages --libvirt-package-names=%{libvirt_packages} %endif @@ -141,7 +127,6 @@ python setup.py configure \ %{?_kvm_packages} \ %{?_libvirt_packages} \ %{?_askpass_package} \ - %{?_preferred_distros} \ %{?_stable_defaults} \ %{?_default_hvs} diff --git a/virtManager/config.py b/virtManager/config.py index 5b04013..b52f121 100644 --- a/virtManager/config.py +++ b/virtManager/config.py @@ -170,7 +170,6 @@ class vmmConfig(object): self.keyring = None self.default_qemu_user = CLIConfig.default_qemu_user - self.preferred_distros = CLIConfig.preferred_distros self.hv_packages = CLIConfig.hv_packages self.libvirt_packages = CLIConfig.libvirt_packages self.askpass_package = CLIConfig.askpass_package diff --git a/virtManager/connection.py b/virtManager/connection.py index 6cb9cc0..21de8cf 100644 --- a/virtManager/connection.py +++ b/virtManager/connection.py @@ -642,8 +642,8 @@ class vmmConnection(vmmGObject): continue if (devtype == "usb_device" and - (("Linux Foundation" in str(xmlobj.vendor_name) or - ("Linux" in str(xmlobj.vendor_name) and + (("Free Software Foundation" in str(xmlobj.vendor_name) or + ("GNU/Linux" in str(xmlobj.vendor_name) and xmlobj.vendor_id == "0x1d6b")) and ("root hub" in str(xmlobj.product_name) or ("host controller" in str(xmlobj.product_name).lower() and diff --git a/virtManager/create.py b/virtManager/create.py index 737c1fa..4c34585 100644 --- a/virtManager/create.py +++ b/virtManager/create.py @@ -931,9 +931,7 @@ class vmmCreate(vmmGObjectUI): model = widget.get_model() model.clear() - # Kind of a hack, just show linux + windows by default since - # that's all 98% of people care about - supportl = ["generic", "linux", "windows"] + supportl = ["generic"] # Move 'generic' to the front of the list types = virtinst.OSDB.list_types() @@ -959,17 +957,12 @@ class vmmCreate(vmmGObjectUI): model = widget.get_model() model.clear() - preferred = self.config.preferred_distros - variants = virtinst.OSDB.list_os(typename=_type, sortpref=preferred) - supportl = virtinst.OSDB.list_os(typename=_type, sortpref=preferred, - only_supported=True) - for v in variants: supported = v in supportl or v.name == "generic" self._add_os_row(model, v.name, v.label, supported) - self._add_os_row(model, sep=True) - self._add_os_row(model, label=_("Show all OS options"), action=True) + self._add_os_row(model, sep=False) + self._add_os_row(model, label=_("Show all OS options"), action=False) widget.set_active(0) @@ -1075,17 +1068,7 @@ class vmmCreate(vmmGObjectUI): install = _("Operating system container") osstr = "" - have_os = True - if self._guest.os.is_container(): - osstr = _("Linux") - elif not distro: - osstr = _("Generic") - have_os = False - elif not version: - osstr = _("Generic") + " " + dlabel - have_os = False - else: - osstr = vlabel + have_os = False self.widget("finish-warn-os").set_visible(not have_os) self.widget("summary-os").set_text(osstr) diff --git a/virtcli/cliconfig.py b/virtcli/cliconfig.py index ef66ba4..da077df 100644 --- a/virtcli/cliconfig.py +++ b/virtcli/cliconfig.py @@ -79,8 +79,6 @@ class _CLIConfig(object): self.default_qemu_user = _get_param("default_qemu_user", "root") self.stable_defaults = bool(int(_get_param("stable_defaults", "0"))) - self.preferred_distros = _split_list( - _get_param("preferred_distros", "")) self.hv_packages = _split_list(_get_param("hv_packages", "")) self.askpass_package = _split_list(_get_param("askpass_packages", "")) self.libvirt_packages = _split_list(_get_param("libvirt_packages", "")) diff --git a/virtinst/guest.py b/virtinst/guest.py index 6a42536..b375bdc 100644 --- a/virtinst/guest.py +++ b/virtinst/guest.py @@ -608,7 +608,6 @@ class Guest(XMLBuilder): return if (self.conn.is_qemu() and - self._os_object.supports_qemu_ga() and self.conn.check_support(self.conn.SUPPORT_CONN_AUTOSOCKET)): dev = VirtualChannelDevice(self.conn) dev.type = "unix" @@ -653,8 +652,7 @@ class Guest(XMLBuilder): # But only if we are installing windows which has a multi stage # install. if (dev.is_cdrom() and - getattr(dev, "installer_media", False) and - not self._os_object.is_windows()): + getattr(dev, "installer_media", False)): dev.path = None def _set_defaults(self): @@ -741,10 +739,8 @@ class Guest(XMLBuilder): hpet.present = False hv_clock = self.conn.check_support(self.conn.SUPPORT_CONN_HYPERV_CLOCK) - hv_clock_rhel = self.conn.check_support(self.conn.SUPPORT_CONN_HYPERV_CLOCK_RHEL) - if (self._os_object.is_windows() and self._hv_supported() and - (hv_clock or (self.stable_defaults() and hv_clock_rhel))): + if (self._hv_supported() and (hv_clock or self.stable_defaults())): hyperv = self.clock.add_timer() hyperv.name = "hypervclock" hyperv.present = True @@ -847,8 +843,7 @@ class Guest(XMLBuilder): self.conn.check_support(self.conn.SUPPORT_CONN_VMPORT)): self.features.vmport = False - if (self._os_object.is_windows() and - self._hv_supported() and + if (self._hv_supported() and self.conn.check_support(self.conn.SUPPORT_CONN_HYPERV_VAPIC)): if self.features.hyperv_relaxed is None: self.features.hyperv_relaxed = True diff --git a/virtinst/initrdinject.py b/virtinst/initrdinject.py index eb5f419..726264a 100644 --- a/virtinst/initrdinject.py +++ b/virtinst/initrdinject.py @@ -24,61 +24,6 @@ import subprocess import tempfile -def _rhel4_initrd_inject(initrd, injections): - try: - file_proc = subprocess.Popen(["file", "-z", initrd], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - if "ext2 filesystem" not in file_proc.communicate()[0]: - return False - except: - logging.exception("Failed to file command for rhel4 initrd detection") - return False - - logging.debug("Is RHEL4 initrd") - - # Uncompress the initrd - newinitrd = file(initrd + ".new", "wb") - gzip_proc = subprocess.Popen(["gzip", "-d", "-f", "-c", initrd], - stdout=newinitrd, - stderr=subprocess.PIPE) - gzip_proc.wait() - newinitrd.close() - - debugfserr = "" - for filename in injections: - # We have an ext2 filesystem, use debugfs to inject files - cmd = ["debugfs", "-w", "-R", - "write %s %s" % (filename, os.path.basename(filename)), - newinitrd.name] - logging.debug("Copying %s to the initrd with cmd=%s", filename, cmd) - - debugfs_proc = subprocess.Popen(cmd, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - debugfs_proc.wait() - debugfserr += debugfs_proc.stderr.read() or "" - - gziperr = gzip_proc.stderr.read() - if gziperr: - logging.debug("gzip stderr=%s", gziperr) - if debugfserr: - logging.debug("debugfs stderr=%s", debugfserr) - - # Recompress the initrd - gzip_proc = subprocess.Popen(["gzip"], - stdin=file(newinitrd.name, "rb"), - stdout=file(initrd, "wb"), - stderr=subprocess.PIPE) - gzip_proc.wait() - gziperr = gzip_proc.stderr.read() - if gziperr: - logging.debug("gzip stderr=%s", gziperr) - os.unlink(newinitrd.name) - - return True - - def perform_initrd_injections(initrd, injections, scratchdir): """ Insert files into the root directory of the initial ram disk @@ -86,9 +31,6 @@ def perform_initrd_injections(initrd, injections, scratchdir): if not injections: return - if _rhel4_initrd_inject(initrd, injections): - return - tempdir = tempfile.mkdtemp(dir=scratchdir) os.chmod(tempdir, 0775) diff --git a/virtinst/osdict.py b/virtinst/osdict.py index e8c1487..2b2ba31 100644 --- a/virtinst/osdict.py +++ b/virtinst/osdict.py @@ -39,10 +39,6 @@ def _remove_older_point_releases(distro_list): return int(osobj.name.rsplit(".", 1)[-1]) def _find_latest(prefix): - """ - Given a prefix like 'rhel4', find the latest 'rhel4.X', - and remove the rest from the os list - """ latest_os = None first_id = None for osobj in ret[:]: @@ -61,12 +57,6 @@ def _remove_older_point_releases(distro_list): if latest_os: ret.insert(first_id, latest_os) - _find_latest("rhel4") - _find_latest("rhel5") - _find_latest("rhel6") - _find_latest("rhel7") - _find_latest("freebsd9") - _find_latest("freebsd10") return ret @@ -134,49 +124,7 @@ class _OSDB(object): # This is only for back compatibility with pre-libosinfo support. # This should never change. _aliases = { - "altlinux" : "altlinux1.0", - "debianetch" : "debian4", - "debianlenny" : "debian5", - "debiansqueeze" : "debian6", - "debianwheezy" : "debian7", - "freebsd10" : "freebsd10.0", - "freebsd6" : "freebsd6.0", - "freebsd7" : "freebsd7.0", - "freebsd8" : "freebsd8.0", - "freebsd9" : "freebsd9.0", - "mandriva2009" : "mandriva2009.0", - "mandriva2010" : "mandriva2010.0", - "mbs1" : "mbs1.0", - "msdos" : "msdos6.22", - "openbsd4" : "openbsd4.2", - "opensolaris" : "opensolaris2009.06", - "opensuse11" : "opensuse11.4", - "opensuse12" : "opensuse12.3", - "rhel4" : "rhel4.0", - "rhel5" : "rhel5.0", - "rhel6" : "rhel6.0", - "rhel7" : "rhel7.0", - "ubuntuhardy" : "ubuntu8.04", - "ubuntuintrepid" : "ubuntu8.10", - "ubuntujaunty" : "ubuntu9.04", - "ubuntukarmic" : "ubuntu9.10", - "ubuntulucid" : "ubuntu10.04", - "ubuntumaverick" : "ubuntu10.10", - "ubuntunatty" : "ubuntu11.04", - "ubuntuoneiric" : "ubuntu11.10", - "ubuntuprecise" : "ubuntu12.04", - "ubuntuquantal" : "ubuntu12.10", - "ubunturaring" : "ubuntu13.04", - "ubuntusaucy" : "ubuntu13.10", - "virtio26": "fedora10", - "vista" : "winvista", - "winxp64" : "winxp", - # Old --os-type values - "linux" : "generic", - "windows" : "winxp", - "solaris" : "solaris10", - "unix": "freebsd9.0", "other": "generic", } @@ -232,17 +180,11 @@ class _OSDB(object): return None osname = ret[0].get_short_id() - if osname == "fedora-unknown": - osname = self.latest_fedora_version() - logging.debug("Detected location=%s as os=fedora-unknown. " - "Converting that to the latest fedora OS version=%s", - location, osname) return osname def list_types(self): - approved_types = ["linux", "windows", "unix", - "solaris", "other", "generic"] + approved_types = ["generic"] return approved_types def list_os(self, typename=None, only_supported=False, sortpref=None): @@ -265,13 +207,6 @@ class _OSDB(object): return _sort(sortmap, sortpref=sortpref, limit_point_releases=only_supported) - def latest_fedora_version(self): - for osinfo in self.list_os(): - if (osinfo.name.startswith("fedora") and - "unknown" not in osinfo.name): - # First fedora* occurrence should be the newest - return osinfo.name - ##################### # OsVariant classes # @@ -287,7 +222,6 @@ class _OsVariant(object): self.codename = self._os and self._os.get_codename() or "" self.sortby = self._get_sortby() - self.urldistro = self._get_urldistro() self._supported = None @@ -363,34 +297,6 @@ class _OsVariant(object): return (datetime.datetime.strptime(eol_date, "%Y-%m-%d") > datetime.datetime.now()) - if self.name == "fedora-unknown": - return False - - # As of libosinfo 2.11, many clearly EOL distros don't have an - # EOL date. So assume None == EOL, add some manual work arounds. - # We should fix this in a new libosinfo version, and then drop - # this hack - if self._is_related_to(["fedora20", "rhel7.0", "debian6", - "ubuntu13.04", "win8", "win2k12"], - check_clones=False, check_derives=False): - return True - return False - - def _get_urldistro(self): - if not self._os: - return None - urldistro = self._os.get_distro() - remap = { - "opensuse" : "suse", - "sles" : "suse", - "mes" : "mandriva" - } - - if remap.get(urldistro): - return remap[urldistro] - - return urldistro - ############### # Public APIs # @@ -408,39 +314,12 @@ class _OsVariant(object): if not self._os: return "generic" - if self._family in ['linux']: - return "linux" - - if self._family in ['win9x', 'winnt', 'win16']: - return "windows" - - if self._family in ['solaris']: - return "solaris" - - if self._family in ['openbsd', 'freebsd', 'netbsd']: - return "unix" - - return "other" - - def is_windows(self): - return self.get_typename() == "windows" - - def need_old_xen_disable_acpi(self): - return self._is_related_to(["winxp", "win2k"], check_upgrades=False) - - def broken_x2apic(self): - # x2apic breaks networking in solaris10 - # https://bugs.launchpad.net/bugs/1395217 - return self.name in ('solaris10', 'solaris11') + return None def get_clock(self): - if self.is_windows() or self._family in ['solaris']: - return "localtime" + return "localtime" return "utc" - def supports_virtiommio(self): - return self._is_related_to(["fedora19"]) - def default_netmodel(self): """ Default non-virtio net-model, since we check for that separately @@ -499,37 +378,16 @@ class _OsVariant(object): return False - def supports_qemu_ga(self): - return self._is_related_to(["fedora18", "rhel6.0", "sles11sp4"]) - def default_videomodel(self, guest): if guest.os.is_pseries(): return "vga" - # Marc Deslauriers of canonical had previously patched us - # to use vmvga for ubuntu, see fb76c4e5. And Fedora users report - # issues with ubuntu + qxl for as late as 14.04, so carry the vmvga - # default forward until someone says otherwise. In 2014-09 I contacted - # Marc offlist and he said this was fine for now. - # - # But in my testing ubuntu-15.04 works _better_ with qxl (installer - # resolution is huge with vmvga but reasonable with qxl), and given - # that the qemu vmvga code is not supposed to be of high quality, - # let's use qxl for newer ubuntu - if (self._os and - self._os.get_distro() == "ubuntu" and - not self._is_related_to("ubuntu15.04")): - return "vmvga" - if guest.has_spice() and guest.os.is_x86(): if guest.has_gl(): return "virtio" else: return "qxl" - if self.is_windows(): - return "vga" - return None def get_recommended_resources(self, guest): diff --git a/virtinst/urlfetcher.py b/virtinst/urlfetcher.py index 692a297..58c1724 100644 --- a/virtinst/urlfetcher.py +++ b/virtinst/urlfetcher.py @@ -382,96 +382,6 @@ def _grabTreeinfo(fetcher): return treeinfo -def _distroFromSUSEContent(fetcher, arch, vmtype=None): - # Parse content file for the 'LABEL' field containing the distribution name - # None if no content, GenericDistro if unknown label type. - try: - cbuf = fetcher.acquireFileContent("content") - except ValueError: - return None - - distribution = None - distro_version = None - distro_summary = None - distro_distro = None - distro_arch = None - - lines = cbuf.splitlines()[1:] - for line in lines: - if line.startswith("LABEL "): - distribution = line.split(' ', 1) - elif line.startswith("DISTRO "): - distro_distro = line.rsplit(',', 1) - elif line.startswith("VERSION "): - distro_version = line.split(' ', 1) - if len(distro_version) > 1: - d_version = distro_version[1].split('-', 1) - if len(d_version) > 1: - distro_version[1] = d_version[0] - elif line.startswith("SUMMARY "): - distro_summary = line.split(' ', 1) - elif line.startswith("BASEARCHS "): - distro_arch = line.split(' ', 1) - elif line.startswith("DEFAULTBASE "): - distro_arch = line.split(' ', 1) - elif line.startswith("REPOID "): - distro_arch = line.rsplit('/', 1) - if distribution and distro_version and distro_arch: - break - - if not distribution: - if distro_summary: - distribution = distro_summary - elif distro_distro: - distribution = distro_distro - if distro_arch: - arch = distro_arch[1].strip() - # Fix for 13.2 official oss repo - if arch.find("i586-x86_64") != -1: - arch = "x86_64" - else: - if cbuf.find("x86_64") != -1: - arch = "x86_64" - elif cbuf.find("i586") != -1: - arch = "i586" - elif cbuf.find("s390x") != -1: - arch = "s390x" - - def _parse_sle_distribution(d): - sle_version = d[1].strip().rsplit(' ')[4] - if len(d[1].strip().rsplit(' ')) > 5: - sle_version = sle_version + '.' + d[1].strip().rsplit(' ')[5][2] - return ['VERSION', sle_version] - - dclass = GenericDistro - if distribution: - if re.match(".*SUSE Linux Enterprise Server*", distribution[1]) or \ - re.match(".*SUSE SLES*", distribution[1]): - dclass = SLESDistro - if distro_version is None: - distro_version = _parse_sle_distribution(distribution) - elif re.match(".*SUSE Linux Enterprise Desktop*", distribution[1]): - dclass = SLEDDistro - if distro_version is None: - distro_version = _parse_sle_distribution(distribution) - elif re.match(".*openSUSE.*", distribution[1]): - dclass = OpensuseDistro - if distro_version is None: - distro_version = ['VERSION', distribution[0].strip().rsplit(':')[4]] - - if distro_version is None: - return None - - ob = dclass(fetcher, arch, vmtype) - if dclass != GenericDistro: - ob.version_from_content = distro_version - - # Explictly call this, so we populate os_type/variant info - ob.isValidStore() - - return ob - - def getDistroStore(guest, fetcher): stores = [] logging.debug("Finding distro store for location=%s", fetcher.location) @@ -755,513 +665,6 @@ class GenericDistro(Distro): return self.fetcher.acquireFile(self._valid_iso_path) -class RedHatDistro(Distro): - """ - Base image store for any Red Hat related distros which have - a common layout - """ - uses_treeinfo = True - _version_number = None - - _boot_iso_paths = ["images/boot.iso"] - _hvm_kernel_paths = [("images/pxeboot/vmlinuz", - "images/pxeboot/initrd.img")] - _xen_kernel_paths = [("images/xen/vmlinuz", - "images/xen/initrd.img")] - - def isValidStore(self): - raise NotImplementedError() - - def _get_method_arg(self): - if (self._version_number is not None and - ((self.urldistro is "rhel" and self._version_number >= 7) or - (self.urldistro is "fedora" and self._version_number >= 19))): - return "inst.repo" - return "method" - - -# Fedora distro check -class FedoraDistro(RedHatDistro): - name = "Fedora" - urldistro = "fedora" - - def isValidStore(self): - if not self.treeinfo: - return self.fetcher.hasFile("Fedora") - - if not re.match(".*Fedora.*", self.treeinfo.get("general", "family")): - return False - - ver = self.treeinfo.get("general", "version") - if not ver: - logging.debug("No version found in .treeinfo") - return False - logging.debug("Found treeinfo version=%s", ver) - - latest_variant = OSDB.latest_fedora_version() - if re.match("fedora[0-9]+", latest_variant): - latest_vernum = int(latest_variant[6:]) - else: - logging.debug("Failed to parse version number from latest " - "fedora variant=%s. Using safe default 22", latest_variant) - latest_vernum = 22 - - # rawhide trees changed to use version=Rawhide in Apr 2016 - if ver in ["development", "rawhide", "Rawhide"]: - self._version_number = latest_vernum - self.os_variant = latest_variant - return True - - # Dev versions can be like '23_Alpha' - if "_" in ver: - ver = ver.split("_")[0] - - # Typical versions are like 'fedora-23' - vernum = str(ver).split("-")[0] - if vernum.isdigit(): - vernum = int(vernum) - else: - logging.debug("Failed to parse version number from treeinfo " - "version=%s, using vernum=latest=%s", ver, latest_vernum) - vernum = latest_vernum - - if vernum > latest_vernum: - self.os_variant = latest_variant - else: - self.os_variant = "fedora" + str(vernum) - - self._version_number = vernum - return True - - -# Red Hat Enterprise Linux distro check -class RHELDistro(RedHatDistro): - name = "Red Hat Enterprise Linux" - urldistro = "rhel" - - def isValidStore(self): - if self.treeinfo: - # Matches: - # Red Hat Enterprise Linux - # RHEL Atomic Host - m = re.match(".*(Red Hat Enterprise Linux|RHEL).*", - self.treeinfo.get("general", "family")) - ret = (m is not None) - - if ret: - self._variantFromVersion() - return ret - - if (self.fetcher.hasFile("Server") or - self.fetcher.hasFile("Client")): - self.os_variant = "rhel5" - return True - return self.fetcher.hasFile("RedHat") - - - ################################ - # osdict autodetection helpers # - ################################ - - def _parseTreeinfoVersion(self, verstr): - def _safeint(c): - try: - val = int(c) - except: - val = 0 - return val - - version = _safeint(verstr[0]) - update = 0 - - # RHEL has version=5.4, scientific linux=54 - updinfo = verstr.split(".") - if len(updinfo) > 1: - update = _safeint(updinfo[1]) - elif len(verstr) > 1: - update = _safeint(verstr[1]) - - return version, update - - def _variantFromVersion(self): - ver = self.treeinfo.get("general", "version") - name = None - if self.treeinfo.has_option("general", "name"): - name = self.treeinfo.get("general", "name") - if not ver: - return - - if name and name.startswith("Red Hat Enterprise Linux Server for ARM"): - # Kind of a hack, but good enough for the time being - version = 7 - update = 0 - else: - version, update = self._parseTreeinfoVersion(ver) - - self._version_number = version - self._setRHELVariant(version, update) - - def _setRHELVariant(self, version, update): - base = "rhel" + str(version) - if update < 0: - update = 0 - - ret = None - while update >= 0: - tryvar = base + ".%s" % update - if not self._check_osvariant_valid(tryvar): - update -= 1 - continue - - ret = tryvar - break - - if not ret: - # Try plain rhel5, rhel6, whatev - if self._check_osvariant_valid(base): - ret = base - - if ret: - self.os_variant = ret - - -# CentOS distro check -class CentOSDistro(RHELDistro): - name = "CentOS" - urldistro = "centos" - - def isValidStore(self): - if not self.treeinfo: - return self.fetcher.hasFile("CentOS") - - m = re.match(".*CentOS.*", self.treeinfo.get("general", "family")) - ret = (m is not None) - if ret: - self._variantFromVersion() - if self.os_variant: - new_variant = self.os_variant.replace("rhel", "centos") - if self._check_osvariant_valid(new_variant): - self.os_variant = new_variant - return ret - - -# Scientific Linux distro check -class SLDistro(RHELDistro): - name = "Scientific Linux" - urldistro = None - - _boot_iso_paths = RHELDistro._boot_iso_paths + ["images/SL/boot.iso"] - _hvm_kernel_paths = RHELDistro._hvm_kernel_paths + [ - ("images/SL/pxeboot/vmlinuz", "images/SL/pxeboot/initrd.img")] - - def isValidStore(self): - if self.treeinfo: - m = re.match(".*Scientific.*", - self.treeinfo.get("general", "family")) - ret = (m is not None) - - if ret: - self._variantFromVersion() - return ret - - return self.fetcher.hasFile("SL") - - -class SuseDistro(Distro): - name = "SUSE" - - _boot_iso_paths = ["boot/boot.iso"] - - def __init__(self, *args, **kwargs): - Distro.__init__(self, *args, **kwargs) - if re.match(r'i[4-9]86', self.arch): - self.arch = 'i386' - - oldkern = "linux" - oldinit = "initrd" - if self.arch == "x86_64": - oldkern += "64" - oldinit += "64" - - if self.arch == "s390x": - self._hvm_kernel_paths = [("boot/%s/linux" % self.arch, - "boot/%s/initrd" % self.arch)] - # No Xen on s390x - self._xen_kernel_paths = [] - else: - # Tested with Opensuse >= 10.2, 11, and sles 10 - self._hvm_kernel_paths = [("boot/%s/loader/linux" % self.arch, - "boot/%s/loader/initrd" % self.arch)] - # Tested with Opensuse 10.0 - self._hvm_kernel_paths.append(("boot/loader/%s" % oldkern, - "boot/loader/%s" % oldinit)) - # Tested with SLES 12 for ppc64le - self._hvm_kernel_paths.append(("boot/%s/linux" % self.arch, - "boot/%s/initrd" % self.arch)) - - # Matches Opensuse > 10.2 and sles 10 - self._xen_kernel_paths = [("boot/%s/vmlinuz-xen" % self.arch, - "boot/%s/initrd-xen" % self.arch)] - - def _variantFromVersion(self): - distro_version = self.version_from_content[1].strip() - version = distro_version.split('.', 1)[0].strip() - self.os_variant = self.urldistro - if int(version) >= 10: - if self.os_variant.startswith(("sles", "sled")): - sp_version = None - if len(distro_version.split('.', 1)) == 2: - sp_version = 'sp' + distro_version.split('.', 1)[1].strip() - self.os_variant += version - if sp_version: - self.os_variant += sp_version - else: - # Tumbleweed 8 digit date - if len(version) == 8: - self.os_variant += "tumbleweed" - else: - self.os_variant += distro_version - else: - self.os_variant += "9" - - def isValidStore(self): - # self.version_from_content is the VERSION line from the contents file - if (not self.version_from_content or - self.version_from_content[1] is None): - return False - - self._variantFromVersion() - - self.os_variant = self._detect_osdict_from_url() - - # Reset kernel name for sle11 source on s390x - if self.arch == "s390x": - if self.os_variant == "sles11" or self.os_variant == "sled11": - self._hvm_kernel_paths = [("boot/%s/vmrdr.ikr" % self.arch, - "boot/%s/initrd" % self.arch)] - - return True - - def _get_method_arg(self): - return "install" - - ################################ - # osdict autodetection helpers # - ################################ - - def _detect_osdict_from_url(self): - root = "opensuse" - oses = [n for n in OSDB.list_os() if n.name.startswith(root)] - - for osobj in oses: - codename = osobj.name[len(root):] - if re.search("/%s/" % codename, self.uri): - return osobj.name - return self.os_variant - - -class SLESDistro(SuseDistro): - urldistro = "sles" - - -class SLEDDistro(SuseDistro): - urldistro = "sled" - - -# Suse image store is harder - we fetch the kernel RPM and a helper -# RPM and then munge bits together to generate a initrd -class OpensuseDistro(SuseDistro): - urldistro = "opensuse" - - -class DebianDistro(Distro): - # ex. http://ftp.egr.msu.edu/debian/dists/sarge/main/installer-i386/ - # daily builds: http://d-i.debian.org/daily-images/amd64/ - name = "Debian" - urldistro = "debian" - - def __init__(self, *args, **kwargs): - Distro.__init__(self, *args, **kwargs) - - # Pull the tree's arch out of the URL text - self._treeArch = "i386" - for pattern in ["^.*/installer-(\w+)/?$", - "^.*/daily-images/(\w+)/?$"]: - arch = re.findall(pattern, self.uri) - if arch: - self._treeArch = arch[0] - break - - self._url_prefix = 'current/images' - self._installer_dirname = self.name.lower() + "-installer" - self._set_media_paths() - - def _set_media_paths(self): - self._boot_iso_paths = ["%s/netboot/mini.iso" % self._url_prefix] - - hvmroot = "%s/netboot/%s/%s/" % (self._url_prefix, - self._installer_dirname, - self._treeArch) - initrd_basename = "initrd.gz" - kernel_basename = "linux" - if self._treeArch in ["ppc64el"]: - kernel_basename = "vmlinux" - self._hvm_kernel_paths = [ - (hvmroot + kernel_basename, hvmroot + initrd_basename)] - - xenroot = "%s/netboot/xen/" % self._url_prefix - self._xen_kernel_paths = [(xenroot + "vmlinuz", xenroot + "initrd.gz")] - - def isValidStore(self): - if self.fetcher.hasFile("%s/MANIFEST" % self._url_prefix): - # For regular trees - pass - elif self.fetcher.hasFile("daily/MANIFEST"): - # For daily trees - self._url_prefix = "daily" - self._set_media_paths() - else: - return False - - filename = "%s/MANIFEST" % self._url_prefix - regex = ".*%s.*" % self._installer_dirname - if not self._fetchAndMatchRegex(filename, regex): - logging.debug("Regex didn't match, not a %s distro", self.name) - return False - - self.os_variant = self._detect_debian_osdict_from_url() - return True - - - ################################ - # osdict autodetection helpers # - ################################ - - def _detect_debian_osdict_from_url(self): - root = self.name.lower() - oses = [n for n in OSDB.list_os() if n.name.startswith(root)] - - if self._url_prefix == "daily": - logging.debug("Appears to be debian 'daily' URL, using latest " - "debian OS") - return oses[0].name - - for osobj in oses: - if osobj.codename: - # Ubuntu codenames look like 'Warty Warthog' - codename = osobj.codename.split()[0].lower() - else: - if " " not in osobj.label: - continue - # Debian labels look like 'Debian Sarge' - codename = osobj.label.split()[1].lower() - - if ("/%s/" % codename) in self.uri: - logging.debug("Found codename=%s in the URL string", codename) - return osobj.name - - logging.debug("Didn't find any known codename in the URL string") - return self.os_variant - - -class UbuntuDistro(DebianDistro): - # http://archive.ubuntu.com/ubuntu/dists/natty/main/installer-amd64/ - name = "Ubuntu" - urldistro = "ubuntu" - - def isValidStore(self): - if self.fetcher.hasFile("%s/MANIFEST" % self._url_prefix): - # For regular trees - filename = "%s/MANIFEST" % self._url_prefix - regex = ".*%s.*" % self._installer_dirname - elif self.fetcher.hasFile("install/netboot/version.info"): - # For trees based on ISO's - self._url_prefix = "install" - self._set_media_paths() - filename = "%s/netboot/version.info" % self._url_prefix - regex = "%s*" % self.name - elif self.fetcher.hasFile(".disk/info") and self.arch == "s390x": - self._hvm_kernel_paths += [("boot/kernel.ubuntu", "boot/initrd.ubuntu")] - self._xen_kernel_paths += [("boot/kernel.ubuntu", "boot/initrd.ubuntu")] - filename = ".disk/info" - regex = "%s*" % self.name - else: - return False - - if not self._fetchAndMatchRegex(filename, regex): - logging.debug("Regex didn't match, not a %s distro", self.name) - return False - - self.os_variant = self._detect_debian_osdict_from_url() - return True - - -class MandrivaDistro(Distro): - # ftp://ftp.uwsg.indiana.edu/linux/mandrake/official/2007.1/x86_64/ - name = "Mandriva/Mageia" - urldistro = "mandriva" - - _boot_iso_paths = ["install/images/boot.iso"] - _xen_kernel_paths = [] - - def __init__(self, *args, **kwargs): - Distro.__init__(self, *args, **kwargs) - self._hvm_kernel_paths = [] - - # At least Mageia 5 uses arch in the names - self._hvm_kernel_paths += [ - ("isolinux/%s/vmlinuz" % self.arch, - "isolinux/%s/all.rdz" % self.arch)] - - # Kernels for HVM: valid for releases 2007.1, 2008.*, 2009.0 - self._hvm_kernel_paths += [ - ("isolinux/alt0/vmlinuz", "isolinux/alt0/all.rdz")] - - - def isValidStore(self): - # Don't support any paravirt installs - if self.type is not None and self.type != "hvm": - return False - - # Mandriva websites / media appear to have a VERSION - # file in top level which we can use as our 'magic' - # check for validity - if not self.fetcher.hasFile("VERSION"): - return False - - for name in ["Mandriva", "Mageia"]: - if self._fetchAndMatchRegex("VERSION", ".*%s.*" % name): - return True - - logging.debug("Regex didn't match, not a %s distro", self.name) - return False - - -class ALTLinuxDistro(Distro): - # altlinux doesn't have installable URLs, so this is just for a - # mounted ISO - name = "ALT Linux" - urldistro = "altlinux" - - _boot_iso_paths = [("altinst", "live")] - _hvm_kernel_paths = [("syslinux/alt0/vmlinuz", "syslinux/alt0/full.cz")] - _xen_kernel_paths = [] - - def isValidStore(self): - # Don't support any paravirt installs - if self.type is not None and self.type != "hvm": - return False - - if not self.fetcher.hasFile(".disk/info"): - return False - - if self._fetchAndMatchRegex(".disk/info", ".*%s.*" % self.name): - return True - - logging.debug("Regex didn't match, not a %s distro", self.name) - return False - - # Build list of all *Distro classes def _build_distro_list(): allstores = []