;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2022 Ludovic Courtès ;;; ;;; This file is part of GNU Guix. ;;; ;;; GNU Guix is free software; you can redistribute it and/or modify it ;;; under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 3 of the License, or (at ;;; your option) any later version. ;;; ;;; GNU Guix is distributed in the hope that it will be useful, but ;;; WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with GNU Guix. If not, see . (define-module (gnu installer hardware) #:use-module (gnu build linux-modules) #:use-module (guix i18n) #:use-module (srfi srfi-1) #:use-module (srfi srfi-71) #:export (unsupported-pci-device? pci-device-description)) (define %unsupported-linux-modules ;; List of Linux modules that are useless without non-free firmware. ;; ;; Currently only drivers for PCI devices are listed. USB devices such as ;; "btintel" would require support to list USB devices and read the USB ;; device ID database. Punt for now as this is usually less critical. ;; ;; This list is currently manually maintained based on information on ;; non-free firmware available from ;; . '(;; WiFi. "brcmfmac" "ipw2100" "ipw2200" "iwlwifi" "mwl8k" "rtl8188ee" "rtl818x_pci" "rtl8192ce" "rtl8192de" "rtl8192ee" ;; Ethernet. "bnx2" "bnx2x" "liquidio" ;; Graphics. "amdgpu" "radeon" ;; Multimedia. "ivtv")) (define unsupported-pci-device? ;; Arrange to load the module alias database only once. (let ((aliases (delay (known-module-aliases)))) (lambda (device) "Return true if DEVICE is known to not be supported by free software." (any (lambda (module) (member module %unsupported-linux-modules)) (matching-modules (pci-device-module-alias device) (force aliases)))))) (define (pci-device-description pci-database) "Return a procedure that, given a PCI device, returns a string describing it." (define (with-fallback lookup) (lambda (vendor-id id) (let ((vendor name (lookup vendor-id id))) (values (or vendor (number->string vendor-id 16)) (or name (number->string id 16)))))) (define pci-lookup (with-fallback (load-pci-device-database pci-database))) (lambda (device) (let ((vendor name (pci-lookup (pci-device-vendor device) (pci-device-id device)))) (if (network-pci-device? device) ;; TRANSLATORS: The two placeholders are the manufacturer ;; and name of a PCI device. (format #f (G_ "~a ~a (networking device)") vendor name) (string-append vendor " " name))))) n. Not considering these files for deduplication speeds up file insertion in the store and, more importantly, leaves 'removeUnusedLinks' with fewer entries to traverse, thereby speeding it up proportionally. Partly fixes <https://issues.guix.gnu.org/24937>. * config-daemon.ac: Remove symlink hard link check and CAN_LINK_SYMLINK definition. * guix/store/deduplication.scm (%deduplication-minimum-size): New variable. (deduplicate)[loop]: Do not recurse when FILE's size is below %DEDUPLICATION-MINIMUM-SIZE. (dump-port): New procedure. (dump-file/deduplicate)[hash]: Turn into... [dump-and-compute-hash]: ... this thunk. Call 'deduplicate' only when SIZE is greater than %DEDUPLICATION-MINIMUM-SIZE; otherwise call 'dump-port'. * nix/libstore/gc.cc (LocalStore::removeUnusedLinks): Drop files where st.st_size < deduplicationMinSize. * nix/libstore/local-store.hh (deduplicationMinSize): New declaration. * nix/libstore/optimise-store.cc (deduplicationMinSize): New variable. (LocalStore::optimisePath_): Return when PATH is a symlink or smaller than 'deduplicationMinSize'. * tests/derivations.scm ("identical files are deduplicated"): Produce files bigger than %DEDUPLICATION-MINIMUM-SIZE. * tests/nar.scm ("restore-file-set with directories (signed, valid)"): Likewise. * tests/store-deduplication.scm ("deduplicate, below %deduplication-minimum-size"): New test. ("deduplicate", "deduplicate, ENOSPC"): Produce files bigger than %DEDUPLICATION-MINIMUM-SIZE. * tests/store.scm ("substitute, deduplication"): Likewise. Ludovic Courtès 2020-12-15deduplicate: Create the '.links' directory lazily....This avoids repeated (mkdir-p "/gnu/store/.links") calls when deduplicating lots of files. * guix/store/deduplication.scm (deduplicate): Remove initial call to 'mkdir-p'. Add ENOENT case in 'link' exception handler. Reindent. * tests/store-deduplication.scm ("deduplicate, ENOSPC"): Check for (<= links 4) to account for the initial 'link' call. Ludovic Courtès 2020-12-15store-copy: 'populate-store' can optionally deduplicate files....Until now deduplication was performed as an additional pass after copying files, which involve re-traversing all the files that had just been copied. * guix/store/deduplication.scm (copy-file/deduplicate): New procedure. * tests/store-deduplication.scm ("copy-file/deduplicate"): New test. * guix/build/store-copy.scm (populate-store): Add #:deduplicate? parameter and honor it. * tests/gexp.scm ("gexp->derivation, store copy"): Pass #:deduplicate? #f to 'populate-store'. * gnu/build/image.scm (initialize-root-partition): Pass #:deduplicate? to 'populate-store'. Pass #:deduplicate? #f to 'register-closure'. * gnu/build/vm.scm (root-partition-initializer): Likewise. * gnu/build/install.scm (populate-single-profile-directory): Pass #:deduplicate? #f to 'populate-store'. * gnu/build/linux-initrd.scm (build-initrd): Likewise. * guix/scripts/pack.scm (self-contained-tarball)[import-module?]: New procedure. [build]: Pass it as an argument to 'source-module-closure'. * guix/scripts/pack.scm (squashfs-image)[build]: Wrap in 'with-extensions'. * gnu/system/linux-initrd.scm (expression->initrd)[import-module?]: New procedure. [builder]: Pass it to 'source-module-closure'. * gnu/system/install.scm (cow-store-service-type)[import-module?]: New procedure. Pass it to 'source-module-closure'. Ludovic Courtès