Upstream

This Week In Pop! – March 11th

Pop!_OS is a Linux distribution by System76, a Linux-based desktop hardware OEM. It is based on Ubuntu, with many enhancements specific to our vision of the desktop, and provides an optimal platform for our hardware, which is thoroughly tested throughout each release. These weekly posts highlight the developments that have been made each week in Pop!_OS.

Pop!_Volunteers This Week

  • Jeffrey Molanus (@gila) improved our sys-mount crate to support mounting any file which contains a file system. Previously, the crate only supported mounting files which were of the squashfs or iso9660 variety. Jeffrey is developing a CSI plugin, which during testing, requires to mount files which contain other file systems. MR

NVIDIA

New 418.43 driver

Eight security vulnerabilities were announced in the NVIDIA driver, affecting all versions of the NVIDIA driver, except for the drivers that had been released at the time of the announcement. With the 418 driver having been recently released, we decided to skip packaging of the latest 410 driver, and instead opted for packaging the new 418.43 driver, with transitional packaging to migrate everyone to the new release. As a result, we’re perhaps the first binary Linux distribution to offer the 418 driver in our repos.

The new 418 release fixes many issues that you may or may not have experienced in the 410 and 415 driver. Most notably, it includes better compatibility with games on Steam, and fixes for some hardware which had choppy animations in GNOME Shell.

If you installed the 415 driver from the graphics driver PPA, you will need to run the following commands to get your system updated to the 418 driver:

sudo apt install system76-driver-nvidia
sudo apt install –reinstall nvidia-dkms-418

CUDA 10.1 SDK

NVIDIA made changes to the install script which broke the packaging process, but we were able to use the --extract option to manually correct the packaging issues. The new version of CUDA SDK can be installed by its package, named system76-cuda-10.1. system76-cudnn-10.1 and system76-nccl-10.1 are also available in the repos. Tensorflow 13.1 is still in the process of being packaged, but it should be ready in time for the next week in Pop!

Organizing Pop!_Volunteers

I’ve started a thread on the Pop! Planet forums for organizing volunteers, outlining ways that they can contribute, and as a place where they can express their interests and seek help in getting started with contributing to Pop!_OS. If you have any questions about our development process, or how you can be a part of it, you may write a comment in that thread expression your interests and questions.

New v2.0.0 Pop Icon Theme

Ian has been working on a new version of Pop’s GTK theme, in preparation for the upcoming 19.04 release. GNOME has made changes to their icon style guidelines, and as a result, many applications have been updated with new icons that adhere to that style. This means that some of the icons in our icon theme are to be removed, so that the new icons can used in their stead. If you would like to test the new icon theme, Ian has provided a link to download the deb for the new icon theme in our Mattermost chatroom.

Pop Upgrade Progress

This week brought the first successful release upgrade from within the recovery partition, a feat which required adding the new feature to our distinst backend and installer frontend. The distinst backend received a new upgrade() function, and a new UpgradeOption variant of the InstallOption. The installer frontend received a new "Decrypt OS" and "Upgrade OS" view, which is triggered upon the existence of the /cdrom/recovery.conf file, and having the UPGRADE=1 variable set in that config.

The test system had a fresh install of 18.04 (bionic), whereby the upgrade daemon was installed, a release upgrade was triggered for the recovery option, and the recovery partition launched on the next boot. Once in the recovery partition, existing versions of distinst and installer were replaced with the in-progress test versions, and the installer relaunched. The installer’s first view was the decryption view, as the install was on an encrypted LUKS partition. Once decrypted, the upgrade process immediately began, and later succeeded.

Significant amounts of incremental improvements and testing will be performed from here on out until the new process is ready to be released.

Detailed changes to distinst

A new upgrade() function has been added to the API. It takes a mutable Disks reference (&mut Disks) as an input, alongside an immutbale RecoveryOption reference (&RecoveryOption). The RecoveryOption reference contains information about the system being upgraded, particularly the partitions which we will need to mount. These mounts will be mounted to a temporary location in the recovery partition, and then systemd-spawn is used to chroot into the install. Each chroot will be fed a series of commands which will upgrade the install, and attempt to handle any errors that arise during the process. LANG=C and DEBIAN_FRONTEND=noninteractive are used as environment variables to our apt commands.

The Command type in distinst was upgraded to feature improved callback support for handling stdout and stderr streams. Previously, stdout and stderr streams were handled in separate threads. This has now been changed to handle streams asynchronously on the same main thread. The stderr and stdout streams can now be handled via callbacks, which have been used by the upgrade daemon, and now distinst itself, for tracking apt package events and progress. Progress which is being used by the installer to display a progress bar.

Debian packaging for distinst has been simplified. The environment variables, CLEAN and VENDORED have been added to make package builds quicker for testing local changes on another system. Disabling cleaning and vendoring enables packages to be built with incremental compilation, which can be the difference between building a package in seconds, as opposed to minutes.. Some further changes were made to the Makefile to increase the reliability of tracking source modifications, which the Makefile uses to know when it’s time to re-execute a rule that was previously executed.

Detailed changes to the installer

A new "Decrypt OS" and "Upgrade OS" view has been added. It’s currently very basic. The "Decrypt OS" view has a password entry which does nothing on failure, or proceeds to the next view on success. The "Upgrade OS" view is displayed once the upgrade has begun in a background thread. It listens for callback events from distinst and updates a text label and progress bar as events are received. On an error, the existing error view is reused, with logs that were obtained from distinst before, and during, the upgrade. On success, the existing success view is also repurposed to display that the upgrade was a success, and a reboot can now happen.

In the near future, there will be an option to launch a recovery shell, as an attempt to allow the user to manually correct upgrade errors from the recovery partition. Failing that, there will be an option to refresh the installed OS, though this will require the refresh option feature to be merged in advance.

blkid Rust bindings

A side project in my free time has been working on blkid bindings for Rust. blkid is a library which can be used to query information about partitions and block devices on the system, such as the file system that is on a device, details on a block device’s partition table, or the UUID/PartUUID of that partition.

This would be highly useful in distinst, which currently relies largely on parted to provide that information, slowly. Freezes experienced in the installer UI during setup can be attributed entirely due to the sluggishness of parted at probing disk information. I have plans to use this in a new project for disk probing on Linux. Coupled with /sys/class/block and /proc/partitions. parted should only be used when partitions are being partitioned, and not for probing disk information.

I am a System76 software engineer, maintainer of Pop!_OS, and contributor to Redox OS. My preferred programming language is Rust, with four years of e...