Repository navigation
start‐direct.md
start-direct.sh prépare, run.sh exécute. Ce document suit le script phase par
phase : ce qu'il lit, ce qu'il décide, ce qu'il écrit, et à quel moment votre
variable est prise en compte — ou écrasée.
ligne de commande ─► coeur.env ─► globals.conf ─► environment/load.env ─► profil
│ │
└──────── résolution run.sh / fork / lanceur QEMU ◄───────────────────┘
│
génération mobile_*.cfg
│
--stop / --status / --list ? ─── délégué à run.sh, fin
│
--regen / --node / --wan / --menu (identité SS7, table WAN)
│
arrêt systématique de la pile
│
dashboard :8080, raccord oFono, exec run.sh ─► tmux « calypso »
Le script se place dans son propre répertoire (HERE). Il ne vérifie plus
qu'il tourne dans Docker (garde retirée le 2026-08-14 : sur l'ISO il n'y a pas de
Docker et c'était le seul lanceur utilisable). Conséquence connue : lancé par
erreur sur un hôte Docker, il meurt sur « run.sh introuvable », qui ne désigne
pas la vraie cause. Sur un hôte avec Docker, le lanceur est ./start.sh.
Dans cet ordre, et l'ordre décide de qui gagne (détail : Environnement.md) :
-
/etc/osmocom/coeur.env(OSMOCOM_CFGpour déplacer) — écrit parbuild-iso.sh, porteN_MS. Chargé ici et pas par~/.bashrc, sinon l'icône, systemd etstart-multi.shne le voyaient pas : le HLR n'avait que 100101 et le second mobile se faisait créer à la volée sans Ki, injoignable. Le fichier utilise:=: unN_MS=3posé dans l'environnement gagne. -
Options de la ligne de commande (
--profile,--dsp,--node…). -
globals.conf— fait autorité sur ses 26 variables réseau (MCC, MNC, OP_NAME, ENCRYPTION, ARFCN, BAND, LAC, APN, MS_COUNT, N_OPERATORS, HOST_IP…) : elles écrasent leur homonyme de l'environnement. Tout le reste passe intact. Champ vide = calculé (souvent depuis le numéro d'opérateur). Modifier :vim globals.confou./generate_configs.sh ARFCN=520. -
environment/load.env—modes.env(le profil),paths.env(où sont les choses), puis les fichiers par domaine. Tout en:=: le premier qui pose une valeur gagne, donc la ligne de commande. - Repli minimal si
load.envmanque (ISO nue, conteneur nu) :GSM_ROOT=/opt/GSM,CALYPSO_FORK=qosmo-grgsm, résolution d'OQC_ROOT. - Défauts restants :
RUN_DIR=/run/osmo-direct,LOG_DIR=$RUN_DIR/logs(tmpfs — le défilement tmux en dépend),ENCRYPTION="a5 1"(repli : la valeur réelle vient deglobals.conf),CALYPSO_BRIDGE=pont(noneavec--dsp),MS_COUNT=2,HOST_IP=127.0.0.1.
Défaut : faketrx-qemu (alias hybrid) — cœur + BTS#0 QEMU + BTS#1 faketrx.
--profile <nom> ou le mode en positionnel le fixe ; CALYPSO_PROFILE ou
l'historique MODE le fixent depuis l'environnement (MODE gagne s'il est posé).
--dsp ne choisit qemu que si personne n'a choisi avant lui.
| Profil | Ce qui tourne |
|---|---|
faketrx-qemu / hybrid
|
cœur + osmo-bts-trx ← QEMU Calypso + fake_trx/trxcon/mobile |
faketrx |
cœur + fake_trx + trxcon + mobile ; pas de QEMU |
virtphy |
cœur + osmo-bts-virtual + virtphy + mobile |
qemu / calypso
|
le pipeline Calypso seul, cœur en no-process |
core / noproc
|
STP + HLR + MSC + MGW + BSC (+ Asterisk), aucune radio |
hw |
SDR physique |
virtual |
multi-opérateurs SS7 par ip netns (N_OPERATORS) |
Ordre : RUN_SH explicite > OQC_ROOT résolu > $GSM_ROOT/<fork>/run.sh.
OQC_ROOT est cherché à côté du dépôt (../qosmo-grgsm) puis sous
/opt/GSM. Si run.sh n'est pas exécutable : FAIL, avec le chemin testé.
Le lanceur C (--launcher <bin>, QOSMO_LAUNCHER, défaut /usr/local/bin/<fork>)
est compilé s'il manque et que <fork>/tools/qosmo-launch est là. Sans lanceur,
40-qemu.sh retombe sur la ligne qemu-system-arm historique.
--check-paths s'arrête ici après avoir vérifié chaque dépendance déclarée
(binaires Osmocom, firmware layer1.highram.elf, ROM calypso_dsp.txt, pont).
mobile_group1.cfg (MS#1, derrière QEMU) et le MS#2 (faketrx) sont écrits dans
$OQC_ROOT/cfgs/ depuis les gabarits, avec IMSI/Ki/IMEI de globals.conf (ou
calculés par opérateur). Le client de couche 2 est mobile par défaut ;
--ccch_scan, --bcch_scan, --cell_log le remplacent (ils prennent sa
socket L1CTL et sa VTY — exclusifs).
Le plan est imprimé : profil, fork, run.sh, lanceur, pont, nombre de MS,
chiffrement, ARFCN. --list s'arrête là (délégué à run.sh --list) ;
--dry-run continue sans effet de bord.
--stop et --status sont transmis à run.sh et le script sort.
Pose une fois les choix que le script aurait devinés : profil, nœud, opérateur, inter-STP, WAN, régénération. Les valeurs proposées sont celles du lancement automatique : valider sans rien changer = ne pas passer l'option. Sans terminal, ignoré.
Par défaut les configs en place sont conservées : run.sh les régénérerait
au démarrage et effacerait l'identité SS7 posée juste avant. --regen arrête la
pile, puis réécrit tout depuis les gabarits (nœud et opérateur courants).
Le numéro de nœud (1 à 9) se déduit : environnement, puis /etc/osmo-role,
puis la table WAN comparée aux adresses locales. --node force. Le script réécrit
l'identité SS7 (point codes 1.<nœud><op>.<rôle>, routing contexts) et pointe
l'ASP sur l'inter-STP (--hub-ip, sinon déduit : docker ou VM). C'est ce qui
permet une ISO unique pour les neuf nœuds.
Jamais par défaut (WAN_AUTO=1 dans /etc/osmo-wan.conf, posé par une ISO
--wan, l'active). Trois formes :
./start-direct.sh --wan # questions : nœuds, IP, indicatifs, mon numéro
./start-direct.sh --wan-nodes "1:IP:IND 2:IP:IND" --wan-id 2 # scriptable
./start-direct.sh --wan mynode1.conf --wan mynode3.conf # depuis les fiches des autres nœuds
./start-direct.sh --gen-conf [FICHIER] # écrit MA fiche, ne lance rienLa table (--wan-conf, défaut /etc/osmo-wan.conf) est appliquée, l'adressage
SS7 vers l'inter-STP posé, le maillage SIP + SMS généré. Composer
<indicatif><numéro> joint ce numéro sur le nœud correspondant. Le profil reste
faketrx-qemu.
--air-mesh[=PORT] maille en plus les bursts : le milieu radio devient
commun, un mobile peut entendre et choisir la BTS d'un autre nœud (pairs de la
table WAN, portée dans data/air-mesh.txt, deux mobiles de plus — pont/airmesh.py).
--virtualbox[=N] monte le segment et N−1 VM avant le WAN ; refuse de tourner
dans une VM (--vbox-node N = numéro de cette machine).
Un wrapper tcpdump est posé pour les captures GSMTAP (udp/4729) et M3UA.
Arrêt systématique de la pile avant démarrage (run.sh --stop). Il n'y a
pas de « relance à chaud » : --force relance seulement les modules déjà
démarrés au lieu de les sauter.
- Adresses privées du nœud imprimées.
-
Tableau de bord sur
:8080(Firefox l'ouvre depuislaunch.sh) ; les spectres I/Q sur:8081(fft-web/fft_web.py). - Raccord mobile oFono — le téléphone physique (postmarketOS, PPP) ou le QEMU Android voit le banc comme un modem.
-
Transmission à
run.sh:exec, avec le profil et tout l'environnement. Toute variableCALYPSO_*passée en préfixe arrive intacte jusqu'àrun.sh, sesrun_modules/et QEMU (CALYPSO_LANG=en,CALYPSO_NO_ATTACH=1,CALYPSO_BRIDGE=none…).
run.sh ouvre le tmux calypso : osmo-bts-trx → QEMU (PTY + moniteur) →
attente de /tmp/osmocom_l2 → pont → attente des ticks UDP 6700 → mobile, puis
le cœur, Asterisk, SMSC. Sauf --no-attach / CALYPSO_NO_ATTACH=1 (ce que pose
osmo-banc.service : personne devant), le script s'attache au tmux.
./start-direct.sh [options] [mode]
Modes : faketrx-qemu (défaut) | faketrx | qemu | noproc | core | hybrid
Choix de la pile
--dsp fork qosmo-dsp : le DSP C54x décode lui-même (le mobile ne campe pas encore)
--grgsm fork qosmo-grgsm (défaut)
--launcher <bin> lanceur C de QEMU (défaut /usr/local/bin/<fork>)
--profile <nom> force le profil
--mobile | --ccch_scan | --bcch_scan | --cell_log client de couche 2 (exclusifs)
Cycle de vie
--list --dry-run --stop --status --force --verbose --no-attach --check-paths
--regen régénère les configs depuis les gabarits (sinon conservées)
--menu pose les questions au lieu de deviner
Topologie
--node N --op N --hub-ip IP
--wan | --wan FICHE… | --wan-nodes "…" | --wan-id N | --wan-conf FICHIER | --gen-conf [F]
--air-mesh[=PORT] --virtualbox[=N] --vbox-node N
Reprendre la main :
tmux attach -t calypso # Ctrl-b d détache, le banc continue
journalctl -u osmo-banc -f # si lancé en service
./start-direct.sh --status
./start-direct.sh --stopLogs : $LOG_DIR (/run/osmo-direct/logs, tmpfs) ; QEMU : /var/log/osmocom/qemu.log,
pont : /var/log/osmocom/bridge.log, orchestration : /var/log/osmocom/run.sh.log.