Guix channel for packages that can't be included upstream. Please do NOT promote or refer to this repository on any official Guix communication channels.
Find a file
Alex Griffin e41d5bdf2c nongnu: linux: Update to 5.4.35.
* nongnu/packages/linux.scm (linux-5.4): Update to 5.4.35.
2020-04-23 07:22:51 -05:00
nongnu nongnu: linux: Update to 5.4.35. 2020-04-23 07:22:51 -05:00
nonguix nonguix: Use name when provided in unredistributable-url-fetch. 2020-03-13 00:30:35 +01:00
.dir-locals.el Add .dir-locals.el with Emacs settings. 2019-05-27 16:34:38 -05:00
.gitignore Add .gitignore 2019-05-27 18:48:39 -05:00
COPYING Initial commit with non-free Linux kernel. 2019-05-11 11:36:21 -05:00
README.org README.org: advice for avoiding kernel rebuilds. 2020-03-25 20:42:28 +00:00

Nonguix

Nonguix is a software repository for the GNU Guix package manager, which packages some software which cannot be included in the official distribution for ethical or policy-related reasons.

Please do NOT promote this repository on any official Guix communication channels, such as their mailing lists or IRC channel, even in response to support requests! This is to show respect for the Guix project's strict policy against recommending nonfree software, and to avoid any unnecessary hostility.

Before using this channel, you should understand the implications of using nonfree software. Read What is free software? for more information.

(Check out the Guix Gaming Channels if you're interested in nonfree games too!)

Warning

This channel does not endorse any non-free application. We believe it is non-ethical, harmful to software development and restricts the users freedom. See the GNU philosophy for a more thorough discussion.

Those packages are provided as a last resort, should none of the official Guix packages work for you.

You should understand the implication of using non-free software. Some of those implications include:

  • Endorsement of non-free products and the perpetration of a culture of restriction on liberties.
  • Non-free software cannot (or hardly) be audited: it can potentially spy on you, destroy or steal your data.

As a minimal security measure, it's heavily recommended to run any non-free software inside a container.

Installation

Nonguix can be installed as a Guix channel. To do so, add it to ~/.config/guix/channels.scm:

  (cons* (channel
          (name 'nonguix)
          (url "https://gitlab.com/nonguix/nonguix"))
         %default-channels)

Using Nonfree Firmware and Drivers

To use Guix System with the standard Linux kernel and nonfree firmware, edit the kernel and firmware fields of the operating-system definition in config.scm:

  ;; Import nonfree linux module.
  (use-modules (nongnu packages linux)
               (nongnu system linux-initrd))

  (operating-system
    (kernel linux)
    (initrd microcode-initrd)
    (firmware (list linux-firmware))
    ...
    )

If you only need firmware for a specific piece of hardware, you may be able to save disk space by using a smaller firmware package instead:

  (firmware (cons* iwlwifi-firmware
                   %base-firmware))

Then of course, run sudo guix system reconfigure /etc/config.scm to apply your configuration.

Installation image

For some hardware the official Guix installation image won't do (e.g. unsupported wifi). You can generate an installation image running the nonfree Linux kernel and nonfree firmware with the following command:

guix system disk-image /path/to/this/channel/nongnu/system/install.scm

CPU Microcode

CPU microcode updates are nonfree blobs that apply directly to a processor to patch its behavior, and are therefore not included in upstream GNU Guix. However, running the latest microcode is important to avoid nasty CPU bugs and hardware security vulnerabilities.

To enable early loading of CPU microcode, use the microcode-initrd function to add the microcode to the Initial RAM Disk. Most users can simply import (nongnu system linux-initrd) and add (initrd microcode-initrd) to their operating-system definition, as illustrated above.

If you need to customize the initrd for some reason, you should first understand the upstream documentation on Initial RAM Disks. microcode-initrd simply wraps another initrd function, which you can swap out for your own. For example, this:

  (initrd microcode-initrd)

is exactly equivalent to:

  (initrd (lambda (file-systems . rest)
            (apply microcode-initrd file-systems
                   #:initrd base-initrd
                   #:microcode-packages (list amd-microcode
                                              intel-microcode)
                   rest)))

Broadcom Wireless

Some Broadcom wireless hardware requires a proprietary kernel module in addition to firmware. To use such hardware you will also need to add a service to load that module on boot, and blacklist conflicting kernel modules:

  (use-modules (nongnu packages linux))

  (operating-system
    (kernel linux)
    ;; Blacklist conflicting kernel modules.
    (kernel-arguments '("modprobe.blacklist=b43,b43legacy,ssb,bcm43xx,brcm80211,brcmfmac,brcmsmac,bcma"))
    (kernel-loadable-modules (list broadcom-sta))
    (firmware (cons* broadcom-bt-firmware
                     %base-firmware))
    ...)

Avoiding kernel recompilation

Since prebuilt substitutes are not currently available for Nonguix, you may find that guix system reconfigure recompiles the kernel frequently due to version bumps in the kernel package. An inferior can be used to pin the kernel version and avoid lengthy rebuilds.

You must pin both Guix and Nonguix, as the Nonguix kernel packages derive from those in Guix (so changes in either could cause a rebuild). Your preferred kernel version must be available in both pinned channels.

Consult the output of guix system describe to get the commits of Guix and Nonguix for the current generation. Once you have determined the commits to use, create an inferior in your system configuration file that pins the channels to them. Then grab the appropriately-versioned Linux package from the inferior to use as your kernel.

  (use-modules (srfi srfi-1)    ; for `first'
               (guix channels))
  (operating-system
    (kernel
      (let*
        ((channels
          (list (channel
                 (name 'nonguix)
                 (url "https://gitlab.com/nonguix/nonguix")
                 (commit "ff6ca98099c7c90e64256236a49ab21fa96fe11e"))
                (channel
                 (name 'guix)
                 (url "https://git.savannah.gnu.org/git/guix.git")
                 (commit "3be96aa9d93ea760e2d965cb3ef03540f01a0a22"))))
         (inferior
          (inferior-for-channels channels)))
        (first (lookup-inferior-packages inferior "linux" "5.4.21"))))
    ...)

Contributing

Contributions are welcome! If there's a package you would like to add, just fork the repository and create a Merge Request when your package is ready. Keep in mind:

  • Nonguix follows the same coding style as GNU Guix. If you don't use Emacs, you should make use of the indent script from the GNU Guix repository (./etc/indent-code.el).
  • Commit messages should follow the same conventions set by GNU Guix.
  • Although licensing restrictions are relaxed, packages should still have accurate license metadata.
  • If a package could be added to upstream GNU Guix with a reasonable amount of effort, then it probably doesn't belong in Nonguix. This isn't a dumping ground for subpar packages, but sometimes we may accept free software packages which are currently too cumbersome to properly build from source.
  • If your package is a game, you should submit it to the Guix Gaming Channels instead.

If you have a history of making quality contributions to GNU Guix or Nonguix and would like commit access, just ask! Nontrivial changes should still go through a simple Merge Request and code review process, but Nonguix needs more people involved to succeed as a community project.