Advanced setup
As described here
and here
you can get a root shell into your speaker when you plug in a USB stick with an empty file called remote_services.
For me, it was a bit hard to figure out how the USB stick needed to be formatted, so here is step-by-step guide to preparing your USB stick.
Guide: Creating an EXT2 “Unlock” USB Stick
OS: Linux Command Line
⚠️ Warning
This process deletes all data on the USB stick.
Identify your USB drive letter carefully (e.g., sdb, sdc).
In this guide, we use sdX. Replace X with your actual letter.
Step 1: Identify and Unmount
Plug in the USB stick into your Linux PC and find its name.
lsblk
# Look for your stick (e.g., /dev/sdc). We will use 'sdX' below.
Unmount it to ensure no files are busy.
sudo umount /dev/sdX*
Step 2: Create MBR Partition Table
- Open the partition tool: ```bash sudo fdisk /dev/sdX
2. Type the following letters in order (press **Enter** after each):
* `o` (Create new DOS partition table)
* `n` (New partition)
* `p` (Primary)
* `1` (Partition number 1)
* *(Press Enter)* (Default first sector)
* *(Press Enter)* (Default last sector)
* `w` (Write changes and exit)
### Step 3: Format to Legacy EXT2
Format the new partition (`sdX1`) with 128-byte inodes.
```bash
sudo mkfs.ext2 -I 128 -b 4096 /dev/sdX1
Step 4: Add the Trigger File
Mount the drive and create the “key” file that activates the services.
- Create a mount point (if not exists): ```bash sudo mkdir -p /mnt/usb
2. Mount the partition:
```bash
sudo mount /dev/sdX1 /mnt/usb
- Create the magic file: ```bash sudo touch /mnt/usb/remote_services
4. Unmount the drive to save the data.
```bash
sudo umount /mnt/usb
Done. You have prepared the USB Stick.
Plug in the USB stick
Now it is time to plug in the stick.
With the SoundTouch 20 it is very easy. Just use the USB-A port.
For the SoundTouch 10, you need an adapter. For me an OTG-Adapter for micro-USB, that I got some years ago together with my smartphone, worked.
Connect via telnet
After the USB-Stick is plugged in, use your computer to open the shell.
telnet 192.168.178.2
Replace 192.168.178.2 with the IP address of your speaker.
You should see something like that
... --- ..- -. -.. - --- ..- -.-. ....
____ ____ _____ _________
/ __ )/ __ \/ ___// _______/
/ __ / / / /\__ \/ __/
____/ /_/ / /_/ /___/ / /___
/_________/\____//____/_____/
spotty login: root
Type root as username.
No password is required. 😅
Change the config on the speaker
To have working internet radio
and to let the analytics data be sent to your Überböse-API server instead of to events.api.bosecm.com
we have to change 2 lines in one file on the device.
cd /var/lib/Bose/PersistenceDataRoot
cat OverrideSdkPrivateCfg.xml
This should show
<SoundTouchSdkPrivateCfg>
<margeServerUrl>http://ueberboese.your-example-host.org:8080</margeServerUrl>
<statsServerUrl>https://events.api.bosecm.com</statsServerUrl>
<swUpdateUrl>http://ueberboese-downloads.your-example-host.org:8080/updates/soundtouch</swUpdateUrl>
<isZeroconfEnabled>true</isZeroconfEnabled>
<usePandoraProductionServer>true</usePandoraProductionServer>
<saveMargeCustomerReport>false</saveMargeCustomerReport>
<bmxRegistryUrl>https://content.api.bose.io/bmx/registry/v1/services</bmxRegistryUrl>
</SoundTouchSdkPrivateCfg>
We need to change it to
<SoundTouchSdkPrivateCfg>
<margeServerUrl>http://ueberboese.your-example-host.org:8080</margeServerUrl>
<statsServerUrl>http://ueberboese.your-example-host.org:8080</statsServerUrl>
<swUpdateUrl>http://ueberboese-downloads.your-example-host.org:8080/updates/soundtouch</swUpdateUrl>
<isZeroconfEnabled>true</isZeroconfEnabled>
<usePandoraProductionServer>true</usePandoraProductionServer>
<saveMargeCustomerReport>false</saveMargeCustomerReport>
<bmxRegistryUrl>http://ueberboese.your-example-host.org:8080/bmx/registry/v1/services</bmxRegistryUrl>
</SoundTouchSdkPrivateCfg>
You can do that via
HOST=$(grep -o '<margeServerUrl>[^<]*' OverrideSdkPrivateCfg.xml | sed 's|<margeServerUrl>||') && \
sed -i \
-e "s|<statsServerUrl>.*</statsServerUrl>|<statsServerUrl>$HOST</statsServerUrl>|" \
-e "s|<bmxRegistryUrl>.*</bmxRegistryUrl>|<bmxRegistryUrl>$HOST/bmx/registry/v1/services</bmxRegistryUrl>|" \
OverrideSdkPrivateCfg.xml
Or you can use vi for that. (If you know vi)
vi OverrideSdkPrivateCfg.xml
And then restart the speaker via
reboot