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.master
parent
11e19555e5
commit
81c3dd9cad
|
@ -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})
|
||||
|
|
|
@ -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))))
|
||||
'()))
|
||||
|
||||
(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 (symbol-append 'swap- (string->symbol device))))
|
||||
(provision (list service-name))
|
||||
(requirement `(udev ,@requirement))
|
||||
(documentation "Enable the given swap device.")
|
||||
(modules `((gnu build file-systems)
|
||||
,@%default-modules))
|
||||
(start #~(lambda ()
|
||||
(restart-on-EINTR (swapon #$device))
|
||||
#t))
|
||||
(let ((device #$(device-lookup device)))
|
||||
(and device
|
||||
(begin
|
||||
(restart-on-EINTR (swapon device))
|
||||
#t)))))
|
||||
(stop #~(lambda _
|
||||
(restart-on-EINTR (swapoff #$device))
|
||||
#f))
|
||||
(respawn? #f)))))
|
||||
(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."
|
||||
|
|
Reference in New Issue