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

3.4 KiB

title subtitle date lastUpdated tags
GNU vs BusyBox Unix tools Alpine uses BusyBox while Ubuntu uses GNU tools, and they behave differently. 2018-10-13 2018-10-31
Linux
Alpine

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.