Hi
Thanks for the input, Felix. I finally managed to get it to work (with
additional input from ludo). I attach the service to this mail. If people
think this might be a nice-to-have in upstream guix i'll happily craft a patch.
g
________________________________
From: Felix Lechner <[email protected]>
Sent: Monday, December 4, 2023 9:18 PM
To: Wicki Gabriel (wicg) <[email protected]>; [email protected] <[email protected]>
Subject: Re: Resize Filesystem Service
Hi Gabriel,
On Mon, Dec 04 2023, Wicki Gabriel wrote:
> I crafted the service in the file attached but this doesn't work and i
> neither know where to look nor how to debug the issue.
Writing services is probably more complex than it should be, but it can
be done.
Please have a look at the cachefilesd-service [1] which I wrote together
with Bruno Victal (mirai) and which was accepted, or the Heimdal
Kerberos services that are still waiting for review. [2]
My most immediate suggestion is that I would use define-configuration
even when no serialization (which helps write configuration files) is
needed. Also, you have to think carefully about where to place the
G-Expressions, which can be tough to wrap your mind arround. Finally, I
would use "file-append" instead of string-append for some of the
configurable executable paths.
Kind regards
Felix
[1] https://git.savannah.gnu.org/cgit/guix.git/tree/gnu/services/linux.scm#n492
[2] https://issues.guix.gnu.org/67555
(define-module (services resize-fs)
#:use-module (guix gexp)
#:use-module (guix records)
#:use-module (gnu packages bash)
#:use-module (gnu packages disk) ; parted
#:use-module (gnu packages linux); e2fsprogs
#:use-module (guix build utils)
#:use-module (guix packages)
#:use-module (gnu services)
#:use-module (gnu services configuration)
#:use-module (gnu services shepherd)
#:export (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))
(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/mmcblk0") ;; #f may be preferrable here to prevent accidental resizing of wrong file-system
"The device containing the partition to be resized.")
(partition
(number 2)
"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
echoerr hello from resize-fs script
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 an image")
(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.")
(extensions
(list
(service-extension shepherd-root-service-type
(compose list resize-fs-shepherd-service))))
(default-value (resize-fs-configuration))))