Barnyard2 and MariaDB
-
My apologies on misleading you with the "MASTER_SITES=" line. That is the way most ports do it, but Barnyard2 is different. It's using a Github technique contained within these two lines:
USE_GITHUB= yes GH_ACCOUNT= firnsy
It's been quite some time since I've looked at the Makefile for Barnyard2.
-
@rickyzhang said in Barnyard2 and MariaDB:
@bmeeks said in Barnyard2 and MariaDB:
But here is the main roadblock: how can I use pfSense port (https://github.com/pfsense/FreeBSD-ports) rather than the one from FreeBSD?For now I don't want to build the whole pfSense port but rather the one port only.
BTW: The build.sh has gone from pfsense/pfsense/tools folder (see https://github.com/pfsense/pfsense/tree/master/tools)
The pfsense/pfsense/tools path was assuming you had cloned the Github repo onto a FreeBSD machine. That will be the path on your FreeBSD machine after the clone operation. And I was operating from memory, so I think I remembered the path wrong.
build.sh
is in pfsense/pfsense, but the main file containing all the function calls is in the pfsense/pfsense/tools path.I recommend creating the directory /usr/home/pfsense and then cloning the two repos I linked earlier into that path on your FreeBSD machine. There will be multiple branches within each repo. DEVEL is for pfSense-2.5 and RELENG_2.4.4 is for pfSense-2.4.
After cloning, if you change to the pfsense/pfsense directory and execute the following commands, the script should build the Poudriere jails for you.
./build.sh --setup ./build.sh --setup-poudriere
-
I run
make
in /usr/ports/security/barnyard2. I starts to build all dependencies and pulling its own code.See below:
===> License GPLv2 accepted by the user ===> barnyard2-1.13_3 depends on file: /usr/local/sbin/pkg - found => firnsy-barnyard2-v2-1.13_GH0.tar.gz doesn't seem to exist in /usr/ports/distfiles/. => Attempting to fetch https://codeload.github.com/firnsy/barnyard2/tar.gz/v2-1.13?dummy=/firnsy-barnyard2-v2-1.13_GH0.tar.gz fetch: https://codeload.github.com/firnsy/barnyard2/tar.gz/v2-1.13?dummy=/firnsy-barnyard2-v2-1.13_GH0.tar.gz: No address record => Attempting to fetch http://distcache.FreeBSD.org/ports-distfiles/firnsy-barnyard2-v2-1.13_GH0.tar.gz firnsy-barnyard2-v2-1.13_GH0.tar.gz 100% of 424 kB 1324 kBps 00m00s ===> Fetching all distfiles required by barnyard2-1.13_3 for building ===> Extracting for barnyard2-1.13_3 => SHA256 Checksum OK for firnsy-barnyard2-v2-1.13_GH0.tar.gz. ===> Patching for barnyard2-1.13_3 ===> Applying FreeBSD patches for barnyard2-1.13_3 ===> barnyard2-1.13_3 depends on package: autoconf>=2.69 - not found ===> License GPLv2+ GPLv3+ GFDL AUTOCONF_CONFIGURE_SCRIPT_EXCEPTION accepted by the user ===> autoconf-2.69_3 depends on file: /usr/local/sbin/pkg - found => autoconf-2.69.tar.xz doesn't seem to exist in /usr/ports/distfiles/. => Attempting to fetch https://ftpmirror.gnu.org/autoconf/autoconf-2.69.tar.xz fetch: https://ftpmirror.gnu.org/autoconf/autoconf-2.69.tar.xz: Authentication error => Attempting to fetch https://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.xz fetch: https://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.xz: Authentication error => Attempting to fetch ftp://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.xz autoconf-2.69.tar.xz 100% of 1186 kB 2416 kBps 00m00s ===> Fetching all distfiles required by autoconf-2.69_3 for building ===> Extracting for autoconf-2.69_3 => SHA256 Checksum OK for autoconf-2.69.tar.xz. ===> Patching for autoconf-2.69_3 ===> Applying FreeBSD patches for autoconf-2.69_3 ===> autoconf-2.69_3 depends on executable: gm4 - not found
The source code indicate its from the upstream. It supposed what I read in Github with the MariaDB syntax patch. I will take a close look.
But I think I do this build exercise in the wrong way. I have to manfully hit my keyboard so many times to answer gettex build option dialog during building of all its dependencies.
-
@rickyzhang :
Yes, FreeBSD has a lot of "interactive" prompts that require hitting "Y" or ENTER. I hate it, but have never found a way around all of them, just some of them. The good news is that it will save your answers and use them from now on without prompting you again. -
I built the Barnyard2 binary successfully from FreeBSD official port by running
make
in /usr/ports/security/barnyard2 folder. I think the same approach can be applied to pfSense's FreeBSD-ports by runningmake
in cloned Git repo.Since I already clone both pfsense repo and FreeBSD-ports repo from Github under pfsense folder. See the folder structure below:
[Ricky@freebsd ~/repo/github/pfsense]$ pwd /home/Ricky/repo/github/pfsense [Ricky@freebsd ~/repo/github/pfsense]$ ls FreeBSD-ports pfsense
I don't see
build.sh
script from pfsense/pfsense folder will use FreeBSD-ports repo cloned by me. In any case, I will give this a try if I fail.Missing build instruction is a real pain in the ass.
-
After building Barnyard2 from by running
make
in /usr/ports/security/barnyard2 folder for 20 mins, it took me less than a few seconds to build it from FreeBSD-ports under my cloned repo /home/Ricky/repo/github/pfsense/FreeBSD-ports/security/barnyard2.I think for now I can start to debug the issue. But it is better that I can just build ARMv7 binary, instead amd64.
Now I have to start to install pfSense in amd64 VM and test it. What a pain in the ass.
-
@rickyzhang :
Thebuild.sh
script is not part of the FreeBSD-ports repo. It is part of the pfSense repo. That's why I gave you two links originally to clone. Here is a screenshot from my builder showing thebuild.sh
script file.You need to fill in the proper values in pfsense/pfsense/build.conf and then execute the
build.sh
commands I posted earlier. That will create a proper environment for building pfSense packages using Poudriere. If you build packagea outside of that environment, you will likely find that they fail to load and run on your pfSense firewall due to path problems. -
@rickyzhang said in Barnyard2 and MariaDB:
/home/Ricky/repo/github/pfsense/FreeBSD-ports/security/barnyard2
I see. I already cloned both pfsense and FreeBSD-ports. I can compile Barnyard2 from both FreeBSD official ports and pfsense's own port a.k.a FreeBSD-ports repo by running
make
. I may not need to use your approach.Now I need to figure it out how to test my change. Replicating my physical SG-3100 pfsense setup in a amd64 virtual machine is not fun. I think I should try QEMU now to run FreeBSD in ARMV7 and replay what I have done in amd64 FreeBSD VM.
BTW, can you share your sample build.conf? From the sample build.conf.sample file, I don't see how they point to local FreeBSD-ports repo.
Thanks so much for your guidance. We definitely need a place somewhere to gather your wisdom and help any newbies.
-
@rickyzhang said in Barnyard2 and MariaDB:
@rickyzhang said in Barnyard2 and MariaDB:
/home/Ricky/repo/github/pfsense/FreeBSD-ports/security/barnyard2
I see. I already cloned both pfsense and FreeBSD-ports. I can compile Barnyard2 from both FreeBSD official ports and pfsense's own port a.k.a FreeBSD-ports repo by running
make
. I may not need to use your approach.Now I need to figure it out how to test my change. Replicating my physical SG-3100 pfsense setup in a amd64 virtual machine is not fun. I think I should try QEMU now to run FreeBSD in ARMV7 and replay what I have done in amd64 FreeBSD VM.
BTW, can you share your sample build.conf? From the sample build.conf.sample file, I don't see how they point to local FreeBSD-ports repo.
Thanks so much for your guidance. We definitely need a place somewhere to gather your wisdom and help any newbies.
I don't want to share my entire
build.conf
file because it contains some sensitive items. But the main two parameters you need to set are these:# Define FreeBSD repository, branch and specific commit export FREEBSD_REPO_BASE=https://github.com/pfsense/FreeBSD-src.git export FREEBSD_BRANCH=RELENG_2_5
In my case, I am building packages for DEVEL, so I use RELENG_2_5. If you want to build packages for pfSense-RELEASE, then you would use RELENG_2_4_4. You can find the relevant branches by looking at the branches available on Github for FreeBSD-ports in pfSense.
Also I hope you realize that unless you do
make pkg
during your build, the binary you produce likely won't run on a pfSense firewall. You need to use themake pkg
command in order to produce a package file that you can install usingpkg
on pfSense itself.And if you want to actually run your binary on your SG-3100 firewall, you must build it either under the qemu emulator environment or else create your FreeBSD builder on native ARM hardware.
-
Are you suggesting that I can't swap the binary file due to some security features like signature signing on the binary? That's new to me. I will look into
make pkg
command.Yes, I'm working on how to emulate FreeBSD on ARMV7 now. All ARM board I got either too slow like BeagleBone or 64 bit like RPI 4 or even they can't run FreeBSD at all like odroid XU4.
I thought their build should work under corss-compile. But I can only saw some qemu string pops up in their build script (https://github.com/pfsense/pfsense/blob/master/tools/builder_common.sh)
-
@rickyzhang :
My experience when trying to transfer and run a binary built on FreeBSD but outside of the pfSense Poudriere builder structure is that the binary would fail to run because the various paths (/usr/local/bin, /usr/etc, etc.) would be incorrect. Also would get various library loading failures. There are probably solutions to all of those, but I just found it easier to use the Poudriere environment within the pfSense builder structure. -
@rickyzhang said in Barnyard2 and MariaDB:
Yes, I'm working on how to emulate FreeBSD on ARMV7 now. All ARM board I got either too slow like BeagleBone or 64 bit like RPI 4 or even they can't run FreeBSD at all like odroid XU4.
I thought their build should work under corss-compile. But I can only saw some qemu string pops up in their build script (https://github.com/pfsense/pfsense/blob/master/tools/builder_common.sh)
If you run things on native ARM hardware, you don't need to "emulate" anything. There is a FreeBSD image for ARM hardware just like there is an image for AMD64. Install that on some true ARMv7 hardware and go with it. You only need the qemu emulator environment when you need to build ARM code on AMD64 hardware.
-
@bmeeks
Those path like /usr/etc can be redefined in configure. Because both FreeBSD and Linux use ELF format. I bet FreeBSD can load dynamic library like Linux from anywhere. But maybe I'm wrong. We will see.Your way is definitely easier to avoid the hack I mentioned. Can you list a command that build only one package like Barnyard2, instead of everything?
Building anything on a native ARM board is always a bad idea. It is way too slow. I once built a customized open-cv on odroid XU4 (way much faster than RPI2 and RPI4) . It took me a day to build it.
I found it difficult to emulate ARM version FreeBSD in QEMU under amd64. The pre-built SD card image provided by FreeBSD doesn't work out-of-box in QEMU. You have to hack the FreeBSD kernel. It seems too much work to get it done. I gave up on this.
But I did find another way: cross compile in amd64 for ARM. See https://wiki.freebsd.org/FreeBSD/arm/crossbuild
-
make package
command works. I can install that package locally without problem. It loads the binary correctly:[Ricky@freebsd ~/repo/github/pfsense/FreeBSD-ports/security/barnyard2]$ ldd /usr/local/bin/barnyard2 /usr/local/bin/barnyard2: libmysqlclient.so.20 => /usr/local/lib/mysql/libmysqlclient.so.20 (0x800a00000) libz.so.6 => /lib/libz.so.6 (0x800fb9000) libpcap.so.8 => /lib/libpcap.so.8 (0x8011d1000) libm.so.5 => /lib/libm.so.5 (0x80142d000) libc.so.7 => /lib/libc.so.7 (0x80165a000) libssl.so.8 => /usr/lib/libssl.so.8 (0x801a16000) libcrypto.so.8 => /lib/libcrypto.so.8 (0x801e00000) librt.so.1 => /usr/lib/librt.so.1 (0x80226f000) libexecinfo.so.1 => /usr/lib/libexecinfo.so.1 (0x802475000) libc++.so.1 => /usr/lib/libc++.so.1 (0x802678000) libcxxrt.so.1 => /lib/libcxxrt.so.1 (0x802946000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x802b65000) libthr.so.3 => /lib/libthr.so.3 (0x802d74000) libelf.so.2 => /lib/libelf.so.2 (0x802f9c000)
But I struggled with ARM cross compile. The wiki I quote suggest use the build flag like
TARGET=arm TARGET_ARCH=armv6
. But it doesn't work. It still shows amd64 binary.[Ricky@freebsd ~/repo/github/pfsense/FreeBSD-ports/security/barnyard2]$ make -j8 package TARGET=arm TARGET_ARCH=armv6 [Ricky@freebsd ~/repo/github/pfsense/FreeBSD-ports/security/barnyard2]$ file work/stage/usr/local/bin/barnyard2 work/stage/usr/local/bin/barnyard2: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), dynamically linked, interpreter /libexec/ld-elf.so.1, for FreeBSD 11.2, FreeBSD-style, stripped
Thanks for your time. I will ask the folks how to cross compile in FreeBSD embedded section.
-
@rickyzhang :
You have to installqemu-user-static
. That's what I've really been talking about the whole time I've mentioned qemu. I was shortening what I typed. I thought you understood already that's how you cross-compile ARM code on AMD64 hardware. That's what the pfSense builder environment does for you, and that is why I use it. It only quit working rather recently (as in the 1st quarter of this year) due to changes in some of the dependent packages such as Go. What happened is that some of the latest ports updates on FreeBSD no longer build properly when cross-compiled usingqemu-user-static
.If you want to build only a single package, you can alter the
make.conf
andpoudriere.bulk
files in the pfSense tree to accomplish that. There are also some port options specified for Barnyard2 that are needed. -
There are two different things: emulation and cross compile.
The emulation means emulating ARM instruction set under AMD64. That means you need ARM version FreeBSD OS and toolchain. That's why I struggled to run the pre-built RPI2 SD card image provided by FreeBSD in QEMU.
Cross compile means your OS and toolchain still run as AMD64 native. It is the compiler (written in native AMD64 instruction) that generates the code which can run in ARM instruction set target platform (Think of this process as you speak foreign language without being in foreign country)
I don't know the technical details
qemu-user-static
. But it sounds like it is an emulation rather than cross compile. Can you find a doc on this thingy?I thought passed in the flag
TARGET=arm TARGET_ARCH=armv6
will force to use cross compiler toolchain. -
The
qemu-user-static
package is the easiest way to cross-compile by using emulation. So I am really talking about both things (cross-compile and emulation). Here is a link: https://forums.freebsd.org/threads/building-arm-packages-with-poudriere-the-simple-way.52994/. And here is another link discussing a similar setup: https://www.dvatp.com/tech/armv6_freebsd_poudriere.The steps outlined in those links are basically what the pfSense package builder scripts are doing for you if you follow my earlier instructions to set that up.
-
If you cross compile, you don't need emulation.
I'm not familiar with FreeBSD jail or poudriere. But it sounds like Linux docker container where it use the same kernel but different cgroup and an independent rootfs to isolate the build env. In any case, docker container always run as native binary. I bet FreeBSD should do the same. Correct me if I'm wrong.
I already started the process like below to build my cross compiler tool chain: http://ray-freebsd.blogspot.com/2011/09/cross-compiling-ports-for-freebsd.html
I will try your poudriere if there is too much trouble.
Thanks in advance.
-
@rickyzhang :
My understanding is that you need the emulation because some of the required tools are not available in AMD64 form or something like that. I've never investigated the "why" in much detail. I'm telling you the process that was given to me by the pfSense developer team a couple of years ago and that is incorporated into their build process. If you don't want to follow that advice, then OK. You can try the cross-compilation route. I will tell you that the pfSense team uses the method I described (well, that is until the last round of FreeBSD ports updates where some ports (Go being one of them) quit building properly using the emulation/cross-compiling tool chain.I understand the difference between emulation and cross-compiling, but I was not sure of your level of expertise so I was not specific about the details. Since you are not familiar with Poudriere, it sounds like your FreeBSD experience may be limited. In many ways the compilation and linking tools for FreeBSD lag behind those available for Linux (and some of the defaults are different, for example using llvm instead of gcc).
-
I may know why. I'm sure Golang is the one to be blamed. Because the latest version of Golang build needs to use lower version of Golang to bootstrap its build process. Imagine how that will work in cross compiling process. You cross compile a bootstrap Golang but only runs in ARM. You can't use that bootstrap version Golang in your AMD64 platform to build the latest version of Golang.
I admit I have limited FreeBSD experience. There are tons of doc to read and catch it up. But I really appreciate your help and advice from FreeBSD community.
No offense. I felt the same way as you did: FreeBSD did lag behind Linux in terms of tooling. But FreeBSD did have advantage to run as network equipment because Linux change so rapidly. You have no idea how many bugs are introduced because of those "new features".
I got stuck now because I don't know:
- How to get clang build tools. The svn repo doesn't include clang
svn checkout https://svn.freebsd.org/base/releng/`uname -r | cut -d'-' -f1,1` /usr/src
- How to have a clean slate so that I can clean up all configuration setting and artifacts from the AMD64 build of dependencies ports (a lot of them).
- How to get clang build tools. The svn repo doesn't include clang