blog/source/_posts/gnu-vs-busybox-tools.md

3.4 KiB

title date lastUpdated tags
GNU vs BusyBox Unix tools 2018-10-13 2018-10-31
Linux
Alpine

TL;DR Alpine uses BusyBox while Ubuntu uses GNU tools, and they behave differently. Here's how they differ.

Intro

Skip to the list.

Alpine Linux is known for its minimal size. The 'mini root filesystem' flavour is only 2MB. This size makes it suitable as a Docker image, so CI job can start running script sooner instead of downloading larger image like Ubuntu.

I use it in my urlhaus-filter repo to run the scripts (that update the filter twice a day). When I first started using it on gitlab ci (I only knew about it a week ago), my first impression was that it somehow ships with more Unix tools than Ubuntu (not technically correct which I explain later), despite its minimal size. during the setup of the repo, there were many job failure due to incorrect command options or syntax.

Exit with code 1

I was dismayed by those error messages, I tested the scripts on my workstation! Looking through error message, I noticed the Alpine's Unx tools behave differently than mine. I investigated further by running an Alpine live cd.

I --version those tools (only those I use in the scripts) and the output is totally different! The Alpine tools output BusyBox vXX, which shows they are part of BusyBox. I briefly read up the wiki and noticed the following line,

{% blockquote %} ...compared GNU, BusyBox, asmutils and Perl implementations of the standard Unix commands... {% endblockquote %}

and the examples,

{% blockquote %} Programs included in BusyBox can be run simply by adding their name as an argument to the BusyBox executable:

/bin/busybox ls

..., for example just

/bin/ls

after /bin/ls is linked to /bin/busybox {% endblockquote %}

So, Alpine uses BusyBox and Ubuntu uses GNU. While Ubuntu also bundles with BusyBox, but it uses GNU by default.

List

I tested the tools on Alpine and Ubuntu, and noted their behaviour. BusyBox = BB.

  • gzip/gunzip/zcat: BB only support gzip/bzip2/xz format, not the ubiquitous zip. To extract, use unzip. GNU supports zip, but its zcat can only extract the first file. Use bsdtar to extract all files.
  • unzip: GNU doesn't support stdin as input. Use funzip to decompress stdin, but only extract the first file like zcat. BB support stdin and extract all files, through unzip -.
  • sed: BB doesn't support -z argument which is used to find/replace \n new line character. A workaround is sed ':a;N;$!ba;s/\n/<new character>/g' file or sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/<new character>/g' file. GNU sed -z 's/\n/<new character>/g' works.
  • bsdtar: Since GNU's zcat and funzip can only extract the first file, in addition to BB's unzip, another alternative is bsdtar. bsdtar can be installed through libarchive-tools package. To extract zip from stdin, use $ bsdtar -xf -.
  • patch: BB doesn't support --backup option. BSD doesn't support --verbose option.