bug#33517: Problem booting when using btrfs subvolume for /gnu/store

2020-05-20 Thread Maxim Cournoyer
Hi Christopher,

Christopher Baines  writes:

> Maxim Cournoyer  writes:
>
>> Hello,
>>
>> Christopher Baines  writes:
>>
>>> I'm loosing track of this issue a bit, as I've been dealing with it for
>>> a while. I have a machine that I've setup where /gnu/store is a btrfs
>>> subvolume. I do this so that I can make flexible use of the space on
>>> that btrfs filesystem.
>>>
>>> Unfortunately, the grub configuration generated for this doesn't seem to
>>> account for this, and so it requires some tweaking to get it to boot.
>>
>> [...]
>>
>> This issue is now resolved as of commit
>> 12df6684b983507b2a73e14f45d28a71cddfb3b1 on master.
>
> Thanks Maxim, I'm guessing the commit that fixes this is
> b460ba7992a0b4af2ddb5927dcf062784539ef7b.
>
> Chris

Yes (and the two supporting commits right before this one).  The one I
pointed to includes a news entry.

Maxim





bug#33517: Problem booting when using btrfs subvolume for /gnu/store

2020-05-20 Thread Christopher Baines

Maxim Cournoyer  writes:

> Hello,
>
> Christopher Baines  writes:
>
>> I'm loosing track of this issue a bit, as I've been dealing with it for
>> a while. I have a machine that I've setup where /gnu/store is a btrfs
>> subvolume. I do this so that I can make flexible use of the space on
>> that btrfs filesystem.
>>
>> Unfortunately, the grub configuration generated for this doesn't seem to
>> account for this, and so it requires some tweaking to get it to boot.
>
> [...]
>
> This issue is now resolved as of commit
> 12df6684b983507b2a73e14f45d28a71cddfb3b1 on master.

Thanks Maxim, I'm guessing the commit that fixes this is
b460ba7992a0b4af2ddb5927dcf062784539ef7b.

Chris


signature.asc
Description: PGP signature


bug#33517: Problem booting when using btrfs subvolume for /gnu/store

2020-05-20 Thread Maxim Cournoyer
Hello,

Christopher Baines  writes:

> I'm loosing track of this issue a bit, as I've been dealing with it for
> a while. I have a machine that I've setup where /gnu/store is a btrfs
> subvolume. I do this so that I can make flexible use of the space on
> that btrfs filesystem.
>
> Unfortunately, the grub configuration generated for this doesn't seem to
> account for this, and so it requires some tweaking to get it to boot.

[...]

This issue is now resolved as of commit
12df6684b983507b2a73e14f45d28a71cddfb3b1 on master.

Closing!

Maxim





bug#33517: Problem booting when using btrfs subvolume for /gnu/store

2019-09-26 Thread Maxim Cournoyer
Hi Christopher,

Christopher Baines  writes:

> Ludovic Courtès  writes:
>
>> Hello,
>>
>> Christopher Baines  skribis:
>>
>>> Unfortunately, it's not a proper solution, as it obviously breaks when
>>> you actually want to strip the mount point off so that grub can find the
>>> right files.
>>
>> Is there a way ‘strip-mount-point’ or some higher-level code could
>> determine whether we actually need to strip the mount point?
>
> So, this is the file-system value that I'm using currently for the
> store. The information about subvolume is in the options value.
>
> (file-system
>   (device (uuid "84fc6b78-d7ff-45df-8659-bef44b5bf0ea"))
>   (type "btrfs")
>   (title 'uuid)
>   (mount-point "/gnu/store")
>   (needed-for-boot? #t)
>   (options "subvol=/gnu/store"))

Ah, that subvolume name explains why your fix would work.  I was
confused at first why such fix should work.

Grub mounts the Btrfs partition at its 'top level'.  In Btrfs, the
subvolume names appear as directories under the top level, so in your
case not striping the mount-point amounts to prepending the subvolume
name to the "real" file path location (as it has the same value as the
mount-point).

That means that your fix only works when mount-point == subvol.

Maxim





bug#33517: Problem booting when using btrfs subvolume for /gnu/store

2019-09-05 Thread Maxim Cournoyer
Hello,

"Svante v. Erichsen"  writes:

> The subvolume and the mount point are independent issues.
>
> For example, I have a subvolume named @ as root volume:
>
> (file-system
>   (device "/dev/mapper/hd")
>   (mount-point "/")
>   (type "btrfs")
>   (options "compress=lzo,ssd,subvol=@"))
>
> It also appears that the subvolume name must be prepended to the path as if it
> just was an ordinary directory (grub.cfg):
>
> …
>   linux /@/gnu/store/…
> …
>
> I could not yet confirm this from documentation, but it works like that for 
> me.
> (I semi-manually edit the generated grub.cfg currently.)
>
> So, additionally to stripping the mount point, the subvolume needs to be
> prepended (grub.scm):
>
>   (let ((kernel (prepend-subvol device-subvol
> (strip-mount-point device-mount-point
>kernel)))
> (initrd (prepend-subvol device-subvol
> (strip-mount-point device-mount-point
>initrd
> …)
>
> This would mean that the menu-entry structure needs the subvol information.
> However, I wouldn't want to parse this from the options field in the 
> file-system
> entry, so I'd propose allowing a list there, maybe like this:
>
> (file-system
>   (device "/dev/mapper/hd")
>   (mount-point "/")
>   (type "btrfs")
>   (options '(("compress" . "lzo")
>  "ssd"
>  ("subvol" . "@"
>
> On the other hand, it might be surprising that declaring the options like this
> would work for subvols, while using a string doesn't, especially when some 
> older
> documentation/blogs/gists is still hanging around on the internet, so maybe it
> would be necessary to parse the options anyway (to this list structure).
>
> I'm lacking experience in guix and guile, so making this work and submit a 
> patch
> will take me some time.
>
> Do you think this is sensible?

I had not seen this issue before implementing the solution, but it seems
we've reached the same conclusion in that the entries of initrd and
kernel of the Grub configuration need to be prepended with the subvolume
name in order for Grub to successfully boot from a subvolume.

My implementation differs a bit in that the subvolume name to be used in
the Grub config is parsed from the kernel argument "rootflags=" value;
the reasoning being that you'd have to specify it there anyway for the
kernel to mount the root partition correctly (for non-root partitions,
fstab (file-system fields) can take care of it alone).

If anyone wants to give it a try, it's available to review here:
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=37305.

Maxim





bug#33517: Problem booting when using btrfs subvolume for /gnu/store

2019-01-26 Thread Svante v. Erichsen
The subvolume and the mount point are independent issues.

For example, I have a subvolume named @ as root volume:

(file-system
  (device "/dev/mapper/hd")
  (mount-point "/")
  (type "btrfs")
  (options "compress=lzo,ssd,subvol=@"))

It also appears that the subvolume name must be prepended to the path as if it
just was an ordinary directory (grub.cfg):

…
  linux /@/gnu/store/…
…

I could not yet confirm this from documentation, but it works like that for me.
(I semi-manually edit the generated grub.cfg currently.)

So, additionally to stripping the mount point, the subvolume needs to be
prepended (grub.scm):

  (let ((kernel (prepend-subvol device-subvol
(strip-mount-point device-mount-point
   kernel)))
(initrd (prepend-subvol device-subvol
(strip-mount-point device-mount-point
   initrd
…)

This would mean that the menu-entry structure needs the subvol information.
However, I wouldn't want to parse this from the options field in the file-system
entry, so I'd propose allowing a list there, maybe like this:

(file-system
  (device "/dev/mapper/hd")
  (mount-point "/")
  (type "btrfs")
  (options '(("compress" . "lzo")
 "ssd"
 ("subvol" . "@"

On the other hand, it might be surprising that declaring the options like this
would work for subvols, while using a string doesn't, especially when some older
documentation/blogs/gists is still hanging around on the internet, so maybe it
would be necessary to parse the options anyway (to this list structure).

I'm lacking experience in guix and guile, so making this work and submit a patch
will take me some time.

Do you think this is sensible?


-- 
Svante von Erichsen

GPG fingerprint: A78A D4FB 762F A922 A495  57E8 2649 9081 6E61 20DE


signature.asc
Description: Digital signature


bug#33517: Problem booting when using btrfs subvolume for /gnu/store

2018-12-01 Thread Christopher Baines

Ludovic Courtès  writes:

> Hello,
>
> Christopher Baines  skribis:
>
>> Unfortunately, it's not a proper solution, as it obviously breaks when
>> you actually want to strip the mount point off so that grub can find the
>> right files.
>
> Is there a way ‘strip-mount-point’ or some higher-level code could
> determine whether we actually need to strip the mount point?

So, this is the file-system value that I'm using currently for the
store. The information about subvolume is in the options value.

(file-system
  (device (uuid "84fc6b78-d7ff-45df-8659-bef44b5bf0ea"))
  (type "btrfs")
  (title 'uuid)
  (mount-point "/gnu/store")
  (needed-for-boot? #t)
  (options "subvol=/gnu/store"))

I guess one approach for dealing with this would be to allow directly
configuring the stripping of the mount point somehow. Or maybe having
some btrfs-file-system record, which could store the subvol option in a
more machine readable way.

One thing that still makes me uncertian, is how grub actually is trying
to find files on the btrfs filesystem. I tried changing the default
subvolume to the one containing the store, but that didn't seem to
help. Looks like it might not be aware of subvolumes.


signature.asc
Description: PGP signature


bug#33517: Problem booting when using btrfs subvolume for /gnu/store

2018-11-28 Thread Ludovic Courtès
Hello,

Christopher Baines  skribis:

> I'm loosing track of this issue a bit, as I've been dealing with it for
> a while. I have a machine that I've setup where /gnu/store is a btrfs
> subvolume. I do this so that I can make flexible use of the space on
> that btrfs filesystem.
>
> Unfortunately, the grub configuration generated for this doesn't seem to
> account for this, and so it requires some tweaking to get it to boot.
>
> A long while back, I discovered I could make the following change, then
> the generated grub configuration would be fine.
>
>
> ---
>  gnu/bootloader/grub.scm | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/gnu/bootloader/grub.scm b/gnu/bootloader/grub.scm
> index 06856dd58c..c3ddc3e128 100644
> --- a/gnu/bootloader/grub.scm
> +++ b/gnu/bootloader/grub.scm
> @@ -320,8 +320,8 @@ entries corresponding to old generations of the system."
>;; Use the right file names for KERNEL and INITRD in case
>;; DEVICE-MOUNT-POINT is not "/", meaning that the store is on a
>;; separate partition.
> -  (let ((kernel  (strip-mount-point device-mount-point kernel))
> -(initrd  (strip-mount-point device-mount-point initrd)))
> +  (let ((kernel kernel)
> +(initrd initrd))
>  #~(format port "menuentry ~s {
>~a
>linux ~a ~a
> --
> 2.19.2
>
>
>
> Unfortunately, it's not a proper solution, as it obviously breaks when
> you actually want to strip the mount point off so that grub can find the
> right files.

Is there a way ‘strip-mount-point’ or some higher-level code could
determine whether we actually need to strip the mount point?

Thanks,
Ludo’.





bug#33517: Problem booting when using btrfs subvolume for /gnu/store

2018-11-26 Thread Christopher Baines
I'm loosing track of this issue a bit, as I've been dealing with it for
a while. I have a machine that I've setup where /gnu/store is a btrfs
subvolume. I do this so that I can make flexible use of the space on
that btrfs filesystem.

Unfortunately, the grub configuration generated for this doesn't seem to
account for this, and so it requires some tweaking to get it to boot.

A long while back, I discovered I could make the following change, then
the generated grub configuration would be fine.


---
 gnu/bootloader/grub.scm | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/gnu/bootloader/grub.scm b/gnu/bootloader/grub.scm
index 06856dd58c..c3ddc3e128 100644
--- a/gnu/bootloader/grub.scm
+++ b/gnu/bootloader/grub.scm
@@ -320,8 +320,8 @@ entries corresponding to old generations of the system."
   ;; Use the right file names for KERNEL and INITRD in case
   ;; DEVICE-MOUNT-POINT is not "/", meaning that the store is on a
   ;; separate partition.
-  (let ((kernel  (strip-mount-point device-mount-point kernel))
-(initrd  (strip-mount-point device-mount-point initrd)))
+  (let ((kernel kernel)
+(initrd initrd))
 #~(format port "menuentry ~s {
   ~a
   linux ~a ~a
--
2.19.2


Unfortunately, it's not a proper solution, as it obviously breaks when
you actually want to strip the mount point off so that grub can find the
right files.

I'm creating a bug for this, as I think it would be good to track the
issue. I've also written a system test that I believe reproduced the
issue.

From 7eee5685f95d0b6baeb97f5fdd947fe5223a61c9 Mon Sep 17 00:00:00 2001
From: Christopher Baines 
Date: Fri, 26 Oct 2018 18:48:32 +0100
Subject: [PATCH] WIP Btrfs store subvolume test

---
 gnu/tests/install.scm | 91 ++-
 1 file changed, 90 insertions(+), 1 deletion(-)

diff --git a/gnu/tests/install.scm b/gnu/tests/install.scm
index 4764de..cfa071187c 100644
--- a/gnu/tests/install.scm
+++ b/gnu/tests/install.scm
@@ -43,7 +43,8 @@
 %test-separate-home-os
 %test-raid-root-os
 %test-encrypted-os
-%test-btrfs-root-os))
+%test-btrfs-root-os
+%test-btrfs-root-with-store-subvolume-os))
 
 ;;; Commentary:
 ;;;
@@ -826,4 +827,92 @@ build (current-guix) and then store a couple of full system images.")
  (command (qemu-command/writable-image image)))
   (run-basic-test %btrfs-root-os command "btrfs-root-os")
 
+
+;;;
+;;; Btrfs root file system with store subvolume.
+;;;
+
+(define-os-with-source (%btrfs-root-with-store-subvolume-os
+%btrfs-root-with-store-subvolume-os-source)
+  ;; The OS we want to install.
+  (use-modules (gnu) (gnu tests) (srfi srfi-1))
+
+  (operating-system
+(host-name "liberigilo")
+(timezone "Europe/Paris")
+(locale "en_US.UTF-8")
+
+(bootloader (bootloader-configuration
+ (bootloader grub-bootloader)
+ (target "/dev/vdb")))
+(kernel-arguments '("console=ttyS0"))
+(file-systems (cons* (file-system
+   (device (file-system-label "my-root"))
+   (mount-point "/")
+   (type "btrfs"))
+ (file-system
+   (device (file-system-label "my-root"))
+   (mount-point "/gnu/store")
+   (type "btrfs")
+   (options "subvol=/gnu/store"))
+ %base-file-systems))
+(users (cons (user-account
+  (name "charlie")
+  (group "users")
+  (home-directory "/home/charlie")
+  (supplementary-groups '("wheel" "audio" "video")))
+ %base-user-accounts))
+(services (cons (service marionette-service-type
+ (marionette-configuration
+  (imported-modules '((gnu services herd)
+  (guix combinators)
+%base-services
+
+(define %btrfs-root-with-store-subvolume-installation-script
+  ;; Shell script of a simple installation.
+  "\
+. /etc/profile
+set -e -x
+guix --version
+
+export GUIX_BUILD_OPTIONS=--no-grafts
+ls -l /run/current-system/gc-roots
+parted --script /dev/vdb mklabel gpt \\
+  mkpart primary ext2 1M 3M \\
+  mkpart primary ext2 3M 2G \\
+  set 1 boot on \\
+  set 1 bios_grub on
+mkfs.btrfs -L my-root /dev/vdb2
+mount /dev/vdb2 /mnt
+btrfs subvolume create /mnt/home
+mkdir /mnt/gnu
+btrfs subvolume create /mnt/gnu/store
+herd start cow-store /mnt
+mkdir /mnt/etc
+cp /etc/target-config.scm /mnt/etc/config.scm
+guix system build /mnt/etc/config.scm
+guix system init /mnt/etc/config.scm /mnt --no-substitutes
+sync
+reboot\n")
+
+(define %test-btrfs-root-with-store-subvolume-os
+  (system-test
+   (name