BusyBox: the Swiss Army knife of Linux

BusyBox: the Swiss Army knife of Linux

BusyBox is a utility that combines several small typical Unix utilities into a single executable one. It

BusyBox is a utility that combines several small typical Unix utilities into a single executable one.

It was created with the idea of optimizing resources and providing a minimal environment for embedded systems. But it is not the only scenario where it is very useful. Let’s take a look at another example.

The problem

Linux has many common libraries that different applications use to implement different features. According to the distribution of Linux that we use, these libraries perhaps are updated periodically. Usually, the tools used to maintain the system updated work well, even when updated critical parts.

But sometimes things go wrong (usually, the user). For example, what if I uninstall the library libattr then install a newer version? When I want to install the new version, I will realize that all utilities interacting with the filesystem do not work because they used libattr for the attributes. So every time you do ls, cp, mv, tar, etc. I’ll get a linking error:

error while loading shared libraries: libattr.so.1: cannot open shared object file: No such file or directory

So, obviously, I cannot install the new version. I conclude with an unusable system. And now?

BusyBox to the rescue

Looking into the BusyBox documentation, we’ll see that it includes the following utilities and their respective libraries and its links:

acpid, addgroup, adduser, adjtimex, ar, arp, arping, ash, awk, basename, beep, blkid, brctl, bunzip2, bzcat, bzip2, cal, cat, catv, chat, chattr, chgrp, chmod, chown, chpasswd, chpst, chroot, chrt, chvt, cksum, clear, cmp, comm, cp, cpio, crond, crontab, cryptpw, cut, date, dc, dd, deallocvt, delgroup, deluser, depmod, devmem, df, dhcprelay, diff, dirname, dmesg, dnsd, dnsdomainname, dos2unix, dpkg, du, dumpkmap, dumpleases, echo, ed, egrep, eject, env, envdir, envuidgid, expand, expr, fakeidentd, false, fbset, fbsplash, fdflush, fdformat, fdisk, fgrep, find, findfs, flash_lock, flash_unlock, fold, free, freeramdisk, fsck, fsck.minix, fsync, ftpd, ftpget, ftpput, fuser, getopt, getty, grep, gunzip, gzip, hd, hdparm, head, hexdump, hostid, hostname, httpd, hush, hwclock, id, ifconfig, ifdown, ifenslave, ifplugd, ifup, inetd, init, inotifyd, insmod, install, ionice, ip, ipaddr, ipcalc, ipcrm, ipcs, iplink, iproute, iprule, iptunnel, kbd_mode, kill, killall, killall5, klogd, last, length, less, linux32, linux64, linuxrc, ln, loadfont, loadkmap, logger, login, logname, logread, losetup, lpd, lpq, lpr, ls, lsattr, lsmod, lzmacat, lzop, lzopcat, makemime, man, md5sum, mdev, mesg, microcom, mkdir, mkdosfs, mkfifo, mkfs.minix, mkfs.vfat, mknod, mkpasswd, mkswap, mktemp, modprobe, more, mount, mountpoint, mt, mv, nameif, nc, netstat, nice, nmeter, nohup, nslookup, od, openvt, passwd, patch, pgrep, pidof, ping, ping6, pipe_progress, pivot_root, pkill, popmaildir, printenv, printf, ps, pscan, pwd, raidautorun, rdate, rdev, readlink, readprofile, realpath, reformime, renice, reset, resize, rm, rmdir, rmmod, route, rpm, rpm2cpio, rtcwake, run-parts, runlevel, runsv, runsvdir, rx, script, scriptreplay, sed, sendmail, seq, setarch, setconsole, setfont, setkeycodes, setlogcons, setsid, setuidgid, sh, sha1sum, sha256sum, sha512sum, showkey, slattach, sleep, softlimit, sort, split, start-stop-daemon, stat, strings, stty, su, sulogin, sum, sv, svlogd, swapoff, swapon, switch_root, sync, sysctl, syslogd, tac, tail, tar, taskset, tcpsvd, tee, telnet, telnetd, test, tftp, tftpd, time, timeout, top, touch, tr, traceroute, true, tty, ttysize, udhcpc, udhcpd, udpsvd, umount, uname, uncompress, unexpand, uniq, unix2dos, unlzma, unlzop, unzip, uptime, usleep, uudecode, uuencode, vconfig, vi, vlock, volname, watch, watchdog, wc, wget, which, who, whoami, xargs, yes, zcat, zcip

So if we have BusyBox installed, we can solve our problem as follows:

busybox wget http://..../attr-2.4.47.tar.gz
busybox tar xfvz attr-2.4.47.tar.gz
busybox mv libattr* /usr/lib

And we have our system running again! More information, here.