Citrix, PVS, Uncategorized

Citrix PVS and Managed Service Accounts gMSA

I’m a big fan of Managed Service Accounts because they are much more secure and aren’t easily exploited by human beings.  Basically, Active Directory controls the account with it being responsible for changing passwords.  While use of gMSA (group managed service accounts) is sometimes hit or miss, I didn’t find much on recent use with Citrix other than a vague “we support this” statement.

Carl Webster had a much older attempt with PVS (not sure whether he tried again or not) and I wanted to ensure that this worked on PVS 7.7 (just released).

You’ll need a couple of things

I would leverage a tool for creating and managing gMSA that I got here.
(note: for a quick guide on setting this up, I would look through Derek Seaman’s blog).


Add you PVS server to the list otherwise it won’t work. (I only have 1 PVS server right now, I’m in rebuilding mode…)


For SOAP, you’ll need to make this account a member of the local admins on the PVS server (when you add the account, make sure you select “service accounts” for objects.


For SQL, I am using 2014 with availability groups.  Check out Derek’s blog for a great walkthrough on this.

Your database should have been created already (use the dbscript.exe to manually create the database in PVS)

Grant the permissions needed to your gMSA on the SQL database (I create the account on both database servers just in case (when I test the failover))

Testing failover should work and you will also notice the services are runningpvsconsoleservicespvs

Citrix, XenServer

FusionIO and XenServer

Getting FusionIO cards and XenServer to work seem to be a bit tougher than I thought but it’s possible. I have a few cards, some old servers and a XenServer 6.5 ISO.  I was hoping to use 6.6 but there isn’t a DDK up for that yet.

Install DDK 6.5
Increase the memory (I used 4GB) or you’ll run into errors on the RPM rebuild with out of memory

on XenServer 6.5

install lsof
yum install –enablerepo=base lsof

you’ll want to use the DDK to develop an RPM as specified here –
Now you can download the HP stuff here – I wouldn’t I’d use the sources from FusionIO directly.  Download the Centos5 sources and all the Utilities from here –

Use WinSCP to upload the files to your DDK server
You should upload the Sources directory

run rpm –rebuild iomemory-vsl-*.src.rpm

Copy the rpm in the /usr/src/redhat/RPMS/x86_64 directory on the DDK to the XenServer
Also copy the utilities directory from the downloaded ZIP to the XenServer

rpm -Uvh iomemory-vsl-*.rpm (you may need to do this in order)

You can ignore the dracut error (search for it in the pdf here)

cd to Utilities – run the following (check the order I may be wrong here but it’ll tell you)
rpm -Uvh fio-common*.rpm
rpm -Uvh fio-preinstall*.rpm
rpm -Uvh fio-util*.rpm
rpm -Uvh fio-sysvinit*.rpm

now run


Note the driver version is empty? – now we are in sync with Kyrian’s blog post.

Run fio-status again – I had to upgrade the firmware on mine meaning I had to copy the firmware file *.fff to the XenServer and run


Then reboot and fio-status again. Now I have to wait for some low-level format but that’s ok…


I and listed what I had for /dev/fct* and performed the following command
fio-format /dev/fct0
fio-format /dev/fct1

Then attached them
fio-attach /dev/fct0
fio-attach /dev/fct1

After that fio-status looks good and we mount
xe sr-create name-label=”ioDrive00″ physical-size=320Gb type=lvm device-config:device=/dev/fioa
xe sr-create name-label=”ioDrive01″ physical-size=320Gb type=lvm device-config:device=/dev/fiob

And we are done!


Career, Citrix

CTP 2016!


I’m honored to be chosen as a CTP for the class of 2016!

It is exciting obviously for me, but also Champion Solutions to be able to speak on Citrix solutions for our customers! If you’re in Atlanta, feel free to reach out!

If you’re not sure what a CTP is, they are the top 50 Citrix experts or champions that are recognized for their contributions and technical expertise. There are only 50 people and this year included 6 new members. CTPs get to interact with the Citrix product team, provide input and also speak to the community. The other perk is they give you some discounts on Citrix Synergy which is in Las Vegas this year!

Thanks to all the current CTPs and congrats to all the new ones!

If you’d like to read more about the CTPs,  click here to read the current bios.

There is also a twitter list here.

Career, OpenStack

2016 – Champion Solutions Group

As you may have noticed, this blog hasn’t been updated in a while. To be honest, last year afforded me little time to update, post or even be allowed to describe what I was doing (to some extent).  Most of the content came from my employment at Presidio, a great company to work for.  At the beginning of 2015, I took up a new challenge, wanting to do something new, something with cloud, something with DevOps.

January of last year was when I accepted a role at Ericsson as a Consulting Manager.  If you’re not familiar with the term, it’s used for enterprise consulting (think Accenture-like companies) and I worked for the consulting services at Ericsson.  In fact, we competed with Accenture and I met a few of the people who stuck around at one of my projects, where we won the bid for a large contract project.  Ericsson is also involved in the telco world, working with companies such at AT&T, Verizon, Sprint, T-Mobile, etc.

Initially at Ericsson, I worked from home and was constantly trying to get involved. It seemed this is normal in consulting, but not for me. I honestly felt that if I wasn’t doing something that my job would be in jeopardy so I run presentations on virtualization, containers and devops and reached out to others in the company to learn more.  This paid off and I developed an opportunity in Europe which seemed perfect.  However, at the same time, Ericsson closed a large project with AT&T that I was called in to help.  The project teamed up with Mirantis (Ericsson holds an interest in them) to push OpenStack through automation and involved everything from the code management, CI/CD, automation to the tools, practices and integration.  We would be running with an agile development process utilizing SCRUM.  In any case, this involved me travelling to St Louis repeatedly and not spending a lot of time with the family.  I also seemed to be dealing more with people than the technology (not because that was what I was told to do, but because that’s what most projects are about, people working together).  In any case, I’ll likely share a lot of that later on.  I met some awesome people on the project that I hope to stay in contact with.

So why Champion?  Champion needed a pre-sales person in Atlanta and has not had the best of luck with the role in past years.  I would love to go back to Presidio, but honestly, they have enough people and they are really good. I needed a challenge.  Champion is much smaller than presidio, roughly 150 employees, and based out of Boca Raton, FL.  The culture mattered a lot to me and often at smaller companies, it is vital that people like you and you like them (less important at bigger companies but not irrelevant).  The interviews went well and I had to chose between them and another offer that was actually more senior but involved some travel.  Ultimately I chose Champion and made my arrangement as close to sales as I could (so my pay is aligned with the sales side as much as possible).  I love the idea of sales, you get paid on what you do, instant gratification and you’re in front of people.  Champion is also very interested in leveraging cloud, containers, and new technology and breaking out of the traditional VAR practice of “slinging boxes”.  I love problem solving and the variety of customer issues in my role keeps me excited and on my toes.  So my decision to work at Champion was based on a number of items, but mostly it was based on a good “fit”.

Hopefully I will be posting more content that is interesting this year so please follow the blog if you’re interested and use the tags if you like certain things but not others on my blog.

Cloud, OpenStack

Openstack Multi-Node with Single NIC

This post is a summary of my experience getting a multi-node, single nic setup up and running.  I have two older laptops (relative term, they still are x64 with intel-vt so not that old) that I use in this scenario.  One is a levono (called stinkpad) and the other is a dell (called dell).  The purpose of all this is to enable neutron networking on a juno ubuntu openstack setup.

Let’s define what I’m doing here.

My switch/router is an Linksys N3000 which is running dd-wrt kong.  Basically it allows me to utilize VLANs. I actaully have it on the same LAN segment as my Comcast Business Router (which has awesome wifi as a side note).  This subnet is the with the comcast router at .1 and the dd-wrt at .2.  It is important to note I am NOT NATing between these, .1 does the DHCP and routing. I am pluggin my laptops into the dd-wrt directly (I can’t do VLANs on the comcast router).  Why am I complicated? No clue, it’s just the setup that was there when I got this working.  (see here for someone who blogged about this a bit in depth, I would caution you should use ssh and command line for the VLANs, the GUI is not 100% at all!).

Just a side note, I wasted a ton of time trying to use wlan0. Not only does the centrino chip on the stinkpad have issues, but it will never work.  The wifi interface on the router doesn’t play well with masqueraded or changed packets, nor will it do VLAN trunking they way I want it.

Stepping back, we are going to have 3 networks but you only need two.  One is an external internet one that is my LAN 10.1.10/0/24 which all computers can reach behind my router.  This network will be the network with the floating ip range allocated and the “public” or “external” network in openstack. If you are using all yous IPs, you can have the dd-wrt NAT from the comcast router on a new subnet, however I didn’t feel like figuring out the translation from a computer on the Comcast subnet to the dd-wrt one.  I choose to allocated DHCP on 100-200 so I used the to the range for openstack (giving me 49 IPs (the router will use the first one)).

Utilizing the wiki for dd-wrt I configured two vlans (really just needed one but why stop at one?).  I used VLAN 5 and VLAN 6.  VLAN 5 is the subnet and VLAN 6 is the subnet.  They are trunked to the ports and my configuration for my dd-wrt is below.

# DD-WRT V24-K26 #
# Kong Mod #

BusyBox v1.21.0 (2014-06-07 21:53:22 CEST) built-in shell (ash)
Enter 'help' for a list of built-in commands.

root@DD-WRT:~# nvram show | grep vlan.*ports
size: 27882 bytes (33558 left)
vlan6ports=4t 3t 2t 1t 8
vlan2ports=0 8
new_vlan2ports=0 8
vlan5ports=4t 3t 2t 1t 8
vlan1ports=4 3 2 1 8*
new_vlan1ports=1 2 3 4 8*
root@DD-WRT:~# nvram show | grep port.*vlans
size: 27882 bytes (33558 left)
root@DD-WRT:~# nvram show | grep vlan.*hwname
size: 27882 bytes (33558 left)

As for the servers, I used the debian wiki and Steve Weston’s blog for help here.

configure the eth0 for stinkpad (my controller/compute/network node) with a static IP

# interfaces(5) file used by ifup(8) and ifdown(8)

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static

and for the dell

# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static

I reboot here (good time to do an apt-get update && apt-get dist-upgrade; and make sure everything came back up

After reboot add the following for packet forwarding


To load the values run the following

sudo sysctl -p

Install the following packages

sudo apt-get -y install ntp vlan openvswitch-switch

load the modules

sudo modprobe 8021q

sudo sh -c ‘echo 8021q >> /etc/modules’

Now create the vlans on both servers and assign an IP (these .2 are for the stinkpad, the .4 is for the dell)

sudo vconfig add eth0 5
sudo ip addr add dev eth0.5
sudo ip link set dev eth0.5 up

sudo vconfig add eth 6
sudo ip addr add dev eth0.6
sudo ip link set dev eth0.6

Do the same for the dell

sudo vconfig add eth0 5
sudo ip addr add dev eth0.5
sudo ip link set dev eth0.5 up

sudo vconfig add eth 6
sudo ip addr add dev eth0.6
sudo ip link set dev eth0.6

Make sure the interfaces are working and you can ping from one another

Let’s add them to the /etc/network/interfaces,  – this is for dell but do the same for the other node

auto eth0.5
iface eth0.5 inet static
vlan-raw-device eth0

auto eth0.6
iface eth0.6 inet static
vlan-raw-device eth0

Now at this point I am going to create an OVS bridge for my primary interface. If you aren’t on the console or using one of the VLAN ports to ssh then you’ll want to change over since this will disconnect your current session.

First let’s create the bridge, assign the port and assign the IP (this is for dell but you obviously need to do this on both nodes)

sudo ovs-vsctl add-br br0
sudo ovs-vsctl add-port br0 eth0 #or whatever your interface is called)

sudo ifconfig br0 netmask
sudo route add default gw
sudo ifconfig eth0 0

Double check here and make sure the IP is working. Then let’s commit this to the interfaces and reboot to ensure it sticks. This is the entire interfaces for the dell node, note that it replaces what is there and includes the vlan info (which is not in a ovs bridge since we will let neutron do this through the ml2 plugin.

# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback

auto eth0
allow-br0 eth0
iface eth0 inet manual
ovs_bridge br0
ovs_type OVSPort
pre-up ifconfig $IFACE up
post-down ifconfig $IFACE down

auto br0
allow-ovs br0
iface br0 inet static
ovs_type OVSBridge
ovs_ports eth0
pre-up ifconfig $IFACE up
post-down ifconfig $IFACE down

auto eth0.5
iface eth0.5 inet static
vlan-raw-device eth0

auto eth0.6
iface eth0.6 inet static
vlan-raw-device eth0

Now let’s make sure everything is working by crossing our fingers and rebooting.  Especially with Ubuntu you’ll likely get a bit of a delay and then we should have the interfaces up. Log back in and let’s see what the final product looks like.

stack@dell:~$ ifconfig
br0 Link encap:Ethernet HWaddr 00:22:19:e2:e5:de
inet addr: Bcast: Mask:
inet6 addr: 2601:0:9182:b000:f4ac:61c9:ef87:d6ae/64 Scope:Global
inet6 addr: fe80::4006:22ff:fee7:c09b/64 Scope:Link
inet6 addr: 2601:0:9182:b000:222:19ff:fee2:e5de/64 Scope:Global
RX packets:362029 errors:0 dropped:60192 overruns:0 frame:0
TX packets:32782 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:98079943 (98.0 MB) TX bytes:19888165 (19.8 MB)

eth0 Link encap:Ethernet HWaddr 00:22:19:e2:e5:de
inet6 addr: fe80::222:19ff:fee2:e5de/64 Scope:Link
inet6 addr: 2601:0:9182:b000:4ac:2aa5:9f09:e7a6/64 Scope:Global
inet6 addr: 2601:0:9182:b000:222:19ff:fee2:e5de/64 Scope:Global
RX packets:744185 errors:0 dropped:0 overruns:0 frame:0
TX packets:351772 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:421597281 (421.5 MB) TX bytes:72956467 (72.9 MB)

eth0.5 Link encap:Ethernet HWaddr 00:22:19:e2:e5:de
inet addr: Bcast: Mask:
inet6 addr: fe80::222:19ff:fee2:e5de/64 Scope:Link
RX packets:226093 errors:0 dropped:0 overruns:0 frame:0
TX packets:279632 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:305497247 (305.4 MB) TX bytes:48168955 (48.1 MB)

eth0.6 Link encap:Ethernet HWaddr 00:22:19:e2:e5:de
inet addr: Bcast: Mask:
inet6 addr: fe80::222:19ff:fee2:e5de/64 Scope:Link
RX packets:257 errors:0 dropped:0 overruns:0 frame:0
TX packets:292 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:28742 (28.7 KB) TX bytes:37008 (37.0 KB)

lo Link encap:Local Loopback
inet addr: Mask:
inet6 addr: ::1/128 Scope:Host
RX packets:69856 errors:0 dropped:0 overruns:0 frame:0
TX packets:69856 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:6204825 (6.2 MB) TX bytes:6204825 (6.2 MB)

stack@dell:~$ sudo ovs-vsctl show
Bridge "br0"
Port "eth0"
Interface "eth0"
Port "br0"
Interface "br0"
type: internal
ovs_version: "2.0.2"

Make sure you modify /etc/hosts

for dell: localhost dell compute1 stinkpad controller network database compute0

for stinkpad: localhost stinkpad controller database network compute0 dell compute1

At this point you can install openstack or devstack

Again remembering my public network is and I want to use .10-.60 for my floating ips is my management is my tunneling interface

here is my l3_agent.ini

interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
use_namespaces = True
external_network_bridge = br0
router_delete_namespaces = True


type_drivers = flat,gre
tenant_network_types = gre
mechanism_drivers = openvswitch

Example:flat_networks = external


tunnel_id_ranges = 1:1000


enable_security_group = True
enable_ipset = True
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver

local_ip =
enable_tunneling = True
bridge_mappings = external:br0

tunnel_types = gre

We use gre to create tunnels on the network between the nodes so the tenant (within the tenant) can talk to each other.

If you want to experience migration of the VMs on KVM, don’t forget to enable the ssh key for the nova account (you’ll need to set it to /bin/bash and actually create and import the key for passwordless auth between node)

Hope this helps someone, if you’re on a single machine, you can create vlans because they won’t go anywhere. If you can get switch VLANs down, this is actually pretty simple compared to trying to fake bridge and do some masquerading to get this to work.

Cloud, OpenStack

Using Swift backend for Glance on Ubuntu Openstack

This took a bit for me to figure out with Juno so I thought I’d share if you’re interested.

If you use devstack, this happens pretty naturally.  I like to understand things a bit more fully and have been playing around with two old laptops running ubuntu 14.04 and openstack (one is a controller and compute/network, the other compute/network).

I only have one node running glance but both run swift.  Obviously your swift should be up and running. Openstack’s Ubuntu guide does this pretty well.  If you want to setup something a bit more fancy, you can also use the Ubuntu SecurityTeam TestingOpenStack guide (it’s a little dated but still good).

Once you have both swift and glance up, edit the /etc/glance/glance-api.conf


default_store = swift #I don’t think this is needed but doesn’t hurt

auth_uri = http://controller:5000/v2.0
identity_uri = http://controller:35357
admin_tenant_name = service
admin_user = glance
admin_password = glance_pass
revocation_cache_time = 10

stores =
#filesystem_store_datadir = /var/lib/glance/images/
swift_store_auth_version = 2
swift_store_auth_address = http://controller:35357/v2.0/
swift_store_user = service:glance
swift_store_key = glance_pass
swift_store_create_container_on_put = True
swift_store_large_object_size = 5120
swift_store_large_object_chunk_size = 200
swift_enable_snet = False

Notice the auth_address is 35357 for the admin keystone portal? Also note we commented out the filesystem_store_datadir

Also you’ll want to use the glance keystone account and tenant in the store_user section with the password (for the keystone glance account) in the store_key field.

The biggest thing I missed was the stores = field.  It’s new and not mentioned anywhere I could find except the commented config file.

Go ahead and modify the /etc/glance/glance-registry.conf

auth_uri = http://controller:5000/v2.0
identity_uri = http://controller:35357
admin_tenant_name = service
admin_user = glance
admin_password = glance_pass

and then modify the /etc/glance/glance-cache.conf (I don’t think this is needed but just in case)

swift_store_auth_version = 2
swift_store_auth_address = http://controller:35357/v2.0/
swift_store_user = service:glance
swift_store_key = glance_pass
swift_store_container = glance
swift_store_create_container_on_put = True
swift_store_large_object_size = 5120
swift_store_large_object_chunk_size = 200
swift_enable_snet = False

the glance container should get created automatically since we specified the create_container_on_put command

sudo service glance-api restart
sudo service glance-registry restart

go ahead and create an image and upload it to glance

mkdir -p /tmp/images

. ~/ #source the admin creds

wget -P /tmp/images
glance image-create --name ubuntu-trusty-x86_64 --disk-format=qcow2 --container-format=bare --file /tmp/images/trusty-server-cloudimg-amd64-disk1.img --progress

glance image-list

we should see the image returned

stack@dell:~$ .
stack@dell:~$ glance image-list
| ID | Name | Disk Format | Container Format | Size | Status |
| db3d6070-0acb-4053-8c9d-277eb090496e | cirros-0.3.3-x86_64 | qcow2 | bare | 13200896 | active |
| 1e7b430c-4aee-43d7-a96e-8a6cab394959 | ubuntu-trusty-x86_64 | qcow2 | bare | 256639488 | active |

Let’s make sure it went into swift though

source the glance user or just export the username/password/tenant and then look in swift

stack@dell:~$ export OS_USERNAME="glance"
stack@dell:~$ export OS_PASSWORD="glance_pass"
stack@dell:~$ export OS_TENANT_NAME="service"
stack@dell:~$ swift list
stack@dell:~$ swift list glance

And that’s it, you’ve now configured swift as your backend.  I’d encourage you to look into using Ceph but I’m holding out until I get another crappy laptop to make 3 nodes (I only have 2). Donations are always welcome!

Hardware, Linux

SteamOS on Lenovo T510 with Nvidia Optimus

SteamOS is still in beta but releases come out and I found the concept interesting.  However, you need a PC with UEFI BIOS and a newer Nvidia or ATI card (although I think an Intel may work).  SteamOS is basically meant to run a Home Theater PC in your livingroom and/or be a gaming console with a controller (Xbox controller can work here if you have the right model/driver).  I was more curious than anything but it wasn’t easy to get this running on the T510.  This is just to share what it took and to bookmark a place for me to come back to (since I have other purposes for this computer, namely openstack testing with Mirantis).

The Lenovo T510 I used has an Nvidia NVS 3100T card and the i5 processor.  Lenovo, and many other manufacturers, did not add UEFI until 2012 (meaning that it is in the T520 but not the T510).  Furthermore, the Nvidia Linux driver dropped support for many older cards (like the 3100T) after the 340.x driver version (I think it’s on 343 right now?)  Steam builds the driver in their Debian-based installer and if dmesg shows NVIDIA, it will assume you want the new drivier.  The issue is, automation breaks because it will prompt about an unsupported driver, so the automated install always will fail.  In any case, here’s how you do this.

WARNING: This wipes out all data on the drive!!!

  1. Get the ISO version of the install, you can do this yourself or get a precompiled copy.  It’s just easier to make a DVD here (because USB boot is based on UEFI and you have to fake the CDROM being the USB…trust me, just burn a DVD for this).
    1. Get the ISO by going the the steam forum and checking for a new sticky on a release and burn a DVD –
  2. Boot up the laptop with DVD and let it install (you can select expert).  Midway through the core install it will error and have a message about trying it 5 times again, You need to just click back until it gives you an option for continue, putting you back on a menu screen.  At this point we jump to tty2 by pressing CTRL-ALT-F2 and perform the following commands:
    1. chroot /target /bin/bash
    2. apt-get install -f
      1. If you get the nvidia installer ignore the next step
    3. apt-get install nvidia-*
      1. When the installer asks to install an unsupported card, say yes, you’ll get two more installers ask questions, select the obvious choices
  3. Hit CTRL-ALT-F5 (I think) to go back to the installer and select install core components (or the selection it should already be on). It will warn of a dirty install, say it’s ok and wait. It should complete the installation (maybe give a warning but it’s fine)
  4. It should boot into a gnome desktop where you need to enable the network, it will update steam and reboot.
  5. It will boot to the GRUB menu and should backup the system partition (select this if it doesn’t do it automatically). upon the next reboot, hit ESC after the lenovo screen (be quick) to get the GRUB menu to show.  Select the (recovery mode option) and it should boot to command line.
  6. At boot, login with desktop/desktop and we will be following most of this guide. but we need to have network enabled first and this is not up on recovery (at least correctly).
    1. login if you’re not already with desktop/desktop
      1.  you may need to set the password using the “passwd” command after login (make it: desktop)
      2. change the Xorg to GDM3 by running the following
        1. sudo dpkg-reconfigure lightdm
          1. select gdm3
        2. sudo passwd steam
          1. set it to “steam”
        3. sudo reboot
    2. Hit ESC after the Lenovo splash screen, keep trying until you see a legacy graphic backsplash of SteamOS and the Grub menu should appear after a few seconds
      1. Select the normal boot option this time and let it boot into the gnome desktop
      2. once you’re in (you may have to select STEAMOS for login), hit CTL-ALT-F2 for the command line
      3. Logon with desktop/desktop and proceed to step C
    3. install compilers for headers
      1. sudo apt-get install build-essential linux-headers-$(uname -r)
      2. wget
      3. sudo chmod +x
      4. sudo apt-get –purge remove xserver-xorg-video-nouveau nvidia-kernel-common nvidia-kernel-dkms nvidia-glx nvidia-smi
      5. sudo apt-get remove –purge nvidia-*
      6. sudo nano /etc/modprobe.d/disable-nouveau.conf
        1. # Disable nouveau
          blacklist nouveau
          options nouveau modeset=0
        2. add the lines above and save this new file (CTRL-X then Y then ENTER)
      7. sudo dpkg-reconfigure lightdm
        1. select lightdm
      8. sudo reboot
    4. Hit ESC after the Lenovo splash screen (we’re going back to recovery) and select the recovery option in Grub (should be on bash already)
      1. cd /home/desktop (I think, might be steamos)
      2. ls -la (see if the NVIDIA file is there, if not, find it)
      3. sudo /etc/init.d/lightdm stop
      4. sudo /etc/init.d/gdm3 stop
      5. sudo ./
        1. ACCEPT EULA, say YES to DKMS, YES to 32bit compat, YES to Xorg config and click OK
      6. sudo reboot
    5. Boot to normal mode and wait (you may have a big cursor and be waiting for over 10 minutes).  I had dinner, came back and I was up and running

Hope this works for some of you who want to test it!

This problem has been raised so hopefully it will be addressed in the final release

PS – I noticed a few other interesting places discussing this which I haven’t tried


2) GitHub for non-UEFI boot (no legacy nvidia yet) –