Rust is a really ambitious programming language that “runs blazingly fast, prevents segfaults, and guarantees thread safety.” Who doesn’t want to try this with a headline like that?
I wanted to use Rust on an offline Linux system, but it seemed like there isn’t a nice guide to install Rust and some popular packages all in one go (like Anaconda, though what I describe here is much more ghetto), so I decided to summarize the procedure to install the Rust toolchain and some popular libraries all in one go on a system with no internet access.
To prepare the files to put onto the targetted unconnected Linux machine, you need a Linux box that is connected to the net to fetch the necessary files and run some commands.
Installing Rust on a normal connected machine is really easy:
It’s an amazing tool (I mean, if you’re a new language, it’s probably a good
idea to make it extremely easy to install), but it seems to only work when the machine is online.
There are standalone installers available in the Other Rust Installation Methods page.
If you’re targeting Linux like me, you should probably download the
x86_64-unknown-linux-gnu .tar.gz bundle and move it over to the target machine.
It installs globally provided you have root access, and there doesn’t really
seem to be an option to install to one user, which there is an option to do if you use
The Rust Playground is a simple website that
lets you run bits of Rust code and get immediate results all in the browser.
A neat thing about the Playground is that it supports the top 100 most popular
Cargo packages. The Playground code maintains a
that is automatically updated with the top 100 packages, so we’ll use this to get
some packages we might need in our offline setup.
Just having the
Cargo.toml file is useless, so we need to turn them into actual
bits of code or blobs that we can use in our Rust code. On a connected machine,
cargo build or any other build commands will automatically fetch
them from crates.io, so we need to replace this functionality
with a local mirror that serves crates.
The following procedure takes a while to complete and is quite fiddly, so I made the final archive file available for download here. Skip to the next section to see how to install this on your target machine.
To create your own local archive, you can use a handy dandy Cargo subcommand called
you can install. Using the
Cargo.toml file from the Playground, we can
turn the declarations into actual
.crate files. Install this on your
I found the easiest way to get these crates was to make a temporary empty Rust project on your connected machine:
cargo new playground
Notice the name of the project, because that means we can use the
from the playground without modifying it.
Cargo.toml from the Playground, and generate
cargo local-registry --sync Cargo.lock ../local_registry/
After that’s done, you probably want to make a tar archive of the local registry so you can easily move it over to the target system.
The following steps are to be run on the Target system.
To reiterate, you need to move the Rust standalone installer and the local registry archive you created earlier to the target machine.
Installing the Rust toolchain is super simple as explained earlier. Unarchive and run the
install.sh script inside the root directory of the installer.
Next, unzip the local registry in a convenient location. You must then tell Cargo on the target machine to use local registry instead of crates.io, by writing a section on your Cargo config.
For the config to take effect for all users, it’s probably best to put it on
/.cargo/config, or if you want it to take effect on just your user, on
Write the following in the config file, creating it if it doesn’t exist already:
Don’t forget to replace the
local-registry field value with the actual location
of your local registry.
To test if it actually compiles, use the temporary
playground Rust project we made earlier.
If you try to
cargo build it, it will compile all 100 of those crates, and it’s
a good way to test. From my experience, you probably need to install
cc crate, the OpenSSL development library because of (to nobody’s surprise)
openssl crate, and
make in addition.
Thank you to the people on the Rust Discord for giving me guidance to get this working.