#+OPTIONS: html-postamble:nil H:5 num:nil ^:{} toc:nil author:nil email:nil tex:dvipng d:nil #+STARTUP: hidestars indent inlineimages :PROPERTIES: :reply-to: nil :attachment: nil :alternatives: (utf-8) :END:
Efraim Flashner <efr...@flashner.co.il> writes: > [[PGP Signed Part:Undecided]] > On Thu, Dec 07, 2023 at 09:25:43AM +0000, Wicki Gabriel (wicg) wrote: >> 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)))) > > I think it would be helpful to have upstream. I'm guessing it would be > useful not just on single board computers but also on VPSs and probably > other use cases. > > Not directly related to upstreaming this service, this seems like a > useful service to offer for an 'on first boot' service, or as some sort > of special service to be loaded with 'sudo herd load root'. I tried to write something similar for my VPS but it wasn't working at boot, although it did if I restarted the service. So I for one would be very grateful if a working resizer service were upstreamed.