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))))

Reply via email to