This guide shows you how to install the SupremeRAID™ software dependencies on a server that has no internet access. The customer collects a system profile with graidutil, a Graid SE or partner generates a matching dependency bundle from the official distribution repositories on a machine with internet access, and the customer installs that bundle before running the SupremeRAID pre-installer and installer in offline mode.
| Step | Where | Command | Produces |
|---|---|---|---|
| 1 | Customer server | graidutil collect data | installed_versions.txt |
| 2 | SE / partner build machine | python3 check_kernel.py --installed installed_versions.txt | Kernel-headers availability result |
| 3 | SE / partner build machine | python3 offline.py --installed installed_versions.txt | <distro><major>_offline_packages.tar.gz |
| 4 | Customer server | sudo graidutil install <bundle> | Dependencies installed |
| 5 | Customer server | graid-preinstaller ... --offline-install, then graid-installer --offline-install | SupremeRAID installed |
Earlier offline procedures only covered the RHEL family and Ubuntu, and they pushed work onto the customer: Ubuntu required a second identical machine, and RHEL required the customer to mount the installation ISO, whose kernel-headers and dependency versions Graid could not control. The current tooling uses one flow for every supported distribution: the customer runs one command to describe their system, the SE generates every required package (including the matching kernel-headers / linux-headers) from the official repositories in a throw-away Docker container, and the customer installs the bundle with one command.
graidutil package from Graid support (.deb or .rpm, x86_64 or aarch64).offline.py and check_kernel.py, in the same directory.curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo systemctl enable --now docker
docker run --rm hello-worlddocker group and log in again.python3 --versionmkdir -p ~/graid-offline && cd ~/graid-offline
# copy offline.py and check_kernel.py hereexport ACCOUNT='<your Red Hat account>'
export PASSWORD='<your Red Hat password>'Install the graidutil package if it is not already present:
# Debian / Ubuntu family
sudo dpkg -i graidutil-<version>-x86_64.deb
# RHEL / SUSE family
sudo rpm -i graidutil-<version>-x86_64.rpmThen collect the profile:
graidutil collect data
# or write it to a specific path
graidutil collect data -o /tmp/installed_versions.txtThis writes installed_versions.txt in the current directory. The file contains the distribution, release, kernel version, CPU architecture, the kernel's GCC configuration, and the version of every installed package. It does not contain hostnames, IP addresses, or credentials.
Send installed_versions.txt to your Graid SE or partner.
Before downloading anything, confirm that the kernel-headers / linux-headers package for the customer's exact kernel still exists in the official repository. Distributions remove older kernel packages over time.
python3 check_kernel.py --installed installed_versions.txtThere are three possible results.
[CHECK] ubuntu 24.04 - kernel: 6.8.0-139-generic
linux-headers-6.8.0-139-generic ... [INSTALLED]
linux-modules-extra-6.8.0-139-generic ... [INSTALLED]
[RESULT] Kernel packages are already installed on the target machine.Nothing kernel-related needs to be downloaded. Go to step 3.
[CHECK] debian 13 - kernel: 6.12.73+deb13-amd64
linux-headers-6.12.73+deb13-amd64 ... [OK]
[RESULT] Kernel-headers/linux-headers packages are available in the official repo.The bundle will include headers matching the running kernel. Go to step 3.
[CHECK] debian 13 - kernel: 6.12.74+deb13-amd64
linux-headers-6.12.74+deb13-amd64 ... [NOT FOUND]
[RESULT] Kernel-headers/linux-headers packages were NOT found.
If you proceed with -K no-specify, offline.py will install:
linux-headers-amd64 = 6.12.94-1The customer's kernel version is no longer in the official repository. Report this to the customer and let them choose:
-K no-specify. The bundle will contain the latest kernel and headers shown in the output, and the customer will reboot into the new kernel after step 4.# RHEL targets only, in the same shell:
export ACCOUNT='<your Red Hat account>'
export PASSWORD='<your Red Hat password>'
python3 offline.py --installed installed_versions.txt
# Only when the customer agreed to a kernel upgrade in step 2, result C:
python3 offline.py --installed installed_versions.txt -K no-specifyThe script pulls the matching distribution image for the customer's architecture, resolves every package SupremeRAID needs against the customer's installed versions, downloads them, and packs them. A successful run ends with:
[DONE] ubuntu24_offline_packages.tar.gz → /home/se/graid-offline/output_tar
[SUCCESS] ubuntu-24.04 finished.The bundle is written to output_tar/<distro><major>_offline_packages.tar.gz next to the script, for example rocky9_offline_packages.tar.gz or ubuntu24_offline_packages.tar.gz. Expect roughly 100 to 400 MB depending on the distribution.
Note: output_tar/ is deleted and recreated on every run. Copy the bundle somewhere else before generating another one.
Send the .tar.gz file to the customer.
Copy the bundle onto the server and run the installer as root:
sudo graidutil install ubuntu24_offline_packages.tar.gz
# or
sudo graidutil install -p /path/to/ubuntu24_offline_packages.tar.gzThe installer:
AgreetoUpgradeEvery run is logged to /var/log/graid-offline-package.log, including what the operator typed at the confirmation prompt.
sudo bash graid-preinstaller -pl sr --offline-install
sudo bash graid-installer --offline-installThe --offline-install option tells both runfiles to use the dependencies installed in step 4 instead of downloading them. Continue with the normal SupremeRAID setup (license, driver, graidctl) as documented in the user guide.
Commands inside the boxes can be selected and copied.
Customer server
graidutil collect datainstalled_versions.txtinstalled_versions.txt to the SE / partnerSE / partner build machine (Docker + offline.py + check_kernel.py)
python3 check_kernel.py --installed installed_versions.txtYes (or already installed) Keep the customer's current kernel version | No Customer decides whether to upgrade the kernel ↓
|
python3 offline.py --installed installed_versions.txtoutput_tar/<distro><major>_offline_packages.tar.gz.tar.gz bundle back to the customerCustomer server (install)
sudo graidutil install <distro><major>_offline_packages.tar.gzAgreetoUpgrade ?Yes Dependencies installed (reboot if the kernel was upgraded) ↓ | No Installation cancelled, nothing changed |
| Family | Releases | Notes |
|---|---|---|
| Red Hat Enterprise Linux | 7, 8, 9, 10 | Needs ACCOUNT / PASSWORD exported on the build machine |
| AlmaLinux / Rocky Linux | 8, 9, 10 | |
| CentOS | 7, Stream 8 | Pulled from vault.centos.org |
| Oracle Linux | 8, 9, 10 | UEK and RHCK kernels |
| Fedora | 40, 42 | |
| openEuler / Kylin | 22.03, 24.03 / V10, V11 | |
| openSUSE Leap / Tumbleweed | 15.6 / 16 | Kernel headers are not pinned to an exact version |
| Ubuntu | 20.04, 22.04, 24.04, 26.04 | |
| Debian | 11, 12, 13 | |
| Proxmox VE | 8, 9 | Built on the matching Debian image |
Both x86_64 and aarch64 customers are supported. The scripts read the architecture from installed_versions.txt and build inside a container of that architecture.
SyntaxError on start: Python is older than 3.10. Check python3 --version.docker command not found or permission denied while trying to connect to the Docker daemon: Docker is not installed, not running, or your user is not in the docker group.[SKIP] Image not available: the machine cannot reach Docker Hub, quay.io, or registry.access.redhat.com. Check proxy and firewall settings.[ERROR] RHEL requires Red Hat subscription credentials: the target is RHEL and ACCOUNT / PASSWORD are not exported in the current shell.[ERROR] DISTRO / RELEASE not found in --installed file: the file was not produced by graidutil collect data, or its first lines were edited. Ask the customer to collect it again.[ERROR] Unsupported distro or is not supported: the customer's distribution or release is not in the supported list. Contact Graid support.[ERROR] -K only accepts 'no-specify': the kernel version is always taken from the file; -K exists only to request the latest kernel.[FAIL] <distro> during step 3: the package manager inside the container could not resolve the request. Scroll up for the package manager's own error. Typical causes are a mirror outage or a kernel version that disappeared between step 2 and step 3.graidutil install: the bundle does not match the server, for example because packages were installed or upgraded after installed_versions.txt was collected. Collect a fresh profile and generate a new bundle.[ABORTED] You did not agree to upgrade the required packages: the confirmation phrase must be typed exactly as AgreetoUpgrade, case-sensitive.