Guix is a package manager. It is based on the Nix package manager with Guile Scheme APIs and specializes in providing exclusively free software.
Guix is a package manager. It is based on the Nix package manager with Guile Scheme APIs and specializes in providing exclusively free software.
To install a single package or list of packages, including dependencies, issue the following command:
$ guix package -i package-name1 package-name2 ...
emacs
gcc-toolchain@7
gcc-toolchain:debug
To remove a single package:
$ guix package -r package-name
The following command synchronizes the repository channels and updates the system package references, excluding “local” packages that are not in the configured repositories:
Get updates
$ guix pull
To update to a specific commit:
$ guix pull --commit=commit
To update to a specific branch:
$ guix pull --branch=branch
To update from specific channels, from file:
$ guix pull -C file
Apply updates
To update a single package:
$ guix package -u package-name
To perform a system update:
$ guix system reconfigure /etc/config.scm
To roll back your system, list the available system generations:
$ guix system list-generations
and initiate a roll-back, to the desired generation:
$ guix system switch-generation number
Guix can search for packages in the channel, searching both in packages’ names and descriptions:
$ guix package -s package-name
To show more information about an individual package:
$ guix package --show=package-name
Channels specify Git repositories where guix pull
looks for updates to Guix and external package repositories. By default guix pull
reads %default-channels
variable to load channels, we can alternatively can set ~/.config/guix/channels.scm
for user defined channels or /etc/guix/channels.scm
for system-wide channel customization, we also are able to pass custom channel definition file to the guix pull
command using --channels
switch. channel specifications file looks like this:
(cons (channel
(name ’guix-hpc)
(url "https://gitlab.inria.fr/guix-hpc/guix-hpc.git")
(branch "master"))
%default-channels)
the order that guix
looks for channel definitions is:
--channels
option;~/.config/guix/channels.scm
file;/etc/guix/channels.scm
file;%default-channels
variable.Reference: Invoking guix pull (Official Guix Documenst)
Guix stores its downloaded packages in /gnu/store/
and does not remove the old or uninstalled versions automatically. This has some advantages:
However, it is necessary to deliberately clean up the cache periodically to prevent the folder to grow indefinitely in size.
To collect remove all old or uninstalled versions:
$ guix gc
To remove n GB of packages:
$ guix gc -C nG
To ensure that n GB of space are available:
$ guix gc -F nG
To remove generations (packages) older than - e.g. 1m for one month
guix package -d duration
in some cases, we might need to refresh the substitute
list cached in our local machine, for this we can delete substitute cache folder located in: /var/guix/substitute/cache
To view package definitions:
$ guix edit package-name
To build packages:
$ guix build package-name1 package-name2
To view the build log:
$ guix build --log-file package-name
To build packages and keep result on failure:
$ guix build -K package-name
To obtain the source code:
$ guix build -S package-name
To rebuild the package:
$ guix build --check package-name
To ross-compile to triplet—e.g., arm-linux-gnueabihf:
$ guix build --target=triplet ...
To download from URL and print it’s SHA256 hash
$ guix download URL
To print the hash of file:
$ guix hash file
To view dependencies:
$ guix graph package-name
To count dependent packages:
$ guix refresh -l package-name
To update package definition:
$ guix refresh package-name
To import JSON package metadata from file:
$ guix import json file
To import package from repo:
$ guix import repo package
To lint packages:
$ guix lint package-name
guix pack
command creates a shrink-wrapped pack or software bundle: it creates a tarball or some other archive containing the binaries of the software you’re interested in, and all its dependencies.To create a tarball:
$ guix pack spec ...
The result here is a tarball containing a /gnu/store
directory with all the relevant packages.
Note 1 Users of this pack would have to run /gnu/store/…-profile/bin/guile to run Guile
To create a Docker image:
$ guix pack -f docker spec ...
To create a Singularity image:
$ guix pack -f squashfs spec ...
To create a relocatable tarball:
$ guix pack --relocatable spec ...
To create a tarball where /bin symlinks to the packages bin directory (To work around Note 1):
$ guix pack -S /bin=bin spec ...
That way, users can happily type /opt/gnu/bin/guile and enjoy.
To create a package from manifest in file:
$ guix pack -m file
To create an environment containing spec …:
$ guix environment --ad-hoc spec...
To create an environment to develop Python itself:
$ guix environment python
To run Python in a container:
$ guix environment --ad-hoc python -C -- python3
To create an environment for packages in manifest file:
guix environment -m file
This happens, when either your network is down, or the guix mirror is unreachable.
substitution of /gnu/store/2lc6b2yfa7vkxbfvsf5pjwwp467g9lik-cairo-1.14.10.tar.xz failed
guix substitute: error: connect: Network is unreachable
substitution of /gnu/store/84dgv1gy1cyms37zlmykpsafbpwbm7xr-dbus-1.12.6 failed
guix substitute: error: connect: Network is unreachable
substitution of /gnu/store/hqhzp6d2b396yqdcappqbjk8xz1fm9jl-flex-2.6.1 failed
guix substitute: error: connect: Network is unreachable
To use an alternative guix mirror, you’ll need to authorize it first.
(1) Get the guix mirror public key and save it:
$ nano berlin.guixsd.org.pub
The public key for berlin.guixsd.org is:
(public-key
(ecc
(curve Ed25519)
(q #8D156F295D24B0D9A86FA5741A840FF2D24F60F7B6C4134814AD55625971B394#)
)
)
(2) Authorize the mirror with Guix:
$ guix archive --authorize < /root/berlin.guixsd.org.pub
(2) Use mirror with Guix:
$ guix package -i packagename --substitute-urls=https://berlin.guixsd.org
When guix refresh
produces an error, similar to this:
gnu/packages/admin.scm:2452:13: thermald would be upgraded from 1.7.2 to 1.8
Backtrace:
16 (primitive-load "/root/.config/guix/current/bin/guix")
In guix/ui.scm:
1583:12 15 (run-guix-command _ . _)
In ice-9/boot-9.scm:
829:9 14 (catch _ _ #<procedure 7f3d05aee458 at guix/ui.scm:615…> …)
829:9 13 (catch _ _ #<procedure 7f3d05aee470 at guix/ui.scm:733…> …)
In guix/scripts/refresh.scm:
458:12 12 (_)
In srfi/srfi-1.scm:
640:9 11 (for-each #<procedure 1557b00 at guix/scripts/refresh.…> …)
In guix/scripts/refresh.scm:
241:2 10 (check-for-package-update #<package rename@1.00 gnu/pa…> …)
In guix/import/cpan.scm:
286:2 9 (latest-release #<package rename@1.00 gnu/packages/admi…>)
In guix/import/json.scm:
50:9 8 (json-fetch-alist _)
In ice-9/boot-9.scm:
829:9 7 (catch srfi-34 #<procedure 2ce9b80 at guix/import/json…> …)
In guix/import/json.scm:
42:19 6 (_)
In guix/http-client.scm:
88:25 5 (http-fetch _ #:port _ #:text? _ #:buffered? _ ## _ ## _ ## …)
In guix/build/download.scm:
403:4 4 (open-connection-for-uri _ #:timeout _ ## _)
301:6 3 (tls-wrap #<input-output: socket 25> _ ## _)
In ice-9/boot-9.scm:
829:9 2 (catch tls-certificate-error #<procedure 2ce9880 at gu…> …)
In guix/build/download.scm:
220:2 1 (assert-valid-server-certificate #<session 372aea0> "fa…")
In unknown file:
0 (peer-certificate-status #<session 372aea0>)
ERROR: In procedure peer-certificate-status:
Throw to key `gnutls-error' with args `(#<gnutls-error-enum An unimplemented or disabled feature has been requested.> peer-certificate-status)'.
To fix this, install gnutls
with:
$ guix package -i gnutls
When you see an error, similar to this:
$ user@system ~$ guix refresh
Backtrace:
13 (primitive-load "/home/user/.config/guix/current/bin…")
In guix/ui.scm:
1583:12 12 (run-guix-command _ . _)
In ice-9/boot-9.scm:
829:9 11 (catch srfi-34 #<procedure 1839a80 at guix/ui.scm:615:…> …)
829:9 10 (catch system-error #<procedure 1b1c0f0 at guix/script…> …)
In guix/scripts/refresh.scm:
458:12 9 (_)
In srfi/srfi-1.scm:
640:9 8 (for-each #<procedure 1839380 at guix/scripts/refresh.…> …)
In guix/scripts/refresh.scm:
241:2 7 (check-for-package-update #<package acct@6.6.4 gnu/pac…> …)
In guix/gnu-maintenance.scm:
561:21 6 (latest-gnu-release _)
546:16 5 (_)
In ice-9/boot-9.scm:
829:9 4 (catch srfi-34 #<procedure 1b1c0a0 at guix/http-client…> …)
In guix/http-client.scm:
182:20 3 (_)
88:25 2 (http-fetch _ #:port _ #:text? _ #:buffered? _ ## _ ## _ ## …)
In guix/build/download.scm:
403:4 1 (open-connection-for-uri _ #:timeout _ ## _)
301:6 0 (tls-wrap #<closed: file 3d22380> _ ## _)
guix/build/download.scm:301:6: In procedure tls-wrap:
X.509 certificate of 'ftp.gnu.org' could not be verified:
signer-not-found
invalid
or this:
fatal: unable to access 'https://address.org/': Problem with the SSL CA cert (path? access rights?)
This issue is related to SSL certificate verification.
To install fix this, install and configure nss-certs
:
$ guix package -i nss-certs
$ export SSL_CERT_DIR="$HOME/.guix-profile/etc/ssl/certs"
$ export SSL_CERT_FILE="$HOME/.guix-profile/etc/ssl/certs/ca-certificates.crt"
$ export GIT_SSL_CAINFO="$SSL_CERT_FILE"
Read more about X.509 Certificates in the Guix Manual.
Executing guix pull
command on a non-root user we might receive following error:
panther@panther ~$ guix pull
Migrating profile generations to '/var/guix/profiles/per-user/panther'...
guix pull: error: symlink: File exists: "/var/guix/profiles/per-user/panther/current-guix"
This problem is occurred because of an issue when guix tries to create symlink to current profile for user.
a workaround to resolve this issue is to remove current profile symlink, which
is located in ~/.config/guix/current
and relink that using following command:
ln -s "/var/guix/profiles/per-user/$USER/current-guix" "~/.config/guix/current"
Reference: Help-Guix mailing list
guix archive: error: build failed: getting status of `/etc/guix/signing-key.sec': No such file or directory
To fix this, generate a new key pair for the daemon. This is a prerequisite before archives can be exported with –export. Note that this operation usually takes time, because it needs to gather enough entropy to generate the key pair. (Source)
$ guix archive --generate-key
When you see an error, similar to this:
$ guix package -i python2
substitute: updating substitutes from 'https://mirror.hydra.gnu.org'... 100.0%
The following package will be installed:
python2 2.7.14 /gnu/store/53qclss2ic8lrs4l9778rf4fkr55rg45-python2-2.7.14
substitute: updating substitutes from 'https://mirror.hydra.gnu.org'... 100.0%
substitute: updating substitutes from 'https://mirror.hydra.gnu.org'... 100.0%
substitute: updating substitutes from 'https://mirror.hydra.gnu.org'... 100.0%
substitute: updating substitutes from 'https://mirror.hydra.gnu.org'... 100.0%
substitute: updating substitutes from 'https://mirror.hydra.gnu.org'... 100.0%
The following derivations will be built:
/gnu/store/gly2wxpgb6amfdwv848c8cd4f81f6h01-profile.drv
/gnu/store/k0isxpanm0qavrgrbxai70y5fiynb153-info-dir.drv
/gnu/store/glykncy3qpsdxkxm55cbwb2qym3pnv4p-ca-certificate-bundle.drv
/gnu/store/c2gzbf55fl7z7wilb4d3hl787v4lzbfq-fonts-dir.drv
/gnu/store/056fvy2kybsl0iisnvc2k2fhxkjxp71j-python2-2.7.14.drv
/gnu/store/kwicx940qyyb125v3r8y5f4wikrpsvrz-manual-database.drv
Downloading https://mirror.hydra.gnu.org/guix/nar/gzip/waszs4why44hpha9xlzp7p8fdc577xlm-python2-2.7.14-tk...
guix substitute: error: download from 'https://mirror.hydra.gnu.org/guix/nar/gzip/waszs4why44hpha9xlzp7p8fdc577xlm-python2-2.7.14-tk' failed: 504, "Gateway Time-out"
guix package: error: build failed: some substitutes for the outputs of derivation `/gnu/store/yhmbka6gryhl69432k3krvaz73ym8130-python2-2.7.14.drv' failed (usually happens due to networking issues); try `--fallback' to build derivation from source
This could have one of two causes:
To fallback, to building unavailable packages locally, do:
$ guix package -i python2 --fallback
If that doesn’t work, refresh your package index first:
$ guix pull
$ guix package -u
$ guix package -i python2
Operation not permitted
issuestarting phase `unpack
tar: .: Cannot utime: Operation not permitted
tar: .: Cannot change mode to rwxr-xr-t: Operation not permitted
tar: Exiting with failure status due to previous errors
This issue could be related tarbomb, and causes when we don’t provide a root folder inside package .tgz
archive files.
While creating package archive files is not standard, and forces us to apply manual modifications and additional workarounds to fix upcoming issues, we still could create these package for this type of archives, by using (method url-fetch/tarbomb)
instead of (method url-fetch)
inside our package definition.
Reference: Help-Guix mailing list
During package installation, each installed file, creates a symbolic link inside ~/.guix-profile/
based on its relative defined path.
For example while ~/.guix-profile/share/guile/site/2.2/
is the base path for installed guile scripts, we need to install our .scm
scripts to share/guile/site/2.2
relative path in store. Later during package installation, a symlink will create inside current users guix-profile path.
Reference: Help-Guix mailing list
in some cases, users might face issues related to reading custom channels during system reconfigure:
no code for module (px packages accounts).
we need to check if the channels file is located in ~/.config/guix/channels.scm
and it’s accessible by current user (reconfigure needs to be performed by root
user). later in order fix we need to perform following steps:
root
user
ssh -p 2222 root@127.0.0.1
commandguix
cache folder located in /root/.cache/guix/
guix pull
to get a fresh copy of package repositories from serverguix system reconfigure ...
to reconfigure the based on system
configuration filesudo
command and guix profilesguix pull
command updates the guix
command and package definitions only for
the user it is ran as no matter to run with sudo
or not.This means that if you
choose to use guix system reconfigure
in root’s login shell, you’ll need to
guix pull
separately.
Reference: regarding commit in Guix repositories
PantherX & (unofficial) GNU Guix Wiki.
Last update: 2024-04-21 10:28:03 +0000 | Apache-2.0
Inspired by the excellent Arch Linux Wiki