Hi Karsten, Quoting Karsten Merker (2018-10-01 22:43:31) > many thanks for creating mmdebstrap! I'm using it for creating > chroots for Debian-Ports architectures, where we need to pull the > packages from two suites: unstable and unreleased. While using > mmdebstrap, I've stumbled over two issues. Everything works fine > when creating a sources.list, feeding it to mmdebstrap on stdin > and having mmdebstrap automatically generate a tarball, i.e. > with something like > > echo -e "deb http://deb.debian.org/debian-ports/ sid main\ndeb > http://deb.debian.org/debian-ports/ unreleased main" | mmdebstrap > --architectures=riscv64 > /tmp/rv64-chroot.tar > > The process fails when one tries to pass the mirrors on the > commandline, though. Due to the fact that there is more than one > suite to use, the mirrors need to be passed in sources.list > style, i.e. as "deb http://<mirror>/debian-ports <suite> main". > > Running mmdebstrap with > > mmdebstrap --architectures=riscv64 sid /tmp/rv64-chroot "deb > http://deb.debian.org/debian-ports/ sid main" "deb > http://deb.debian.org/debian-ports/ unreleased main" > > results in > > E: Malformed entry 1 in list file /tmp/rv64-chroot/etc/apt/sources.list > (URI parse) > E: The list of sources could not be read. > apt-get update failed at /usr/bin/mmdebstrap line 548. > # cat /tmp/rv64-chroot/etc/apt/sources.list > deb deb http://deb.debian.org/debian-ports/ sid main sid main > deb deb http://deb.debian.org/debian-ports/ unreleased main sid main > > The manpage states: > > If a MIRROR option starts with "deb " or "deb-src " then it is > used as a one-line-style format entry for apt's sources.list > inside the chroot. If a MIRROR option contains a "://" then it > is interpreted as a mirror URI and the apt line inside the chroot > is assembled as "deb [arch=A] B C D" where A is the host's native > architecture, B is the MIRROR, C is the given SUITE and D is the > components given via --components (defaults to "main"). > > It looks like the second part is applied unconditionally on > all mirror parameters that contain a "://", although that should > not happen if the mirror parameter starts with a "deb " or > "deb-src " and thereby already constitutes a complete sources.list > entry.
yes, that is a bug. The code was indeed wrongly first checking for :// even though it should first check if the parameter starts with "deb " or "deb-src ". Fixed here: https://gitlab.mister-muffin.de/josch/mmdebstrap/commit/bb2aa6e9fdbbf4723eacdaf5937a8855ff41509d > Another thing that I have stumbled upon is that providing a sources.list on > stdin only works when no target directory is provided on the commandline, > i.e. when automatically creating a tarball. While > > echo -e "deb http://deb.debian.org/debian-ports/ sid main\ndeb > http://deb.debian.org/debian-ports/ unreleased main" | mmdebstrap > --architectures=riscv64 > /tmp/rv64-chroot.tar > > works, the following doesn't: > > echo -e "deb http://deb.debian.org/debian-ports/ sid main\ndeb > http://deb.debian.org/debian-ports/ unreleased main" | mmdebstrap > --architectures=riscv64 sid /tmp/rv64-chroot > > It results in > > I: riscv64 cannot be executed, falling back to qemu-user > I: automatically chosen mode: root > I: running apt-get update... > done > apt-get update didn't download anything at /usr/bin/mmdebstrap line 721. This is actually a feature. In your second invocation, you didn't specify the "MIRROR" argument. The docs say: > If no MIRROR option is provided, http://deb.debian.org/debian is used. In your first invocation, you also didn't specify the "SUITE" argument. The docs say: > If no SUITE was specified, then a single MIRROR "-" is added and thus the > information of the desired suite has to come from standard input as part of a > valid apt sources.list file. So the implicit '-' as the mirror argument only works if there was no SUITE. If you pass a SUITE, you need to explicitly tell it that you want to read the mirror from stdin. This is to have compatibility with how debootstrap also just uses deb.debian.org/debian as the mirror if the mirror argument is missing. To make the cause of the problem more obvious, I'm now printing the content of /etc/apt/sources.list in the chroot in case apt-get didn't download anything: https://gitlab.mister-muffin.de/josch/mmdebstrap/commit/1f13d0157bc8364ac491203a6a9156a78f6228a9 But we could turn this bug into a feature request of the following form: If no MIRROR was provided *and* something was specified on standard input, then don't use deb.debian.org/debian but use whatever was given on standard input instead. Or even more liberal: If anything is provided on standard input and there is no '-' MIRROR argument, then just append whatever is given on standard input to the apt sources.list inside the chroot. What do you think? Thanks! cheers, josch
signature.asc
Description: signature