muhuk's blog

Nature, to Be Commanded, Must Be Obeyed

November 07, 2017

How to Install Rust on Debian Without Sudo

Rust has been around for a while but I have just recently found the opportunity to study it. It has some unique and powerful ideas and I intend to experiment further. This post summarizes the steps I have followed to install Rust toolchain on my Debian Stretch machine without admin rights[1].

Step 0: Temporarily Disabling Sudo

Official Rust documentation suggests installing official installer rustup by running the command below:

curl https://sh.rustup.rs -sSf | sh

This would install the toolchain system-wide, writing to directories like /usr/local. I wanted a user-space install. To ensure sudo is not used I aliased the command like below:

sudo whoami       # => root
alias sudo=''
sudo whoami       # => muhuk
unalias sudo
sudo whoami       # => root

This does not prevent any script to execute /usr/bin/sudo but it is good enough to quell my paranoia.

Step 1: Install Rust Toolchain

I copied rustup.sh file to my ~/bin and made it executable. Then I created a base directory for Rust:

cp ~/Downloads/rustup.sh ~/bin
chmod +x ~/bin/rustup.sh
mkdir -p ~/lib/rust

With this we are ready to run the installer:

$ rustup.sh --help

Usage: rustup.sh [--verbose]

Options:

     --channel=(stable|beta|nightly)   Install from channel (default stable)
     --date=<YYYY-MM-DD>               Install from archives
     --revision=<version-number>       Install a specific release
     --spec=<toolchain-spec>           Install from toolchain spec
     --prefix=<path>                   Install to a specific location (default /usr/local)
     --uninstall                       Uninstall instead of install
     --with-target=<triple>            Also install the standard library for the given target
     --add-target=<triple>             Updates an existing installation with a new target
     --list-available-targets          Lists targets available to an existing installation
     --disable-ldconfig                Do not run ldconfig on Linux
     --disable-sudo                    Do not run installer under sudo
     --save                            Save downloads for future reuse
     --yes, -y                         Disable the interactive mode
     --help, -h                        Display usage information

I have used the following command to install[2]:

rustup.sh --disable-sudo --prefix=/home/muhuk/lib/rust

This will download and install Rust compiler and Cargo package manager. It run successfully but since I did not specify --disable-ldconfig there was a warning about that. Following commands should fix this issue:

sudo bash -c 'echo "/home/muhuk/lib/rust/lib" > /etc/ld.so.conf.d/rust.conf'
sudo ldconfig

# Below command would only produce any output if
# you have already compiled something with Rust:
sudo ldconfig -p | grep rust

Step 2: Add Rust Binaries to PATH

Rust base directory has these subdirectories:

$ ls -1 ~/lib/rust
bin
etc
lib
share

Adding export PATH=~/lib/rust/bin:$PATH to ~/.profile would make Rust compiler and Cargo available through the PATH:

$ tail -n1 ~/.profile
export PATH=~/lib/rust/bin:$PATH

Step 3: Verify Installation

Run following commands to verify everything works:

cargo new cargo-test
cd cargo-test
cargo check
cargo build
cargo test

Output of cargo test should look something like below:

$ cargo test
    Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
     Running target/debug/deps/cargo_test-9badc6b245845605

running 1 test
test tests::it_works ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

   Doc-tests cargo-test

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

More Rust posts will follow.


[1]For the most part. I still needed admin rights for ldconfig.
[2]Needless to say you should replace muhuk with your own user name.

If you have any questions, suggestions or corrections feel free to drop me a line.