Repository navigation
Osmo-Operator v0.1-6
osmo-operator-desktop.iso
A complete GSM + LTE operator on a single live image, with a GNOME desktop for everything that can't be driven from the VTY. No SDR and no physical phone: the radio is emulated end to end, all the way down to the baseband.
IMAGE_VERSION="OSMO_EGPRS_V2" · OSMO_ROLE=operator · OSMO_LITE=0
Passwords: live ISO osmo · postmarketOS phone 147147
Download
Download every .part-NN file, not just the first one. GitHub caps release files at 2 GiB, so the image ships in pieces. Reassemble, then verify:
wget https://github.com/bbaranoff/osmo-operator/releases/download/v0.1-6/osmo-operator-desktop.iso.part-00
wget https://github.com/bbaranoff/osmo-operator/releases/download/v0.1-6/osmo-operator-desktop.iso.part-01
wget https://github.com/bbaranoff/osmo-operator/releases/download/v0.1-6/osmo-operator-desktop.iso.part-02
wget https://github.com/bbaranoff/osmo-operator/releases/download/v0.1-6/osmo-operator-desktop.iso.part-03
cat osmo-operator-desktop.iso.part-* > osmo-operator-desktop.iso
sha256sum -c SHA256SUMSWhat's inside
2G / GSM — Osmocom
- Full core: osmo-stp (M3UA, SCTP :2905), osmo-bsc, osmo-msc, osmo-hlr, osmo-sgsn, osmo-ggsn (GTPv1-C/U), osmo-pcu, osmo-mgw (MGCP :2427).
- Two DCS1800 cells in LAC 1: BTS 0 (Cell ID 6001, BSIC 7) and BTS 1 (Cell ID 6012, BSIC 8), each on its own osmo-bts-trx.
- A real emulated Calypso as layer 1:
qemu-system-arm -M calypso -cpu arm946(qosmo) runslayer1.highram.elf, loaded byosmoconexactly as on a C123.pont.pyturns bursts into I/Q forfake_trx.py, thentrxconand two osmocom-bbmobileinstances on the terminal side. - GPRS/EDGE: BSSGP/NS to the PCU, PDP contexts through osmo-ggsn.
- Voice: external MNCC → Asterisk (SIP :5060, FR/HR) via osmo-sip-connector.
- SMS: SMS-over-GSUP → proto-smsc-daemon, SMPP :2775 with a test ESME, inter-operator relay :7890.
- A3A8 with deterministic RAND (
*-force-rand-toypatches): the bench is reproducible from one boot to the next. - Live GSMTAP capture, ready for Wireshark.
The DSP — the Calypso's TMS320C54x on TI's real mask ROM
- Default demodulator: gr-gsm (grgsm_exe). With
./start-direct.sh --dsp, the baseband's own DSP takes over: a C54x core emulated outside QEMU (c54x_exe), running the mask ROM dumped from a real Calypso (PROM0-3, DROM, PDROM). - ARM (QEMU) and DSP share the API RAM through
/dev/shm/calypso_api_ramand run in lockstep, one TDMA frame at a time, over/tmp/calypso_dsp.sock. Downlink bursts reach the DSP's serial port (BSP) over UDP 6702 viapont_dsp.py. - What the ROM does by itself (bench runs of 2026-09-23): FCCH/SCH acquisition, BCCH decoding (SI1-4), camping, location update, SMS MO/MT, MO/MT calls with A5/1 and speech audible both ways.
- Still a work bench, not the demo path: every TCH/F frame is flagged BFI even though speech stays intelligible, SACCH occasionally drops a call, the SB window is rarely armed, and the DSP needs 4.3–4.6 ms of host time per 4.62 ms frame. Details in the c54x_exe README.
4G / LTE — open5gs + srsRAN
- open5gs core (MME, SGW-C/U, SMF, UPF, PCRF, HSS…) on dedicated loopbacks, Prometheus :9090, WebUI :9999, MongoDB behind the HSS.
- PLMN 001/01, TAC 7. NAS null ciphering (EIA2/EIA1 + EEA0) on purpose: it's an analysis bench, NAS reads in clear in Wireshark.
- srsENB (10 MHz, EARFCN 3350, band 7) and srsUE over ZMQ, no SDR. Milenage test subscriber IMSI 001010001000001; the UE gets an IP in a netns and reaches the Internet through NAT.
CSFB — tying 2G and 4G together
- SGs between osmo-msc and the MME (:29118), mapping
TAI (001-01, TAC 7) → LAI (001-01, LAC 1). - Combined EPS+IMSI attach: an incoming call is paged by the MME and the UE falls back to the BTS.
- Two subscribers (100101, 100102), one per cell, wired for an inter-cell call with fallback.
postmarketOS — the phone
- x86_64 pmOS VM with a patched kernel (
CONFIG_PPPenabled, missing upstream); prebuilt kernel in/opt/user_interface/kernel/pmos/. - 4G data: NetworkManager → pppd (
ATD*99***1#) → virtio-consoleosmo.data→osmo-phonesim-banc.py→ UE netns → srsUE → srsENB → UPF → Internet. - 2G voice and SMS: virtio-console
osmo.modem, whereosmo-phonesim-banc.pyplays a 27.007 AT modem driven by oFono. No dongle. - Audio: two duplex PulseAudio chains (GAPK bridge to the osmocom-bb mobile, and an echo-cancelled chain).
- Result: data on 4G, voice and SMS on 2G, same identity — a real CSFB handset's behaviour at modem level.
Requirements
x86_64, 8 GB RAM and 4 cores minimum. The live root is a tmpfs (~6 GB in toram mode); logs and captures are bounded and purged at every boot. The bench runs two QEMUs (Calypso + pmOS): in a VM, enable nested virtualization or the phone VM falls back to software emulation.
Running the image
QEMU
qemu-system-x86_64 -cdrom osmo-operator-desktop.iso -m 8G -enable-kvm \
-cpu host -smp 4 -nic user,hostfwd=tcp::8080-:8080VirtualBox — Linux / Ubuntu 64-bit, 8 GB, 4 CPUs, 3D off. System → Processor: tick Nested VT-x/AMD-V (if greyed out: VBoxManage modifyvm "<name>" --nested-hw-virt on). ISO on the optical drive, no disk needed. NAT port forward host 8080 → guest 8080.
VMware — new VM from the ISO, Linux / Ubuntu 64-bit, 8 GB, 4 cores, tick Virtualize Intel VT-x/EPT or AMD-V/RVI, skip Easy Install.
USB stick (hybrid ISO)
sudo dd if=osmo-operator-desktop.iso of=/dev/sdX bs=4M status=progress conv=fsyncOn Windows, use Rufus in DD Image mode. Boots UEFI or BIOS. On real hardware KVM is available directly — the most comfortable setup.
Getting started
Three launchers are pinned in the dock. 2G and 4G are independent and can start in any order; launch the smartphone last, once both networks are up.
Run the 2G handset on the DSP :
cd /opt/GSM/osmo-operator && sudo ./start-direct.sh --dsp(--menu asks interactively: layer 1 grgsm_exe or c54x_exe.)
Check everything is in place: checks/diag-stp-operator.sh
