Tweaks for Ubuntu on Surface Book

You are Unix-lover but can’t stand the elegance of Microsoft Surface Book and Windows 10. So you decide to switch back, thinking the so-called “Windows Subsystem for Linux” (WSL) will solve all your problems with Windows and let you enjoy the most cutting-edge Microsoft technology on Surface. Or at least you can make a dual-boot to utilize both its powerful hardware and appealing tablet design at the same time.

So you are like me. At first, it works fine. Microsoft has done a good job to make it smoothly run for developers. However, though Windows 10 is perfect for entertainment, if you have long time using Mac or Linux, you will miss your workspace back. Sometimes a simple yet productive and highly customizable system is favored over even an elegant and universal one.

However, Surface Book will only work best with Windows. I tried to make Windows as similar as possible to Unix when needed. WSL can handle most of the popular jobs on Linux and ConEmu (as an alternative for guake) can keep it handy, but as time goes on, I realized that having two or more command-line shells will only complicated things, as most of the tasks you want to do on bash, but some can only be done with cmd. And installing packages for both Windows and Linux for just compatibility is not a wise option. So while waiting for the WSL to improve (like to fully integrated) probably you would be happy with dual-boot to separate your “working” and “entertaining” environment.

You think you can dual boot? But it’s only true until you realize Surface Book has some flaws that makes it impossible to utilize most of the hardware and functions, as Microsoft was building that with Windows in mind. Many of the features that make people choose to use Surface: touch and detachable screen, GPU, camera, etc. are not working in Ubuntu, not to mention some irritating bugs.

But I still can’t live without bash, so here I will try to share and keep updating all the problems and workarounds I had with my Surface Book. If you have better experiences and want to share below I would be more than thankful.

(Also note that with the newer version of Ubuntu and Linux kernel, some of the problem could have already been resolved, so some of the tricks here became obsolete. I will try to keep removing old ones and updating with new tweaks)

Update: For most of the patches you can fix by using jakeday’s kernel available at https://github.com/jakeday/linux-surface. I wasn’t be able to install this at the time of writing, due to old Linux kernel, but with this you can enjoy many useful features of your Surface coming to Ubuntu.

Ubuntu 17.10 couldn’t boot

Due to a problem related to NVIDIA GPU card, Ubuntu 17.10, both live CD and upgrade from previous version will hang at booting the kernel. Kernel before 4.13.x (prior to Ubuntu 17.10) won’t see this problem as they cannot recognize GPU at all.

Fix: In the case that you have already upgraded, you can choose to use previous kernel from grub menu. You can change GRUB_DEFAULT (like to “1” or “2>0”) for submenu) in /etc/default/grub and run update-grub to automate it at start up and wait until next release, when some fixes should be included.

Update: Newer kernel came with a patch for this. You can just upgrade and it will work like a charm.

Wifi randomly switched off until restart

(https://askubuntu.com/questions/902992/ubuntu-gnome-17-04-wi-fi-not-working-mac-address-keeps-changing/905019#905019)

This is due to a new feature in Ubuntu 17.01 that constantly changes the MAC address. After a while it will show ‘Connection failed’ and you won’t be able to connect again.

Fix: Disable by adding

to /etc/NetworkManager/NetworkManager.conf

Unable to wake up from sleep

This problem persists from previous Surface brand laptop but there is no workaround until now. You have to disable suspension.

Update: With newer version, you can suspend your PC, but network is not waking up from sleep, even when you restart network-manager. I will keep this section until I can find a workaround.

Fix: Change IgnoreLid to True in /etc/UPower/UPower.conf.

Small text size in GRUB menu

Surface Book comes with default screen of 3000x2000, so many things won’t display properly until you make some changes. This is also problem of many other high-resolution monitor.

Fix: Change GRUB_GFXMODE to "1028x1024" in /etc/UPower/UPower.conf or uncomment GRUB_TERMINAL="console" to disable graphics

Adjust external screen size & position

There is an option to set scale factor for HiDPI screen. For Surface Book with screen resolution of 3000x2000, the reasonable scale is x2. However, when you connect it to an external screen, there is no GUI option to adjust screen size, so it will keep this scale factor, which is sometimes incompatible. It’s little bit tricky to tune this. In my case, I have an external screen of 1980x1080. This command works.

Problems still

  • Camera doesn’t work
  • GPU doesn’t work
  • Touch Screen and Pen don’t work

Written by

Kyoto, Japan

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store