doc: Add new Swap Space section.

* doc/guix.texi (operating-system Reference): Update swap-devices.
* doc/guix.texi (Swap Space): Add it.
* gnu/system/examples/desktop.tmpl: Add swap-devices example.

Signed-off-by: Ludovic Courtès <ludo@gnu.org>
This commit is contained in:
Josselin Poiret 2021-11-15 20:26:31 +00:00 committed by Ludovic Courtès
parent 4af3262d98
commit 9685c0637d
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
2 changed files with 116 additions and 38 deletions

View file

@ -319,6 +319,7 @@ System Configuration
* operating-system Reference:: Detail of operating-system declarations. * operating-system Reference:: Detail of operating-system declarations.
* File Systems:: Configuring file system mounts. * File Systems:: Configuring file system mounts.
* Mapped Devices:: Block device extra processing. * Mapped Devices:: Block device extra processing.
* Swap Space:: Backing RAM with disk space.
* User Accounts:: Specifying user accounts. * User Accounts:: Specifying user accounts.
* Keyboard Layout:: How the system interprets key strokes. * Keyboard Layout:: How the system interprets key strokes.
* Locales:: Language and cultural convention settings. * Locales:: Language and cultural convention settings.
@ -2515,10 +2516,9 @@ system relative to this path. If you have opted for @file{/boot/efi} as an
EFI mount point for example, mount it at @file{/mnt/boot/efi} now so it is EFI mount point for example, mount it at @file{/mnt/boot/efi} now so it is
found by @code{guix system init} afterwards. found by @code{guix system init} afterwards.
Finally, if you plan to use one or more swap partitions (@pxref{Memory Finally, if you plan to use one or more swap partitions (@pxref{Swap
Concepts, swap space,, libc, The GNU C Library Reference Manual}), make Space}), make sure to initialize them with @command{mkswap}. Assuming
sure to initialize them with @command{mkswap}. Assuming you have one you have one swap partition on @file{/dev/sda3}, you would run:
swap partition on @file{/dev/sda3}, you would run:
@example @example
mkswap /dev/sda3 mkswap /dev/sda3
@ -13987,6 +13987,7 @@ instance to support new system services.
* operating-system Reference:: Detail of operating-system declarations. * operating-system Reference:: Detail of operating-system declarations.
* File Systems:: Configuring file system mounts. * File Systems:: Configuring file system mounts.
* Mapped Devices:: Block device extra processing. * Mapped Devices:: Block device extra processing.
* Swap Space:: Backing RAM with disk space.
* User Accounts:: Specifying user accounts. * User Accounts:: Specifying user accounts.
* Keyboard Layout:: How the system interprets key strokes. * Keyboard Layout:: How the system interprets key strokes.
* Locales:: Language and cultural convention settings. * Locales:: Language and cultural convention settings.
@ -14155,7 +14156,7 @@ configuration, but with a few modifications.
@cindex encrypted disk @cindex encrypted disk
The configuration for a typical ``desktop'' usage, with an encrypted The configuration for a typical ``desktop'' usage, with an encrypted
root partition, the X11 display root partition, a swap file on the root partition, the X11 display
server, GNOME and Xfce (users can choose which of these desktop server, GNOME and Xfce (users can choose which of these desktop
environments to use at the log-in screen by pressing @kbd{F1}), network environments to use at the log-in screen by pressing @kbd{F1}), network
management, power management, and more, would look like this: management, power management, and more, would look like this:
@ -14353,38 +14354,9 @@ A list of mapped devices. @xref{Mapped Devices}.
@item @code{file-systems} @item @code{file-systems}
A list of file systems. @xref{File Systems}. A list of file systems. @xref{File Systems}.
@cindex swap devices
@cindex swap space
@item @code{swap-devices} (default: @code{'()}) @item @code{swap-devices} (default: @code{'()})
A list of UUIDs, file system labels, or strings identifying devices or @cindex swap devices
files to be used for ``swap A list of swap spaces. @xref{Swap Space}.
space'' (@pxref{Memory Concepts,,, libc, The GNU C Library Reference
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 (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}) @item @code{users} (default: @code{%base-user-accounts})
@itemx @code{groups} (default: @code{%base-groups}) @itemx @code{groups} (default: @code{%base-groups})
@ -14974,7 +14946,8 @@ It is also desirable to encrypt swap space, since swap space may contain
sensitive data. One way to accomplish that is to use a swap file in a sensitive data. One way to accomplish that is to use a swap file in a
file system on a device mapped via LUKS encryption. In this way, the file system on a device mapped via LUKS encryption. In this way, the
swap file is encrypted because the entire device is encrypted. swap file is encrypted because the entire device is encrypted.
@xref{Preparing for Installation,,Disk Partitioning}, for an example. @xref{Swap Space}, or @xref{Preparing for Installation,,Disk
Partitioning}, for an example.
A RAID device formed of the partitions @file{/dev/sda1} and @file{/dev/sdb1} A RAID device formed of the partitions @file{/dev/sda1} and @file{/dev/sdb1}
may be declared as follows: may be declared as follows:
@ -15006,6 +14979,106 @@ Devices @file{/dev/mapper/vg0-alpha} and @file{/dev/mapper/vg0-beta} can
then be used as the @code{device} of a @code{file-system} declaration then be used as the @code{device} of a @code{file-system} declaration
(@pxref{File Systems}). (@pxref{File Systems}).
@node Swap Space
@section Swap Space
@cindex swap space
Swap space, as it is commonly called, is a disk area specifically
designated for paging: the process in charge of memory management
(the Linux kernel or Hurd's default pager) can decide that some memory
pages stored in RAM which belong to a running program but are unused
should be stored on disk instead. It unloads those from the RAM,
freeing up precious fast memory, and writes them to the swap space. If
the program tries to access that very page, the memory management
process loads it back into memory for the program to use.
A common misconception about swap is that it is only useful when small
amounts of RAM are available to the system. However, it should be noted
that kernels often use all available RAM for disk access caching to make
I/O faster, and thus paging out unused portions of program memory will
expand the RAM available for such caching.
For a more detailed description of how memory is managed from the
viewpoint of a monolithic kernel, @xref{Memory
Concepts,,, libc, The GNU C Library Reference Manual}.
The Linux kernel has support for swap partitions and swap files: the
former uses a whole disk partition for paging, whereas the second uses a
file on a file system for that (the file system driver needs to support
it). On a comparable setup, both have the same performance, so one
should consider ease of use when deciding between them. Partitions are
``simpler'' and do not need file system support, but need to be
allocated at disk formatting time (logical volumes notwithstanding),
whereas files can be allocated and deallocated at any time.
Note that swap space is not zeroed on shutdown, so sensitive data (such
as passwords) may linger on it if it was paged out. As such, you should
consider having your swap reside on an encrypted device (@pxref{Mapped
Devices}).
@deftp {Data Type} swap-space
Objects of this type represent swap spaces. They contain the following
members:
@table @asis
@item @code{target}
The device or file to use, either a UUID, a @code{file-system-label} or
a string, as in the definition of a @code{file-system} (@pxref{File
Systems}).
@item @code{dependencies} (default: @code{'()})
A list of @code{file-system} or @code{mapped-device} objects, upon which
the availability of the space depends. Note that just like for
@code{file-system} objects, dependencies which are needed for boot and
mounted in early userspace are not managed by the Shepherd, and so
automatically filtered out for you.
@item @code{priority} (default: @code{#f})
Only supported by the Linux kernel. Either @code{#f} to disable swap
priority, or an integer between 0 and 32767. The kernel will first use
swap spaces of higher priority when paging, and use same priority spaces
on a round-robin basis. The kernel will use swap spaces without a set
priority after prioritized spaces, and in the order that they appeared in
(not round-robin).
@item @code{discard?} (default: @code{#f})
Only supported by the Linux kernel. When true, the kernel will notify
the disk controller of discarded pages, for example with the TRIM
operation on Solid State Drives.
@end table
@end deftp
Here are some examples:
@lisp
(swap-space (target (uuid "4dab5feb-d176-45de-b287-9b0a6e4c01cb")))
@end lisp
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.
@lisp
(swap-space
(target (file-system-label "swap"))
(dependencies (list lvm-device)))
@end lisp
Use the partition with label @code{swap}, which can be found after the
@var{lvm-device} mapped device has been opened. Again, the
@command{swaplabel} command allows you to view and change the label of a
Linux swap partition.
@lisp
(swap-space
(target "/btrfs/swapfile")
(dependencies (list btrfs-fs)))
@end lisp
Use the file @file{/btrfs/swapfile} as swap space, which is present on the
@var{btrfs-fs} filesystem.
@node User Accounts @node User Accounts
@section User Accounts @section User Accounts

View file

@ -1,6 +1,6 @@
;; This is an operating system configuration template ;; This is an operating system configuration template
;; for a "desktop" setup with GNOME and Xfce where the ;; for a "desktop" setup with GNOME and Xfce where the
;; root partition is encrypted with LUKS. ;; root partition is encrypted with LUKS, and a swap file.
(use-modules (gnu) (gnu system nss)) (use-modules (gnu) (gnu system nss))
(use-service-modules desktop xorg) (use-service-modules desktop xorg)
@ -42,6 +42,11 @@
(type "vfat"))) (type "vfat")))
%base-file-systems)) %base-file-systems))
;; Specify a swap file for the system, which resides on the
;; root file system.
(swap-devices (list (swap-space
(target "/swapfile"))))
;; Create user `bob' with `alice' as its initial password. ;; Create user `bob' with `alice' as its initial password.
(users (cons (user-account (users (cons (user-account
(name "bob") (name "bob")