gnu: python-sockjs-tornado: Update to 1.0.5.
[jackhill/guix/guix.git] / gnu / system.scm
CommitLineData
033adfe7 1;;; GNU Guix --- Functional package management for GNU
d466b1fc 2;;; Copyright © 2013, 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
5e738ac2 3;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
5dccaffe 4;;; Copyright © 2015, 2016 Alex Kost <alezost@gmail.com>
1ef8b72a 5;;; Copyright © 2016 Chris Marusich <cmmarusich@gmail.com>
c76b3046 6;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com>
033adfe7
LC
7;;;
8;;; This file is part of GNU Guix.
9;;;
10;;; GNU Guix is free software; you can redistribute it and/or modify it
11;;; under the terms of the GNU General Public License as published by
12;;; the Free Software Foundation; either version 3 of the License, or (at
13;;; your option) any later version.
14;;;
15;;; GNU Guix is distributed in the hope that it will be useful, but
16;;; WITHOUT ANY WARRANTY; without even the implied warranty of
17;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18;;; GNU General Public License for more details.
19;;;
20;;; You should have received a copy of the GNU General Public License
21;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
22
23(define-module (gnu system)
24 #:use-module (guix store)
25 #:use-module (guix monads)
02100028 26 #:use-module (guix gexp)
033adfe7
LC
27 #:use-module (guix records)
28 #:use-module (guix packages)
29 #:use-module (guix derivations)
29fce8b6 30 #:use-module (guix profiles)
84765839 31 #:use-module (guix ui)
033adfe7
LC
32 #:use-module (gnu packages base)
33 #:use-module (gnu packages bash)
bdb36958 34 #:use-module (gnu packages guile)
9de46ffb 35 #:use-module (gnu packages admin)
8a07c289 36 #:use-module (gnu packages linux)
a96a82d7 37 #:use-module (gnu packages pciutils)
033adfe7 38 #:use-module (gnu packages package-management)
6f436c54
LC
39 #:use-module (gnu packages less)
40 #:use-module (gnu packages zile)
55e70e65 41 #:use-module (gnu packages nano)
a68c6967 42 #:use-module (gnu packages gawk)
18316d86 43 #:use-module (gnu packages man)
939c5c31 44 #:use-module (gnu packages texinfo)
a68c6967 45 #:use-module (gnu packages compression)
f34c56be 46 #:use-module (gnu packages firmware)
db4fdc04 47 #:use-module (gnu services)
0190c1c0 48 #:use-module (gnu services shepherd)
db4fdc04 49 #:use-module (gnu services base)
b09a8da4 50 #:use-module (gnu bootloader)
033adfe7 51 #:use-module (gnu system shadow)
996ed739 52 #:use-module (gnu system nss)
598e19dc 53 #:use-module (gnu system locale)
6e828634 54 #:use-module (gnu system pam)
735c6dd7 55 #:use-module (gnu system linux-initrd)
9b336338 56 #:use-module (gnu system uuid)
c5df1839 57 #:use-module (gnu system file-systems)
060d62a7 58 #:use-module (gnu system mapped-devices)
033adfe7
LC
59 #:use-module (ice-9 match)
60 #:use-module (srfi srfi-1)
61 #:use-module (srfi srfi-26)
598e19dc
LC
62 #:use-module (srfi srfi-34)
63 #:use-module (srfi srfi-35)
3382bfe9 64 #:use-module (rnrs bytevectors)
033adfe7
LC
65 #:export (operating-system
66 operating-system?
d5b429ab
LC
67
68 operating-system-bootloader
033adfe7 69 operating-system-services
217a5b85 70 operating-system-user-services
033adfe7 71 operating-system-packages
fd3bfc44 72 operating-system-host-name
c65e1834 73 operating-system-hosts-file
fd3bfc44 74 operating-system-kernel
44d5f54e 75 operating-system-kernel-file
33f0aa88 76 operating-system-kernel-arguments
bc499b11 77 operating-system-initrd-modules
fd3bfc44
LC
78 operating-system-initrd
79 operating-system-users
80 operating-system-groups
548d4c13 81 operating-system-issue
fd3bfc44
LC
82 operating-system-timezone
83 operating-system-locale
598e19dc 84 operating-system-locale-definitions
34760ae7 85 operating-system-locale-libcs
5dae0186 86 operating-system-mapped-devices
83bcd0b8 87 operating-system-file-systems
6b779207 88 operating-system-store-file-system
2bdd7ac1
LC
89 operating-system-user-mapped-devices
90 operating-system-boot-mapped-devices
b25937e3 91 operating-system-activation-script
b2fef041
LC
92 operating-system-user-accounts
93 operating-system-shepherd-service-names
20abb8c4 94 operating-system-user-kernel-arguments
033adfe7 95
1aa0033b 96 operating-system-derivation
83bcd0b8 97 operating-system-profile
c76b3046 98 operating-system-bootcfg
239db054
DT
99 operating-system-etc-directory
100 operating-system-locale-directory
101 operating-system-boot-script
102
43fe431c
DC
103 system-linux-image-file-name
104
b8300494
AK
105 boot-parameters
106 boot-parameters?
107 boot-parameters-label
108 boot-parameters-root-device
f96752e3 109 boot-parameters-bootloader-name
1ef8b72a
CM
110 boot-parameters-store-device
111 boot-parameters-store-mount-point
b8300494
AK
112 boot-parameters-kernel
113 boot-parameters-kernel-arguments
d7b342d8 114 boot-parameters-initrd
4e4e0185 115 read-boot-parameters
9530e73b 116 read-boot-parameters-file
1975c754 117 boot-parameters->menu-entry
b8300494 118
568841d4 119 local-host-aliases
df5ce088 120 %setuid-programs
5dae0186 121 %base-packages
374f14c2 122 %base-firmware))
033adfe7
LC
123
124;;; Commentary:
125;;;
126;;; This module supports whole-system configuration.
127;;;
128;;; Code:
129
33f0aa88
DM
130(define (bootable-kernel-arguments kernel-arguments system.drv root-device)
131 "Prepend extra arguments to KERNEL-ARGUMENTS that allow SYSTEM.DRV to be
132booted from ROOT-DEVICE"
9b336338 133 (cons* (string-append "--root="
a5acc17a
LC
134 (cond ((uuid? root-device)
135
136 ;; Note: Always use the DCE format because that's
137 ;; what (gnu build linux-boot) expects for the
138 ;; '--root' kernel command-line option.
139 (uuid->string (uuid-bytevector root-device)
140 'dce))
141 ((file-system-label? root-device)
142 (file-system-label->string root-device))
143 (else root-device)))
33f0aa88
DM
144 #~(string-append "--system=" #$system.drv)
145 #~(string-append "--load=" #$system.drv "/boot")
146 kernel-arguments))
147
033adfe7
LC
148;; System-wide configuration.
149;; TODO: Add per-field docstrings/stexi.
150(define-record-type* <operating-system> operating-system
151 make-operating-system
152 operating-system?
153 (kernel operating-system-kernel ; package
57082417 154 (default linux-libre))
af98d25a 155 (kernel-arguments operating-system-user-kernel-arguments
ee2a6304 156 (default '())) ; list of gexps/strings
b09a8da4 157 (bootloader operating-system-bootloader) ; <bootloader-configuration>
d5b429ab 158
83bcd0b8 159 (initrd operating-system-initrd ; (list fs) -> M derivation
060238ae 160 (default base-initrd))
bc499b11
LC
161 (initrd-modules operating-system-initrd-modules ; list of strings
162 (thunked) ; it's system-dependent
163 (default %base-initrd-modules))
164
f34c56be
LC
165 (firmware operating-system-firmware ; list of packages
166 (default %base-firmware))
033adfe7
LC
167
168 (host-name operating-system-host-name) ; string
24e02c28 169 (hosts-file operating-system-hosts-file ; file-like | #f
c65e1834 170 (default #f))
033adfe7 171
5dae0186
LC
172 (mapped-devices operating-system-mapped-devices ; list of <mapped-device>
173 (default '()))
8a6d2731 174 (file-systems operating-system-file-systems) ; list of fs
2a13d05e
LC
175 (swap-devices operating-system-swap-devices ; list of strings
176 (default '()))
033adfe7
LC
177
178 (users operating-system-users ; list of user accounts
bf87f38a 179 (default %base-user-accounts))
033adfe7 180 (groups operating-system-groups ; list of user groups
773e956d 181 (default %base-groups))
033adfe7 182
40281c54
LC
183 (skeletons operating-system-skeletons ; list of name/monadic value
184 (default (default-skeletons)))
548d4c13
LC
185 (issue operating-system-issue ; string
186 (default %default-issue))
40281c54 187
033adfe7 188 (packages operating-system-packages ; list of (PACKAGE OUTPUT...)
6f436c54 189 (default %base-packages)) ; or just PACKAGE
033adfe7
LC
190
191 (timezone operating-system-timezone) ; string
8a6d2731 192 (locale operating-system-locale ; string
598e19dc
LC
193 (default "en_US.utf8"))
194 (locale-definitions operating-system-locale-definitions ; list of <locale-definition>
195 (default %default-locale-definitions))
34760ae7
LC
196 (locale-libcs operating-system-locale-libcs ; list of <packages>
197 (default %default-locale-libcs))
996ed739
LC
198 (name-service-switch operating-system-name-service-switch ; <name-service-switch>
199 (default %default-nss))
033adfe7 200
217a5b85 201 (services operating-system-user-services ; list of monadic services
09e028f4
LC
202 (default %base-services))
203
204 (pam-services operating-system-pam-services ; list of PAM services
205 (default (base-pam-services)))
206 (setuid-programs operating-system-setuid-programs
69689380 207 (default %setuid-programs)) ; list of string-valued gexps
033adfe7 208
f5a9ffa0
AK
209 (sudoers-file operating-system-sudoers-file ; file-like
210 (default %sudoers-specification)))
033adfe7 211
33f0aa88
DM
212(define (operating-system-kernel-arguments os system.drv root-device)
213 "Return all the kernel arguments, including the ones not specified
214directly by the user."
215 (bootable-kernel-arguments (operating-system-user-kernel-arguments os)
216 system.drv
217 root-device))
218
2717a89a 219\f
8e815c5b
LC
220;;;
221;;; Boot parameters
222;;;
223
224(define-record-type* <boot-parameters>
225 boot-parameters make-boot-parameters boot-parameters?
226 (label boot-parameters-label)
227 ;; Because we will use the 'store-device' to create the GRUB search command,
228 ;; the 'store-device' has slightly different semantics than 'root-device'.
229 ;; The 'store-device' can be a file system uuid, a file system label, or #f,
230 ;; but it cannot be a device path such as "/dev/sda3", since GRUB would not
231 ;; understand that. The 'root-device', on the other hand, corresponds
232 ;; exactly to the device field of the <file-system> object representing the
233 ;; OS's root file system, so it might be a device path like "/dev/sda3".
234 (root-device boot-parameters-root-device)
f96752e3 235 (bootloader-name boot-parameters-bootloader-name)
8e815c5b
LC
236 (store-device boot-parameters-store-device)
237 (store-mount-point boot-parameters-store-mount-point)
238 (kernel boot-parameters-kernel)
239 (kernel-arguments boot-parameters-kernel-arguments)
240 (initrd boot-parameters-initrd))
241
90d23ed9
LC
242(define (ensure-not-/dev device)
243 "If DEVICE starts with a slash, return #f. This is meant to filter out
244Linux device names such as /dev/sda, and to preserve GRUB device names and
245file system labels."
246 (if (and (string? device) (string-prefix? "/" device))
247 #f
248 device))
249
8e815c5b
LC
250(define (read-boot-parameters port)
251 "Read boot parameters from PORT and return the corresponding
252<boot-parameters> object or #f if the format is unrecognized."
075681d3
LC
253 (define device-sexp->device
254 (match-lambda
255 (('uuid (? symbol? type) (? bytevector? bv))
256 (bytevector->uuid bv type))
a5acc17a
LC
257 (('file-system-label (? string? label))
258 (file-system-label label))
075681d3
LC
259 ((? bytevector? bv) ;old format
260 (bytevector->uuid bv 'dce))
261 ((? string? device)
a5acc17a
LC
262 ;; It used to be that we would not distinguish between labels and
263 ;; device names. Try to infer the right thing here.
264 (if (string-prefix? "/dev/" device)
265 device
266 (file-system-label device)))))
075681d3 267
8e815c5b
LC
268 (match (read port)
269 (('boot-parameters ('version 0)
270 ('label label) ('root-device root)
271 ('kernel linux)
272 rest ...)
273 (boot-parameters
274 (label label)
7940188e 275 (root-device (device-sexp->device root))
8e815c5b 276
f96752e3
MO
277 (bootloader-name
278 (match (assq 'bootloader-name rest)
bcaf67c4
MO
279 ((_ args) args)
280 (#f 'grub))) ; for compatibility reasons.
281
8e815c5b
LC
282 ;; In the past, we would store the directory name of the kernel instead
283 ;; of the absolute file name of its image. Detect that and correct it.
284 (kernel (if (string=? linux (direct-store-path linux))
285 (string-append linux "/"
286 (system-linux-image-file-name))
287 linux))
288
289 (kernel-arguments
290 (match (assq 'kernel-arguments rest)
291 ((_ args) args)
292 (#f '()))) ;the old format
293
294 (initrd
295 (match (assq 'initrd rest)
296 (('initrd ('string-append directory file)) ;the old format
297 (string-append directory file))
298 (('initrd (? string? file))
299 file)))
300
301 (store-device
db4e8fd5
LC
302 ;; Linux device names like "/dev/sda1" are not suitable GRUB device
303 ;; identifiers, so we just filter them out.
304 (ensure-not-/dev
305 (match (assq 'store rest)
306 (('store ('device #f) _ ...)
307 root-device)
308 (('store ('device device) _ ...)
309 (device-sexp->device device))
310 (_ ;the old format
311 root-device))))
8e815c5b
LC
312
313 (store-mount-point
314 (match (assq 'store rest)
315 (('store ('device _) ('mount-point mount-point) _ ...)
316 mount-point)
317 (_ ;the old format
318 "/")))))
319 (x ;unsupported format
b1059b38
LC
320 (warning (G_ "unrecognized boot parameters at '~a'~%")
321 (port-filename port))
8e815c5b
LC
322 #f)))
323
324(define (read-boot-parameters-file system)
325 "Read boot parameters from SYSTEM's (system or generation) \"parameters\"
326file and returns the corresponding <boot-parameters> object or #f if the
327format is unrecognized.
328The object has its kernel-arguments extended in order to make it bootable."
329 (let* ((file (string-append system "/parameters"))
330 (params (call-with-input-file file read-boot-parameters))
331 (root (boot-parameters-root-device params))
8e815c5b
LC
332 (kernel-arguments (boot-parameters-kernel-arguments params)))
333 (if params
334 (boot-parameters
335 (inherit params)
336 (kernel-arguments (bootable-kernel-arguments kernel-arguments
9b336338 337 system root)))
8e815c5b 338 #f)))
8b22107e 339
1975c754
DM
340(define (boot-parameters->menu-entry conf)
341 (menu-entry
342 (label (boot-parameters-label conf))
343 (device (boot-parameters-store-device conf))
344 (device-mount-point (boot-parameters-store-mount-point conf))
345 (linux (boot-parameters-kernel conf))
346 (linux-arguments (boot-parameters-kernel-arguments conf))
347 (initrd (boot-parameters-initrd conf))))
348
8b22107e 349
8e815c5b 350\f
40281c54
LC
351;;;
352;;; Services.
353;;;
354
aa1145df
LC
355(define (non-boot-file-system-service os)
356 "Return the file system service for the file systems of OS that are not
357marked as 'needed-for-boot'."
023f391c 358 (define file-systems
4d6b879c 359 (remove file-system-needed-for-boot?
023f391c
LC
360 (operating-system-file-systems os)))
361
68a58775
LC
362 (define mapped-devices-for-boot
363 (operating-system-boot-mapped-devices os))
364
5dae0186 365 (define (device-mappings fs)
ab64483f 366 (let ((device (file-system-device fs)))
29824d80 367 (if (string? device) ;title is 'device
ab64483f
LC
368 (filter (lambda (md)
369 (string=? (string-append "/dev/mapper/"
370 (mapped-device-target md))
371 device))
372 (operating-system-mapped-devices os))
373 '())))
5dae0186 374
e502bf89
LC
375 (define (add-dependencies fs)
376 ;; Add the dependencies due to device mappings to FS.
377 (file-system
378 (inherit fs)
379 (dependencies
68a58775
LC
380 (delete-duplicates
381 (remove (cut member <> mapped-devices-for-boot)
382 (append (device-mappings fs)
383 (file-system-dependencies fs)))
384 eq?))))
e502bf89 385
aa1145df
LC
386 (service file-system-service-type
387 (map add-dependencies file-systems)))
023f391c 388
68a58775
LC
389(define (mapped-device-users device file-systems)
390 "Return the subset of FILE-SYSTEMS that use DEVICE."
de1c158f 391 (let ((target (string-append "/dev/mapper/" (mapped-device-target device))))
68a58775
LC
392 (filter (lambda (fs)
393 (or (member device (file-system-dependencies fs))
394 (and (string? (file-system-device fs))
395 (string=? (file-system-device fs) target))))
396 file-systems)))
de1c158f
LC
397
398(define (operating-system-user-mapped-devices os)
399 "Return the subset of mapped devices that can be installed in
400user-land--i.e., those not needed during boot."
9cb426b8
LC
401 (let ((devices (operating-system-mapped-devices os))
402 (file-systems (operating-system-file-systems os)))
403 (filter (lambda (md)
68a58775
LC
404 (let ((users (mapped-device-users md file-systems)))
405 (not (any file-system-needed-for-boot? users))))
9cb426b8 406 devices)))
de1c158f
LC
407
408(define (operating-system-boot-mapped-devices os)
409 "Return the subset of mapped devices that must be installed during boot,
410from the initrd."
9cb426b8
LC
411 (let ((devices (operating-system-mapped-devices os))
412 (file-systems (operating-system-file-systems os)))
413 (filter (lambda (md)
68a58775
LC
414 (let ((users (mapped-device-users md file-systems)))
415 (any file-system-needed-for-boot? users)))
9cb426b8 416 devices)))
de1c158f 417
5dae0186 418(define (device-mapping-services os)
be1c2c54 419 "Return the list of device-mapping services for OS as a list."
4da8c19e 420 (map device-mapping-service
be1c2c54 421 (operating-system-user-mapped-devices os)))
5dae0186 422
2a13d05e 423(define (swap-services os)
be1c2c54
LC
424 "Return the list of swap services for OS."
425 (map swap-service (operating-system-swap-devices os)))
2a13d05e 426
44d5f54e
LC
427(define* (system-linux-image-file-name #:optional (system (%current-system)))
428 "Return the basename of the kernel image file for SYSTEM."
429 ;; FIXME: Evaluate the conditional based on the actual current system.
43fe431c
DC
430 (cond
431 ((string-prefix? "arm" (%current-system)) "zImage")
432 ((string-prefix? "mips" (%current-system)) "vmlinuz")
fd900d68 433 ((string-prefix? "aarch64" (%current-system)) "Image")
43fe431c 434 (else "bzImage")))
44d5f54e
LC
435
436(define (operating-system-kernel-file os)
437 "Return an object representing the absolute file name of the kernel image of
438OS."
439 (file-append (operating-system-kernel os)
440 "/" (system-linux-image-file-name os)))
441
d62e201c
LC
442(define* (operating-system-directory-base-entries os #:key container?)
443 "Return the basic entries of the 'system' directory of OS for use as the
444value of the SYSTEM-SERVICE-TYPE service."
b19a49d0
LC
445 (let ((locale (operating-system-locale-directory os)))
446 (with-monad %store-monad
447 (if container?
448 (return `(("locale" ,locale)))
449 (mlet %store-monad
450 ((kernel -> (operating-system-kernel os))
451 (initrd (operating-system-initrd-file os))
452 (params (operating-system-boot-parameters-file os)))
453 (return `(("kernel" ,kernel)
454 ("parameters" ,params)
455 ("initrd" ,initrd)
456 ("locale" ,locale)))))))) ;used by libc
d62e201c 457
0adfe95a 458(define* (essential-services os #:key container?)
217a5b85
LC
459 "Return the list of essential services for OS. These are special services
460that implement part of what's declared in OS are responsible for low-level
0adfe95a
LC
461bookkeeping. CONTAINER? determines whether to return the list of services for
462a container or that of a \"bare metal\" system."
d6e2a622
LC
463 (define known-fs
464 (map file-system-mount-point (operating-system-file-systems os)))
465
be1c2c54
LC
466 (let* ((mappings (device-mapping-services os))
467 (root-fs (root-file-system-service))
aa1145df 468 (other-fs (non-boot-file-system-service os))
be1c2c54 469 (swaps (swap-services os))
206a28d8 470 (procs (service user-processes-service-type))
d62e201c
LC
471 (host-name (host-name-service (operating-system-host-name os)))
472 (entries (operating-system-directory-base-entries
473 os #:container? container?)))
474 (cons* (service system-service-type entries)
475 %boot-service
0adfe95a 476
661c237b 477 ;; %SHEPHERD-ROOT-SERVICE must come last so that the gexp that
d4053c71 478 ;; execs shepherd comes last in the boot script (XXX). Likewise,
661c237b 479 ;; the cleanup service must come first so that its gexp runs before
d4053c71 480 ;; activation code.
be7be9e8 481 (service cleanup-service-type #f)
661c237b
LC
482 %activation-service
483 %shepherd-root-service
0adfe95a
LC
484
485 (pam-root-service (operating-system-pam-services os))
486 (account-service (append (operating-system-accounts os)
487 (operating-system-groups os))
488 (operating-system-skeletons os))
489 (operating-system-etc-service os)
e43e84ba 490 (service fstab-service-type '())
6bad7524
SB
491 (session-environment-service
492 (operating-system-environment-variables os))
6c445817 493 host-name procs root-fs
0adfe95a
LC
494 (service setuid-program-service-type
495 (operating-system-setuid-programs os))
af4c3fd5
LC
496 (service profile-service-type
497 (operating-system-packages os))
aa1145df
LC
498 other-fs
499 (append mappings swaps
0adfe95a
LC
500
501 ;; Add the firmware service, unless we are building for a
502 ;; container.
503 (if container?
504 '()
a241a7ac
LC
505 (list %linux-bare-metal-service
506 (service firmware-service-type
0adfe95a
LC
507 (operating-system-firmware os))))))))
508
509(define* (operating-system-services os #:key container?)
217a5b85
LC
510 "Return all the services of OS, including \"internal\" services that do not
511explicitly appear in OS."
d466b1fc
LC
512 (instantiate-missing-services
513 (append (operating-system-user-services os)
514 (essential-services os #:container? container?))))
217a5b85 515
40281c54
LC
516\f
517;;;
518;;; /etc.
519;;;
520
f34c56be
LC
521(define %base-firmware
522 ;; Firmware usable by default.
52db41af
EB
523 (list ath9k-htc-firmware
524 openfwwf-firmware))
f34c56be 525
6f436c54
LC
526(define %base-packages
527 ;; Default set of packages globally visible. It should include anything
528 ;; required for basic administrator tasks.
55e70e65 529 (cons* procps psmisc which less zile nano
a96a82d7 530 pciutils usbutils
5576cfab 531 util-linux
af23710f 532 inetutils isc-dhcp
87941d1d 533 (@ (gnu packages admin) shadow) ;for 'passwd'
be681773
LC
534
535 ;; wireless-tools is deprecated in favor of iw, but it's still what
536 ;; many people are familiar with, so keep it around.
5146f22b 537 iw wireless-tools
be681773 538
5dccaffe 539 iproute
9b762b8d 540 net-tools ; XXX: remove when Inetutils suffices
18316d86 541 man-db
02683c33 542 info-reader ;the standalone Info reader (no Perl)
03e9998f 543
a8a086e3
LC
544 ;; The 'sudo' command is already in %SETUID-PROGRAMS, but we also
545 ;; want the other commands and the man pages (notably because
546 ;; auto-completion in Emacs shell relies on man pages.)
547 sudo
548
03e9998f
LC
549 ;; Get 'insmod' & co. from kmod, not module-init-tools, since udev
550 ;; already depends on it anyway.
255f7308 551 kmod eudev
03e9998f 552
b63dbd44 553 e2fsprogs kbd
9b762b8d 554
1d167b6e
LC
555 bash-completion
556
86f23092
LC
557 ;; XXX: We don't use (canonical-package guile-2.2) here because that
558 ;; would create a collision in the global profile between the GMP
559 ;; variant propagated by 'guile-final' and the GMP variant propagated
560 ;; by 'gnutls', itself propagated by 'guix'.
561 guile-2.2
562
9b762b8d
LC
563 ;; The packages below are also in %FINAL-INPUTS, so take them from
564 ;; there to avoid duplication.
565 (map canonical-package
86f23092 566 (list bash coreutils findutils grep sed
4b164c45 567 diffutils patch gawk tar gzip bzip2 xz lzip))))
6f436c54 568
548d4c13
LC
569(define %default-issue
570 ;; Default contents for /etc/issue.
571 "
572This is the GNU system. Welcome.\n")
573
568841d4
LC
574(define (local-host-aliases host-name)
575 "Return aliases for HOST-NAME, to be used in /etc/hosts."
576 (string-append "127.0.0.1 localhost " host-name "\n"
577 "::1 localhost " host-name "\n"))
578
c65e1834
LC
579(define (default-/etc/hosts host-name)
580 "Return the default /etc/hosts file."
24e02c28 581 (plain-file "hosts" (local-host-aliases host-name)))
c65e1834 582
0adfe95a
LC
583(define* (operating-system-etc-service os)
584 "Return a <service> that builds containing the static part of the /etc
585directory."
e453da13
LF
586 (let ((login.defs
587 (plain-file "login.defs"
588 (string-append
589 "# Default paths for non-login shells started by su(1).\n"
590 "ENV_PATH /run/setuid-programs:"
591 "/run/current-system/profile/bin:"
592 "/run/current-system/profile/sbin\n"
593 "ENV_SUPATH /run/setuid-programs:"
594 "/run/current-system/profile/bin:"
595 "/run/current-system/profile/sbin\n")))
0adfe95a 596
0adfe95a
LC
597 (issue (plain-file "issue" (operating-system-issue os)))
598 (nsswitch (plain-file "nsswitch.conf"
599 (name-service-switch->string
600 (operating-system-name-service-switch os))))
601
602 ;; Startup file for POSIX-compliant login shells, which set system-wide
603 ;; environment variables.
604 (profile (mixed-text-file "profile" "\
c05c4321 605# Crucial variables that could be missing in the profiles' 'etc/profile'
d9959421
LC
606# because they would require combining both profiles.
607# FIXME: See <http://bugs.gnu.org/20255>.
97ab2c0f 608export MANPATH=$HOME/.guix-profile/share/man:/run/current-system/profile/share/man
8d09bfe2 609export INFOPATH=$HOME/.guix-profile/share/info:/run/current-system/profile/share/info
00239d05
SB
610export XDG_DATA_DIRS=$HOME/.guix-profile/share:/run/current-system/profile/share
611export XDG_CONFIG_DIRS=$HOME/.guix-profile/etc/xdg:/run/current-system/profile/etc/xdg
612
ce380150
TD
613# Make sure libXcursor finds cursors installed into user or system profiles. See <http://bugs.gnu.org/24445>
614export XCURSOR_PATH=$HOME/.icons:$HOME/.guix-profile/share/icons:/run/current-system/profile/share/icons
615
d9959421
LC
616# Ignore the default value of 'PATH'.
617unset PATH
618
619# Load the system profile's settings.
bd7e136d 620GUIX_PROFILE=/run/current-system/profile ; \\
669786da 621. /run/current-system/profile/etc/profile
d9959421 622
cad7e6ab
CSLL
623# Since 'lshd' does not use pam_env, /etc/environment must be explicitly
624# loaded when someone logs in via SSH. See <http://bugs.gnu.org/22175>.
625# We need 'PATH' to be defined here, for 'cat' and 'cut'. Do this before
626# reading the user's 'etc/profile' to allow variables to be overridden.
627if [ -f /etc/environment -a -n \"$SSH_CLIENT\" \\
628 -a -z \"$LINUX_MODULE_DIRECTORY\" ]
629then
630 . /etc/environment
631 export `cat /etc/environment | cut -d= -f1`
632fi
633
8d09bfe2
LC
634# Arrange so that ~/.config/guix/current comes first.
635for profile in \"$HOME/.guix-profile\" \"$HOME/.config/guix/current\"
cdc5b932
LC
636do
637 if [ -f \"$profile/etc/profile\" ]
638 then
639 # Load the user profile's settings.
640 GUIX_PROFILE=\"$profile\" ; \\
641 . \"$profile/etc/profile\"
642 else
643 # At least define this one so that basic things just work
644 # when the user installs their first package.
645 export PATH=\"$profile/bin:$PATH\"
646 fi
647done
d9959421 648
a854525a
LC
649# Prepend setuid programs.
650export PATH=/run/setuid-programs:$PATH
651
8d09bfe2
LC
652# Arrange so that ~/.config/guix/current/share/info comes first.
653export INFOPATH=\"$HOME/.config/guix/current/share/info:$INFOPATH\"
654
11202482
LC
655# Set the umask, notably for users logging in via 'lsh'.
656# See <http://bugs.gnu.org/22650>.
657umask 022
2a5f0db4 658
c08da2ee
LC
659# Allow Hunspell-based applications (IceCat, LibreOffice, etc.) to
660# find dictionaries.
661export DICPATH=\"$HOME/.guix-profile/share/hunspell:/run/current-system/profile/share/hunspell\"
662
4af7c83b
LC
663# Allow GStreamer-based applications to find plugins.
664export GST_PLUGIN_PATH=\"$HOME/.guix-profile/lib/gstreamer-1.0\"
665
1d167b6e
LC
666if [ -n \"$BASH_VERSION\" -a -f /etc/bashrc ]
667then
668 # Load Bash-specific initialization code.
669786da 669 . /etc/bashrc
1d167b6e 670fi
40281c54 671"))
1d167b6e 672
0adfe95a 673 (bashrc (plain-file "bashrc" "\
1d167b6e
LC
674# Bash-specific initialization.
675
676# The 'bash-completion' package.
677if [ -f /run/current-system/profile/etc/profile.d/bash_completion.sh ]
678then
679 # Bash-completion sources ~/.bash_completion. It installs a dynamic
680 # completion loader that searches its own completion files as well
681 # as those in ~/.guix-profile and /run/current-system/profile.
682 source /run/current-system/profile/etc/profile.d/bash_completion.sh
0adfe95a
LC
683fi\n")))
684 (etc-service
9e41130b
LC
685 `(("services" ,(file-append net-base "/etc/services"))
686 ("protocols" ,(file-append net-base "/etc/protocols"))
687 ("rpc" ,(file-append net-base "/etc/rpc"))
0adfe95a
LC
688 ("login.defs" ,#~#$login.defs)
689 ("issue" ,#~#$issue)
690 ("nsswitch.conf" ,#~#$nsswitch)
0adfe95a
LC
691 ("profile" ,#~#$profile)
692 ("bashrc" ,#~#$bashrc)
693 ("hosts" ,#~#$(or (operating-system-hosts-file os)
694 (default-/etc/hosts (operating-system-host-name os))))
c694520b
TD
695 ;; Write the operating-system-host-name to /etc/hostname to prevent
696 ;; NetworkManager from changing the system's hostname when connecting
697 ;; to certain networks. Some discussion at
698 ;; https://lists.gnu.org/archive/html/help-guix/2017-09/msg00037.html
699 ("hostname" ,(plain-file "hostname" (operating-system-host-name os)))
9e41130b
LC
700 ("localtime" ,(file-append tzdata "/share/zoneinfo/"
701 (operating-system-timezone os)))
0adfe95a 702 ("sudoers" ,(operating-system-sudoers-file os))))))
033adfe7 703
ab6a279a
LC
704(define %root-account
705 ;; Default root account.
706 (user-account
707 (name "root")
708 (password "")
709 (uid 0) (group "root")
710 (comment "System administrator")
711 (home-directory "/root")))
712
0b6f49ef 713(define (operating-system-accounts os)
0adfe95a
LC
714 "Return the user accounts for OS, including an obligatory 'root' account,
715and excluding accounts requested by services."
716 ;; Make sure there's a root account.
717 (if (find (lambda (user)
718 (and=> (user-account-uid user) zero?))
719 (operating-system-users os))
720 (operating-system-users os)
721 (cons %root-account (operating-system-users os))))
0b6f49ef 722
84765839
LC
723(define (maybe-string->file file-name thing)
724 "If THING is a string, return a <plain-file> with THING as its content.
725Otherwise just return THING.
726
727This is for backward-compatibility of fields that used to be strings and are
728now file-like objects.."
729 (match thing
730 ((? string?)
69daee23 731 (warning (G_ "using a string for file '~a' is deprecated; \
84765839
LC
732use 'plain-file' instead~%")
733 file-name)
734 (plain-file file-name thing))
735 (x
736 x)))
737
24e02c28
LC
738(define (maybe-file->monadic file-name thing)
739 "If THING is a value in %STORE-MONAD, return it as is; otherwise return
740THING in the %STORE-MONAD.
741
742This is for backward-compatibility of fields that used to be monadic values
743and are now file-like objects."
744 (with-monad %store-monad
745 (match thing
746 ((? procedure?)
69daee23 747 (warning (G_ "using a monadic value for '~a' is deprecated; \
24e02c28
LC
748use 'plain-file' instead~%")
749 file-name)
750 thing)
751 (x
752 (return x)))))
753
0b6f49ef
LC
754(define (operating-system-etc-directory os)
755 "Return that static part of the /etc directory of OS."
0adfe95a
LC
756 (etc-directory
757 (fold-services (operating-system-services os)
758 #:target-type etc-service-type)))
033adfe7 759
6bad7524
SB
760(define (operating-system-environment-variables os)
761 "Return the environment variables of OS for
762@var{session-environment-service-type}, to be used in @file{/etc/environment}."
763 `(("LANG" . ,(operating-system-locale os))
54757499
LC
764 ;; Note: No need to set 'TZ' since (1) we provide /etc/localtime, and (2)
765 ;; it doesn't work for setuid binaries. See <https://bugs.gnu.org/29212>.
9e41130b 766 ("TZDIR" . ,(file-append tzdata "/share/zoneinfo"))
6bad7524
SB
767 ;; Tell 'modprobe' & co. where to look for modules.
768 ("LINUX_MODULE_DIRECTORY" . "/run/booted-system/kernel/lib/modules")
769 ;; These variables are honored by OpenSSL (libssl) and Git.
770 ("SSL_CERT_DIR" . "/etc/ssl/certs")
771 ("SSL_CERT_FILE" . "/etc/ssl/certs/ca-certificates.crt")
772 ("GIT_SSL_CAINFO" . "/etc/ssl/certs/ca-certificates.crt")
ae05e366
LC
773
774 ;; 'GTK_DATA_PREFIX' must name one directory where GTK+ themes are
775 ;; searched for.
776 ("GTK_DATA_PREFIX" . "/run/current-system/profile")
777
6bad7524
SB
778 ;; By default, applications that use D-Bus, such as Emacs, abort at startup
779 ;; when /etc/machine-id is missing. Make sure these warnings are non-fatal.
946465bb
LC
780 ("DBUS_FATAL_WARNINGS" . "0")
781
782 ;; XXX: Normally we wouldn't need to do this, but our glibc@2.23 package
783 ;; used to look things up in 'PREFIX/lib/locale' instead of
784 ;; '/run/current-system/locale' as was intended. Keep this hack around so
785 ;; that people who still have glibc@2.23-using packages in their profiles
786 ;; can use them correctly.
787 ;; TODO: Remove when glibc@2.23 is long gone.
788 ("GUIX_LOCPATH" . "/run/current-system/locale")))
6bad7524 789
09e028f4
LC
790(define %setuid-programs
791 ;; Default set of setuid-root programs.
3b65abac 792 (let ((shadow (@ (gnu packages admin) shadow)))
9e41130b
LC
793 (list (file-append shadow "/bin/passwd")
794 (file-append shadow "/bin/su")
852241eb
SB
795 (file-append shadow "/bin/newuidmap")
796 (file-append shadow "/bin/newgidmap")
9e41130b
LC
797 (file-append inetutils "/bin/ping")
798 (file-append inetutils "/bin/ping6")
799 (file-append sudo "/bin/sudo")
800 (file-append fuse "/bin/fusermount"))))
69689380
LC
801
802(define %sudoers-specification
803 ;; Default /etc/sudoers contents: 'root' and all members of the 'wheel'
804 ;; group can do anything. See
805 ;; <http://www.sudo.ws/sudo/man/1.8.10/sudoers.man.html>.
806 ;; TODO: Add a declarative API.
84765839
LC
807 (plain-file "sudoers" "\
808root ALL=(ALL) ALL
809%wheel ALL=(ALL) ALL\n"))
09e028f4 810
239db054 811(define* (operating-system-activation-script os #:key container?)
484a2b3a
LC
812 "Return the activation script for OS---i.e., the code that \"activates\" the
813stateful part of OS, including user accounts and groups, special directories,
814etc."
0adfe95a
LC
815 (let* ((services (operating-system-services os #:container? container?))
816 (activation (fold-services services
817 #:target-type activation-service-type)))
818 (activation-service->script activation)))
484a2b3a 819
239db054 820(define* (operating-system-boot-script os #:key container?)
484a2b3a 821 "Return the boot script for OS---i.e., the code started by the initrd once
239db054
DT
822we're running in the final root. When CONTAINER? is true, skip all
823hardware-related operations as necessary when booting a Linux container."
0adfe95a 824 (let* ((services (operating-system-services os #:container? container?))
d62e201c 825 (boot (fold-services services #:target-type boot-service-type)))
efe7d19a 826 (service-value boot)))
2106d3fc 827
b2fef041
LC
828(define (operating-system-user-accounts os)
829 "Return the list of user accounts of OS."
830 (let* ((services (operating-system-services os))
831 (account (fold-services services
832 #:target-type account-service-type)))
833 (filter user-account?
efe7d19a 834 (service-value account))))
b2fef041
LC
835
836(define (operating-system-shepherd-service-names os)
837 "Return the list of Shepherd service names for OS."
838 (append-map shepherd-service-provision
efe7d19a 839 (service-value
b2fef041
LC
840 (fold-services (operating-system-services os)
841 #:target-type
842 shepherd-root-service-type))))
843
d62e201c
LC
844(define* (operating-system-derivation os #:key container?)
845 "Return a derivation that builds OS."
846 (let* ((services (operating-system-services os #:container? container?))
847 (system (fold-services services)))
848 ;; SYSTEM contains the derivation as a monadic value.
efe7d19a 849 (service-value system)))
d62e201c 850
af4c3fd5
LC
851(define* (operating-system-profile os #:key container?)
852 "Return a derivation that builds the system profile of OS."
853 (mlet* %store-monad
854 ((services -> (operating-system-services os #:container? container?))
855 (profile (fold-services services
856 #:target-type profile-service-type)))
857 (match profile
858 (("profile" profile)
859 (return profile)))))
860
83bcd0b8
LC
861(define (operating-system-root-file-system os)
862 "Return the root file system of OS."
a48d3450
LC
863 (find (lambda (fs)
864 (string=? "/" (file-system-mount-point fs)))
83bcd0b8
LC
865 (operating-system-file-systems os)))
866
b4140694
LC
867(define (operating-system-initrd-file os)
868 "Return a gexp denoting the initrd file of OS."
83bcd0b8 869 (define boot-file-systems
4d6b879c 870 (filter file-system-needed-for-boot?
83bcd0b8
LC
871 (operating-system-file-systems os)))
872
de1c158f
LC
873 (define mapped-devices
874 (operating-system-boot-mapped-devices os))
875
876 (define make-initrd
877 (operating-system-initrd os))
878
879 (mlet %store-monad ((initrd (make-initrd boot-file-systems
0d275f4a 880 #:linux (operating-system-kernel os)
bc499b11
LC
881 #:linux-modules
882 (operating-system-initrd-modules os)
de1c158f 883 #:mapped-devices mapped-devices)))
ab20d74a 884 (return (file-append initrd "/initrd"))))
b4140694 885
f5582b2c
LC
886(define (locale-name->definition* name)
887 "Variant of 'locale-name->definition' that raises an error upon failure."
888 (match (locale-name->definition name)
889 (#f
890 (raise (condition
891 (&message
69daee23 892 (message (format #f (G_ "~a: invalid locale name") name))))))
f5582b2c
LC
893 (def def)))
894
598e19dc
LC
895(define (operating-system-locale-directory os)
896 "Return the directory containing the locales compiled for the definitions
897listed in OS. The C library expects to find it under
898/run/current-system/locale."
f5582b2c
LC
899 (define name
900 (operating-system-locale os))
901
902 (define definitions
903 ;; While we're at it, check whether NAME is defined and add it if needed.
904 (if (member name (map locale-definition-name
905 (operating-system-locale-definitions os)))
906 (operating-system-locale-definitions os)
907 (cons (locale-name->definition* name)
908 (operating-system-locale-definitions os))))
909
910 (locale-directory definitions
34760ae7 911 #:libcs (operating-system-locale-libcs os)))
598e19dc 912
c2e9942b
MO
913(define (kernel->boot-label kernel)
914 "Return a label for the bootloader menu entry that boots KERNEL."
42de9608 915 (string-append "GNU with "
2d23e6f0
LC
916 (string-titlecase (package-name kernel)) " "
917 (package-version kernel)
d0a65256 918 " (beta)"))
2d23e6f0 919
6b779207
LC
920(define (store-file-system file-systems)
921 "Return the file system object among FILE-SYSTEMS that contains the store."
922 (match (filter (lambda (fs)
923 (and (file-system-mount? fs)
924 (not (memq 'bind-mount (file-system-flags fs)))
925 (string-prefix? (file-system-mount-point fs)
926 (%store-prefix))))
927 file-systems)
928 ((and candidates (head . tail))
929 (reduce (lambda (fs1 fs2)
930 (if (> (string-length (file-system-mount-point fs1))
931 (string-length (file-system-mount-point fs2)))
932 fs1
933 fs2))
934 head
935 candidates))))
936
937(define (operating-system-store-file-system os)
938 "Return the file system that contains the store of OS."
939 (store-file-system (operating-system-file-systems os)))
940
c76b3046 941(define* (operating-system-bootcfg os #:optional (old-entries '()))
1975c754
DM
942 "Return the bootloader configuration file for OS. Use OLD-ENTRIES
943(which is a list of <menu-entry>) to populate the \"old entries\" menu."
0b6f49ef 944 (mlet* %store-monad
b4140694 945 ((system (operating-system-derivation os))
83bcd0b8 946 (root-fs -> (operating-system-root-file-system os))
9b336338 947 (root-device -> (file-system-device root-fs))
1975c754
DM
948 (params (operating-system-boot-parameters os system root-device))
949 (entry -> (boot-parameters->menu-entry params))
b09a8da4
MO
950 (bootloader-conf -> (operating-system-bootloader os)))
951 ((bootloader-configuration-file-generator
952 (bootloader-configuration-bootloader bootloader-conf))
953 bootloader-conf (list entry) #:old-entries old-entries)))
b4140694 954
360874dd
DM
955(define (operating-system-boot-parameters os system.drv root-device)
956 "Return a monadic <boot-parameters> record that describes the boot parameters
957of OS. SYSTEM.DRV is either a derivation or #f. If it's a derivation, adds
958kernel arguments for that derivation to <boot-parameters>."
40fad1c2
DM
959 (mlet* %store-monad
960 ((initrd (operating-system-initrd-file os))
961 (store -> (operating-system-store-file-system os))
bcaf67c4
MO
962 (bootloader -> (bootloader-configuration-bootloader
963 (operating-system-bootloader os)))
f96752e3 964 (bootloader-name -> (bootloader-name bootloader))
40fad1c2
DM
965 (label -> (kernel->boot-label (operating-system-kernel os))))
966 (return (boot-parameters
967 (label label)
968 (root-device root-device)
969 (kernel (operating-system-kernel-file os))
970 (kernel-arguments
360874dd
DM
971 (if system.drv
972 (operating-system-kernel-arguments os system.drv root-device)
973 (operating-system-user-kernel-arguments os)))
40fad1c2 974 (initrd initrd)
f96752e3 975 (bootloader-name bootloader-name)
a5acc17a 976 (store-device (ensure-not-/dev (file-system-device store)))
40fad1c2
DM
977 (store-mount-point (file-system-mount-point store))))))
978
9b336338
LC
979(define (device->sexp device)
980 "Serialize DEVICE as an sexp (really, as an object with a read syntax.)"
981 (match device
982 ((? uuid? uuid)
075681d3 983 `(uuid ,(uuid-type uuid) ,(uuid-bytevector uuid)))
a5acc17a
LC
984 ((? file-system-label? label)
985 `(file-system-label ,(file-system-label->string label)))
9b336338
LC
986 (_
987 device)))
988
40fad1c2
DM
989(define* (operating-system-boot-parameters-file os #:optional (system.drv #f))
990 "Return a file that describes the boot parameters of OS. The primary use of
991this file is the reconstruction of GRUB menu entries for old configurations.
992SYSTEM.DRV is optional. If given, adds kernel arguments for that system to the
993returned file (since the returned file is then usually stored into the
994content-addressed \"system\" directory, it's usually not a good idea
995to give it because the content hash would change by the content hash
996being stored into the \"parameters\" file)."
997 (mlet* %store-monad ((root -> (operating-system-root-file-system os))
998 (device -> (file-system-device root))
999 (params (operating-system-boot-parameters os
1000 system.drv
1001 device)))
1002 (gexp->file "parameters"
1003 #~(boot-parameters
1004 (version 0)
1005 (label #$(boot-parameters-label params))
9b336338
LC
1006 (root-device
1007 #$(device->sexp
1008 (boot-parameters-root-device params)))
40fad1c2
DM
1009 (kernel #$(boot-parameters-kernel params))
1010 (kernel-arguments
1011 #$(boot-parameters-kernel-arguments params))
1012 (initrd #$(boot-parameters-initrd params))
f96752e3 1013 (bootloader-name #$(boot-parameters-bootloader-name params))
40fad1c2 1014 (store
9b336338
LC
1015 (device
1016 #$(device->sexp (boot-parameters-store-device params)))
40fad1c2
DM
1017 (mount-point #$(boot-parameters-store-mount-point params))))
1018 #:set-load-path? #f)))
64e40dbb 1019
96da5d62
LC
1020(define-gexp-compiler (operating-system-compiler (os <operating-system>)
1021 system target)
1022 ((store-lift
1023 (lambda (store)
1024 ;; XXX: This is not super elegant but we can't pass SYSTEM and TARGET to
1025 ;; 'operating-system-derivation'.
1026 (run-with-store store (operating-system-derivation os)
1027 #:system system
1028 #:target target)))))
1029
033adfe7 1030;;; system.scm ends here