~ruther/guix-local

62c28bc6d8c54800b16341d1c93a1d7833fc3328 — Ryan Sundberg a month ago 35929d5
image: Use `unshare` to map root user for btrfs

The current version of `mkfs.btrfs` has a regression when combined with
`fakeroot` where it does not detect the faked root uid/gid of files when
building the filesystem. This produces partition images with `/` owned by
the guixbuild user when it should be owned by root.

Using `unshare` rather than `fakeroot` resolves this by doing the uid
mapping at the kernel level rather than overloading the `stat` function.

An equivalent issue was [reported and patched in
NixOS](https://github.com/NixOS/nixpkgs/pull/434122)

* gnu/build/image.scm (system-disk-image): Import `util-linux` instead of
`fakeroot`.
* gnu/system/image.scm (make-btrfs-image): Use `unshare --map-root-user`

Change-Id: Id4eeaf510f3ec5f4a23b4d700a73e2cf46da40b1
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
Merges: #5536
2 files changed, 3 insertions(+), 2 deletions(-)

M gnu/build/image.scm
M gnu/system/image.scm
M gnu/build/image.scm => gnu/build/image.scm +2 -1
@@ 83,7 83,8 @@ turn doesn't take any constant overhead into account, force a 1-MiB minimum."
        (label (partition-label partition))
        (uuid (partition-uuid partition)))
    (apply invoke
           `("fakeroot" "mkfs.btrfs" "-r" ,root
           `("unshare" "--map-root-user" "mkfs.btrfs"
             "-r" ,root
             "-L" ,label
             ,@(if uuid
                   `("-U" ,(uuid->string uuid))

M gnu/system/image.scm => gnu/system/image.scm +1 -1
@@ 504,7 504,7 @@ used in the image."
                                      initialize-root-partition))
                     (inputs '#+(cond
                                  ((string=? type "btrfs")
                                   (list btrfs-progs fakeroot))
                                   (list btrfs-progs util-linux))
                                  ((string-prefix? "ext" type)
                                   (list e2fsprogs fakeroot))
                                  ((string=? type "f2fs")