Update stock firmware and subsystems
sleepypod runs as userspace software on top of the Pod’s underlying embedded Linux operating system. The sleepypod biometrics pipeline communicates with the bed via stock background daemons (frankenfirmware) and onboard microcontroller firmware (firmware-sensor on the cover, and firmware-frozen in the hub).
While sleepypod Core updates itself with sp-update, the underlying stock firmware daemons and microcontroller binaries are not updated by sleepypod. Usually you do not need to touch stock firmware. However, there are scenarios where updating the stock subsystems is necessary.
When an update is needed
- Cross-generation hardware pairings: For example, pairing a Pod 3 hub with a Pod 4 cover. Stock Pod 3 firmware only supports older STM32F0/F1 cover microcontrollers (
0x08005000flash base). The Pod 4 cover uses an STM32G0 microcontroller with bootloaderv2.0.3.0(0x08008000flash base). Older firmware repeatedly sends a jump command to the wrong address, putting the cover into an infinite reboot loop (BL: Likely wrong Firmware address 8005000). - Missing NATS JetStream telemetry: Older hub firmware streams sensor data exclusively through legacy
.RAWfiles on disk. Modern Eight Sleep firmware publishes CBOR frames directly to a localnats-serverJetStream message bus (raw.sens.*andraw.frz.*), including batched piezo samples, a 2 Hz capacitive presence grid, and bed surface temperatures. - Hub thermal controller features: Updating
firmware-frozen.bbinto versionv1.5.156addsraw.frz.healthandraw.frz.thermtelemetry for pump flow rates, fan RPMs, and TEC thermal power.
Never flash a full .swu image to a MediaTek-based hub.
Official .swu firmware packages distributed by Eight Sleep contain complete root filesystem archives built for the NXP i.MX 8M Mini platform (imx8mm-var-dart-eight). This includes the pod3 update channel, so Pod 3 hubs exist on more than one SoC. Check your board before doing anything else:
ssh -p 8822 root@POD_IP "cat /proc/device-tree/model; echo"If it prints MT8365 Pumpkin, your hub runs on a MediaTek MT8365 SoC. Flashing the entire .swu file with swupdate or writing it to the eMMC will corrupt the kernel, device tree, and drivers, permanently bricking the board. This guide was written and verified on an MT8365 Pod 3 hub; use the extraction method below.
The userspace ARM64 binaries (frankenfirmware, libnats, nats-server) run across 64-bit ARM Linux platforms. However, microcontroller firmware images (.bbin) target specific hardware revisions: firmware-sensor-g0.bbin targets the STM32G0 microcontroller on Pod 4 covers, and firmware-frozen.bbin v1.5.156 has been verified on an MT8365 Pod 3 hub (pn 20500, hardware revision 0504). Compatibility with other hub controller hardware revisions has not been tested.
Option 1: Factory reset and official OTA (safest)
If you are using matching hardware (such as a Pod 3 hub with a Pod 3 cover, or a Pod 4 hub with a Pod 4 cover) and want the safest path to the latest vendor firmware, use the official factory reset procedure.
- Perform a hardware factory reset: Follow the firmware reset photos for your model in free-sleep’s installation guide . The hub boots from its factory backup partition and resets network settings.
- Pair with the official Eight Sleep app: Temporarily pair the Pod to the official mobile app over Wi-Fi. Allow the hub to connect to Eight Sleep’s servers and download official over-the-air (OTA) updates. Wait until all firmware and subsystem updates finish applying.
- Re-gain root access and reinstall sleepypod: Once the official firmware is up to date, re-open the root shell using the hardware serial procedure described in Open your Pod and get root, then install sleepypod following Install and update Core.
Limitation: Official OTA will not resolve cross-generation hardware pairings (for example, official servers will not push STM32G0 Pod 4 cover firmware to a registered Pod 3 hub). For mismatched hardware or offline setups, use Option 2 below.
Option 2: Manual subsystem update (surgical extraction)
This method extracts universal 64-bit ARM binaries and STM32 microcontroller firmware from an official .swu release and stages them directly on your rooted Pod.
Step 1: Back up the existing pod state
Connect to your Pod over SSH as root (port 8822) and back up the current daemon and firmware directory:
ssh -p 8822 root@POD_IP "
if [ ! -e /opt/eight/bin/frankenfirmware.bak ]; then cp -a /opt/eight/bin/frankenfirmware /opt/eight/bin/frankenfirmware.bak; fi && \
if [ ! -e /opt/eight/lib/subsystem_updates.bak ]; then cp -a /opt/eight/lib/subsystem_updates /opt/eight/lib/subsystem_updates.bak; fi && \
if [ -f /opt/eight/config/machine.json ] && [ ! -e /opt/eight/config/machine.json.bak ]; then cp -a /opt/eight/config/machine.json /opt/eight/config/machine.json.bak; fi && \
mkdir -p /opt/eight/backup_nats && \
for f in /usr/bin/nats-server /usr/bin/nats /usr/lib64/libnats.so.3.11.0 /etc/nats.conf /etc/systemd/system/nats-server.service; do
if [ -e \"\$f\" ] && [ ! -e \"/opt/eight/backup_nats/\$(basename \"\$f\")\" ]; then cp -a \"\$f\" /opt/eight/backup_nats/; fi
done && \
if [ ! -e /opt/eight/backup_nats/was-enabled ]; then systemctl is-enabled nats-server.service > /opt/eight/backup_nats/was-enabled 2>/dev/null || true; fi
"Keep these backups available on the Pod. If you need to revert any changes, see Roll back to stock.
Step 2: Acquire the update archive
Firmware updates are distributed as .swu packages through Eight Sleep’s update API (update-api.8slp.net).
You can check the API directly using your device ID and current revision hash:
curl -is "https://update-api.8slp.net/v1/updates/pod3/1?deviceId=<id>¤tRev=<rev>"- When an update is available, the API returns
HTTP/1.1 302 Foundwith a signed AWS CloudFront/S3 download URL in theLocation:header pointing tohttps://fw.8slp.net/pod3-updates/pod3/releases/<hash>.swu. - Alternatively, public releases are indexed on the Wayback Machine . For example,
77af88bd8b941fed81786c09a9ac3cdb1e97b126.swucontains ARM64 daemons with NATS JetStream support, STM32G0 cover firmware (v5.5.9), and hub thermal firmware (v1.5.156).
Step 3: Extract universal artifacts on your computer
Download the .swu file to your computer and extract the root filesystem archive:
mkdir -p swu_extracted && cd swu_extracted
# The .swu file is a standard cpio archive
cpio -idmv < ../77af88bd8b941fed81786c09a9ac3cdb1e97b126.swu
# Extract the rootfs tarball
tar -xzf eightsleep-nxp-image-*.tar.gzLocate the required universal artifacts:
| Path in archive | Artifact description |
|---|---|
opt/eight/bin/frankenfirmware | ARM64 daemon with NATS JetStream and STM32G0 support |
opt/eight/lib/subsystem_updates/firmware-sensor-g0.bbin | STM32G0 Pod 4 cover firmware (v5.5.9, ~136 KB) |
opt/eight/lib/subsystem_updates/firmware-frozen.bbin | Hub thermal controller firmware (v1.5.156, ~120 KB) |
usr/lib64/libnats.so.3.11.0 | C NATS shared library |
usr/bin/nats-server & usr/bin/nats | Static ARM64 NATS server and management CLI |
etc/nats.conf & lib/systemd/system/nats-server.service | NATS service configuration and systemd unit |
Step 4: Transfer artifacts to the Pod
From your computer within the swu_extracted directory, transfer the extracted binaries, libraries, firmware images, and service units to their target paths on the Pod over port 8822.
If you are re-running this step and nats-server is already running, stop it first (ssh -p 8822 root@POD_IP "systemctl stop nats-server.service"). Otherwise scp cannot overwrite the running binary and fails with Text file busy.
# Transfer the updated frankenfirmware daemon to staging in /tmp/
scp -P 8822 opt/eight/bin/frankenfirmware root@POD_IP:/tmp/frankenfirmware
# Transfer the microcontroller cover firmware image to subsystem updates
scp -P 8822 opt/eight/lib/subsystem_updates/firmware-sensor-g0.bbin \
root@POD_IP:/opt/eight/lib/subsystem_updates/
# Optional: transfer the hub thermal controller firmware (reflashes hub MCU on restart)
scp -P 8822 opt/eight/lib/subsystem_updates/firmware-frozen.bbin \
root@POD_IP:/opt/eight/lib/subsystem_updates/
# Transfer the C NATS shared library to /usr/lib64/
scp -P 8822 usr/lib64/libnats.so.3.11.0 root@POD_IP:/usr/lib64/
# Transfer the NATS server and management CLI to /usr/bin/
scp -P 8822 usr/bin/nats-server usr/bin/nats root@POD_IP:/usr/bin/
# Transfer NATS configuration and systemd service unit
scp -P 8822 etc/nats.conf root@POD_IP:/etc/nats.conf
scp -P 8822 lib/systemd/system/nats-server.service root@POD_IP:/etc/systemd/system/nats-server.serviceHub controller firmware: Staging firmware-frozen.bbin in /opt/eight/lib/subsystem_updates/
causes frank to reflash the hub’s onboard thermal controller MCU upon restarting. This has been
tested and verified on a Pod 3 hub (pn 20500, hardware revision 0504). If you only want to
update cover support or NATS telemetry without reflashing the hub controller, omit copying
firmware-frozen.bbin.
Step 5: Install and start NATS JetStream
On the Pod, configure the library loader, start the NATS service, and provision the raw JetStream stream:
# Link the shared library and update loader cache
ssh -p 8822 root@POD_IP "
ln -sf /usr/lib64/libnats.so.3.11.0 /usr/lib64/libnats.so.3.11 && \
ldconfig
"
# Set permissions and start nats-server
ssh -p 8822 root@POD_IP "
chmod +x /usr/bin/nats-server /usr/bin/nats && \
mkdir -p /persistent/jetstream && \
systemctl daemon-reload && \
systemctl enable --now nats-server.service
"
# Wait for the server, then provision the 'raw' stream frankenfirmware publishes to (skipped if it already exists)
ssh -p 8822 root@POD_IP "
for i in 1 2 3 4 5 6 7 8 9 10; do nats account info >/dev/null 2>&1 && break; sleep 1; done
nats stream info raw >/dev/null 2>&1 || \
nats stream add raw --subjects 'raw.>' --storage file --retention limits --max-age 24h --max-bytes 512MB --discard old --defaults
"Step 6: Configure UART mapping and stage cover firmware (Pod 3 hub + Pod 4 cover)
Hardware scope: This step applies specifically when pairing a Pod 3 hub with a Pod 4 cover.
If you are updating a Pod 3 hub paired with its original Pod 3 cover (STM32F0/F1), do not overwrite firmware-sensor.bbin with the G0 binary or change machine.json—retain the stock port mapping and cover firmware so the original microcontroller can initialize normally.
When connecting a Pod 4 cover to a Pod 3 MediaTek Pumpkin board, verify the hardware serial port routing in /opt/eight/config/machine.json:
/dev/ttyS2connects to the cover sensor port (pn 20600, Pod 4 cover)./dev/ttyS1connects to the hub thermal controller (pn 20500, water/TEC/pump controller).
Write the configuration and stage firmware-sensor-g0.bbin into the fallback locations so that uninitialized or blank cover bootloaders boot the STM32G0 image. set -e stops the script if any write fails:
ssh -p 8822 root@POD_IP "
set -e
mkdir -p /opt/eight/config
cat > /opt/eight/config/machine.json << 'EOF'
{
\"F04\": {
\"sensorPort\": \"/dev/ttyS2\",
\"frozenPort\": \"/dev/ttyS1\"
}
}
EOF
# Copy the G0 firmware into the fallback locations for the Pod 4 cover
cp /opt/eight/lib/subsystem_updates/firmware-sensor-g0.bbin /opt/eight/lib/subsystem_updates/firmware-sensor-legacy.bbin
cp /opt/eight/lib/subsystem_updates/firmware-sensor-g0.bbin /opt/eight/lib/subsystem_updates/firmware-sensor.bbin
"Step 7: Deploy updated frankenfirmware
Stop the background service, place the new binary, and restart. /tmp is cleared on reboot, so if the Pod rebooted since Step 4, re-run the first scp in Step 4 before this step:
ssh -p 8822 root@POD_IP "
if [ ! -f /tmp/frankenfirmware ]; then echo 'Error: /tmp/frankenfirmware missing; re-run the Step 4 scp' >&2; exit 1; fi && \
systemctl stop frank.service && \
cp /tmp/frankenfirmware /opt/eight/bin/frankenfirmware && \
chmod +x /opt/eight/bin/frankenfirmware && \
systemctl start frank.service
"Monitor the firmware log with journalctl -u frank -f. You should see frank recognize the bootloader, stage the firmware, and jump to the application:
frozen.cpp: handleCommand|[frozen] -> FW: Firmware initialized v1.5.156
Sensor.cpp: handleCommand|[sensor] -> FW: Firmware initialized v5.5.9Step 8: Restart sleepypod biometrics services
Once the microcontrollers boot their new application firmwares, restart the sleepypod processing stack to connect to NATS:
ssh -p 8822 root@POD_IP "
systemctl restart \
sleepypod-piezo-processor.service \
sleepypod-sleep-detector.service \
sleepypod-environment-monitor.service \
sleepypod-cover-buttons.service \
sleepypod-calibrator.service \
sleepypod.service
"Roll back to stock
If you encounter issues or wish to revert to stock daemons:
ssh -p 8822 root@POD_IP "
set -e
# Verify required backups exist before changing services
if [ ! -f /opt/eight/bin/frankenfirmware.bak ] || [ ! -d /opt/eight/lib/subsystem_updates.bak ]; then
echo 'Error: backups missing; aborting rollback' >&2
exit 1
fi
# Stop the firmware daemon
systemctl stop frank.service
# Disable NATS service if installed
if systemctl list-unit-files nats-server.service >/dev/null 2>&1 || [ -f /etc/systemd/system/nats-server.service ]; then
systemctl disable --now nats-server.service
fi
# Restore frankenfirmware
cp -a /opt/eight/bin/frankenfirmware.bak /opt/eight/bin/frankenfirmware
# Safely stage and restore subsystem_updates
rm -rf /opt/eight/lib/subsystem_updates.restoring
cp -a /opt/eight/lib/subsystem_updates.bak /opt/eight/lib/subsystem_updates.restoring
rm -rf /opt/eight/lib/subsystem_updates
mv /opt/eight/lib/subsystem_updates.restoring /opt/eight/lib/subsystem_updates
# Restore machine.json if backup exists
if [ -f /opt/eight/config/machine.json.bak ]; then
cp -a /opt/eight/config/machine.json.bak /opt/eight/config/machine.json
else
rm -f /opt/eight/config/machine.json
fi
# Clean up installed NATS files and restore pre-existing NATS files if any existed
rm -f /usr/bin/nats-server /usr/bin/nats /usr/lib64/libnats.so.3.11.0 /usr/lib64/libnats.so.3.11 /etc/nats.conf /etc/systemd/system/nats-server.service
if [ -d /opt/eight/backup_nats ]; then
if [ -f /opt/eight/backup_nats/nats-server ]; then
cp -a /opt/eight/backup_nats/nats-server /usr/bin/
fi
if [ -f /opt/eight/backup_nats/nats ]; then
cp -a /opt/eight/backup_nats/nats /usr/bin/
fi
if [ -f /opt/eight/backup_nats/libnats.so.3.11.0 ]; then
cp -a /opt/eight/backup_nats/libnats.so.3.11.0 /usr/lib64/
ldconfig
fi
if [ -f /opt/eight/backup_nats/nats.conf ]; then
cp -a /opt/eight/backup_nats/nats.conf /etc/nats.conf
fi
if [ -f /opt/eight/backup_nats/nats-server.service ]; then
cp -a /opt/eight/backup_nats/nats-server.service /etc/systemd/system/
fi
fi
ldconfig
systemctl daemon-reload
# Re-enable nats-server if it was enabled before Step 1
if [ \"\$(cat /opt/eight/backup_nats/was-enabled 2>/dev/null)\" = enabled ]; then
systemctl enable --now nats-server.service
fi
# Restart frank to restore stock behavior
systemctl start frank.service
"Microcontroller rollback behavior (untested): Restoring the old frankenfirmware and /opt/eight/lib/subsystem_updates/ does not by itself revert firmware already running on the microcontrollers. frank may reflash a microcontroller with the restored .bbin images when it starts, but this downgrade path has not been verified. An STM32G0 Pod 4 cover cannot boot stock STM32F0/F1 firmware, so after a rollback expect the cover to return to its bootloader loop unless you replace it with a native Pod 3 cover.
Verification
Check the system status on the Pod:
sp-statusConfirm that the sensor pipeline reports NATS JetStream:
pipeline: NATS JetStream (new firmware, April 2026+)
nats-server: active (port 4222 open)
jetstream: /persistent/jetstream present (<size>)
jetstream-uploader.service: <state>
raw stream: present (subject raw.>)Confirm messages are arriving with the NATS CLI:
nats stream subjects rawYou should see these subjects. Rates were measured on a working Pod 3 hub with a Pod 4 cover:
raw.sens.piezo: about 1 message per second, each carrying a batch of piezo samplesraw.sens.capsense: capacitive presence grid, 2 messages per secondraw.sens.bedtemp: bed surface temperatures, roughly every 10 secondsraw.frz.temp,raw.frz.water,raw.frz.health,raw.frz.therm: hub cooling loop, reservoir, and thermal controller status, roughly every 10 seconds
raw is capped at 512MB (--max-bytes), so once it fills, old messages are discarded and the per-subject counts stop growing. To check that data is still arriving, watch a subject live with nats sub raw.sens.capsense.
Finally, check /persistent/sleepypod-data/biometrics.db to confirm that cap_sense_frames and bed_temp rows are incrementing in real time.
Optional: Synchronizing the backup partition (Slot B)
Advanced and high risk.
This procedure is strictly limited to boards running on the verified Slot A eMMC boot path (/dev/mmcblk0p5, rootfs_a) described in the root access guide. Do not run this on SD-card installations (such as Pod 3 with an SD card), systems booted from Slot B, or unknown partition layouts.
Leaving Slot B untouched is recommended. If Slot B retains its original factory installation, a hardware factory reset will safely boot into a pristine stock environment. If you overwrite Slot B, factory reset will boot into this modified environment instead.
Only synchronize Slot B if you are completely confident in your installation and want to prevent a lockout or firmware mismatch if the hardware ever fails over to Slot B.
If you choose to synchronize Slot B:
ssh -p 8822 root@POD_IP "
set -e
trap 'umount /mnt/slot_b 2>/dev/null || true' EXIT
# 1. Verify board variant and active boot slot (Slot A eMMC layout only)
ACTIVE_ROOT=\"\$(findmnt -n -o SOURCE / 2>/dev/null || awk '\$2==\"/\" {print \$1}' /proc/mounts)\"
CMDLINE=\"\$(cat /proc/cmdline 2>/dev/null || true)\"
case \"\$CMDLINE \$ACTIVE_ROOT\" in
*rootfs_a*|*mmcblk0p5*) ;;
*)
echo 'Error: Active system is not on the verified Slot A eMMC boot path (/dev/mmcblk0p5).' >&2
exit 1
;;
esac
TARGET_DEV='/dev/mmcblk0p7'
if [ ! -b \"\$TARGET_DEV\" ]; then
echo \"Error: Inactive Slot B partition \$TARGET_DEV does not exist.\" >&2
exit 1
fi
if [ \"\$ACTIVE_ROOT\" = \"\$TARGET_DEV\" ]; then
echo \"Error: Target partition \$TARGET_DEV is currently active as root!\" >&2
exit 1
fi
# 2. Mount Slot B and verify mount target
mkdir -p /mnt/slot_b
mount -o rw \"\$TARGET_DEV\" /mnt/slot_b
MOUNTED_DEV=\"\$(findmnt -n -o SOURCE /mnt/slot_b 2>/dev/null || awk '\$2==\"/mnt/slot_b\" {print \$1}' /proc/mounts)\"
if [ \"\$MOUNTED_DEV\" != \"\$TARGET_DEV\" ]; then
echo \"Error: Mount mismatch: /mnt/slot_b is \$MOUNTED_DEV, expected \$TARGET_DEV.\" >&2
exit 1
fi
# 3. Resolve effective authorized_keys path used by sshd for root on Slot A
ROOT_HOME=\"\$(awk -F: '\$1==\"root\" {print \$6}' /etc/passwd 2>/dev/null || true)\"
ROOT_HOME=\"\${ROOT_HOME:-/home/root}\"
KEY_PATH=''
ENTRIES=\"\$(sshd -T -C 'user=root,host=localhost,addr=127.0.0.1' 2>/dev/null | awk 'tolower(\$1)==\"authorizedkeysfile\" {\$1=\"\"; print \$0}')\"
for entry in \$ENTRIES; do
case \"\$entry\" in
*%h*) cand=\"\${entry//%h/\$ROOT_HOME}\" ;;
/*) cand=\"\$entry\" ;;
*) cand=\"\$ROOT_HOME/\$entry\" ;;
esac
if [ -s \"\$cand\" ]; then
KEY_PATH=\"\$cand\"
break
fi
done
if [ -z \"\$KEY_PATH\" ]; then
for cand in \"\$ROOT_HOME/.ssh/authorized_keys\" \"\$ROOT_HOME/ssh/authorized_keys\" /etc/ssh/authorized_keys; do
if [ -s \"\$cand\" ]; then KEY_PATH=\"\$cand\"; break; fi
done
fi
if [ ! -s \"\$KEY_PATH\" ]; then
echo 'Error: No valid root authorized_keys file found on Slot A.' >&2
exit 1
fi
# 4. Copy authorized_keys to effective Slot B path and verify write
DEST_KEY=\"/mnt/slot_b\$KEY_PATH\"
mkdir -p \"\$(dirname \"\$DEST_KEY\")\"
cp -a \"\$KEY_PATH\" \"\$DEST_KEY\"
chmod 600 \"\$DEST_KEY\"
# Verify destination copy succeeded and content matches before proceeding
if [ ! -s \"\$DEST_KEY\" ] || ! cmp -s \"\$KEY_PATH\" \"\$DEST_KEY\"; then
echo \"Error: Failed to verify authorized_keys write at \$DEST_KEY.\" >&2
exit 1
fi
# Also populate root's home key locations on Slot B for recovery resilience
for dir in \"/mnt/slot_b\$ROOT_HOME/.ssh\" \"/mnt/slot_b\$ROOT_HOME/ssh\"; do
mkdir -p \"\$dir\"
cp -a \"\$KEY_PATH\" \"\$dir/authorized_keys\"
chmod 700 \"\$dir\"
chmod 600 \"\$dir/authorized_keys\"
done
# Stock sshd_config_readonly reads /etc/ssh/authorized_keys as the login user (rewt),
# so append root's keys there instead of overwriting, and leave /etc/ssh at its stock mode.
mkdir -p /mnt/slot_b/etc/ssh
touch /mnt/slot_b/etc/ssh/authorized_keys
while IFS= read -r key || [ -n \"\$key\" ]; do
[ -n \"\$key\" ] || continue
grep -qxF -- \"\$key\" /mnt/slot_b/etc/ssh/authorized_keys || echo \"\$key\" >> /mnt/slot_b/etc/ssh/authorized_keys
done < \"\$KEY_PATH\"
# Stock Slot B ships 'AllowUsers rewt', which refuses root even with a valid key.
# Allow key-only root login and add root to AllowUsers in both sshd configs.
for cfg in /mnt/slot_b/etc/ssh/sshd_config /mnt/slot_b/etc/ssh/sshd_config_readonly; do
[ -f \"\$cfg\" ] || continue
sed -i -E 's/^#?[[:space:]]*PermitRootLogin[[:space:]]+.*/PermitRootLogin prohibit-password/' \"\$cfg\"
if grep -qE '^[[:space:]]*AllowUsers[[:space:]]' \"\$cfg\" && ! grep -qE '^[[:space:]]*AllowUsers([[:space:]].*)?[[:space:]]root([[:space:]]|\$)' \"\$cfg\"; then
sed -i -E 's/^([[:space:]]*AllowUsers[[:space:]].*)\$/\1 root/' \"\$cfg\"
fi
done
# 5. Sync updated binaries, configurations, and NATS service
cp -a /opt/eight/bin/frankenfirmware /mnt/slot_b/opt/eight/bin/frankenfirmware
cp -a /opt/eight/lib/subsystem_updates/* /mnt/slot_b/opt/eight/lib/subsystem_updates/
mkdir -p /mnt/slot_b/opt/eight/config /mnt/slot_b/etc/systemd/system/multi-user.target.wants
if [ -f /opt/eight/config/machine.json ]; then
cp -a /opt/eight/config/machine.json /mnt/slot_b/opt/eight/config/machine.json
else
rm -f /mnt/slot_b/opt/eight/config/machine.json
fi
cp -a /usr/lib64/libnats.so.3.11* /mnt/slot_b/usr/lib64/
cp -a /usr/bin/nats* /mnt/slot_b/usr/bin/
cp -a /etc/nats.conf /mnt/slot_b/etc/nats.conf
cp -a /etc/systemd/system/nats-server.service /mnt/slot_b/etc/systemd/system/nats-server.service
ln -sf /etc/systemd/system/nats-server.service /mnt/slot_b/etc/systemd/system/multi-user.target.wants/nats-server.service
# 6. Flush changes and safely unmount
sync
trap - EXIT
umount /mnt/slot_b
"Source reference: sp-status output format · Root SSH key resolution in the Core installer · free-sleep firmware reset and slot check · Archived Pod 3 .swu releases. Stream limits, subject rates, serial port mapping, and the Slot B sshd configuration were checked on an MT8365 Pod 3 hub (pn 20500, revision 0504) with a Pod 4 cover, using artifacts extracted from release 77af88bd8b941fed81786c09a9ac3cdb1e97b126.