Too bad: ESXi busybox has `diff`, but not `patch`
Posted by jpluimers on 2022/03/02
On my ESXi boxes, I have a directory with local scripts that in part depend on the machine.
So I contemplated patching the dending parts with patch
.
Then I found out that the BusyBox that VMware built for ESXi does have diff
, but not patch
:
# $(readlink -f "`which diff`") BusyBox v1.29.3 (2021-01-17 01:25:00 PST) multi-call binary. BusyBox is copyrighted by many authors between 1998-2015. Licensed under GPLv2. See source distribution for detailed copyright notices. Usage: busybox [function [arguments]...] or: busybox --list or: function [arguments]... BusyBox is a multi-call binary that combines many common Unix utilities into a single executable. Most people will create a link to busybox for each function they wish to use and BusyBox will act like whatever it was invoked as. Currently defined functions: addgroup, adduser, arch, ash, awk, basename, bunzip2, bzcat, bzip2, cat, chgrp, chmod, chown, chvt, cksum, clear, cp, crond, cut, date, dd, delgroup, deluser, diff, dirname, dnsdomainname, du, echo, egrep, eject, env, expr, false, fdisk, fgrep, find, fstrim, getty, grep, groups, gunzip, gzip, halt, head, hexdump, hostname, inetd, init, kill, ln, logger, login, ls, lzop, lzopcat, md5sum, mkdir, mkfifo, mknod, mktemp, more, mv, nohup, nslookup, od, passwd, poweroff, printf, readlink, reboot, reset, resize, rm, rmdir, sed, seq, setsid, sh, sha1sum, sha256sum, sha3sum, sha512sum, sleep, sort, ssl_client, stat, stty, sum, sync, tail, tar, taskset, tee, test, time, timeout, touch, true, uname, uniq, unlink, unlzop, unzip, usleep, vi, watch, wc, wget, which, who, xargs, zcat
This list is much shorter than the applets that are supported in [Wayback] BusyBox – The Swiss Army Knife of Embedded Linux, so VMware did cut out quite a few.
Generating the above output
The command-line trick above first expands diff
using the output of which diff
, then finds out where it links to through the readlink -f
wrapper there the back-quotes “`
” get this output:
# readlink -f "`which diff`" /usr/lib/vmware/busybox/bin/busybox
Finally the $(...)
executes the output of readlink
.
It is based on [Wayback] bash – How to resolve symbolic links in a shell script – Stack Overflow
readlink -f "$path"
Editor’s note: The above works with GNU readlink and FreeBSD/PC-BSD/OpenBSD readlink, but not on OS X as of 10.11.GNU readlink offers additional, related options…
Need to devise a way to apply patches
Given there is no patch
, I need to think about a good way to apply patches, for instance to snip this into /etc/rc.local.d/local.sh
in a reliable way:
## BEGIN-PATCH-PATH # local binaries are in /vmfs/volumes/NVMe980PRO_1TB/local-bin/ # link that directory from /opt/bin # then add /opt/bin to the PATH in /etc/profile so that on each logon it becomes available # this means you need to logon twice after reboot: # - first to patch /etc/profile # - second to have the correct PATH loaded from /etc/profile # direcory exist trick from https://stackoverflow.com/questions/59838/how-can-i-check-if-a-directory-exists-in-a-bash-shell-script patch_etc_profile_PATH() { if [ -d "$1" ]; then ln -s "$1" "/opt/bin" sed -i -e 's!PATH=/bin:/sbin!PATH=/bin:/sbin:/opt/bin/!' /etc/profile fi } patch_etc_profile_PATH /vmfs/volumes/NVMe980PRO_1TB/local-bin/ ## END-PATCH-PATH
–jeroen
Leave a Reply