GNU Guix

From Infogalactic: the planetary knowledge core
(Redirected from Guix)
Jump to: navigation, search

<templatestyles src="Module:Hatnote/styles.css"></templatestyles>

GNU Guix
200px
Stable release Lua error in Module:Wd at line 405: invalid escape sequence near '"^'. / Lua error in Module:Wd at line 405: invalid escape sequence near '"^'.
Preview release Lua error in Module:Wd at line 405: invalid escape sequence near '"^'. / Lua error in Module:Wd at line 405: invalid escape sequence near '"^'.
Written in Guile Scheme, C++ (Nix core)
License GPLv3+
Website guix.gnu.org/en/

GNU Guix (/ɡks/[1]) is a functional cross-platform package manager and a tool to instantiate and manage Unix-like operating systems, based on the Nix package manager. Configuration and package recipes are written in Guile Scheme. GNU Guix is the default package manager of the GNU Guix System distribution.[2]

Differing from traditional package managers, Guix (like Nix) utilizes a purely functional deployment model where software is installed into unique directories generated through cryptographic hashes. All dependencies for each software are included within each hash.[3][4] This solves the problem of dependency hell,[5] allows multiple versions of the same software to coexist and makes packages portable and reproducible. Performing scientific computations in a Guix setup has been proposed as a promising response to the replication crisis.[6]

The development of GNU Guix is intertwined with the GNU Guix System,[7] an installable operating system distribution using the Linux-libre kernel and GNU Shepherd init system.[8][9][10]

General features

Guix packages are defined through functional Guile Scheme APIs specifically designed for package management. Dependencies are tracked directly in this language through special values called "derivations" which are evaluated by the Guix daemon lazily. Guix keeps track of these references automatically so that installed packages can be garbage collected when no other package depends on them. At the cost of greater storage requirements, all upgrades in Guix are guaranteed to be both atomic and can be rolled back. The roll-back feature of Guix is inherited from the design of Nix and is not found in any of the native package managers of popular Linux distributions such as Debian and its derivatives, Arch Linux and its derivatives, or in other major distributions such as Fedora, CentOS or OpenSUSE. The Guix package manager can however be used in such distributions and is available for Debian and Parabola.[11][12] This also enables multiple users to safely install software on the same system without administrator privileges.

Compared to traditional package managers, Guix package stores can grow considerably bigger and therefore require more bandwidth; although compared to container solutions (like Docker) that are also commonly employed to solve dependency hell, Guix is leaner and conforms to practices like Don't repeat yourself and Single source of truth. If the user chooses to build everything from source even larger storage space and bandwidth is required.

The store

Inherited from the design of Nix, most of the content of the package manager is kept in a directory /gnu/store where only the Guix daemon has write-access. This is achieved via specialised bind mounts, where the Store as a file system is mounted read only, prohibiting interference even from the root user, while the Guix daemon remounts the Store as read/writable in its own private namespace. Guix talks with this daemon to build things or fetch substitutes which are all kept in the store. Users are discouraged from ever manually touching the store by re-mounting it as writable since this defeats the whole purpose of the store.

Garbage collection

Guix - like Nix - has built-in garbage collection facilities to help prune dead store items and keep the live ones.[13]

Package definitions

This is an example of a package definition for the hello-package:

(define-public hello
  (package
   (name "hello")
   (version "2.10")
   (source (origin
            (method url-fetch)
            (uri (string-append "mirror://gnu/hello/hello-" version
                                ".tar.gz"))
            (sha256
             (base32
              "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i"))))
   (build-system gnu-build-system)
   (synopsis "Hello, GNU world: An example GNU package")
   (description
    "GNU Hello prints the message \"Hello, world!\" and then exits.  It
 serves as an example of standard GNU coding practices.  As such, it supports
 command-line arguments, multiple languages, and so on.")
   (home-page "https://www.gnu.org/software/hello/")
   (license gpl3+)))

It is written using Guile. The package recipes can easily be inspected (running e.g. guix edit hello) and changed in Guix, making the system transparent and very easily hackable.

Transactional upgrades

Inherited from the design of Nix, all manipulation of store items is independent of each other, and the directories of the store begin with a base32-encoded hash of the source code of the derivation along with its inputs.

Profiles

Guix package uses profiles generations, which are a collection of symlinks to specific store items together comprising what the user has installed into the profile. Every time a package is installed or removed, a new generation will be built.

E.g. the profile of a user who only installed GNU Hello contains links to the store item which holds the version of hello installed with the currently used guix.

E.g. on version c087a90e06d7b9451f802323e24deb1862a21e0f of guix, this corresponds to the following item: /gnu/store/md2plii4g5sk66wg9cgwc964l3xwhrm9-hello-2.10 (built from the recipe above).

In addition to symlinks, each profile guix builds also contains a union of all the info-manuals, man-pages, icons, fonts, etc. so that the user can browse documentation and have access to all the icons and fonts installed.

The default symlinks to profile generations are stored under /var/guix in the filesystem.

Multiple user profiles

The user can create any number of profiles by invoking guix package -p PROFILE-NAME COMMAND. A new directory with the profile-name as well as profile-generation-symlinks will then be created in the current directory.

Roll-back

Guix package enables instantaneous roll-back to a previous profile generation via changing the symlink to an earlier profile generation.[14] Profiles are also stored in the store e.g. this item is a profile containing hello above: /gnu/store/b4wipjlsapvnijmbawl7sh76087vpl4n-profile (built and activated when running guix install hello).

Environment

Guix environment enables the user to easily enter an environment where all the necessary packages for development of software are present without clogging up the users default profile with dependencies for multiple projects.[15]

E.g. running guix environment hello enters a throw-away environment where everything needed to compile hello on guix is present (gcc, guile, etc.).

Persistent development environment

If you want a persistent gc-rooted environment that is not garbage collected on the next run of guix gc you can create a root:

E.g. running guix environment --root=hello-root hello enters an environment where everything needed to compile guix is present (gcc, guile, etc.) and registered as a root in the current directory (by symlinking to the items in the store).

Pack

Guix pack enables the user to bundle together store items and output them as a docker binary image, a relocatable tarball or a squashfs binary.[16]

Graph

Guix graph enables the user to view different graphs of the packages and their dependencies.[17]

Guix System (operating system)

<templatestyles src="Module:Hatnote/styles.css"></templatestyles>

GNU Guix System uses Guix as its package manager and configuration system, similar to how NixOS uses Nix.

History

The GNU Project announced in November 2012 the first release of GNU Guix, a functional package manager based on Nix that provides, among other things, Guile Scheme APIs.[18] The project was started in June 2012 by Ludovic Courtès, one of the GNU Guile hackers.[19] On August 20, 2015, it was announced that Guix had been ported to GNU Hurd.[20]

Releases

The project has no fixed release schedule and has until now released approximately every 6 months.

Version Announcement Supported architectures Packages
0.1 (alpha) Lua error in package.lua at line 80: module 'strict' not found. i686, x86_64 ~150
0.2 (alpha) Lua error in package.lua at line 80: module 'strict' not found. ~400
0.3 Lua error in package.lua at line 80: module 'strict' not found. ~430
0.4 Lua error in package.lua at line 80: module 'strict' not found. ~490
0.5 Lua error in package.lua at line 80: module 'strict' not found. ~600
0.6 Lua error in package.lua at line 80: module 'strict' not found. ~691
0.7 Lua error in package.lua at line 80: module 'strict' not found. ~825
0.8 Lua error in package.lua at line 80: module 'strict' not found. i686, x86_64, mips64el ~987
0.8.1 Lua error in package.lua at line 80: module 'strict' not found. i686, x86_64, mips64el, armv7 ~1151
0.8.2 Lua error in package.lua at line 80: module 'strict' not found. ~1869
0.8.3 Lua error in package.lua at line 80: module 'strict' not found. ~2048
0.9.0 Lua error in package.lua at line 80: module 'strict' not found. ~2591
0.10.0 Lua error in package.lua at line 80: module 'strict' not found. ~3230
0.11.0 Lua error in package.lua at line 80: module 'strict' not found. ~3714
0.12.0 Lua error in package.lua at line 80: module 'strict' not found. ~4567
0.13.0 Lua error in package.lua at line 80: module 'strict' not found. i686, x86_64, mips64el, armv7, aarch64 ~5407
0.14.0 Lua error in package.lua at line 80: module 'strict' not found. ~6618
0.15.0 Lua error in package.lua at line 80: module 'strict' not found. ~7857
0.16.0 Lua error in package.lua at line 80: module 'strict' not found. ~8715
1.0.0 Lua error in package.lua at line 80: module 'strict' not found. ~9712
1.0.1 Lua error in package.lua at line 80: module 'strict' not found. ~9771
1.1.0 Lua error in package.lua at line 80: module 'strict' not found. i686, x86_64, armv7, aarch64 ~13161
1.2.0 Lua error in package.lua at line 80: module 'strict' not found. ~15333
1.3.0 Lua error in package.lua at line 80: module 'strict' not found. i686, x86_64, powerpc64le, armv7, aarch64 ~17262

See also

References

  1. Lua error in package.lua at line 80: module 'strict' not found.
  2. Lua error in package.lua at line 80: module 'strict' not found.
  3. Dolstra, E., de Jonge, M. and Visser, E. "Nix: A Safe and Policy-Free System for Software Deployment." In Damon, L. (Ed.), 18th Large Installation System Administration Conference (LISA '04), pages 79–92, Atlanta, Georgia, USA. USENIX, November 2004.
  4. Dolstra, E. The Purely Functional Software Deployment Model. PhD thesis, Faculty of Science, Utrecht, The Netherlands. January 2006. ISBN 90-393-4130-3.
  5. Prins, P., Suresh, J. and Dolstra, E., "Nix fixes dependency hell on all Linux distributions," Archived December 26, 2008, at the Wayback Machine linux.com, December 22, 2008
  6. Konrad Hinsen. ``Staged computation: the technique you didn’t know you were using.`` Computing in Science and Engineering 22, 99-103 (2020). doi:10.1109/MCSE.2020.2985508. https://hal.archives-ouvertes.fr/hal-02877319
  7. Lua error in package.lua at line 80: module 'strict' not found.
  8. Programming Interface (GNU Guix Reference Manual)
  9. Guix: A New Package Manager & GNU Distribution - Phoronix
  10. Lua error in package.lua at line 80: module 'strict' not found.
  11. Lua error in package.lua at line 80: module 'strict' not found.
  12. Lua error in package.lua at line 80: module 'strict' not found.
  13. Lua error in package.lua at line 80: module 'strict' not found.
  14. Lua error in package.lua at line 80: module 'strict' not found.
  15. Lua error in package.lua at line 80: module 'strict' not found.
  16. Lua error in package.lua at line 80: module 'strict' not found.
  17. Lua error in package.lua at line 80: module 'strict' not found.
  18. Lua error in package.lua at line 80: module 'strict' not found.
  19. Lua error in package.lua at line 80: module 'strict' not found.
  20. Lua error in package.lua at line 80: module 'strict' not found.
  21. Lua error in package.lua at line 80: module 'strict' not found.

External links