rshim and the BFB path
S2·E3Exit code zero, and nothing works · Caged row, Round Rock, Wednesday, day three of five
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 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]
1. Host prerequisites: DOCA-Host, MFT, rshim
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
● 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.
sourceSources: 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.
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]
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]
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 finishedHow to read it:[1]
Pushing bfbis the host streaming the image into/dev/rshim0/boot; the size and rate are the only feedback.INFO[BL2]: boot mode (rshim)confirms the card booted from the stream, not from eMMC.INFO[BL2]: DDR POST passedis the on-card memory test; a failure here is hardware, not software.INFO[UEFI]: PMI: updates completed, status 0means the platform firmware pieces bundled in the image applied cleanly.INFO[MISC]: Found bf.cfgproves your config reached the installer; if it is missing, your password and hooks did not apply.INFO[MISC]: Updating NIC firmware...thenNIC firmware update doneis the NIC firmware step controlled byWITH_NIC_FW_UPDATE; the failure form isNIC firmware update failed.[5][9]Installation finishedends 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]
host# echo ____='$1$3B0RIrfX$TlHry93NFUJzg3Nya00rE1' > bf.cfg
host# sudo bfb-install --rshim ____ --bfb bf-bundle-<ver>_ubuntu-<os>_prod.bfb --config ____
Pushing bfb ...
Collecting BlueField booting status. Press Ctrl+C to stop
INFO[BL2]: boot mode (____) <- proves the card booted from the stream
INFO[BL2]: DDR POST ____
INFO[UEFI]: PMI: updates completed, status ____
INFO[MISC]: Found ____ <- your config reached the installer
INFO[MISC]: Ubuntu installation started
INFO[MISC]: Installing OS image
INFO[MISC]: Changing the default password for user ____
INFO[MISC]: Ubuntu installation completed
INFO[MISC]: Updating NIC firmware...
INFO[MISC]: NIC firmware update ____
INFO[MISC]: Installation ____After reboot in misc: INFO[MISC]: ____ up, then INFO[MISC]: DPU is ____. Then ip route get 192.168.100.2 must show dev ____ or dev ____; ssh ____@192.168.100.2; cat /etc/____; sudo ____ for component versions.
A host has two BlueField-3 cards; /dev/rshim0/misc shows DEV_NAME pcie-98:00.2 and /dev/rshim1/misc shows DEV_NAME pcie-21:00.2. You must reinstall only the card at 21:00 with a 3.5.0 bundle, set a known ubuntu password, install your SSH key, and leave BMC firmware alone. Write the bf.cfg, the exact bfb-install line, the markers you wait for, and the five verification commands. Acceptance: the rshim index in your command follows from DEV_NAME, not from habit; bf.cfg has no spaces around =, uses bfb_modify_os() with the /mnt prefix, and sets UPDATE_BMC_FW=no; your verification includes the route check and /etc/mlnx-release; you name the rollback (previous BFB kept) before you push.
End of Episode 3 — Markers, route, SSH, release
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
Pre-flight (read-only; all of it before step 6):
lspci -d 15b3: -nnandgrep -E 'DEV_NAME|DEV_INFO|BOOT_MODE|SECURE_NIC_MODE' /dev/rshim0/misc.DEV_NAMEmust be the.2function of the card you intend to flash.[2][3] IfSECURE_NIC_MODEis 1, stop: most rshim functions are disabled.sudo flint -d /dev/mst/mt41692_pciconf0 q | grep -E 'FW Version|FW Release Date'— record.ip route get 192.168.100.2thenssh ubuntu@192.168.100.2 'cat /etc/mlnx-release; sudo bf-info'— record the current release and component versions.[1][9]- 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] - Open a second terminal with
sudo screen /dev/rshim0/console 115200(orminicom -D /dev/rshim0/console -C rshim_console.txt) to capture the console.[1]
Mutating steps (each names its rollback):
echo "DISPLAY_LEVEL 2" > /dev/rshim0/miscso misc streams the boot log. Rollback:echo "DISPLAY_LEVEL 0" > /dev/rshim0/misc.[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 previousbf-fwbundleinstead.[1][7] - Watch
sudo cat /dev/rshim0/miscuntilINFO[MISC]: Linux upandINFO[MISC]: DPU is ready. If the log stops for more than theBOOT_TIMEOUTshown in misc,echo "SW_RESET 1" > /dev/rshim0/miscand watch again; if it stops a second time, roll back.[1][2] - Verify:
ip route get 192.168.100.2(acceptdev tmfifo_net0ordev tm-bronly),ssh ubuntu@192.168.100.2 'cat /etc/mlnx-release; sudo bf-info', and on the hostsudo 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] - 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.
- Create a password hash:
openssl passwd -1. Expected: a string starting with$1$.[1] If not: your openssl lacks the-1(MD5-crypt) mode; use another machine. - Write
bf.cfgfrom the Segment 4 example with your own key andUPDATE_BMC_FW=no. Check syntax:bash -n bf.cfgmust print nothing, andgrep -c ' = ' bf.cfgmust print0.[5] If not: remove the spaces around=. - Dry-run the concatenation with a stand-in image:
head -c 1M /dev/urandom > fake.bfb && cat fake.bfb bf.cfg > fake-with-cfg.bfb && tail -c 400 fake-with-cfg.bfb | strings | head. Expected: yourbf.cfgtext at the end of the file, which is whatbfb-install --configappends.[1] If not: the order of thecatarguments is wrong. - Read the Segment 5 transcript and mark the three lines that answer: did the card boot from rshim, did the config arrive, did the NIC firmware step finish. Expected:
boot mode (rshim),Found bf.cfg,NIC firmware update done.[1] - Classify these observations with the six-state ladder: (a) misc shows
INFO[UEFI]: exit Boot Serviceand nothing since, (b) misc showsLinux upbutip route get 192.168.100.2returnsdev eth0, (c) SSH works and/etc/mlnx-releasesays 3.4 while the host says 3.5. Expected: uefi-only, linux-up-tmfifo-down, host-bf-version-mismatch.[10] - Write the exact
ip route getacceptance line you would require before trusting a ping.[9]
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.
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.
- BF-Bundle Installation and Upgrade · fetched 2026-09-06 · DOCA 3.5.0
- BlueField Platform Software Troubleshooting Guide: SoC Management Interface (RShim) · fetched 2026-09-06
- rshim-user-space README (device files, misc fields) · fetched 2026-09-06
- rshim daemon source (rshim.c: -F force mode, another backend already attached) · fetched 2026-09-06
- BlueField BSP 4.15.0: Customizing BlueField Software Deployment (bf.cfg) · fetched 2026-09-06
- DOCA Installation Guide for Linux (installation methods) · fetched 2026-09-06 · DOCA 3.5.0
- BF-Bundle Installation and Upgrade (3.5.0 archive, bf-fwbundle scope) · fetched 2026-09-06 · DOCA 3.5.0
- DOCA General Support (default BlueField OS, firmware table) · fetched 2026-09-06 · DOCA 3.5.0
- NVIDIA/skills: doca-bf3-deployment CAPABILITIES (tmfifo route check, bfb_modify_os) · fetched 2026-09-06
- NVIDIA/skills: doca-bf3-deployment TASKS (exit-code rule, six-state classifier) · fetched 2026-09-06
- 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.