Skip to content

rshim and the BFB path

S2·E3Exit code zero, and nothing works · Caged row, Round Rock, Wednesday, day three of five

S2·E3Apply~45 minsources checked todaylab mutates hardwareverified against DOCA 3.5.0 BF-Bundle Installation and Upgrade, BlueField Platform Software Troubleshooting Guide (RShim), rshim-user-space README and source, BSP 4.15.0 bf.cfg reference, 2026-09-06

Builds on: The MFT toolbox: read-only vs mutating

Before you read: what do you already know?

3 quick questions. Wrong answers are fine and expected; trying first makes the lesson stick.

After this lesson you can

  • Use the four rshim device files and read the misc status fields to diagnose a BlueField's boot state.
  • Bring up and verify the tmfifo_net0 path to the Arm and tell a real path from a locally answered ping.
  • Push a BF-Bundle with bfb-install and a bf.cfg, and read the boot markers that prove it finished.
  • Distinguish bf-bundle from bf-fwbundle and choose the right one for an OS install versus a firmware-only update.

Episode 3 — Exit code zero, and nothing works

The situation · Caged row, Round Rock, Wednesday, day three of five

The SE has a cold coffee and a green row: twenty-four bfb-install runs, exit code 0 on all of them, the afternoon booked for the OVS work. The engineer who ran them has not opened one SSH session to a card. He pings 192.168.100.2, gets replies, and concludes the network is fine and the Arm’s SSH daemon is broken. The network lead writes that sentence down, in the voice he saves for these moments, and asks to be shown the counter that says the Arm is up.

The ping is lying to him. That address is answered by whichever interface owns it in the host’s routing table, so a stale address on the wrong interface answers itself; ip route get 192.168.100.2 has to come back with dev tmfifo_net0 or dev tm-br before an SSH failure means anything at all.[9][10]

RShim exists for exactly this situation. A DPU has no screen and no keyboard, so NVIDIA gave the host a management channel that works before the card has an OS: device files for a boot stream, an Arm serial console, raw register access and a key/value status file, plus a small network interface riding the same channel.[2][3] That is how you install a computer through a PCIe slot.

The deployment guidance for the rest of the afternoon is one sentence long: do not trust bfb-install exit code 0 alone.[10]

Exit code zero means the file was sent, not that the card is installed.

Segment 1 is the file he should have read first.

1RShim: four device files and one status file

RShim is the SoC management interface of a BlueField. It “enables management, monitoring, and debugging of the device … firmware updates, system status checks, Arm console access, and network communication through device files (e.g., boot, misc, console) and the RShim network interface (i.e., tmfifo_net0)”.[2] The host-side daemon (rshim) probes backends in the order IOMMU, UIO, Direct Map, and creates one directory per attached target.[2] List them with ls -la /dev/ | grep rshim.[1]

Each /dev/rshim<N>/ holds four files:[3]

File Role Typical command
boot Push a boot stream to the Arm cat install.bfb > /dev/rshim0/boot
console Serial console of the Arm screen /dev/rshim0/console 115200 or minicom -D /dev/rshim0/console -C rshim_console.txt
rshim Raw register access debugging only
misc Key/value status and control cat /dev/rshim0/misc

The misc file is the one you read most. At the default DISPLAY_LEVEL 0 the README shows these fields:[3]

DISPLAY_LEVEL   0 (0:basic, 1:advanced, 2:log)
BOOT_MODE       1 (0:rshim, 1:emmc, 2:emmc-boot-swap)
BOOT_TIMEOUT    100 (seconds)
DROP_MODE       0 (0:normal, 1:drop)
SW_RESET        0 (1: reset)
DEV_NAME        usb-3.3
DEV_INFO        BlueField-3(Rev 1)
OPN_STR         9009D3B400ENEA
UP_TIME         179752(s)
SECURE_NIC_MODE 1 (0:no, 1:yes)

DISPLAY_LEVEL 1 adds PEER_MAC (the Arm-side MAC of the rshim network interface) and PXE_ID; DISPLAY_LEVEL 2 streams the boot log, which is where the install markers appear.[3][2] On a PCIe backend DEV_NAME reads like pcie-04:00.2: the RShim PF is the .2 function of the BlueField PCIe device, so this field joins an rshim index to an lspci address.[2] Two writes matter: echo "SW_RESET 1" > /dev/rshim0/misc resets the Arm cores, and echo "DISPLAY_LEVEL 2" > /dev/rshim0/misc turns on the log.[2] When SECURE_NIC_MODE is 1 “the NIC firmware is in Secure NIC mode and most rshim functionalities are disabled” (PCIe backend only).[3] OPN_STR is the card’s ordering part number and DEV_INFO its silicon revision; both are worth pasting into a ticket.

One error to recognise on a fresh host: “failed to setup CUSE rshim” means the cuse kernel module is missing; install kernel-modules-extra, modprobe cuse, restart the service.[2]

Inject failure:
A · rshim / BFB from the host (BlueField-3)1Host prereqs2Find rshim03bf.cfg4bfb-install5misc log6tmfifo + ssh7VerifyB · BMC Redfish SimpleUpdate → DPU_OS (BlueField-3)1Reach BMC2bf.cfg3SimpleUpdate4Task5Mode6Verify
step 1 / 7
host

1. Host prerequisites: DOCA-Host, MFT, rshim

Command
sudo apt install -y doca-all        # DEB; RPM: sudo yum install -y doca-all  (or doca-ofed / doca-networking)
sudo mst start
systemctl status rshim
Expected output (excerpt)
● rshim.service - rshim driver for BlueField SoC
     Active: active (running)

If it does not match · rshim and MFT ship with DOCA-Host. "failed to setup CUSE rshim" → sudo dnf install kernel-modules-extra; sudo modprobe cuse; systemctl restart rshim. mst status -v should list /dev/mst/mt41692_pciconf0 (BlueField-3 device ID 41692). Keep the apt/yum repo channel and the installed DOCA version on the same release.

source

Sources: BF-Bundle Installation and Upgrade, BlueField Platform Software Troubleshooting (RShim), BSP 4.15.0 bf.cfg guide, rshim-user-space (rshim.8, rshim.conf, bfb-install), BlueField BMC 26.04 (Deploying Software Using BFB, Modes), NVIDIA/skills doca-bf4-deployment.

The rshim path: from a card the host sees in lspci to DPU is ready. Predict each step before revealing it.

2tmfifo_net0 and the ping that lies

The rshim daemon also creates a network interface, tmfifo_net0, that rides the same channel. The BF-Bundle guide configures the host side with ifconfig tmfifo_net0 192.168.100.1/24 and then connects with ssh ubuntu@192.168.100.2; the Arm side is preconfigured at .2.[1] The troubleshooting guide shows the Arm end as ifconfig tmfifo_net0 192.168.100.2 netmask 255.255.255.252 up, a /30; either mask works as long as host and Arm agree.[2] Some DOCA-Host installs bridge tmfifo_net0 into a tm-br bridge, so the address may sit on the bridge instead of the interface.[9]

The trap: a ping 192.168.100.2 that succeeds can be answered by the host itself when the address landed on the wrong interface. Run ip route get 192.168.100.2 first and accept only dev tmfifo_net0 or dev tm-br in the output.[9][10] Only then trust SSH failures as the Arm’s fault.

First login on a fresh image is ubuntu/ubuntu, and the system forces a password change unless ubuntu_PASSWORD was set in bf.cfg at install time.[1] The Arm-side anchors to read once you are in are cat /etc/mlnx-release and sudo bf-info.[1]

3bf-bundle, bf-fwbundle, and bfb-install

The Linux installation guide lists five ways to put software on a BlueField: a BFB image (“BlueField bootstream (BFB) image for OS deployment on the BlueField DPUs”), standard apt update or yum update on the Arm, an ISO image, bfb-build for people who build their own image, and the BF-FW bundle, “a firmware-only BFB image which includes UEFI, NIC firmware, and BMC firmware”.[6] The BF-Bundle itself is the DOCA runtime plus the Arm OS plus the platform firmware and UEFI.[11]

Names tell you which you hold. A full bundle looks like bf-bundle-2.7.0_24.04_ubuntu-22.04_prod.bfb (the guide’s example); the firmware-only image is bf-fwbundle-<version>_prod.[1] Because 3.5.0’s default BlueField OS is “Ubuntu 24.04 64k”, expect ubuntu-24.04 in a 3.5.0 bundle name, but read the exact file name from the downloads page rather than from this lesson.[8] The 3.5.0 archive page confirms bf-fwbundle upgrades ATF-UEFI, NIC firmware and BMC firmware only, without OS overwrite, and covers both BlueField-2 and BlueField-3.[7] The component versions inside a given 3.5.0 image are not tabulated on the pages fetched for this lesson; read them with sudo bf-info on the Arm after the install.[1]

The push itself:[1][5]

sudo bfb-install --rshim rshim<N> --bfb <image_path.bfb>
sudo bfb-install --rshim rshim<N> --bfb <image_path.bfb> --config bf.cfg
# short form from the BSP guide
bfb-install -r <rshim device> -c <path/to/bf.cfg> -b <BFB>
# what bfb-install does for you
cat <BFB> <path/to/bf.cfg> > /dev/<rshim device>/boot
# or bake the config into a new image
cat <BFB> <path/to/bf.cfg> > <new BFB>

While it runs, sudo cat /dev/rshim<N>/misc (at DISPLAY_LEVEL 2) shows the boot log. The markers you wait for after the reboot are INFO[MISC]: Linux up and INFO[MISC]: DPU is ready[1]; the failure string seen during installs is INFO[MISC]: NIC firmware update failed.[9] The deployment skill’s rule: “Do NOT trust bfb-install exit code 0 alone.” Require the markers, then the tmfifo route, then SSH, then cat /etc/mlnx-release and bfver.[10] For a card that is not yet healthy it gives a six-state ladder: installer-still-running, uefi-only, linux-up-tmfifo-down, tmfifo-up-ssh-down, arm-ok-host-pfs-unbound, host-bf-version-mismatch.[10][9] Name the state before you act; each has a different next command.

An Arm-side alternative exists, doca-installer -b <image_path.bfb> -c <path-to-config>, with --show-target-fw, --show-running-fw and --compare; its logs land under /var/log/doca_installer_logs/.[1]

4bf.cfg: keys and hooks

bf.cfg is a shell-style file appended to the BFB. The BSP guide’s syntax rule is short: “Do not use spaces around the ‘=’.”[5] The keys fall into four groups (defaults from the BSP 4.15.0 page):[5]

Group Keys (default)
Credentials ubuntu_PASSWORD (hash from openssl passwd -1), grub_admin_PASSWORD, BMC_PASSWORD / NEW_BMC_PASSWORD, UEFI_PASSWORD / NEW_UEFI_PASSWORD
BMC BMC_USER (root), UPDATE_BMC_FW (yes), BMC_REBOOT (no), UPDATE_CEC_FW (yes), BMC_IP_TIMEOUT (600 s), BMC_TASK_TIMEOUT (1800 s)
OS and NIC firmware UPDATE_ATF_UEFI (yes), UPDATE_DPU_OS (yes), WITH_NIC_FW_UPDATE (yes on the 4.15.0 page), FORCE_NIC_FW_UPDATE (no), NIC_FW_RESET (yes)
Network NET_RSHIM_MAC, PXE_DHCP_CLASS_ID

One default is uncertain across versions: the 4.15.0 page lists WITH_NIC_FW_UPDATE as yes, while older BSP text described it as disabled by default. Read the bf.cfg reference for the BSP inside your bundle before assuming a push will or will not touch NIC firmware.[5]

Three hook functions let you run shell during the install:[5]

  • bfb_pre_install() runs before storage partitioning.
  • bfb_modify_os() is “called after the file system is extracted on the target partitions … target file system mounted under /mnt”.
  • bfb_post_install() is the final step before reboot, with partitions unmounted.

The deployment skill uses bfb_modify_os() as the documented place to inject authorized_keys and to apply mode-related mlxconfig at install time, with the rule “decide the DPU mode BEFORE the push”.[9][10] The guide’s password example is echo ubuntu_PASSWORD='$1$3B0RIrfX$TlHry93NFUJzg3Nya00rE1' > bf.cfg.[1]

# bf.cfg — minimal lab example (no spaces around '=')
ubuntu_PASSWORD='$1$3B0RIrfX$TlHry93NFUJzg3Nya00rE1'
UPDATE_BMC_FW=no
bfb_modify_os()
{
  mkdir -p /mnt/home/ubuntu/.ssh
  cat >> /mnt/home/ubuntu/.ssh/authorized_keys <<'KEY'
ssh-ed25519 AAAA...your-lab-key... lab@dell
KEY
  chmod 700 /mnt/home/ubuntu/.ssh
  chmod 600 /mnt/home/ubuntu/.ssh/authorized_keys
}

The key material and the chmod lines are ordinary Linux; the hook name, the /mnt prefix and the no-spaces rule are the BlueField-specific facts.[5]

5A full install transcript

The transcript below is the BF-Bundle guide’s own example (a 2.7.0 image on Ubuntu 22.04; a 3.5.0 push prints the same stages with a different file name).[1]

Push a BF-Bundle over rshim, read every line, verify

Pre-flight on the host: lspci -d 15b3: -nn, grep DEV_NAME /dev/rshim0/misc (must be the .2 function of the card you intend), sudo flint -d /dev/mst/mt41692_pciconf0 q, and the current Arm release (ssh ubuntu@192.168.100.2 cat /etc/mlnx-release). Keep the previous BFB file.[10]

host# echo ubuntu_PASSWORD='$1$3B0RIrfX$TlHry93NFUJzg3Nya00rE1' > bf.cfg
host# sudo bfb-install --rshim rshim0 --bfb bf-bundle-2.7.0_24.04_ubuntu-22.04_prod.bfb --config bf.cfg
Pushing bfb 1.41GiB 0:02:02 [11.7MiB/s] [           <=>                     ]
Collecting BlueField booting status. Press Ctrl+C to stop
 INFO[PSC]: PSC BL1 START
 INFO[BL2]: start
 INFO[BL2]: boot mode (rshim)
 INFO[BL2]: VDDQ: 1120 mV
 INFO[BL2]: DDR POST passed
 INFO[BL2]: UEFI loaded
 INFO[BL31]: start
 INFO[BL31]: lifecycle GA Secured
 INFO[BL31]: VDD: 850 mV
 INFO[BL31]: runtime
 INFO[BL31]: MB ping success
 INFO[UEFI]: eMMC init
 INFO[UEFI]: eMMC probed
 INFO[UEFI]: UPVS valid
 INFO[UEFI]: PMI: updates started
 INFO[UEFI]: PMI: total updates: 1
 INFO[UEFI]: PMI: updates completed, status 0
 INFO[UEFI]: PCIe enum start
 INFO[UEFI]: PCIe enum end
 INFO[UEFI]: UEFI Secure Boot
 INFO[UEFI]: PK configured
 INFO[UEFI]: Redfish enabled
 INFO[UEFI]: exit Boot Service
 INFO[MISC]: Found bf.cfg
 INFO[MISC]: Ubuntu installation started
 INFO[MISC]: Installing OS image
 INFO[MISC]: Changing the default password for user ubuntu
 INFO[MISC]: Ubuntu installation completed
 INFO[MISC]: Updating NIC firmware...
 INFO[MISC]: NIC firmware update done
 INFO[MISC]: Installation finished

How to read it:[1]

  1. Pushing bfb is the host streaming the image into /dev/rshim0/boot; the size and rate are the only feedback.
  2. INFO[BL2]: boot mode (rshim) confirms the card booted from the stream, not from eMMC.
  3. INFO[BL2]: DDR POST passed is the on-card memory test; a failure here is hardware, not software.
  4. INFO[UEFI]: PMI: updates completed, status 0 means the platform firmware pieces bundled in the image applied cleanly.
  5. INFO[MISC]: Found bf.cfg proves your config reached the installer; if it is missing, your password and hooks did not apply.
  6. INFO[MISC]: Updating NIC firmware... then NIC firmware update done is the NIC firmware step controlled by WITH_NIC_FW_UPDATE; the failure form is NIC firmware update failed.[5][9]
  7. Installation finished ends the installer; the card reboots into the new OS.

After the reboot, keep sudo cat /dev/rshim0/misc open until you see INFO[MISC]: Linux up and then INFO[MISC]: DPU is ready.[1] Then: ip route get 192.168.100.2 (expect dev tmfifo_net0 or dev tm-br), ssh ubuntu@192.168.100.2, cat /etc/mlnx-release, sudo bf-info, and on the host sudo flint -d /dev/mst/mt41692_pciconf0 q to confirm the NIC firmware moved to the bundle’s level.[9][1]

End of Episode 3 — Markers, route, SSH, release

How it ended

You raise DISPLAY_LEVEL to 2 and read the boot log in misc: the cards never reached INFO[MISC]: DPU is ready.[2][1] The pushes are repeated with a bf.cfg that sets the Arm password, the markers appear, ip route get names tmfifo_net0, SSH opens, and cat /etc/mlnx-release on the Arm matches the host.[1] Twenty-one nodes are proven before dinner, and the network lead gets his counter.

What you say to the engineer: “The card is installed when the boot markers, the route, SSH and the release string all agree.”[10]

Twenty-one. The three nodes at the dark end of the cage never offered a /dev/rshim0 to push into at all.

Lab

Mutating steps ahead. Needs a maintenance window, out-of-band access (BMC/iDRAC/rshim console) and a rollback path. Record the pre-flight inventory before changing anything. Never on a production host.

Pre-flight (read-only; all of it before step 6):

  1. lspci -d 15b3: -nn and grep -E 'DEV_NAME|DEV_INFO|BOOT_MODE|SECURE_NIC_MODE' /dev/rshim0/misc. DEV_NAME must be the .2 function of the card you intend to flash.[2][3] If SECURE_NIC_MODE is 1, stop: most rshim functions are disabled.
  2. sudo flint -d /dev/mst/mt41692_pciconf0 q | grep -E 'FW Version|FW Release Date' — record.
  3. ip route get 192.168.100.2 then ssh ubuntu@192.168.100.2 'cat /etc/mlnx-release; sudo bf-info' — record the current release and component versions.[1][9]
  4. Confirm the previous BFB file is on the host disk (ls -l *.bfb). This file is your rollback; if it is not there, download it before continuing.[10]
  5. Open a second terminal with sudo screen /dev/rshim0/console 115200 (or minicom -D /dev/rshim0/console -C rshim_console.txt) to capture the console.[1]

Mutating steps (each names its rollback):

  1. echo "DISPLAY_LEVEL 2" > /dev/rshim0/misc so misc streams the boot log. Rollback: echo "DISPLAY_LEVEL 0" > /dev/rshim0/misc.[2]
  2. Push: sudo bfb-install --rshim rshim0 --bfb <3.5.0 bf-bundle>.bfb --config bf.cfg. Rollback: push the previous bf-bundle from step 4 with the same command; if only the NIC firmware step went wrong, push the previous bf-fwbundle instead.[1][7]
  3. Watch sudo cat /dev/rshim0/misc until INFO[MISC]: Linux up and INFO[MISC]: DPU is ready. If the log stops for more than the BOOT_TIMEOUT shown in misc, echo "SW_RESET 1" > /dev/rshim0/misc and watch again; if it stops a second time, roll back.[1][2]
  4. Verify: ip route get 192.168.100.2 (accept dev tmfifo_net0 or dev tm-br only), ssh ubuntu@192.168.100.2 'cat /etc/mlnx-release; sudo bf-info', and on the host sudo flint -d /dev/mst/mt41692_pciconf0 q. Pass: the Arm release matches the bundle and the host’s DOCA-Host release, and the firmware moved to the bundle’s level. Fail: classify with the six-state ladder and roll back if you cannot name the next command.[9][10]
  5. If a mode change was decided before the push, the power cycle for it is a separate mutating step; do it as lesson 2.5 describes, with its own rollback.

Retrieval check

10 questions from memory. Answer before looking anything up; misses become flashcards.

Explain it to a Dell SE

Explain to a Dell SE, in five sentences, how a BlueField-3 gets its operating system when there is no keyboard, screen or USB stick on the card.

14 flashcards for this lesson — 0 in deck. Spaced review lives at /review.

Sources

Facts in this lesson were checked against DOCA 3.5.0 BF-Bundle Installation and Upgrade, BlueField Platform Software Troubleshooting Guide (RShim), rshim-user-space README and source, BSP 4.15.0 bf.cfg reference, 2026-09-06. Dates are when each page was fetched.

  1. BF-Bundle Installation and Upgrade · fetched 2026-09-06 · DOCA 3.5.0
  2. BlueField Platform Software Troubleshooting Guide: SoC Management Interface (RShim) · fetched 2026-09-06
  3. rshim-user-space README (device files, misc fields) · fetched 2026-09-06
  4. rshim daemon source (rshim.c: -F force mode, another backend already attached) · fetched 2026-09-06
  5. BlueField BSP 4.15.0: Customizing BlueField Software Deployment (bf.cfg) · fetched 2026-09-06
  6. DOCA Installation Guide for Linux (installation methods) · fetched 2026-09-06 · DOCA 3.5.0
  7. BF-Bundle Installation and Upgrade (3.5.0 archive, bf-fwbundle scope) · fetched 2026-09-06 · DOCA 3.5.0
  8. DOCA General Support (default BlueField OS, firmware table) · fetched 2026-09-06 · DOCA 3.5.0
  9. NVIDIA/skills: doca-bf3-deployment CAPABILITIES (tmfifo route check, bfb_modify_os) · fetched 2026-09-06
  10. NVIDIA/skills: doca-bf3-deployment TASKS (exit-code rule, six-state classifier) · fetched 2026-09-06
  11. DOCA Overview (BF-Bundle definition) · fetched 2026-09-06 · DOCA 3.5.0

The same idea elsewhere

Other lessons that cover this ground, sometimes from another course's angle.