services: swap: Allow for UUIDs and file system labels.

* gnu/services/base.scm (swap-service-type)[device-lookup, device-name]:
New variables.
Add 'modules' field to 'shepherd-service'.  In 'start' and 'stop', use
'device-lookup' to resolve UUIDs and labels.
* doc/guix.texi (operating-system Reference): Adjust accordingly.
This commit is contained in:
Ludovic Courtès 2020-10-23 11:46:21 +02:00
parent 11e19555e5
commit 81c3dd9cad
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
2 changed files with 71 additions and 17 deletions

View File

@ -13075,14 +13075,38 @@ A list of mapped devices. @xref{Mapped Devices}.
@item @code{file-systems}
A list of file systems. @xref{File Systems}.
@item @code{swap-devices} (default: @code{'()})
@cindex swap devices
A list of strings identifying devices or files to be used for ``swap
@cindex swap space
@item @code{swap-devices} (default: @code{'()})
A list of UUIDs, file system labels, or strings identifying devices or
files to be used for ``swap
space'' (@pxref{Memory Concepts,,, libc, The GNU C Library Reference
Manual}). For example, @code{'("/dev/sda3")} or @code{'("/swapfile")}.
Manual}). Here are some examples:
@table @code
@item (list (uuid "4dab5feb-d176-45de-b287-9b0a6e4c01cb"))
Use the swap partition with the given UUID. You can learn the UUID of a
Linux swap partition by running @command{swaplabel @var{device}}, where
@var{device} is the @file{/dev} file name of that partition.
@item (list (file-system-label "swap"))
Use the partition with label @code{swap}. Again, the
@command{swaplabel} command allows you to view and change the label of a
Linux swap partition.
@item (list "/swapfile")
Use the file @file{/swapfile} as swap space.
@item (list "/dev/sda3" "/dev/sdb2")
Use the @file{/dev/sda3} and @file{/dev/sdb2} partitions as swap space.
We recommend referring to swap devices by UUIDs or labels as shown above
instead.
@end table
It is possible to specify a swap file in a file system on a mapped
device, provided that the necessary device mapping and file system are
also specified. @xref{Mapped Devices} and @ref{File Systems}.
device (under @file{/dev/mapper}), provided that the necessary device
mapping and file system are also specified. @xref{Mapped Devices} and
@ref{File Systems}.
@item @code{users} (default: @code{%base-user-accounts})
@itemx @code{groups} (default: @code{%base-groups})

View File

@ -2104,22 +2104,52 @@ instance."
'swap
(lambda (device)
(define requirement
(if (string-prefix? "/dev/mapper/" device)
(if (and (string? device)
(string-prefix? "/dev/mapper/" device))
(list (symbol-append 'device-mapping-
(string->symbol (basename device))))
'()))
(shepherd-service
(provision (list (symbol-append 'swap- (string->symbol device))))
(requirement `(udev ,@requirement))
(documentation "Enable the given swap device.")
(start #~(lambda ()
(restart-on-EINTR (swapon #$device))
#t))
(stop #~(lambda _
(restart-on-EINTR (swapoff #$device))
#f))
(respawn? #f)))))
(define (device-lookup device)
;; The generic 'find-partition' procedures could return a partition
;; that's not swap space, but that's unlikely.
(cond ((uuid? device)
#~(find-partition-by-uuid #$(uuid-bytevector device)))
((file-system-label? device)
#~(find-partition-by-label
#$(file-system-label->string device)))
(else
device)))
(define service-name
(symbol-append 'swap-
(string->symbol
(cond ((uuid? device)
(string-take (uuid->string device) 6))
((file-system-label? device)
(file-system-label->string device))
(else
device)))))
(with-imported-modules (source-module-closure '((gnu build file-systems)))
(shepherd-service
(provision (list service-name))
(requirement `(udev ,@requirement))
(documentation "Enable the given swap device.")
(modules `((gnu build file-systems)
,@%default-modules))
(start #~(lambda ()
(let ((device #$(device-lookup device)))
(and device
(begin
(restart-on-EINTR (swapon device))
#t)))))
(stop #~(lambda _
(let ((device #$(device-lookup device)))
(when device
(restart-on-EINTR (swapoff device)))
#f)))
(respawn? #f))))))
(define (swap-service device)
"Return a service that uses @var{device} as a swap device."