Makefile: Automatically use fakemachine if not uid 0

fakemachine launches a virtual machine reusing the host system's /usr,
and runs commands as root on that virtual machine. It's used by debos,
but can also be used to wrap arbitrary commands, in particular vmdb2;
it's enough to run the parts of vmdb2 that need to mount filesystems
and run apt.

This won't work if fakemachine isn't available (in particular on non-x86),
but that seems better than just failing altogether.

Signed-off-by: Simon McVittie <smcv@debian.org>
This commit is contained in:
Simon McVittie 2021-04-24 23:07:01 +01:00 committed by Diederik de Haas
parent 5aadb0116a
commit 821aff4e19
2 changed files with 13 additions and 3 deletions

View File

@ -12,6 +12,12 @@ xzimages: $(addsuffix .img.xz,$(platforms))
images: $(addsuffix .img,$(platforms))
yaml: $(addsuffix .yaml,$(platforms))
ifeq ($(shell id -u),0)
as_root =
else
as_root = fakemachine -v $(CURDIR) -- env --chdir $(CURDIR)
endif
target_platforms:
@echo $(platforms)
@ -122,7 +128,7 @@ raspi_4_bullseye.yaml: raspi_base_bullseye.yaml
%.img: %.yaml
touch $(@:.img=.log)
time nice vmdb2 --verbose --rootfs-tarball=$(subst .img,.tar.gz,$@) --output=$@ $(subst .img,.yaml,$@) --log $(subst .img,.log,$@)
time nice $(as_root) vmdb2 --verbose --rootfs-tarball=$(subst .img,.tar.gz,$@) --output=$@ $(subst .img,.yaml,$@) --log $(subst .img,.log,$@)
chmod 0644 $@ $(@,.img=.log)
_ck_root:

View File

@ -30,10 +30,12 @@ Debian Buster (10) or higher system:
* debootstrap
* time
* kpartx
* fakemachine (optional, only available on amd64)
To install these (as root):
```shell
apt install -y vmdb2 dosfstools qemu-utils qemu-user-static debootstrap binfmt-support time kpartx
apt install -y fakemachine
```
Do note that at least currently vmdb2 uses some syntax that is available
@ -50,8 +52,10 @@ little as possible in a parametrized way. The master recipe is
[raspi_master.yaml](raspi_master.yaml).
A Makefile is supplied to drive the build of the recipes into images.
Some portions of building the image will require root privileges, thus
you'll need to execute *make* below as root.
If `fakemachine` is installed, it can be run as an unprivileged user.
Otherwise, because some steps of building the image require root privileges,
you'll need to execute `make` as root.
The argument to `make` is constructed as follows:
`raspi_<model>_<release>.<result-type>`