summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriel Wicki <gabriel@erlikon.ch>2024-05-23 16:07:04 -0400
committerGuix Patches Tester <>2024-05-23 23:24:24 +0200
commit8fae45e1e4893c6683518bf83145969b7f67f95e (patch)
tree4bc7091a10ef60b4a4bfe61acedbc0f27b1844b0
parentc3fe248e6987025c7d4ffdb6da0a3fc77f5a3f39 (diff)
downloadguix-patches-issue-69090.tar
guix-patches-issue-69090.tar.gz
gnu: services: Add resize-fs-service.issue-69090
* gnu/services/admin.scm (resize-fs-configuration): New configuration type. (resize-fs-script, resize-fs-shepherd-service): New procedures. resize-fs-service-type): New variable. * doc/guix.texi (Miscallaneous Services): Document it. Change-Id: Ib80c1af99ff62b68a79d7c463a5173f530514227
-rw-r--r--doc/guix.texi41
-rw-r--r--gnu/services/admin.scm89
2 files changed, 129 insertions, 1 deletions
diff --git a/doc/guix.texi b/doc/guix.texi
index 8073e3f6d4..29fde6bad5 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -41090,6 +41090,47 @@ Mode for filter.
@c End of auto-generated fail2ban documentation.
+@cindex resize-fs
+@subsubheading Resize Filesystem service
+
+This service type lets you resize a live file-system during boot, which
+can be convenient if you flashed Guix on an SD Card (e.g. for an
+embedded device) or uploaded the image to a VPS. In both cases the
+medium the image will reside upon may be larger than the image you want
+to produce.
+For an embedded device booting from an SD card you may use something like:
+@lisp
+(service resize-fs-service-type
+ (resize-fs-configuration
+ (device "/dev/mmcblk0")
+ (partition 2)))
+@end lisp
+
+Be extra cautious to use the correct device, partiion and end value, for
+the service will circumvent parted's safety checks - wrong use could end
+in loss of data or the corruption of your operating system.
+
+@table @asis
+
+@item @code{parted} (default: @code{parted}) (type: file-like)
+The parted package to use.
+
+@item @code{e2fsprogs} (default: @code{e2fsprogs}) (type: file-like)
+The e2fsprogs package to use.
+
+@item @code{device} (default: @code{"/dev/sdZ"}) (type: string)
+The device containing the file-system that shall be resized.
+
+@item @code{partition} (default: @code{-1}) (type: number)
+The partition number of the file-system that shall be resized.
+
+@item @code{end} (default: @code{"100%"}) (type: string)
+The end position of the resized partition as understood by the parted
+utility (e.g. "100%", "500M" or "16GiB").
+
+@end table
+
+
@node Setuid Programs
@section Setuid Programs
diff --git a/gnu/services/admin.scm b/gnu/services/admin.scm
index 0b325fddb1..acd7cacd3e 100644
--- a/gnu/services/admin.scm
+++ b/gnu/services/admin.scm
@@ -23,8 +23,11 @@
#:use-module (gnu packages admin)
#:use-module ((gnu packages base)
#:select (canonical-package findutils coreutils sed))
+ #:use-module (gnu packages bash)
#:use-module (gnu packages certs)
+ #:use-module (gnu packages disk)
#:use-module (gnu packages package-management)
+ #:use-module (gnu packages linux)
#:use-module (gnu services)
#:use-module (gnu services configuration)
#:use-module (gnu services mcron)
@@ -93,7 +96,16 @@
unattended-upgrade-configuration-services-to-restart
unattended-upgrade-configuration-system-expiration
unattended-upgrade-configuration-maximum-duration
- unattended-upgrade-configuration-log-file))
+ unattended-upgrade-configuration-log-file
+
+ resize-fs-configuration
+ resize-fs-configuration?
+ resize-fs-configuration-parted
+ resize-fs-configuration-e2fsprogs
+ resize-fs-configuration-device
+ resize-fs-configuration-partition
+ resize-fs-configuration-end
+ resize-fs-service-type))
;;; Commentary:
;;;
@@ -537,4 +549,79 @@ which lets you search for packages that provide a given file.")
"Periodically upgrade the system from the current configuration.")
(default-value (unattended-upgrade-configuration))))
+
+;;;
+;;; Resize filesystem.
+;;;
+
+(define-configuration/no-serialization resize-fs-configuration
+ (parted
+ (file-like parted)
+ "The parted package to use.")
+ (e2fsprogs
+ (file-like e2fsprogs)
+ "The e2fsprogs package providing the resize2fs utility.")
+ (device
+ (string "/dev/sdZ")
+ "The device containing the partition to be resized.")
+ (partition
+ (number -1)
+ "The partition number that is to be resized.")
+ (end
+ (string "100%")
+ "The end position of the resized partition as understood by the parted \
+utility (e.g. \"100%\", \"500M\" or \"16GiB\")."))
+
+(define (resize-fs-script config)
+ (match-record
+ config <resize-fs-configuration> (parted e2fsprogs device partition end)
+ (let ((parted-bin (file-append parted "/sbin/parted"))
+ (resize2fs (file-append e2fsprogs "/sbin/resize2fs"))
+ (device+partition (string-append device "p" (number->string partition))))
+ (mixed-text-file "resize-fs.sh"
+ "#!/bin/sh
+echoerr() { printf \"$*\\n\" >&2 ; }
+
+cmd() {
+ " parted-bin " " device " ---pretend-input-tty <<EOF && " resize2fs " " device+partition "
+resizepart
+" (number->string partition) "
+Yes
+" end "
+EOF
+}
+
+set -o errexit
+set -o pipefail
+
+if cmd; then
+ echoerr \"Resizing successful\"
+else
+ echoerr \"resize-script returned $?\"
+fi
+"))))
+
+(define (resize-fs-shepherd-service config)
+ "Return a list of <shepherd-service> for resize-fs-service for CONFIG."
+ (let ((resize-script (resize-fs-script config)))
+ (shepherd-service
+ (documentation "Resize a file-system. Intended for Guix Systems that are \
+booted from a system image flashed onto a larger medium.")
+ (provision '(resize-fs))
+ (requirement '(user-processes))
+ (one-shot? #t)
+ (respawn? #f)
+ (start #~(make-forkexec-constructor
+ (list #$(file-append bash "/bin/sh") #$resize-script))))))
+
+(define resize-fs-service-type
+ (service-type
+ (name 'resize-fs)
+ (description "Resize a partition during boot.")
+ (extensions
+ (list
+ (service-extension shepherd-root-service-type
+ (compose list resize-fs-shepherd-service))))
+ (default-value (resize-fs-configuration))))
+
;;; admin.scm ends here