DEV Community

lbonanomi
lbonanomi

Posted on

4

Package Your Tools

RPMs in $HOME! Amaze friends! Confound enemies! Install the binary versions YOU want! All this and more with native tools and no root!

Enough hype yet? This is a simple and maybe-ugly way to get RPMs that install into your $HOME directory to simplify management of hosted shells and tight VMs/containers where management infrastructure would be too much overhead. You won't need root to install these RPMs, but will need a RHEL/Centos host to build them on; Circle CI's free tier is great for this.

I feel like I misled DeChamp in a comment thread talking about the socket options for fuser, so I'll use this article as a roundabout apology and employ fuser as an example.

Building RPMs for $HOME

  1. Install rpm-build on the builder VM to do the heavy lifting:
    sudo yum install rpm-build -y;

  2. Install the FPM gem on the builder VM to handle the RPM building :
    git clone https://github.com/jordansissel/fpm.git;
    cd fpm && gem install --no-ri --no-rdoc fpm;

  3. Create an install tree for your script on the builder VM. This file system tree will be reflected on the target host that the RPM is installed-on:
    mkdir -p $HOME/var/tmp/bin

  4. Add the scripts, libraries, configs and whatever else to $HOME/var/tmp/bin:
    cp $HOME/psmisc/src/fuser $HOME/var/tmp/bin

  5. Add a helper script called var/tmp/bin/fuser-after.sh to relocate installed files:
    [[ -d $HOME/bin ]] || mkdir $HOME/bin;
    [[ -d $HOME/bin ]] && mv /var/tmp/bin/fuser $HOME/bin;

Please give these scripts distinctive names, RPM won't want to install over an existing script.

  1. Build an RPM from the contents of $HOME/var: cd && fpm -s dir -t rpm -n fuser --after-install 'var/tmp/bin/fuser-after.sh' var

Installing RPMs for $HOME

Now don't let your enthusiasm fizzle when rpm -i comes back with "error: can't create transaction lock on /var/lib/rpm/.rpm.lock (Permission denied)"! If root doesn't want to share its tree house we'll build our own!

mkdir $HOME/rpmdb
find /var/lib/rpm -type f |xargs file| awk '/Berkeley/ {print $1}' | tr -d ':' | while read src 
do 
    db_dump $src | db_load $HOME/rpmdb/$(basename $src); 
done;
rpm --dbpath $HOME/rpmdb --rebuilddb;

Now we can install our RPMs like so:

rpm --dbpath $HOME/rpmdb -i fuser-1.0-1.x86_64.rpm

Image of Datadog

The Future of AI, LLMs, and Observability on Google Cloud

Datadog sat down with Google’s Director of AI to discuss the current and future states of AI, ML, and LLMs on Google Cloud. Discover 7 key insights for technical leaders, covering everything from upskilling teams to observability best practices

Learn More

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more