OScam emmcache: настройка кэша EMM в 2026
Если вы уже подняли OScam и карта читается, но каналы периодически отваливаются или ресивер начинает вести себя странно после нескольких часов работы — скорее всего, проблема в EMM. OScam emmcache настройка — одна из тех вещей, которую многие пропускают при первом запуске, а потом месяцами гадают, почему карта уходит в защиту. Разберём, как это работает и что конкретно писать в конфиг.
Что такое emmcache в OScam и зачем он нужен
OScam работает с двумя принципиально разными типами сообщений — EMM и ECM. Их часто путают, и это порождает неверные решения при диагностике.
Разница между EMM и ECM простыми словами
ECM (Entitlement Control Message) — это запрос на расшифровку конкретного момента потока. Приходит каждые несколько секунд, OScam отправляет его на карту, карта возвращает CW (Control Word), поток декодируется. Это основной рабочий цикл.
EMM (Entitlement Management Message) — другое. Это команды от провайдера, которые обновляют права на карте: продлевают подписку, добавляют пакеты, иногда меняют ключи. EMM не нужны каждую секунду, они приходят в потоке вместе с ECM, но обрабатываются отдельно. Карта физически записывает изменения в свою память при каждом EMM.
Какую задачу решает кэш EMM
Проблема в том, что один и тот же EMM провайдер может передавать в потоке сотни раз. Без кэша OScam послушно отправляет каждый такой пакет на карту снова и снова. Карта записывает одно и то же в память, её контроллер перегревается от лишних write-циклов, и в какой-то момент срабатывает встроенная защита — карта замолкает на несколько минут или часов.
emmcache запоминает хэши уже обработанных EMM и просто не отправляет дубликаты на карту. Если EMM уже видели — в лог пишется SKIPPED. Это и есть основная задача кэша.
В каком файле задаётся параметр и где он действует
Глобальное поведение emmcache задаётся в /etc/oscam/oscam.conf в секции [global]. Именно там указывается, включён ли кэш и каковы базовые параметры хранения.
Для конкретного ридера поведение уточняется в /etc/oscam/oscam.server — там же задаётся saveemm и блокировки типов EMM через blockemm-u, blockemm-s, blockemm-g. Два файла работают вместе: глобальный кэш + настройки ридера.
Синтаксис параметра emmcache и значения по умолчанию
Вот где начинается путаница. Синтаксис emmcache менялся между ветками OScam, и то, что работает в trunk r11800+, может молча игнорироваться в более старых сборках для Dreambox или OpenPLi.
Формат записи emmcache = CARDID,keepcache,duration,UNIQ
Полная форма параметра в современных сборках выглядит так:
[global]
emmcache = 1,3,15
В некоторых ветках обязательно четыре поля с указанием UNIQ-флага:
emmcache = 1,3,15,1
Если в вашей сборке UNIQ обязателен, а вы написали три поля — строка не парсится и кэш просто не включается. OScam при этом не падает и не ругается явно — просто работает без кэша. Именно это описано в стартовом логе как предупреждение парсинга, которое большинство пропускает.
Расшифровка четырёх полей параметра
Первое поле — keepcache. Значение 1 означает, что кэш сохраняется между перезапусками OScam в файл на диске. 0 — кэш только в памяти, при рестарте сбрасывается.
Второе поле — количество EMM каждого типа, которые кэш запоминает. Значение 3 означает: помнить три последних EMM для каждого типа сообщений (Unique, Shared, Global). Чем больше — тем больше памяти, но и эффективнее фильтрация.
Третье поле — время жизни в минутах. 15 означает, что EMM хранится в кэше 15 минут. После этого он считается устаревшим и при повторном приходе будет снова отправлен на карту.
Четвёртое поле — UNIQ-режим. 1 включает уникальность по содержимому EMM, 0 отключает. В большинстве случаев ставьте 1.
Рекомендуемые стартовые значения
Для большинства карт хорошим стартом будет:
[global]
emmcache = 1,3,15
Если сборка требует четыре поля:
[global]
emmcache = 1,3,15,1
Это консервативные значения. Кэш хранится между рестартами, помнит три EMM на тип, устаревает через 15 минут. Для начала достаточно, потом подстраиваете под конкретного провайдера.
Отдельный параметр saveemm в oscam.server
В oscam.server для каждого ридера можно добавить:
[reader]
label = mycard
protocol = internal
device = /dev/sci0
caid = 1830
saveemm = 1
При saveemm = 1 OScam сохраняет все входящие EMM в бинарные дамп-файлы в рабочем каталоге. Удобно для диагностики — можно посмотреть, что именно приходит от провайдера. Но на ресиверах с маленькой флешкой эти файлы растут быстро. Включайте только когда разбираетесь с проблемой, потом отключайте.
Пошаговая настройка emmcache на практике
Прежде чем что-то редактировать, убедитесь, что работаете с правильным файлом. Путь к oscam.conf зависит от того, где и как установлен OScam.
Редактирование oscam.conf через WebIF и через SSH
Типичные пути в зависимости от платформы:
- Enigma2 (Dreambox, VU+, GigaBlue):
/etc/tuxbox/config/oscam/oscam.conf - OpenPLi/OpenATV:
/etc/oscam/oscam.conf - Роутер с Entware:
/opt/etc/oscam/oscam.conf - Linux-сервер, ручная сборка:
/usr/local/etc/oscam.confили/var/etc/oscam.conf - Docker-контейнер: смотрите volume mount — обычно маппится в
/config/oscam.confхоста
WebIF доступен на порту 8888 по умолчанию (или на том, что задано в httpport в секции [webif]). Там можно редактировать конфиг прямо в браузере через раздел Files → oscam.conf. Удобно, но на ресиверах с read-only разделом конфигурации правки через WebIF не переживают перезагрузку — подробнее об этом ниже.
Через SSH редактируете обычным текстовым редактором:
nano /etc/oscam/oscam.conf
Привязка кэша к конкретному CAID провайдера
Параметр emmcache в [global] применяется глобально. Если у вас несколько карт с разными CAID и разным поведением провайдеров, глобальный параметр может быть слишком грубым инструментом.
Более тонкое управление — через секции ридеров в oscam.server. Там через blockemm-u = 1, blockemm-s = 1, blockemm-g = 1 можно вообще заблокировать отдельные типы EMM для конкретного ридера, не трогая глобальный кэш.
Перезапуск службы и проверка применения
После редактирования конфига перезапускать OScam можно несколькими способами. Мягкий рестарт без обрыва текущих соединений:
kill -HUP $(pidof oscam)
Или через init.d, если OScam установлен как служба:
/etc/init.d/oscam restart
На Enigma2-боксах чаще:
/etc/init.d/oscam.sh restart
После рестарта сразу смотрите начало лога на предупреждения. Если emmcache не парсится — увидите строку вида WARNING: emmcache parse error или просто параметр будет проигнорирован без сообщения. Именно поэтому важно проверять лог сразу после каждого изменения конфига.
Чтение строк EMM в логе для контроля
Чтобы видеть EMM-активность в логе, в секции [global] нужно включить отображение EMM:
logfile = /var/log/oscam.log
loglevel = 128
logemm = 1
Потом смотрим лог в реальном времени:
tail -f /var/log/oscam.log | grep -i emm
Строки, на которые смотреть:
WRITTEN— EMM отправлен на карту и записанSKIPPED— EMM найден в кэше и пропущен (это норма, именно так и должно работать)BLOCKED— EMM заблокирован через blockemm-настройки ридера
Если видите только WRITTEN и ни одного SKIPPED — кэш не работает. Если WRITTEN вообще нет часами — возможно, кэш слишком агрессивен и блокирует нужные обновления прав.
Тонкая настройка под разные карты и нагрузку
Универсальных значений нет. Один провайдер меняет права раз в сутки, другой — каждые 20 минут. Карты тоже отличаются по чувствительности к частоте записи.
Карты, чувствительные к частоте EMM
Некоторые смарт-карты имеют ограниченный ресурс записи в EEPROM. Это не миф — у ряда карт старых провайдеров счётчик записей реально сказывается на работоспособности через несколько лет интенсивного использования.
Для таких карт нужен максимально жёсткий кэш: большой duration (30–60 минут и больше) и блокировка ненужных типов EMM. Если провайдер меняет права не чаще раза в час — нет смысла принимать EMM чаще:
[global]
emmcache = 1,5,60
Плюс в ридере блокируем лишнее:
[reader]
blockemm-unknown = 1
blockemm-g = 0
blockemm-s = 0
blockemm-u = 0
Здесь blockemm-unknown = 1 блокирует EMM неизвестных типов, которые карта всё равно не знает как обработать, но тратит ресурс на попытку.
Когда увеличивать глубину кэша
Если в логе видите много WRITTEN для одних и тех же CAID подряд — увеличивайте второе поле emmcache. По умолчанию 3 означает, что кэш помнит только три последних EMM каждого типа. Некоторые провайдеры используют ротацию из 5–7 EMM-сообщений, и кэш глубиной 3 их не отсекает полностью.
Попробуйте emmcache = 1,7,20 — глубина 7, время жизни 20 минут. Смотрите на соотношение SKIPPED/WRITTEN в логе. Цель — чтобы SKIPPED преобладал при стабильных правах.
Очистка устаревшего кэша и файлов дампов
При keepcache = 1 кэш хранится в файле рядом с конфигом — обычно это oscam.emm или файлы вида oscam_emm_CAID.log в рабочем каталоге OScam.
Иногда кэш нужно сбросить принудительно — например, после смены карты или при подозрении на повреждение. Просто удаляйте файл и рестартуйте:
rm /etc/oscam/oscam.emm
/etc/init.d/oscam restart
Дамп-файлы от saveemm = 1 имеют имена вида emm_CAID_PROVID.log. Их можно удалять в любое время — это просто логи для диагностики, не рабочие данные.
Баланс между свежестью ключей и нагрузкой на карту
Это главный компромисс при OScam emmcache настройке. Слишком большой duration — права не успевают обновиться после смены провайдером, каналы отваливаются. Слишком маленький — карта получает шквал EMM, перегружается.
Практическое правило: duration должен быть меньше, чем интервал смены прав у провайдера, но больше, чем интервал повторной передачи одного EMM в потоке. Для большинства европейских провайдеров значения 10–20 минут работают нормально. Если права меняются чаще — уменьшайте до 5–8 минут.
Типичные ошибки и их устранение
Собрал здесь реальные сценарии, которые встречаются чаще всего. Не теория — конкретные симптомы и что с ними делать.
Параметр не применяется после перезапуска
Симптом: изменили emmcache, перезапустили, в логе всё равно нет SKIPPED, только WRITTEN.
Первое — проверьте, что правите правильный файл. Запустите:
grep -r "emmcache" /etc/
Иногда OScam собран с хардкодным путём к конфигу, отличным от ожидаемого. Путь можно увидеть в выводе oscam --help или в стартовой строке лога.
Второе — на ресиверах с read-only разделом (встречается на некоторых прошивках OpenATV, когда /etc смонтирован в read-only tmpfs) правки вообще не сохраняются после перезагрузки. Нужно либо перенести конфиг на /media/hdd/oscam/ и запускать OScam с флагом -c /media/hdd/oscam/, либо добавить распаковку конфига в скрипт автозапуска.
Третье — несовместимый синтаксис. Смотрите лог сразу после старта:
grep -i "emm\|warn\|error\|parse" /var/log/oscam.log | head -30
Карта периодически уходит в защиту
Кэш включён, но карта всё равно блокируется на 10–30 минут каждые несколько часов.
Скорее всего, проблема в UNIQUE EMM — сообщениях, адресованных конкретно вашей карте. Кэш работает, но UNIQUE EMM приходят новые каждый раз, кэш их не отсекает, и карта всё равно перегружается записью.
Решение — заблокировать UNIQUE EMM, если они не нужны для обновления прав:
[reader]
blockemm-u = 1
Но будьте осторожны: у некоторых провайдеров именно UNIQUE EMM несут обновление подписки. Если после блокировки права перестали обновляться — верните обратно и ищите другую причину перегрузки.
Каналы отваливаются после смены ключей
Это обратная ситуация — кэш слишком агрессивный. Провайдер поменял права, прислал новые EMM, но OScam видит их как "уже обработанные" и не отправляет на карту. Права на карте устаревают — канал пропадает.
Подсчитайте соотношение WRITTEN и SKIPPED за период отвала:
grep "WRITTEN\|SKIPPED" /var/log/oscam.log | awk '{print $NF}' | sort | uniq -c
Если SKIPPED 100% за последние полчаса — почти наверняка кэш блокирует нужные EMM. Уменьшайте duration или временно отключайте кэш для диагностики (emmcache = 0), чтобы убедиться, что без кэша права обновляются.
Растущий размер файлов EMM на флеш-памяти
На ресиверах с внутренней flash 256–512 МБ это реальная проблема. Дамп-файлы EMM при активном потоке могут расти на 10–50 МБ в сутки.
Первое — отключите saveemm, если он включён для постоянной работы. Он нужен только для диагностики.
Второе — ограничьте размер лога OScam:
[global]
maxlogsize = 10
Значение в МБ. При достижении лимита лог ротируется.
Третье — вынесите каталог OScam и логи на USB-накопитель или HDD:
oscam -c /media/hdd/oscam/ -t /media/hdd/oscam/tmp/
Флеш ресивера при этом не трогается, все файлы — на внешнем носителе.
При работе OScam emmcache настройка в Docker-контейнере пути задаются через volume-маппинг — /config внутри контейнера должен маппиться на достаточно большой том хоста, иначе та же проблема с переполнением.
Несколько ридеров с одной CAID
Отдельный случай, который почти нигде не разбирается. Если у вас два ридера с картами одного провайдера (один локальный, один по сети), оба получают одни и те же EMM из потока.
Глобальный кэш в [global] работает для обоих ридеров. Но если у них разные physical card ID, OScam ведёт отдельный кэш для каждого. Это правильное поведение — не пытайтесь его обойти.
Проблема возникает, когда оба ридера параллельно пишут одно и то же на свои карты, удваивая нагрузку. Решение — включить blockemm на резервном ридере и пусть EMM обрабатывает только основной:
[reader]
label = backup_card
blockemm-u = 1
blockemm-s = 1
blockemm-g = 1
Резервная карта будет участвовать только в расшифровке ECM, не тратя ресурс на запись EMM.
Часто задаваемые вопросы
В каком файле и секции задаётся emmcache?
В oscam.conf, секция [global]. Именно там строка emmcache = 1,3,15 задаёт глобальное поведение кэша для всех ридеров. Поведение по сохранению EMM на конкретный ридер дополнительно регулируется параметром saveemm в oscam.server — он включает запись дамп-файлов EMM для диагностики.
Что означают цифры в строке emmcache = 1,3,15?
Первое поле (1) — keepcache: хранить кэш между перезапусками OScam на диске. Второе поле (3) — сколько EMM каждого типа запоминать. Третье поле (15) — время жизни кэша в минутах. В некоторых ветках OScam обязательно четвёртое поле UNIQ — если его нет, строка не парсится и кэш молча не включается. Уточняйте по стартовому логу вашей конкретной сборки.
Почему карта уходит в защиту даже с настроенным кэшем?
Чаще всего причина в UNIQUE EMM — сообщениях, адресованных конкретно вашей карте. Они каждый раз разные, и кэш их не отсекает. Помогает блокировка через blockemm-u = 1 в секции ридера в oscam.server. Дополнительно добавьте blockemm-unknown = 1 для блокировки EMM неизвестных типов.
Как проверить, что кэш реально работает?
Включите logemm = 1 в секции [global] и смотрите лог: tail -f /var/log/oscam.log | grep -i "emm". Строки SKIPPED означают, что кэш сработал и EMM не отправлен на карту — это хорошо. Строки WRITTEN означают реальную запись. Преобладание SKIPPED при стабильных правах — признак корректной работы кэша.
Нужно ли включать saveemm и чем это грозит?
saveemm = 1 сохраняет дампы EMM в файлы — удобно для диагностики: можно посмотреть, какие именно сообщения приходят от провайдера. Но на ресиверах с малой внутренней flash-памятью (256–512 МБ) файлы быстро растут и могут переполнить раздел до отказа системы. Включайте только временно для диагностики, потом обязательно отключайте.
Влияет ли emmcache на расшифровку каналов напрямую?
Нет, напрямую — нет. emmcache управляет только обработкой EMM, то есть обновлением прав на карте. Расшифровкой потока занимаются ECM-запросы — они кэшируются отдельно через параметр ecmcache. Но косвенно неверная настройка emmcache ломает приём: если права не успевают обновиться из-за слишком агрессивного кэша, карта начинает возвращать неверные CW и каналы пропадают.