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 <felix.lech...@lease-up.com> Sent: Monday, December 4, 2023 9:18 PM To: Wicki Gabriel (wicg) <w...@zhaw.ch>; help-guix@gnu.org <help-guix@gnu.org> 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))))