This has been tested on Ubuntu 20.04.3, 20.04.4 and 22.04 Beta (Linux 5.11, Linux 5.13 and Linux 5.15), on Frameworks with i5, i7 and non-vPro AX210 by a good number of users. It may or may not work on anything that it wasn’t tested on. Work has been done to make it safe for other versions, but testing outside of 20.04 and 22.04 is out of scope. Use your own judgement.
Click to see more...
- Update hibernate support for 24.04.
- Silence spurious errors on 22.04 due to Python packaging.
- Fix hibernate swap removal in certain cases.
- Simplify hibernate by adding it as an option to the tldr script.
- Install HiRes codecs (aptX, LDAC) for PulseAudio to use with Bluetooth devices.
- Add a workaround for a kernel quirk that should improve idle power consumtion by
about 2-3W after resuming from suspend, when using the
s2idle
sleep mode. - Add support for Ubuntu 22.04.
- Update kernel before applying AX210.
- Disable PSR on Linux 5.13 in order to avoid screen tearing.
- Updated TL;DR command to handle Linux 5.13 and check for AX210.
- Remove fingerprint reader prebuilt packages if updated fprintd is found.
- Remove AX210 workaround after upgrade to Linux 5.13.
- Increase the number of retries fingerprint auth allows.
- Disable AX on AX210 when running kernel 5.11.
- Only apply AX210 workaround if it's found on the system.
- Document
defaults.yaml
usage. - Enable graphics acceleration in VMware Workstation Player.
- Workarounds relevant to Ubuntu 20.04 are only applied on 20.04. Applying the formula on 21.04 or above would skip those. This has not been tested on non-20.04.
hibernate
was tested on Manjaro 21.1.6. It works and can be used. ...
- Perform the upgrade.
- Grab the latest version of this Salt formula and re-run it after upgading by following the instructions below.
Click to see more...
If you've already applied this formula and your WiFi suddenly stopped working around mid-January 2022, without explanation, chances that your system got upgraded to Linux 5.13. The AX210 workaround used for Linux 5.11 breaks WiFi on 5.13. In order to get your WiFi working, execute the following:
sudo systemctl disable intel-ax210-workaround.service
sudo mv /lib/firmware/iwlwifi-ty-a0-gf-a0.pnvm.renamed-by-salt /lib/firmware/iwlwifi-ty-a0-gf-a0.pnvm
sudo rmmod iwlmvm
sudo rmmod iwlwifi
sudo modprobe iwlwifi
Following that, pull the latest formula and execute it again in order to remove the workaround completely. Executing the command from the TL;DR in a clean location should also do the trick.
If this is your first rodeo and your WiFi isn't working after fresh Ubuntu 20.04.3 install, get it running by doing this:
sudo mv -f /lib/firmware/iwlwifi-ty-a0-gf-a0.pnvm /lib/firmware/iwlwifi-ty-a0-gf-a0.pnvm.renamed-by-salt
sudo rmmod iwlmvm
sudo rmmod iwlwifi
sudo modprobe iwlwifi
Ideally, read the rest if this is your first time
In order to setup Ubuntu 20.04 or 22.04 with most common config and workarounds needed for the Framework Laptop, connect to the internet, then run the following:
wget -O /tmp/framework-laptop-tldr.sh https://raw.githubusercontent.com/lightrush/framework-laptop-formula/main/framework-laptop-tldr.sh && bash /tmp/framework-laptop-tldr.sh
If you also want hibernate, run the following instead or after:
wget -O /tmp/framework-laptop-tldr.sh https://raw.githubusercontent.com/lightrush/framework-laptop-formula/main/framework-laptop-tldr.sh && bash /tmp/framework-laptop-tldr.sh --enable-hibernate
By default it enables suspend-then-hibernate with 120 minutes delay. That can be changed in defaults.yaml
. The hibernate function also creates a swapfile that's as large as your RAM size plus 1GB.
NB: You have to disable Secure Boot for hibernate to function.
Now reboot your Framework.
Afterwards, you should have:
- 1 second GRUB menu timeout instead of 30 in case you use /boot on LVM
- Intel HD audio mic TRRS jack workaround
- Intel AX210 persistent workaround (doesn’t break on update of linux-firmware) (only on Ubuntu 20.04.3)
- Suspend to RAM
- TLP installed and enabled (only on Ubuntu 20.04)
- Touchpad suspend workarond
- Working fingerprint reader
- Hibernate, if you opted to use it
- No additional power draw after resume from suspend when usind
s2idle
- HiRes codecs (LDAC, aptX) for Bluetooth devices
For more features like 2/3-finger clicking or changing defaults, read the rest.
This Salt formula is designed to be idempotent. That is, it can be re-run over and over without causing unexpected problems. In fact that's the intended path for using newer versions. Simply download the latest one and re-run it. For examle when some workaround is no longer needed, running the latest version of the formula should remove it automatically. When some new was added that you want - re-download and re-run it.
If you see errors similar to this:
[ERROR ] Failed to import module pip, this is due most likely to a syntax error:
...
Fear not as they are benign. They're caused by a known Salt-related bug that doesn't affect the functionality of this code.
This is a piece of software in the form of a Salt (SaltStack) formula for performing post-install setup of Ubuntu 20.04 (for now) on the Framework Laptop. It configures the basic things that need configuring. Things like getting the Intel AX210 WiFi to work persistently, getting the fingerprint reader working, enabling better powersaving, etc. It eliminates the need to hunt down the documentation for each configuration or workaround and apply it manually.
Because the number of Framework Laptops that will need Ubuntu 20.04 setup will be growing over time and I don't want to manually implement all the config and workarounds on each and every one. Maybe this could make someone else’s life easier as well.
Here's a brief bulrb for people unfamiliar with SaltStack explaining what it is.
SaltStack (Salt for short) is a configuration management system used across extremely large cloud deployments to personal machines and anywhere in-between. It defines a language and a set of built-in APIs that allow to describe configuration as code. At the very basic level it does what one could do with Bash scripts with less typing and fewer errors. Its utility grows upwards from there. It allows for code reuse, better maintainability, modularity, config dependencies and a lot more that we don't need to go into for this short blurb.
In short, because it's easier and more maintainable than a bunch of Bash scripts. For example if we want to install the TLP package on Ubuntu, with Bash we'd have to write this somewhere in our scripts:
sudo apt install -y tlp
That's easy enough. But what if we want to also support Fedora? We'd now have to differentiate between distributions and use the correct package manager call:
LINUX_DISTRIBUTION=${get_linux_distribution} # Here we casually outsource the job of determining the distribution to another function.
case "$LINUX_DISTRIBUTION" in
fedora)
yum install --yes tlp
;;
ubuntu)
apt install -y tlp
;;
*)
echo Unsupported distribution
exit 1
esac
We went from a one-liner to a paragraph. And that would only grow with any other distribution handling. And with any other function which has different invocation across multiple distributions.
If we were to do this with Salt, we would use its built-in API for package management and say:
# The first line is an arbitrary ID for our own use.
tlp_package_installed:
pkg.installed: # Name of built-in function used.
- name: tlp # An arg to the pkg.installed function passing the name of the package we want installed.
That's it. This will work on most popular distributions and derivatives without any further work on our end. Salt is by no means the only tool capable of doing this. Ansible and Puppet are the other two (more) popular options but I know Salt best. :D
And that's why we use Salt.
In its most basic, a Salt formula is a self-contained module of Salt code that can achieve some well defined task, is usually configurable and reusable within other Salt code. That's Salt's terminology, not mine so that's that. This formula is intended to do the things needed to get Ubuntu working well on the Framework Laptop.
Yes. The changes will persist.
This was tested on the Framework with both the i5 and i7 CPUs, with non-vPro wifi modules. The following table describes the available states, and which distributions they have been tested with. If you're using it on something else, it may or may not work, use your own discretion. If you verify any of these states, please open a pull request updating the following table.
Ubuntu 20.04 | Ubuntu 22.04 | Manjaro 21.1.6 | |
---|---|---|---|
fingerprint-reader | yes | yes | |
framework-sec-trim-enable | yes | yes | |
grub-decrease-menu-timeout | yes | yes | |
hibernate | yes | yes | yes |
intel-audio-workaround | yes | yes | |
intel-ax210-workaround | yes | yes | |
intel-xe-tearing-workaround | yes | ||
mem-sleep-default | yes | yes | |
mouse-accel-profile | yes | yes | |
tlp | yes | yes | |
touchpad-click-method | yes | yes | |
touchpad-suspend-workaround | yes | yes | |
post-resume-power-draw | yes | ||
pulseaudio-bt-hires-codecs | yes | ||
vmware-graphics-acceleration | yes | yes |
Upgrade your Ubuntu packages via the Software Updater
or by doing:
sudo apt-get -y update && sudo apt-get -y upgrade && sudo apt-get -y dist-upgrade
if ! sudo apt-get -y install salt-common ; then wget -O /tmp/bootstrap-salt.sh https://bootstrap.saltproject.io && sudo sh /tmp/bootstrap-salt.sh ; fi
Clone this formula or download it and extract it somewhere.
From the root directory of the formula, where this README.md is, run:
sudo salt-call -l quiet --local --file-root="$(pwd)" state.apply framework-laptop
Reboot your computer after applying.
From the root directory of the formula, where this README.md is, run:
sudo salt-call -l quiet --local --file-root="$(pwd)" state.apply framework-laptop.[STATE NAME]
Example:
sudo salt-call -l quiet --local --file-root="$(pwd)" state.apply framework-laptop.hibernate
Some states can be customized by changing the values of their parameters. The default values are defined in defaults.yaml
. Each available parameter is documented in-line in that file. Editing defaults.yaml
is the easiest way to change the behaviour of the formula. Thus defaults.yaml
is the primary "user interface" for tuning the formula. The values set there can also be overriden at the command line or in pillar.
Some states are parametrized and have default values for those parameters specified
in defaults.yaml
. Those values can be overriden in various ways. One is via the
command line, by specifying override values in pillar, like so:
sudo salt-call -l quiet --local --file-root="$(pwd)" state.apply framework-laptop.mem-sleep-default \
pillar='{"framework-laptop":{"mem_sleep_default": "s2idle"}}'
Some states modify user-specific config like touchpad and mouse settings. For those we have to specify the user this config should be applied to. To apply those to the current user you can do:
sudo salt-call -l quiet --local --file-root="$(pwd)" state.apply framework-laptop.touchpad-click-method pillar="{ 'desktop_user': { 'name': '"${USER}"' }}"
To apply config for user different_user
:
sudo salt-call -l quiet --local --file-root="$(pwd)" state.apply framework-laptop.touchpad-click-method pillar="{ 'desktop_user': { 'name': '"different_user"' }}"
If you try to apply a user-specific state without specifying a desktop_user
as shown above, you'd get an error.
The fingerprint-reader
state installs the needed packages for the Frameworks's fingerprint reader from a collection of prebuilt deb files provided by the community. You can add your fingerprint using Settings > Users > Fingerprint Login
after applying this state. Rebooting may be required after enabling fingerprint authentication.
The framework-sec-trim-enable
state adds the necessary unmap
attribute to your Storage Expansion Card (SEC) via a udev rule. This allows the SEC SSD to be trimmed by the normal fstrim.service
to help it maintain performance and endurance.
The grub-decrease-menu-timeout
state changes the timeout for the GRUB boot menu to 1 second. As the time of this writing, /etc/grub.d/00_header
forces GRUB_RECORDFAIL_TIMEOUT
when running on UEFI systems which the Framework Laptop generally is. The default value for this timeout is 30 seconds which is rather much, however disabling it altogether prevents us from being able to access GRUB as hotkeys do not work in UEFI mode in certain cases. Hence the maintainers forcing GRUB_RECORDFAIL_TIMEOUT
on UEFI. 1 second is short enough to allow access in emergency but does not impact the boot time too much.
The hibernate
state would setup /swapfile
with size as much as your RAM + 1GB. It would then add it to GRUB and update the GRUB config. Finaly, the state would configure systemd to do suspend-then-hibernate with 2 hours delay. This is a decent decent default and simmilar to the behaviour under Windows. Since the suspend period is limited to 2 hours, the officially supported suspend method - s2idle
- can be used which suspends and resumes instantly but consumes ~3%/hr. If you wish to use hibernate, apply it individually. Note that the hibernate
state has to be applied twice if the /swapfile
wasn't setup or it was too small and was recreated. The first application sets up /swapfile
. The second adds the relevant kernel resume arguments. Applying it more than twice has no further effect past the first two applications.
The intel-audio-workaround
state applies a recommended workaround that enables mic through the Framework's TRRS jack. This was recommended here.
The intel-ax210-workaround
state rolls the workaround needed for Intel AX210 on Ubuntu 20.04.3+ (Linux 5.11) into a service that re-applies the workaround on every boot. This is needed because an update to the linux-firmware
package would remove manually applied workaround leaving you with dead WiFi after the following boot.
The mem-sleep-default
state configures the default mem sleep type to deep
which causes suspend to RAM instead the default, suspend to idle. That lowers the power consumption during suspend from ~3.5% to ~1.5%.
The mouse-accel-profile
state disables acceleration for mice in GNOME. This is a user-specific state and it is more of a personal preference than something needed by every Framework running Ubuntu 20.04. For that reason it's not included in the default formula. If you wish to use it, apply it individually as described here.
The tlp
state installs the tlp
package and enables the tlp.service
. The TLP package and service apply power saving config on boot as well as adjust power settings when switching between AC and battery. It lowers the battery power consumption by a significant amount. To give you an idea, as I'm typing this, enabling TLP brings down the pwoer consumption from ~8.7W to ~6.3W. That's power saving of ~28%.
The touchpad-click-method
state enables 2 and 3-finger clicks for the touchpad in GNOME. A 2-finger click does right mouse click and 3-finger click does middle mouse click. This is a user-specific state and it is more of a personal preference than something needed by every Framework running Ubuntu 20.04. For that reason it's not included in the default formula. If you wish to use it, apply it individually as described here.
The touchpad-suspend-workaround
state applies a workaround for the occasional touchpad (driver?) malfunction after suspend. It adds a hook to the systemd's sleep system which unloads the i2c_hid
kernel module prior to suspend and loads it back on resume. Alternatively you could disable PS2 emulation from the BIOS, however that would would leave you without touchpad in operating systems that do not understand HID like Windows Setup.
The vmware-graphics-acceleration
state enables 3D acceleration in VMware Workstation (Player) if its config file was found in the user's directory specified by desktop_user
, see. The state is a no-op in case a config file wasn't found or desktop_user
was not defined.
The post-resume-power-draw-workaround
state applies a workaround for increased power draw
after resuming from suspend, when using the s2idle
sleep mode. This workaround should reduce
post-suspend idle power usage by about 2-3W.
The pulseaudio-bt-hires-codecs
state installs HiRes codecs such as LDAC and aptX for PulseAudio to use with higher-end Bluetooth audio devices. Tested with FiiO BTR3K and verified it uses aptX once the state is applied.
Framework DIY Linux community. Lots of things. https://community.frame.work/c/framework-laptop/linux/91
Henry Luengas. Python utility for deleting fingerprints from reader. https://github.com/hluengas/framework_scripts