# How to get to base.txz for my BeagleBone?



## Andreas Strauch (Jun 7, 2021)

I have tried to google and forum-search all of last weekend to solve the following problem: _Where do I get *base.txz* and *kernel.txz* for my BeagleBone Black?_

Specifically, I want to setup some jails on my BBB, but for that I need the DISTRIBUTION files...

```
root@beaglebone:~ # ezjail-admin install
fetch: ftp://ftp.freebsd.org/pub/FreeBSD/releases/arm/armv7/13.0-RELEASE/base.txz: File unavailable (e.g., file not found, no access)
fetch: ftp://ftp.freebsd.org/pub/FreeBSD/snapshot/arm/armv7/13.0-RELEASE/base.txz: File unavailable (e.g., file not found, no access)
fetch: ftp://ftp.freebsd.org/pub/FreeBSD/arm/armv7/13.0-RELEASE/base.txz: File unavailable (e.g., file not found, no access)
fetch: ftp://ftp.freebsd.org/releases/arm/armv7/13.0-RELEASE/base.txz: File unavailable (e.g., file not found, no access)
fetch: ftp://ftp.freebsd.org/snapshots/arm/armv7/13.0-RELEASE/base.txz: File unavailable (e.g., file not found, no access)
fetch: ftp://ftp.freebsd.org/pub/FreeBSD-Archive/old-releases/arm/armv7/13.0-RELEASE/base.txz: File unavailable (e.g., file not found, no access)

Could not fetch base from ftp://ftp.freebsd.org.
  Maybe your release (13.0-RELEASE) is specified incorrectly or the host ftp.freebsd.org does not provide that release build.
  Use the -r option to specify an existing release or the -h option to specify an alternative ftp server.
Querying your ftp-server... Warning: I am having problems querying the ftp server you specified (ftp.freebsd.org).
```

I thought maybe I can get these files if I build my own release - so I did that. I checked out the sources from https://git.freebsd.org/src.git (stable/13) and cross-build the release. Below are the most essential lines of my build:

```
...
make buildworld TARGET_ARCH=armv7 UBLDR_LOADADDR=0x88000000 -DWITH_FDT __MAKE_CONF=/dev/null SRCCONF=/dev/null
make buildkernel TARGET_ARCH=armv7 KERNCONF=GENERIC
...
make installworld TARGET_ARCH=armv7 -DWITHOUT_SHAREDOCS -DWITHOUT_EXAMPLES -DWITHOUT_GAMES -DWITHOUT_HTML -DWITHOUT_INFO -DWITHOUT_MAN DESTDIR=/mnt
make distribution TARGET_ARCH=armv7 DESTDIR=/mnt
make installkernel TARGET_ARCH=armv7 KERNCONF=GENERIC DESTDIR=/mnt
...
```

I was hoping that *base.txz* and *kernel.txz* would be created along the line of my build, but that did not happen 

My attempt to find any *.txz* file did not yield any success.

```
find /mnt -type f -name '*.txz'
```

Regardless, I put my build onto an SD-Card and booted my BBB with it. At least that was a success. However, still no *base.txz* and *kernel.txz* anywhere 

Obviously, I am missing something! Most likely it will be something very simple, but I can't figure out what. Does anybody know what I am missing? How can I build *base.txz* and *kernel.txz* for my BeagleBone Black?


----------



## covacat (Jun 7, 2021)

man 7 release


----------



## kpedersen (Jun 7, 2021)

The BBB, is that armv7?

Could you not grab the files you need from the .img here?

It is under ISO-IMAGES so presumably it is an installer image rather than an expandable hard drive?


----------



## acheron (Jun 7, 2021)

These files are not generated for armv6 and armv7


----------



## acheron (Jun 7, 2021)

You can grab some archives here but there are no RELEASE tarball https://artifact.ci.freebsd.org/


----------



## Andreas Strauch (Jun 13, 2021)

Thanks for the tip regarding release.sh, which helped to get things running very conveniently. Still, for arm/armv7 it doesn't give me the distribution files. I installed a fresh FreeBSD-13 VM with no packages (other than git(1) and tmux(1)) and ran the following commands:


```
cd /usr/src/release/
sh release.sh -c arm/GENERICSD.conf
```

Around 4.5h later the build completed and I found the completed image under the _/scratch/R_ directory.

```
root@buildhost2:~ # ls -lah /scratch/R/
total 391952
drwxr-xr-x   2 root  wheel   512B Jun 13 15:13 .
drwxr-xr-x  19 root  wheel   512B Jun 13 15:09 ..
-rw-r--r--   1 root  wheel   124B Jun 13 15:13 CHECKSUM.SHA256
-rw-r--r--   1 root  wheel   188B Jun 13 15:13 CHECKSUM.SHA512
-rw-r--r--   1 root  wheel   383M Jun 13 15:09 FreeBSD-13.0-CURRENT-arm-armv7-GENERICSD.img.xz
```

It seems somehow I am still missing that last step to create the **.txz* files?

```
root@buildhost2:~ # find /scratch -type f -name '*.txz'
root@buildhost2:~ #
```

Does anybody know what that last step (that I am obviously missing) is?


----------



## SirDice (Jun 13, 2021)

Look _in_ the image file. It contains everything to 'burn' that installer to a USB stick. If you want the separate files then building an FTP install directory is probably easier to use.


----------



## acheron (Jun 14, 2021)

Try this in /usr/src/release (assuming you've already built the world): `make TARGET=arm TARGET_ARCH=armv7 base.txz`


----------



## Andreas Strauch (Jun 14, 2021)

Uh... this feels like getting closer. It doesn't work yet, but I think this could be the right track...


```
root@buildhost2:/usr/src/release # make TARGET=arm TARGET_ARCH=armv7 base.txz
[Creating objdir /usr/obj/usr/src/arm.armv7/release...]
mkdir -p dist
cd /usr/src/release/.. && make TARGET_ARCH=armv7 TARGET=arm distributeworld DISTDIR=/usr/obj/usr/src/arm.armv7/release/dist
make[2]: "/usr/src/Makefile.inc1" line 105: A build is required first.  You may have the wrong MAKEOBJDIRPREFIX set.

make[2]: stopped in /usr/src
*** Error code 1

Stop.
make[1]: stopped in /usr/src
*** Error code 1

Stop.
make: stopped in /usr/src/release
```

It looks almost as *release.sh* is a nice "one-stop-shop" but it doesn't play well with the "more manual" build commands. I might need to find out what to set *MAKEOBJDIRPREFIX* to after a *release.sh* build and continue the trail from there. I will keep you posted...


----------



## acheron (Jun 15, 2021)

Try with `setenv MAKEOBJDIRPREFIX /usr/obj`


----------



## mtu (Jun 15, 2021)

You have manually command to build the world first, _then_ you can pack it all up into base.txz:

```
make -C /usr/src/ SRCCONF=/my/src.conf -j7 buildworld
make -C /usr/src/release SRCCONF=/my/src.conf base.txz
```
… is how I have done it.


----------



## T-Daemon (Jun 15, 2021)

It's more likely MAKEOBJDIRPREFIX is /scratch/tmp/obj.

From post #6

```
sh release.sh -c arm/GENERICSD.conf
```

/usr/src/release/release.sh

```
57         # The directory within which the release will be built.
     58         CHROOTDIR="/scratch"
     ...
    211         CHROOT_MAKEENV="${CHROOT_MAKEENV} \
    212                 MAKEOBJDIRPREFIX=${CHROOTDIR}/tmp/obj"
```


----------



## Andreas Strauch (Jun 15, 2021)

T-Daemon, I tried what you suggested in post #12 but no success yet:

```
root@buildhost2:/usr/src/release # sh release.sh -c arm/GENERICSD.conf

...

root@buildhost2:/usr/src/release # setenv MAKEOBJDIRPREFIX /scratch/tmp/obj
root@buildhost2:/usr/src/release # make TARGET=arm TARGET_ARCH=armv7 base.txz
[Creating objdir /scratch/tmp/obj/usr/src/arm.armv7/release...]
mkdir -p dist
cd /usr/src/release/.. && make TARGET_ARCH=armv7 TARGET=arm distributeworld DISTDIR=/scratch/tmp/obj/usr/src/arm.armv7/release/dist
make[2]: "/usr/src/Makefile.inc1" line 105: A build is required first.  You may have the wrong MAKEOBJDIRPREFIX set.

make[2]: stopped in /usr/src
*** Error code 1

Stop.
make[1]: stopped in /usr/src
*** Error code 1

Stop.
make: stopped in /usr/src/release
```

Also, setting the `MAKEOBJDIRPREFIX` to /usr/obj as acheron suggested in post #10 doesn't work (yields the same error as listed above).

I need a little more time (probably tonight) to try what mtu has suggested in post #11.


----------



## acheron (Jun 15, 2021)

Buildworld has to be done in /usr/src


----------



## Andreas Strauch (Jun 27, 2021)

o.k. - I found 2 solutions how to get to base.txz. The first modifies `release.sh` and the second does it all from the command line.

1st option:

I have tried to manually build base.txz after a successful run of `release.sh`, but never succeeded. It seems that I was either missing environment variables or did not `chroot` into the right location. Eventually I simply added a line into the `chroot_arm_build_release()` subroutine of `release.sh`:

```
371    chroot_arm_build_release() {
372        load_target_env
...
386        export MAKE_FLAGS="${MAKE_FLAGS} ${CONF_FILES}"
387        eval chroot ${CHROOTDIR} env WITH_UNIFIED_OBJDIR=1 make ${MAKE_FLAGS} -C /usr/src/release obj
>>>
+++        eval chroot ${CHROOTDIR} env WITH_UNIFIED_OBJDIR=1 make ${MAKE_FLAGS} -C /usr/src/release base.txz
<<<
388        export WORLDDIR="$(eval chroot ${CHROOTDIR} make ${MAKE_FLAGS} -C /usr/src/release -V WORLDDIR)"
...
415        return 0
416    } # chroot_arm_build_release()
```
While it ain't pretty, it does the trick and puts base.txz into the /scratch/scratch/tmp/obj/usr/src/arm.armv7/release/ directory during a release.

2nd option:

Basically building world and then building base.txz directly after.

```
export MAKEOBJDIRPREFIX=/scratch/obj
mkdir -p /scratch/usr/src && mkdir $MAKEOBJDIRPREFIX
git clone -b stable/13 --depth 1 https://git.freebsd.org/src.git /scratch/usr/src
make -C /scratch/usr/src -j16 TARGET_ARCH=armv7 UBLDR_LOADADDR=0x88000000 -DWITH_FDT __MAKE_CONF=/dev/null SRCCONF=/dev/null buildworld
make -C /scratch/usr/src/release TARGET=arm TARGET_ARCH=armv7 base.txz
```

The base.txz file will be located under the /scratch/obj/scratch/usr/src/arm.armv7/release/ directory.


----------

