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

55 lines
3.2 KiB
Markdown
Raw Normal View History

2018-10-13 03:38:32 +00:00
---
title: GNU vs BusyBox Unix tools
excerpt: Alpine uses BusyBox while Ubuntu uses GNU tools, and they behave differently.
date: 2018-10-13
updated: 2021-04-19
2018-10-13 03:38:32 +00:00
tags:
- linux
- alpine
2020-10-21 01:20:33 +00:00
- busybox
2018-10-13 03:38:32 +00:00
---
2018-10-13 03:38:32 +00:00
## Intro
> Skip to the [list](#list).
2018-10-13 03:38:32 +00:00
Alpine Linux is known for its minimal size. The '[mini root filesystem](https://www.alpinelinux.org/downloads/)' 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.
2020-02-18 23:40:10 +00:00
I use it in my [urlhaus-filter](https://gitlab.com/curben/urlhaus-filter) repo to run the [scripts](https://gitlab.com/curben/urlhaus-filter/tree/master/utils) (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](https://mdleom.com/2018/10/10/binaries-alpine-docker/) 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.
2018-10-13 03:38:32 +00:00
## Exit with code 1
While setting up GitLab CI for urlhaus-filter, I encountered many issues despite tested fine on my workstation. Sifting through the error messages, I noticed the Alpine's Unix tools behave differently than mine. I investigated further by testing the script on an Alpine VM.
2018-10-13 03:38:32 +00:00
I compared the `--version` of those tools in Ubuntu and Alpine, and noticed the outputs are totally different. The Alpine tools output `BusyBox vXX`, which shows they are part of BusyBox. I briefly read up the [wiki](https://en.wikipedia.org/wiki/BusyBox#Features) and noticed the following line,
2018-10-13 03:38:32 +00:00
{% blockquote %}
...compared GNU, BusyBox, asmutils and Perl implementations of the standard Unix commands...
{% endblockquote %}
and the [examples](https://en.wikipedia.org/wiki/BusyBox#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. Ubuntu does include BusyBox by default, but it mostly uses GNU.
2018-10-13 03:38:32 +00:00
## 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, use BB's unzip for zip file. GNU can only extract the first file in a zip.
- **unzip**: GNU doesn't support stdin as input. funzip can decompress from stdin, but only the first file (like zcat). BB support stdin and extract all files, through `unzip -`.
2018-10-17 08:42:15 +00:00
- **sed**: BB doesn't support -z argument which is used to find/replace \n new line character. A [workaround](https://stackoverflow.com/a/1252191) 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 can only extract the first file, in addition to BB's unzip, another alternative is bsdtar. bsdtar is available through `libarchive-tools` package. To extract zip from stdin, use `$ bsdtar -xf -`.
2019-02-09 06:01:22 +00:00
- **patch**: BB doesn't support `--backup` option. BSD doesn't support `--verbose` option.