help-guix
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Resize Filesystem Service


From: Csepp
Subject: Re: Resize Filesystem Service
Date: Sun, 10 Dec 2023 18:03:59 +0100

#+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 <efraim@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.lechner@lease-up.com>
>> Sent: Monday, December 4, 2023 9:18 PM
>> To: Wicki Gabriel (wicg) <wicg@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.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]