Re: Resize Filesystem Service

2023-12-12 Thread Wicki Gabriel (wicg)
Would you mind giving my previously attached service a try and tell me whether 
this works?

If there is no other input I will just prepare a patch where the service 
renders a bash script which (somewhat stupidly) attempts to resize the 
file-system at (every!) boot - mostly because I'm not sure whether we have the 
facilities to (or I wouldn't know how)

  1.  run a service once per system generation (or some other measure) and
  2.  to construct such a Shell-script in a more verifiable or maintainable 
fashion in Guile (though I'd be willing to write relevant helper functions)

Thanks for all your input!  If there is no more input I'll just prepare some 
patch from the existing service.

P.S. Since this isn't a classic "help" problem anymore I'm moving the 
discussion over to the devel-list.

From: Csepp 
Sent: Sunday, December 10, 2023 6:03 PM
To: Efraim Flashner 
Cc: Wicki Gabriel (wicg) ; help-guix@gnu.org 
Subject: Re: Resize Filesystem Service

#+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  writes:

> [[PGP Signed Part:Undecided]]
> On Thu, Dec 07, 2023 at 09:25:43AM +, 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 
>> Sent: Monday, December 4, 2023 9:18 PM
>> To: Wicki Gabriel (wicg) ; 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\")."))
>>
&g

Re: Resize Filesystem Service

2023-12-10 Thread Csepp
#+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  writes:

> [[PGP Signed Part:Undecided]]
> On Thu, Dec 07, 2023 at 09:25:43AM +, 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 
>> Sent: Monday, December 4, 2023 9:18 PM
>> To: Wicki Gabriel (wicg) ; 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  (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 <> 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 successf

Re: Resize Filesystem Service

2023-12-07 Thread Efraim Flashner
On Thu, Dec 07, 2023 at 09:25:43AM +, 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 
> Sent: Monday, December 4, 2023 9:18 PM
> To: Wicki Gabriel (wicg) ; 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  (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 < 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  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))

Re: Resize Filesystem Service

2023-12-07 Thread Wicki Gabriel (wicg)
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 
Sent: Monday, December 4, 2023 9:18 PM
To: Wicki Gabriel (wicg) ; 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  (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 <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  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


Re: Resize Filesystem Service

2023-12-04 Thread Felix Lechner via
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



Resize Filesystem Service

2023-12-04 Thread Wicki Gabriel (wicg)
Hi

For a small embedded software project I need a resize-fs-service: a one-shot 
service started during boot that ensures that the rootfs (created from a guix 
system image foo.scm​ command) uses all of the medium's space -- creating an 
image of the correct size is completely infeasible as you may imagine.

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.

Any ideas are deeply appreciated!

Thanks for your time and effort!
Gabriel aka gabber

--
Gabriel Wicki
Research Assistant

ZHAW, Zurich University of Applied Sciences
InES, Institute of Embedded Systems
High Integrity Systems Group

Technikumstrasse 22, Postfach
CH-8401 Winterthur
--
E-Mail: w...@zhaw.ch
Web: http://ines.zhaw.ch
(define-module (resize-fs)
  #:use-module (gnu packages disk)
  #:use-module (gnu packages linux)

  #:use-module (guix build utils)
  #:use-module (guix packages)

  #:use-module (gnu services)
  #:use-module (guix gexp)
  #:use-module (guix records)
  #:use-module (gnu services shepherd))

(define (resize-fs-service config)
  (use-modules (guix gexp))
  (define parted #$(string-append (or (resize-fs-configuration-parted config)
  parted)
  "/sbin/parted"))
  (define resize2fs #$(string-append (or (resize-fs-configuration-e2fsprogs config)
 e2fsprogs)
 "/sbin/resize2fs"))
  (define size #$(resize-fs-configuration-size config))
  (define device #$(resize-fs-configuration-device config))
  (define partition #$(resize-fs-configuration-partition config))
  (define device+partition (string-append device "p" partition))

  (shepherd-service
   (documentation "Resize a file-system.  Intended for Guix Systems that are booted from an image")
   (provision '(resize-fs))
   (one-shot? #t)
   (requirement '())
   (start #~(invoke (plain-file "resize_partition.bash"
(string-append
 "#!/bin/sh
parted " #$device " ---pretend-input-tty <
  resize-fs-configuration make-resize-fs-configuration
  resize-fs-configuration?
  ;; the utilities doing the job
  (parted resize-fs-configuraiton-parted
  (default parted))
  (e2fsprogs resize-fs-configuration-e2fsprogs
 (default e2fsprogs))
  ;; path of a device
  (device resize-fs-configuration-device
  (default "/dev/mmcblk0")) ; #f may be preferrable here
  ;; integer
  (partition resize-fs-configuration-partition
 (default 2))
  ;; size - as understood by parted
  (size resize-fs-configuration-size
(default "100%")))

(define-public resize-fs-service-type
  (service-type
   (name 'resize-fs)
   (extensions
(list (service-extension shepherd-root-service-type resize-fs-service)))
   (description "Resize a partition.")
   (default-value (resize-fs-configuration