<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Компактные компьютеры на Linux и Embedded устройства Blog</title>
        <link>https://napiworld.ru/recipes</link>
        <description>Компактные компьютеры на Linux и Embedded устройства Blog</description>
        <lastBuildDate>Wed, 20 May 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>ru</language>
        <item>
            <title><![CDATA[U-Boot RK3308 - фиксируем bootcmd через rk_board_late_init]]></title>
            <link>https://napiworld.ru/recipes/uboot-bootcmd-rk3308</link>
            <guid>https://napiworld.ru/recipes/uboot-bootcmd-rk3308</guid>
            <pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Как жёстко зафиксировать bootcmd в U-Boot на RK3308, не отказываясь от saveenv. Используем хук rk_board_late_init().]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="проблема">Проблема<a class="hash-link" aria-label="Прямая ссылка на Проблема" title="Прямая ссылка на Проблема" href="https://napiworld.ru/recipes/uboot-bootcmd-rk3308#%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0">​</a></h2>
<p>U-Boot хранит переменные окружения (env) в энергонезависимой памяти. Это удобно: можно сохранить нужные настройки через <code>saveenv</code> и они переживут перезагрузку. Проблема в том, что <code>bootcmd</code> - переменная, которая определяет, как именно загружается система, - тоже хранится в этом env.</p>
<p>Если в процессе отладки или обновления env был сохранён с одним <code>bootcmd</code>, а в новой версии прошивки нужна другая последовательность загрузки, то сохранённый env будет молча перебивать то, что прописано в исходниках. Система загрузится по-старому, и понять почему - непросто: U-Boot не предупреждает, что использует значение из сохранённого env вместо скомпилированного.</p>
<p>Классическое решение - <code>CONFIG_BOOTCOMMAND</code> - задаёт значение <code>bootcmd</code> по умолчанию, но только если переменная <strong>не определена</strong> в env. Стоит один раз выполнить <code>saveenv</code> с любым <code>bootcmd</code> - и <code>CONFIG_BOOTCOMMAND</code> перестаёт действовать навсегда на этом устройстве.</p>
<p>Нужно было жёстко задать <code>bootcmd</code> при каждом старте, не отказываясь от <code>saveenv</code> для остальных переменных.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="решение">Решение<a class="hash-link" aria-label="Прямая ссылка на Решение" title="Прямая ссылка на Решение" href="https://napiworld.ru/recipes/uboot-bootcmd-rk3308#%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5">​</a></h2>
<p>Используется хук <code>rk_board_late_init()</code> - он вызывается <strong>после</strong> загрузки env из памяти, поэтому <code>env_set()</code> внутри него всегда перекрывает сохранённое значение. Что бы ни было записано в env - нужный <code>bootcmd</code> будет выставлен поверх.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-configsnapi-rk3308_defconfig">1. <code>configs/napi-rk3308_defconfig</code><a class="hash-link" aria-label="Прямая ссылка на 1-configsnapi-rk3308_defconfig" title="Прямая ссылка на 1-configsnapi-rk3308_defconfig" href="https://napiworld.ru/recipes/uboot-bootcmd-rk3308#1-configsnapi-rk3308_defconfig">​</a></h3>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">CONFIG_BOARD_LATE_INIT=y</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-boardrockchipevb_rk3308evb_rk3308c">2. <code>board/rockchip/evb_rk3308/evb_rk3308.c</code><a class="hash-link" aria-label="Прямая ссылка на 2-boardrockchipevb_rk3308evb_rk3308c" title="Прямая ссылка на 2-boardrockchipevb_rk3308evb_rk3308c" href="https://napiworld.ru/recipes/uboot-bootcmd-rk3308#2-boardrockchipevb_rk3308evb_rk3308c">​</a></h3>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">include</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property string" style="color:#e3116c">&lt;env.h&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">rk_board_late_init</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">void</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	</span><span class="token function" style="color:#d73a49">env_set</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"bootcmd"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		</span><span class="token string" style="color:#e3116c">"setenv fdt_addr_r 0x01e00000;"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		</span><span class="token string" style="color:#e3116c">"setenv kernel_addr_r 0x02080000;"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		</span><span class="token string" style="color:#e3116c">"setenv ramdisk_addr_r 0x06000000;"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		</span><span class="token string" style="color:#e3116c">"setenv kernel_comp_addr_r 0x08000000;"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		</span><span class="token string" style="color:#e3116c">"setenv kernel_comp_size 0x04000000;"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		</span><span class="token string" style="color:#e3116c">"bootflow scan"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	</span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="почему-не-config_bootcommand">Почему не <code>CONFIG_BOOTCOMMAND</code><a class="hash-link" aria-label="Прямая ссылка на почему-не-config_bootcommand" title="Прямая ссылка на почему-не-config_bootcommand" href="https://napiworld.ru/recipes/uboot-bootcmd-rk3308#%D0%BF%D0%BE%D1%87%D0%B5%D0%BC%D1%83-%D0%BD%D0%B5-config_bootcommand">​</a></h2>
<p><code>CONFIG_BOOTCOMMAND</code> задаёт дефолтное значение <code>bootcmd</code>, но только для случая, когда переменная <strong>отсутствует</strong> в env. Стоит устройству хоть раз выполнить <code>saveenv</code> - и <code>bootcmd</code> окажется зафиксирован в энергонезависимой памяти. После этого <code>CONFIG_BOOTCOMMAND</code> полностью игнорируется: U-Boot всегда предпочитает сохранённый env.</p>
<p><code>rk_board_late_init()</code> выполняется <strong>после</strong> загрузки env - переменная всегда выставляется в нужное значение независимо от содержимого env.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="почему-rk_board_late_init-а-не-board_late_init">Почему <code>rk_board_late_init</code>, а не <code>board_late_init</code><a class="hash-link" aria-label="Прямая ссылка на почему-rk_board_late_init-а-не-board_late_init" title="Прямая ссылка на почему-rk_board_late_init-а-не-board_late_init" href="https://napiworld.ru/recipes/uboot-bootcmd-rk3308#%D0%BF%D0%BE%D1%87%D0%B5%D0%BC%D1%83-rk_board_late_init-%D0%B0-%D0%BD%D0%B5-board_late_init">​</a></h2>
<p>В <code>arch/arm/mach-rockchip/board.c</code> уже определён <code>board_late_init()</code>, который вызывает <code>rk_board_late_init()</code> как weak-хук. Переопределять <code>board_late_init()</code> нельзя - линкер выдаст ошибку <code>multiple definition</code>. Правильная точка расширения для Rockchip-плат - именно <code>rk_board_late_init()</code>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="адреса-памяти">Адреса памяти<a class="hash-link" aria-label="Прямая ссылка на Адреса памяти" title="Прямая ссылка на Адреса памят�и" href="https://napiworld.ru/recipes/uboot-bootcmd-rk3308#%D0%B0%D0%B4%D1%80%D0%B5%D1%81%D0%B0-%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8">​</a></h2>
<table><thead><tr><th>Переменная</th><th>Адрес</th><th>Назначение</th></tr></thead><tbody><tr><td><code>fdt_addr_r</code></td><td><code>0x01e00000</code></td><td>Device Tree</td></tr><tr><td><code>kernel_addr_r</code></td><td><code>0x02080000</code></td><td>Ядро (несжатое)</td></tr><tr><td><code>ramdisk_addr_r</code></td><td><code>0x06000000</code></td><td>initrd</td></tr><tr><td><code>kernel_comp_addr_r</code></td><td><code>0x08000000</code></td><td>Буфер распаковки ядра</td></tr><tr><td><code>kernel_comp_size</code></td><td><code>0x04000000</code></td><td>Размер буфера (64 МБ)</td></tr></tbody></table>]]></content:encoded>
            <category>uboot</category>
            <category>napi2</category>
            <category>rk3308</category>
            <category>linux</category>
            <category>embedded</category>
        </item>
        <item>
            <title><![CDATA[NapiWRT - инструкция по сборке OpenWrt]]></title>
            <link>https://napiworld.ru/recipes/openwrt-napic-fccm3308</link>
            <guid>https://napiworld.ru/recipes/openwrt-napic-fccm3308</guid>
            <pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Пошаговая сборка OpenWrt (NapiWRT) для NAPI-C/P/Slot и компьютеров FCC3308, FCCM3308 на RK3308. Патчи, DTS и конфигурация.]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>Пошаговая инструкция по сборке кастомной прошивки OpenWrt для плат NapiLab Napi-C/P/Slot на базе Rockchip RK3308 и компьютеров на основе Napi-C (FCC3308, FCM3308). Включает все необходимые патчи, DTS, uci-defaults скрипты и конфигурацию. Особенно интересно для устройств с двумя Ethernet (FCM3308).</p>
</blockquote>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="1-подготовка-хост-машины-ubuntudebian">1. Подготовка хост-машины (Ubuntu/Debian)<a class="hash-link" aria-label="Прямая ссылка на 1. Подготовка хост-машины (Ubuntu/Debian)" title="Прямая ссылка на 1. Подготовка хост-машины (Ubuntu/Debian)" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#1-%D0%BF%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B0-%D1%85%D0%BE%D1%81%D1%82-%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D1%8B-ubuntudebian">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo apt install build-essential clang flex bison g++ gawk gcc-multilib \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  gettext git libncurses-dev libssl-dev python3-distutils python3-setuptools \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  python3-pyelftools swig rsync unzip zlib1g-dev help2man</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="2-клонирование-openwrt">2. Клонирование OpenWrt<a class="hash-link" aria-label="Прямая ссылка на 2. Клонирование OpenWrt" title="Прямая ссылка на 2. Клонирование OpenWrt" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#2-%D0%BA%D0%BB%D0%BE%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-openwrt">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">git clone https://github.com/openwrt/openwrt.git ~/openwrt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cd ~/openwrt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./scripts/feeds update -a</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./scripts/feeds install -a</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="3-кастомизации">3. Кастомизации<a class="hash-link" aria-label="Прямая ссылка на 3. Кастомизации" title="Прямая ссылка на 3. Кастомизации" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#3-%D0%BA%D0%B0%D1%81%D1%82%D0%BE%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8">​</a></h2>
<p>Все изменения вносятся в чистое дерево OpenWrt. Ниже - полный список файлов и модификаций.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="31-патч-u-boot-defconfig">3.1. Патч U-Boot defconfig<a class="hash-link" aria-label="Прямая ссылка на 3.1. Патч U-Boot defconfig" title="Прямая ссылка на 3.1. Патч U-Boot defconfig" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#31-%D0%BF%D0%B0%D1%82%D1%87-u-boot-defconfig">​</a></h3>
<p>Файл: <code>package/boot/uboot-rockchip/patches/108-board-rockchip-add-napilab-napic.patch</code></p>
<p>Этот патч добавляет defconfig для NapiLab Napi-C в систему сборки U-Boot. Копируется из репозитория napi-openwrt-build.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="32-блок-u-boot-в-makefile">3.2. Блок U-Boot в Makefile<a class="hash-link" aria-label="Прямая ссылка на 3.2. Блок U-Boot в Makefile" title="Прямая ссылка на 3.2. Блок U-Boot в Makefile" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#32-%D0%B1%D0%BB%D0%BE%D0%BA-u-boot-%D0%B2-makefile">​</a></h3>
<p>В файле <code>package/boot/uboot-rockchip/Makefile</code> нужно добавить определение устройства napic и включить его в список целей сборки.</p>
<p><strong>Добавить блок определения</strong> после <code>U-Boot/rock-pi-s-rk3308</code> (перед строкой <code># RK3328 boards</code>):</p>
<div class="language-makefile codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-makefile codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">define U-Boot/napic-rk3308</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  $(U-Boot/rk3308/Default)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  DEPENDS+=+PACKAGE_u-boot-$(1):trusted-firmware-a-rk3308-tpl-rock-pi-s</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  TPL:=rk3308_ddr_589MHz_uart0_m0_v2.10.bin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  NAME:=NapiLab Napi-C</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  BUILD_DEVICES:= \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    napilab_napic</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">endef</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Команда для вставки:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sed -i '/^# RK3328 boards/i\</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">define U-Boot/napic-rk3308\</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  $(U-Boot/rk3308/Default)\</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  DEPENDS+=+PACKAGE_u-boot-$(1):trusted-firmware-a-rk3308-tpl-rock-pi-s\</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  TPL:=rk3308_ddr_589MHz_uart0_m0_v2.10.bin\</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  NAME:=NapiLab Napi-C\</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  BUILD_DEVICES:= \\\</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    napilab_napic\</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">endef' package/boot/uboot-rockchip/Makefile</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Ограничить UBOOT_TARGETS</strong> только платами RK3308 (иначе сборка падает на отсутствующих ATF для rk3399 и др.):</p>
<p>Найти блок <code>UBOOT_TARGETS := \</code> и заменить весь список на:</p>
<div class="language-makefile codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-makefile codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">UBOOT_TARGETS := \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  rock-pi-s-rk3308 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  napic-rk3308</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="33-профиль-устройства-в-armv8mk">3.3. Профиль устройства в armv8.mk<a class="hash-link" aria-label="Прямая ссылка на 3.3. Профиль устройства в armv8.mk" title="Прямая ссылка на 3.3. Профиль устройства в armv8.mk" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#33-%D0%BF%D1%80%D0%BE%D1%84%D0%B8%D0%BB%D1%8C-%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0-%D0%B2-armv8mk">​</a></h3>
<p>В файл <code>target/linux/rockchip/image/armv8.mk</code> добавить в конец:</p>
<div class="language-makefile codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-makefile codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">define Device/napilab_napic</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  $(Device/rk3308)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  DEVICE_VENDOR := NapiLab</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  DEVICE_MODEL := Napi-C</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  DEVICE_DTS := rk3308-napi-c</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  SUPPORTED_DEVICES := napilab,napic radxa,rockpis</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  BOOT_SCRIPT := rock-pi-s</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  UBOOT_DEVICE_NAME := napic-rk3308</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  DEVICE_PACKAGES := \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  kmod-rtw88-8723ds \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  kmod-usb-net-cdc-ncm \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  kmod-usb-net-rndis \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  wpad-basic-mbedtls \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  kmod-fs-ext4 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  kmod-fs-msdos \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  kmod-fs-vfat \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  kmod-fs-exfat \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  kmod-fs-ntfs3 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  kmod-usb-storage \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  kmod-usb-serial-option \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  kmod-usb-net-qmi-wwan \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  uqmi \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  minicom \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  htop \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  nano \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  lsblk \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  usbutils \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  tcpdump \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ethtool \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  mosquitto \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  mosquitto-client \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  screen \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  xz-utils \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  mbpoll \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  openssh-sftp-server \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  bash \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  luci-ssl \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  luci-theme-openwrt-2020 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  luci-proto-qmi \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  luci-app-mbusd</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">endef</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TARGET_DEVICES += napilab_napic</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="34-device-tree-dts">3.4. Device Tree (DTS)<a class="hash-link" aria-label="Прямая ссылка на 3.4. Device Tree (DTS)" title="Прямая ссылка на 3.4. Device Tree (DTS)" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#34-device-tree-dts">​</a></h3>
<p>Файл: <code>target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3308-napi-c.dts</code></p>
<p>Основан на Rock Pi S, ключевые отличия:</p>
<ul>
<li><code>uart1</code>, <code>uart2</code>, <code>uart4</code> включены (RS-485, дополнительные последовательные порты)</li>
<li>Bluetooth не используется (занимает UART)</li>
<li>USB OTG контроллер (<code>usb20_otg</code>) переключён в режим host - без этого USB-устройства на OTG-порте не видны:</li>
</ul>
<div class="language-dts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-dts codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">&amp;usb20_otg {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    dr_mode = "host";</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    status = "okay";</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">};</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<blockquote>
<p><strong>Важно:</strong> без <code>dr_mode = "host"</code> модуль <code>dwc2</code> инициализируется в режиме gadget и USB-устройства (например, USB-Ethernet адаптеры) не определяются.</p>
</blockquote>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="35-пакеты">3.5. Пакеты<a class="hash-link" aria-label="Прямая ссылка на 3.5. Пакеты" title="Прямая ссылка на 3.5. Пакеты" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#35-%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D1%8B">​</a></h3>
<p>Скопировать в <code>package/</code>:</p>
<ul>
<li><code>package/luci-app-mbusd/</code> - LuCI веб-интерфейс для Modbus-шлюза mbusd</li>
<li><code>package/luci-app-mbpoll/</code> - LuCI веб-интерфейс для Modbus-поллера</li>
<li><code>package/mbscan/</code> - утилита сканирования Modbus RTU шины (содержит <code>Makefile</code> + <code>src/mbscan.c</code>)</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="36-файлы-прошивки-files">3.6. Файлы прошивки (files/)<a class="hash-link" aria-label="Прямая ссылка на 3.6. Файлы прошивки (files/)" title="Прямая ссылка на 3.6. Файлы прошивки (files/)" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#36-%D1%84%D0%B0%D0%B9%D0%BB%D1%8B-%D0%BF%D1%80%D0%BE%D1%88%D0%B8%D0%B2%D0%BA%D0%B8-files">​</a></h3>
<p>Все файлы в директории <code>files/</code> копируются в корневую ФС образа при сборке.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="filesetcshadow">files/etc/shadow<a class="hash-link" aria-label="Прямая ссылка на files/etc/shadow" title="Прямая ссылка на files/etc/shadow" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#filesetcshadow">​</a></h4>
<p>Пароль root по умолчанию (хеш генерируется через <code>openssl passwd -6</code>):</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">HASH=$(openssl passwd -6)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">echo "root:${HASH}:19000:0:99999:7:::" &gt; files/etc/shadow</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">chmod 640 files/etc/shadow</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="filesetcbanner">files/etc/banner<a class="hash-link" aria-label="Прямая ссылка на files/etc/banner" title="Прямая ссылка на files/etc/banner" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#filesetcbanner">​</a></h4>
<p>Кастомный баннер при логине.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="filesetcprofiled10-sysinfosh">files/etc/profile.d/10-sysinfo.sh<a class="hash-link" aria-label="Прямая ссылка на files/etc/profile.d/10-sysinfo.sh" title="Прямая ссылка на files/etc/profile.d/10-sysinfo.sh" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#filesetcprofiled10-sysinfosh">​</a></h4>
<p>Скрипт вывода информации об интерфейсах при логине:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">#!/bin/sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">echo ""</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">for iface in /sys/class/net/eth*; do</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    name=$(basename "$iface")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ip=$(ip -4 addr show "$name" 2&gt;/dev/null | awk '/inet /{print $2}')</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    state=$(cat "$iface/operstate" 2&gt;/dev/null)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    [ -z "$ip" ] &amp;&amp; ip="no address"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    echo " $name: $ip ($state)"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">done</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">echo ""</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="filesetcuci-defaults">files/etc/uci-defaults/<a class="hash-link" aria-label="Прямая ссылка на files/etc/uci-defaults/" title="Прямая ссылка на files/etc/uci-defaults/" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#filesetcuci-defaults">​</a></h4>
<p>Скрипты первого старта (выполняются один раз и удаляются):</p>
<table><thead><tr><th>Скрипт</th><th>Назначение</th></tr></thead><tbody><tr><td><code>70-rootpt-resize</code></td><td>Расширяет раздел до конца носителя, перезагружает</td></tr><tr><td><code>80-rootfs-resize</code></td><td>Расширяет ФС через losetup + resize2fs, перезагружает</td></tr><tr><td><code>91-bash</code></td><td>Меняет shell root на /bin/bash</td></tr><tr><td><code>92-timezone</code></td><td>Устанавливает MSK-3 (Москва)</td></tr><tr><td><code>93-console-password</code></td><td>Включает пароль на серийной консоли ttyS0</td></tr><tr><td><code>94-macaddr</code></td><td>Генерирует стабильный MAC из OTP-памяти чипа</td></tr><tr><td><code>95-network</code></td><td>Настройка сети: 1 интерфейс - DHCP; 2 - eth0=lan/static, eth1=wan/dhcp; 3+ - eth2+ в бридж с eth0</td></tr><tr><td><code>96-hostname</code></td><td>Устанавливает hostname napiwrt</td></tr><tr><td><code>97-luci-theme</code></td><td>Тема openwrt-2020</td></tr><tr><td><code>98-firewall-wan</code></td><td>Зона wan + правила SSH/HTTP/HTTPS на wan</td></tr><tr><td><code>99-dhcp</code></td><td>Отключает DHCP-сервер если одна сетевуха</td></tr></tbody></table>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="70-rootpt-resize">70-rootpt-resize<a class="hash-link" aria-label="Прямая ссылка на 70-rootpt-resize" title="Прямая ссылка на 70-rootpt-resize" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#70-rootpt-resize">​</a></h5>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">if [ ! -e /etc/rootpt-resize ] \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&amp;&amp; type parted &gt; /dev/null \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&amp;&amp; lock -n /var/lock/root-resize</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">then</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ROOT_BLK="$(readlink -f /sys/dev/block/"$(awk -e \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">'$9=="/dev/root"{print $3}' /proc/self/mountinfo)")"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ROOT_DISK="/dev/$(basename "${ROOT_BLK%/*}")"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ROOT_PART="${ROOT_BLK##*[^0-9]}"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">parted -f -s "${ROOT_DISK}" resizepart "${ROOT_PART}" 100%</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mount_root done</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">touch /etc/rootpt-resize</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">reboot</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fi</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">exit 1</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="80-rootfs-resize">80-rootfs-resize<a class="hash-link" aria-label="Прямая ссылка на 80-rootfs-resize" title="Прямая ссылка на 80-rootfs-resize" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#80-rootfs-resize">​</a></h5>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">if [ ! -e /etc/rootfs-resize ] \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&amp;&amp; [ -e /etc/rootpt-resize ] \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&amp;&amp; type losetup &gt; /dev/null \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&amp;&amp; type resize2fs &gt; /dev/null \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&amp;&amp; lock -n /var/lock/root-resize</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">then</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ROOT_BLK="$(readlink -f /sys/dev/block/"$(awk -e \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">'$9=="/dev/root"{print $3}' /proc/self/mountinfo)")"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ROOT_DEV="/dev/${ROOT_BLK##*/}"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LOOP_DEV="$(losetup -f)"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">losetup "${LOOP_DEV}" "${ROOT_DEV}"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">resize2fs -f "${LOOP_DEV}"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">losetup -d "${LOOP_DEV}"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mount_root done</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">touch /etc/rootfs-resize</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">reboot</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fi</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">exit 1</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="91-bash">91-bash<a class="hash-link" aria-label="Прямая ссылка на 91-bash" title="Прямая ссылка на 91-bash" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#91-bash">​</a></h5>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">#!/bin/sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sed -i 's|/bin/ash|/bin/bash|' /etc/passwd</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="92-timezone">92-timezone<a class="hash-link" aria-label="Прямая ссылка на 92-timezone" title="Прямая ссылка на 92-timezone" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#92-timezone">​</a></h5>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">#!/bin/sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set system.@system[0].timezone='MSK-3'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set system.@system[0].zonename='Europe/Moscow'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci commit system</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="93-console-password">93-console-password<a class="hash-link" aria-label="Прямая ссылка на 93-console-password" title="Прямая ссылка на 93-console-password" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#93-console-password">​</a></h5>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">#!/bin/sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set system.@system[0].ttylogin='1'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci commit system</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="94-macaddr">94-macaddr<a class="hash-link" aria-label="Прямая ссылка на 94-macaddr" title="Прямая ссылка на 94-macaddr" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#94-macaddr">​</a></h5>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">#!/bin/sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">MAC=$(cat /sys/bus/nvmem/devices/rockchip-otp0/nvmem | md5sum | \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  sed 's/\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*/02:\1:\2:\3:\4:\5/')</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set network.lan.macaddr="$MAC"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci commit network</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="95-network">95-network<a class="hash-link" aria-label="Прямая ссылка на 95-network" title="Прямая ссылка на 95-network" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#95-network">​</a></h5>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">#!/bin/sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Убираем дефолтный бридж</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci -q delete network.@device[0]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">if [ -e /sys/class/net/eth1 ]; then</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    # Две+ сетевухи: eth0=lan, eth1=wan</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    # Собираем дополнительные интерфейсы (eth2, eth3...) в бридж</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    EXTRA=""</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    for iface in /sys/class/net/eth*; do</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        name=$(basename "$iface")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        [ "$name" = "eth0" ] &amp;&amp; continue</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        [ "$name" = "eth1" ] &amp;&amp; continue</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        EXTRA="$EXTRA $name"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    done</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    if [ -n "$EXTRA" ]; then</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        # Есть eth2+ : бридж из eth0 + extras</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        uci set network.br_lan=device</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        uci set network.br_lan.type='bridge'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        uci set network.br_lan.name='br-lan'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        uci add_list network.br_lan.ports='eth0'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        for iface in $EXTRA; do</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            uci add_list network.br_lan.ports="$iface"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        done</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        uci set network.lan.device='br-lan'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    else</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        # Только eth0 + eth1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        uci set network.lan.device='eth0'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    fi</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    uci set network.lan.proto='static'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    uci set network.lan.ipaddr='192.168.1.1/24'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    # wan = eth1 (USB сетевушка)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    uci -q delete network.wan</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    uci set network.wan=interface</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    uci set network.wan.device='eth1'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    uci set network.wan.proto='dhcp'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">else</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    # Одна сетевуха: lan=dhcp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    uci set network.lan.device='eth0'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    uci set network.lan.proto='dhcp'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    uci -q delete network.lan.ipaddr</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fi</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci commit network</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="96-hostname">96-hostname<a class="hash-link" aria-label="Прямая ссылка на 96-hostname" title="Прямая ссылка на 96-hostname" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#96-hostname">​</a></h5>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">#!/bin/sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set system.@system[0].hostname='napiwrt'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci commit system</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="97-luci-theme">97-luci-theme<a class="hash-link" aria-label="Прямая ссылка на 97-luci-theme" title="Прямая ссылка на 97-luci-theme" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#97-luci-theme">​</a></h5>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">#!/bin/sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set luci.main.mediaurlbase='/luci-static/openwrt-2020'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci commit luci</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="98-firewall-wan">98-firewall-wan<a class="hash-link" aria-label="Прямая ссылка на 98-firewall-wan" title="Прямая ссылка на 98-firewall-wan" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#98-firewall-wan">​</a></h5>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">#!/bin/sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[ -e /sys/class/net/eth1 ] || exit 0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Включаем masq на дефолтной зоне wan (если ещё не включён)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set firewall.@zone[1].masq='1'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set firewall.@zone[1].mtu_fix='1'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci commit firewall</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># SSH на wan</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci add firewall rule</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set firewall.@rule[-1].name='Allow-SSH-WAN'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set firewall.@rule[-1].src='wan'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set firewall.@rule[-1].dest_port='22'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set firewall.@rule[-1].proto='tcp'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set firewall.@rule[-1].target='ACCEPT'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># HTTP на wan</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci add firewall rule</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set firewall.@rule[-1].name='Allow-HTTP-WAN'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set firewall.@rule[-1].src='wan'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set firewall.@rule[-1].dest_port='80'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set firewall.@rule[-1].proto='tcp'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set firewall.@rule[-1].target='ACCEPT'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># HTTPS на wan</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci add firewall rule</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set firewall.@rule[-1].name='Allow-HTTPS-WAN'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set firewall.@rule[-1].src='wan'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set firewall.@rule[-1].dest_port='443'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set firewall.@rule[-1].proto='tcp'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set firewall.@rule[-1].target='ACCEPT'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci commit firewall</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="99-dhcp">99-dhcp<a class="hash-link" aria-label="Прямая ссылка на 99-dhcp" title="Прямая ссылка на 99-dhcp" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#99-dhcp">​</a></h5>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">#!/bin/sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">if [ ! -e /sys/class/net/eth1 ]; then</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    # Одна сетевуха - не раздаём DHCP</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    uci set dhcp.lan.ignore='1'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fi</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci commit dhcp</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="4-конфигурация-config">4. Конфигурация (.config)<a class="hash-link" aria-label="Прямая ссылка на 4. Конфигурация (.config)" title="Прямая ссылка на 4. Конфигурация (.config)" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#4-%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D1%8F-config">​</a></h2>
<p>Скопировать <code>.config</code> из репозитория napi-openwrt-build. Обязательные пакеты, которые должны быть включены:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">CONFIG_PACKAGE_kmod-usb-dwc2=y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CONFIG_PACKAGE_kmod-usb-net-smsc95xx=y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CONFIG_PACKAGE_kmod-usb-gadget=y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CONFIG_PACKAGE_kmod-lib-crc16=y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CONFIG_PACKAGE_kmod-net-selftests=y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CONFIG_PACKAGE_kmod-phy-smsc=y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CONFIG_PACKAGE_parted=y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CONFIG_PACKAGE_losetup=y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CONFIG_PACKAGE_resize2fs=y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CONFIG_PACKAGE_luci-app-mbusd=y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CONFIG_PACKAGE_luci-app-mbpoll=y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CONFIG_PACKAGE_mbscan=y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CONFIG_PACKAGE_mbusd=y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CONFIG_PACKAGE_mbpoll=y</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Добавление пакетов в <code>.config</code> (никогда не запускать <code>make menuconfig</code> или <code>make defconfig</code> после!):</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">for pkg in kmod-usb-dwc2 kmod-usb-net-smsc95xx kmod-usb-gadget kmod-lib-crc16 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  kmod-net-selftests kmod-phy-smsc parted losetup resize2fs; do</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  sed -i "/$pkg/d" .config</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  echo "CONFIG_PACKAGE_$pkg=y" &gt;&gt; .config</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">done</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="5-сборка">5. Сборка<a class="hash-link" aria-label="Прямая ссылка на 5. Сборка" title="Прямая ссылка на 5. Сборка" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#5-%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B0">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="первая-сборка">Первая сборка<a class="hash-link" aria-label="Прямая ссылка на Первая сборка" title="Прямая ссылка на Первая сборка" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#%D0%BF%D0%B5%D1%80%D0%B2%D0%B0%D1%8F-%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B0">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">cd ~/openwrt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">make package/boot/arm-trusted-firmware-rockchip/compile -j$(nproc)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">make package/boot/uboot-rockchip/compile -j$(nproc)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">make -j$(nproc) EXTRA_IMAGE_NAME=$(date +%d%b_%H%M)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="пересборка-после-изменений">Пересборка после изменений<a class="hash-link" aria-label="Прямая ссылка на Пересборка после изменений" title="Прямая ссылка на Пересборка после изменений" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#%D0%BF%D0%B5%D1%80%D0%B5%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B0-%D0%BF%D0%BE%D1%81%D0%BB%D0%B5-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">make -j$(nproc) EXTRA_IMAGE_NAME=$(date +%d%b_%H%M)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="результат">Результат<a class="hash-link" aria-label="Прямая ссылка на Результат" title="Прямая ссылка на Результат" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82">​</a></h3>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">bin/targets/rockchip/armv8/openwrt-ДАТА-rockchip-armv8-napilab_napic-ext4-sysupgrade.img.gz</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="6-прошивка">6. Прошивка<a class="hash-link" aria-label="Прямая ссылка на 6. Прошивка" title="Прямая ссылка на 6. Прошивка" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#6-%D0%BF%D1%80%D0%BE%D1%88%D0%B8%D0%B2%D0%BA%D0%B0">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">gunzip openwrt-*-napilab_napic-ext4-sysupgrade.img.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dd if=openwrt-*-napilab_napic-ext4-sysupgrade.img of=/dev/sdX bs=4M status=progress</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sync</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<blockquote>
<p>Внимательно проверьте <code>/dev/sdX</code> командой <code>lsblk</code> перед записью!</p>
</blockquote>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="7-первый-запуск">7. Первый запуск<a class="hash-link" aria-label="Прямая ссылка на 7. Первый запуск" title="Прямая ссылка на 7. Первый запуск" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#7-%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9-%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA">​</a></h2>
<p>При первом старте на новом носителе происходит:</p>
<ol>
<li>Скрипт <code>70-rootpt-resize</code> расширяет раздел - перезагрузка</li>
<li>Скрипт <code>80-rootfs-resize</code> расширяет ФС - перезагрузка</li>
<li>Остальные uci-defaults применяются - система готова</li>
</ol>
<p>Итого: две автоматических перезагрузки, после чего устройство полностью настроено.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="доступ">Доступ<a class="hash-link" aria-label="Прямая ссылка на Доступ" title="Прямая ссылка на Доступ" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF">​</a></h3>
<table><thead><tr><th>Параметр</th><th>Одна сетевуха</th><th>Две сетевухи</th></tr></thead><tbody><tr><td>eth0 (LAN)</td><td>DHCP-клиент</td><td>192.168.1.1 (static)</td></tr><tr><td>eth1 (WAN)</td><td>-</td><td>DHCP-клиент</td></tr><tr><td>SSH</td><td>root@IP</td><td>root@IP (lan и wan)</td></tr><tr><td>LuCI</td><td><a href="http://ip/" target="_blank" rel="noopener noreferrer">http://IP/</a></td><td><a href="http://ip/" target="_blank" rel="noopener noreferrer">http://IP/</a> (lan и wan)</td></tr><tr><td>Консоль</td><td>ttyS0, 1500000 бод</td><td>ttyS0, 1500000 бод</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="8-перенос-сборки-на-другую-машину">8. Перенос сборки на другую машину<a class="hash-link" aria-label="Прямая ссылка на 8. Перенос сборки на другую машину" title="Прямая ссылка на 8. Перенос сборки на другую машину" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#8-%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81-%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B8-%D0%BD%D0%B0-%D0%B4%D1%80%D1%83%D0%B3%D1%83%D1%8E-%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D1%83">​</a></h2>
<p>Переносить нужно <strong>только кастомизации</strong>, не build_dir/staging_dir. Список файлов для переноса:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">tar czf napi-custom.tar.gz \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  .config \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  files/ \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  target/linux/rockchip/files/ \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  target/linux/rockchip/image/armv8.mk \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  package/boot/uboot-rockchip/patches/108-board-rockchip-add-napilab-napic.patch \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  package/boot/uboot-rockchip/Makefile \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  package/luci-app-mbusd/ \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  package/luci-app-mbpoll/ \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  package/mbscan/</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>На новой машине:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">git clone https://github.com/openwrt/openwrt.git ~/openwrt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cd ~/openwrt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./scripts/feeds update -a</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./scripts/feeds install -a</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">tar xzf napi-custom.tar.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">make -j$(nproc) EXTRA_IMAGE_NAME=$(date +%d%b_%H%M)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<blockquote>
<p><strong>Важно:</strong> <code>armv8.mk</code> и <code>package/boot/uboot-rockchip/Makefile</code> из архива перезапишут оригинальные файлы OpenWrt. Если версия OpenWrt сильно отличается, эти файлы нужно мержить вручную - добавлять блоки napic в актуальные файлы новой версии.</p>
</blockquote>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="9-известные-грабли">9. Известные грабли<a class="hash-link" aria-label="Прямая ссылка на 9. Известные грабли" title="Прямая ссылка на 9. Известные грабли" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#9-%D0%B8%D0%B7%D0%B2%D0%B5%D1%81%D1%82%D0%BD%D1%8B%D0%B5-%D0%B3%D1%80%D0%B0%D0%B1%D0%BB%D0%B8">​</a></h2>
<ul>
<li><strong>Никогда не запускать <code>make menuconfig</code> или <code>make defconfig</code></strong> после ручной правки <code>.config</code> - они перезапишут кастомные записи</li>
<li><strong>Добавление пакетов</strong>: только через <code>sed -i '/&lt;pkg&gt;/d' .config &amp;&amp; echo 'CONFIG_PACKAGE_&lt;pkg&gt;=y' &gt;&gt; .config</code></li>
<li><strong>build_dir/staging_dir содержат абсолютные пути</strong> - при переносе между машинами всегда <code>make distclean</code> (сохранив <code>.config</code>)</li>
<li><strong>UBOOT_TARGETS нужно ограничивать</strong> - без ATF для rk3399/rk3588 сборка U-Boot падает</li>
<li><strong><code>dr_mode = "host"</code> обязателен</strong> для USB OTG - без него dwc2 уходит в gadget-режим</li>
<li><strong><code>files/etc/shadow</code></strong> не должен содержать пароль в открытом виде - только хеш через <code>openssl passwd -6</code></li>
<li><strong>USB-Ethernet (SMSC LAN9500)</strong> требует пакеты: <code>kmod-usb-dwc2</code>, <code>kmod-usb-net-smsc95xx</code>, <code>kmod-usb-gadget</code>, <code>kmod-lib-crc16</code>, <code>kmod-net-selftests</code>, <code>kmod-phy-smsc</code></li>
</ul>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="лицензия">Лицензия<a class="hash-link" aria-label="Прямая ссылка на Лицензия" title="Прямая ссылка на Лицензия" href="https://napiworld.ru/recipes/openwrt-napic-fccm3308#%D0%BB%D0%B8%D1%86%D0%B5%D0%BD%D0%B7%D0%B8%D1%8F">​</a></h2>
<p>GPL-2.0 - следуем лицензии OpenWrt. Все кастомизации открыты.</p>]]></content:encoded>
            <category>openwrt napic fccm3308</category>
        </item>
        <item>
            <title><![CDATA[Debian для NAPI-C с ядром 6.6]]></title>
            <link>https://napiworld.ru/recipes/debian-napic</link>
            <guid>https://napiworld.ru/recipes/debian-napic</guid>
            <pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Сборочная система для создания готового образа Debian Trixie (arm64) с ядром 6.6 для NAPI-C на Rockchip RK3308.]]></description>
            <content:encoded><![CDATA[<p>Сборочная система для создания готового образа Debian (trixie) под одноплатный компьютер Napi-C на базе Rockchip RK3308.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="готовые-образы-для-прошивки-и-исходный-код">Готовые образы для прошивки и исходный код<a class="hash-link" aria-label="Прямая ссылка на Готовые образы для прошивки и исходный код" title="Прямая ссылка на Готовые образы для прошивки и исходный код" href="https://napiworld.ru/recipes/debian-napic#%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D1%8B%D0%B5-%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D1%8B-%D0%B4%D0%BB%D1%8F-%D0%BF%D1%80%D0%BE%D1%88%D0%B8%D0%B2%D0%BA%D0%B8-%D0%B8-%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D0%B9-%D0%BA%D0%BE%D0%B4">​</a></h2>
<p>Готовые образы: <a href="https://download.napilinux.ru/linuximg/napic/debian/" target="_blank" rel="noopener noreferrer">https://download.napilinux.ru/linuximg/napic/debian/</a></p>
<p>Наисвежайшая информация м сборочная система на GitHub: <a href="https://github.com/lab240/napi-debian-build" target="_blank" rel="noopener noreferrer">https://github.com/lab240/napi-debian-build</a></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="подключённые-репозитории">Подключённые репозитории<a class="hash-link" aria-label="Прямая ссылка на Подключённые репозитории" title="Прямая ссылка на Подключённые репозитории" href="https://napiworld.ru/recipes/debian-napic#%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D1%91%D0%BD%D0%BD%D1%8B%D0%B5-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B8">​</a></h3>
<ul>
<li><code>http://deb.debian.org/debian</code> - основной Debian</li>
<li><code>https://deb.napilab.net</code> - пакеты NapiLab (ядра, утилиты)</li>
<li><code>https://repo.napilab.ru</code> - дополнительные пакеты (mbusd и др.)</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="что-в-образе">Что в образе<a class="hash-link" aria-label="Прямая ссылка на Что в образе" title="Прямая ссылка на Что в образе" href="https://napiworld.ru/recipes/debian-napic#%D1%87%D1%82%D0%BE-%D0%B2-%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%B5">​</a></h2>
<ul>
<li><strong>Debian trixie</strong> (arm64)</li>
<li><strong>Ядро 6.6.x</strong> (vendor Rockchip, собирается из исходников или устанавливается из deb)</li>
<li><strong>U-Boot 2023.10</strong></li>
<li>Поддержка Device Tree Overlays (UART, I2C, USB host, SPI и др.)</li>
<li>Автоматическое расширение раздела при первом запуске</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="предустановленные-пакеты">Предустановленные пакеты<a class="hash-link" aria-label="Прямая ссылка на Предустановленные пакеты" title="Прямая ссылка на Предустановленные пакеты" href="https://napiworld.ru/recipes/debian-napic#%D0%BF%D1%80%D0%B5%D0%B4%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D1%8B">​</a></h3>
<p>Базовые: ssh, NetworkManager, sudo, nano, curl, ntpsec, initramfs-tools, locales</p>
<p>Из <code>packages.list</code>: vim, net-tools, can-utils, mbpoll, minicom, tcpdump, screen, memtester, xxd, tree, util-linux-extra, mosquitto, mosquitto-clients, i2c-tools, python3-pymodbus, python3-pip, python3-smbus2, git, tmux, make, cmake, gcc, build-essential, flex, bison, libssl-dev, pkg-config, mbusd</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="overlays-по-умолчанию">Overlays по умолчанию<a class="hash-link" aria-label="Прямая ссылка на Overlays по умолчанию" title="Прямая ссылка на Overlays по умолчанию" href="https://napiworld.ru/recipes/debian-napic#overlays-%D0%BF%D0%BE-%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E">​</a></h3>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">rk3308-uart0 rk3308-uart1 rk3308-uart2-m0 rk3308-uart3-m0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">rk3308-i2c1-ds1338 rk3308-i2c3-m0 rk3308-usb20-host</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Настраиваются в <code>/boot/uEnv.txt</code>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="учётные-данные">Учётные данные<a class="hash-link" aria-label="Прямая ссылка на Учётные данные" title="Прямая ссылка на Учётные данные" href="https://napiworld.ru/recipes/debian-napic#%D1%83%D1%87%D1%91%D1%82%D0%BD%D1%8B%D0%B5-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5">​</a></h2>
<ul>
<li><strong>root</strong> / napilinux</li>
<li><strong>napi</strong> / napilinux (sudo)</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="быстрый-старт">Быстрый старт<a class="hash-link" aria-label="Прямая ссылка на Быстрый старт" title="Прямая ссылка на Быстрый старт" href="https://napiworld.ru/recipes/debian-napic#%D0%B1%D1%8B%D1%81%D1%82%D1%80%D1%8B%D0%B9-%D1%81%D1%82%D0%B0%D1%80%D1%82">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="сборка-образа-из-готовых-deb">Сборка образа из готовых deb<a class="hash-link" aria-label="Прямая ссылка на Сборка образа из готовых deb" title="Прямая ссылка на Сборка образа из готовых deb" href="https://napiworld.ru/recipes/debian-napic#%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B0-%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%B0-%D0%B8%D0%B7-%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D1%8B%D1%85-deb">​</a></h3>
<p>Положить deb-пакеты ядра в <code>kernel-rk-6.6/</code> и запустить:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo ./mkimg.sh</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Готовый образ появится в <code>artifacts-trixie/</code>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="сборка-с-компиляцией-ядра-из-исходников">Сборка с компиляцией ядра из исходников<a class="hash-link" aria-label="Прямая ссылка на Сборка с компиляцией ядра из исходников" title="Прямая ссылка на Сборка с компиляцией ядра из исходников" href="https://napiworld.ru/recipes/debian-napic#%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B0-%D1%81-%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D0%B5%D0%B9-%D1%8F%D0%B4%D1%80%D0%B0-%D0%B8%D0%B7-%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo ./mkimg.sh --build-kernel</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Исходники клонируются из <code>https://gitlab.nnz-ipc.net/pub/napilinux/kernel.git</code> (ветка <code>rk-6.6</code>), собранные deb сохраняются в <code>kernel-rk-6.6/</code>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="только-сборка-ядра-без-образа">Только сборка ядра (без образа)<a class="hash-link" aria-label="Прямая ссылка на Только сборка ядра (без образа)" title="Прямая ссылка на Только сборка ядра (без образа)" href="https://napiworld.ru/recipes/debian-napic#%D1%82%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE-%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B0-%D1%8F%D0%B4%D1%80%D0%B0-%D0%B1%D0%B5%D0%B7-%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%B0">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo bash -c '</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">source config.sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">BUILD_KERNEL=1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">source scripts/00-build-kernel.sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">'</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="прошивка-на-sd-карту">Прошивка на SD-карту<a class="hash-link" aria-label="Прямая ссылка на Прошивка на SD-карту" title="Прямая ссылка на Прошивка на SD-карту" href="https://napiworld.ru/recipes/debian-napic#%D0%BF%D1%80%D0%BE%D1%88%D0%B8%D0%B2%D0%BA%D0%B0-%D0%BD%D0%B0-sd-%D0%BA%D0%B0%D1%80%D1%82%D1%83">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">xzcat artifacts-trixie/Debian-napilab_*.img.xz | sudo dd of=/dev/sdX bs=4M status=progress</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sync</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="параметры-сборки">Параметры сборки<a class="hash-link" aria-label="Прямая ссылка на Параметры сборки" title="Прямая ссылка на Параметры сборки" href="https://napiworld.ru/recipes/debian-napic#%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B-%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B8">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="аргументы-командной-строки">Аргументы командной строки<a class="hash-link" aria-label="Прямая ссылка на Аргументы командной строки" title="Прямая ссылка на Аргументы командной строки" href="https://napiworld.ru/recipes/debian-napic#%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D0%BE%D0%B9-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8">​</a></h3>
<table><thead><tr><th>Аргумент</th><th>Описание</th></tr></thead><tbody><tr><td><code>--build-kernel</code></td><td>Собрать ядро из исходников</td></tr><tr><td><code>--branch=rk-6.6</code></td><td>Ветка ядра (каталог <code>kernel-&lt;branch&gt;</code>)</td></tr><tr><td><code>--skip-uboot</code></td><td>Не прошивать U-Boot в образ</td></tr><tr><td><code>--skip-xz</code></td><td>Не сжимать образ (для отладки)</td></tr></tbody></table>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="переменные-окружения">Переменные окружения<a class="hash-link" aria-label="Прямая ссылка на Переменные окружения" title="Прямая ссылка на Переменные окружения" href="https://napiworld.ru/recipes/debian-napic#%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D0%BE%D0%BA%D1%80%D1%83%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F">​</a></h3>
<table><thead><tr><th>Переменная</th><th>По умолчанию</th><th>Описание</th></tr></thead><tbody><tr><td><code>KERNEL_VER</code></td><td>6.6.89</td><td>Версия ядра</td></tr><tr><td><code>IMAGE_SIZE</code></td><td>2048</td><td>Размер образа в MB</td></tr><tr><td><code>DISTRIBUTION</code></td><td>trixie</td><td>Релиз Debian</td></tr><tr><td><code>EXTRA_PKGS</code></td><td>-</td><td>Дополнительные пакеты через запятую</td></tr><tr><td><code>HOSTNAME_TARGET</code></td><td>napic</td><td>Hostname платы</td></tr></tbody></table>
<p>Примеры:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Другая ветка ядра</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sudo ./mkimg.sh --branch=rk-6.1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Увеличенный образ с доп. пакетами</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sudo IMAGE_SIZE=4096 EXTRA_PKGS=docker.io ./mkimg.sh</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="структура-проекта">Структура проекта<a class="hash-link" aria-label="Прямая ссылка на Структура проекта" title="Прямая ссылка на Структура проекта" href="https://napiworld.ru/recipes/debian-napic#%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0">​</a></h2>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">make-napi-debian/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── config.sh                     # конфигурация сборки</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── mkimg.sh                      # главный скрипт</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── packages.list                 # дополнительные пакеты</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── napi-archive-keyring.asc      # ключ репозитория deb.napilab.net</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── u-boot-latest_*.deb           # U-Boot</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── kernel-rk-6.6/               # deb-пакеты ядра</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   ├── linux-image-*.deb</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   └── linux-headers-*.deb</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── scripts/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   ├── 00-build-kernel.sh        # [опц.] сборка ядра из исходников</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   ├── 01-create-image.sh        # создание образа и разметка</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   ├── 02-debootstrap.sh         # установка базовой системы</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   ├── 03-install-kernel.sh      # установка ядра и DTB</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   ├── 04-boot-config.sh         # boot.cmd, uEnv.txt, boot.scr</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   ├── 05-configure.sh           # пользователи, locale, репы, пакеты</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   ├── 06-cleanup.sh             # размонтирование</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   └── 07-install-uboot.sh       # прошивка U-Boot, упаковка xz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── cache/apt/                    # кеш скачанных пакетов</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">└── artifacts-trixie/             # готовые образы</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="настройка-на-плате">Настройка на плате<a class="hash-link" aria-label="Прямая ссылка на Настройка на плате" title="Прямая ссылка на Настройка на плате" href="https://napiworld.ru/recipes/debian-napic#%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%BD%D0%B0-%D0%BF%D0%BB%D0%B0%D1%82%D0%B5">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="overlays">Overlays<a class="hash-link" aria-label="Прямая ссылка на Overlays" title="Прямая ссылка на Overlays" href="https://napiworld.ru/recipes/debian-napic#overlays">​</a></h3>
<p>Редактировать <code>/boot/uEnv.txt</code>, строка <code>overlays=</code>. Доступные overlays:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ls /boot/dtbs/overlay/rk3308/</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>После изменения перезагрузить плату.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="обновление-ядра">Обновление ядра<a class="hash-link" aria-label="Прямая ссылка на Обновление ядра" title="Прямая ссылка на Обновление ядра" href="https://napiworld.ru/recipes/debian-napic#%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D1%8F%D0%B4%D1%80%D0%B0">​</a></h3>
<p>При установке нового ядра через <code>dpkg -i linux-image-*.deb</code> автоматически обновляются DTB, симлинки и boot.scr (через postinst hook <code>/etc/kernel/postinst.d/zz-napi-update-boot</code>)</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="контакты">Контакты<a class="hash-link" aria-label="Прямая ссылка на Контакты" title="Прямая ссылка на Контакты" href="https://napiworld.ru/recipes/debian-napic#%D0%BA%D0%BE%D0%BD%D1%82%D0%B0%D0%BA%D1%82%D1%8B">​</a></h2>
<p>Вопросы, заказ плат и интеграция: <a href="mailto:dj.novikov@gmail.com" target="_blank" rel="noopener noreferrer">dj.novikov@gmail.com</a></p>]]></content:encoded>
            <category>debian napic</category>
        </item>
        <item>
            <title><![CDATA[Установка USB WIFI RTL8188 в Armbian]]></title>
            <link>https://napiworld.ru/recipes/rtl8188-armbian</link>
            <guid>https://napiworld.ru/recipes/rtl8188-armbian</guid>
            <pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Установка и настройка USB WiFi адаптера Realtek RTL8188FTV (ID 0bda:f179) в Armbian на NAPI-C.]]></description>
            <content:encoded><![CDATA[<p><strong>Адаптер:</strong> Realtek RTL8188FTV (ID 0bda<!-- -->:f179<!-- -->) <br>
<strong>Драйвер:</strong> rtl8xxxu (mainline) <br>
<strong>Прошивка:</strong> rtlwifi/rtl8188fufw.bin</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="1-установить-необходимые-пакеты">1. Установить необходимые пакеты<a class="hash-link" aria-label="Прямая ссылка на 1. Установить необходимые пакеты" title="Прямая ссылка на 1. Установить необходимые пакеты" href="https://napiworld.ru/recipes/rtl8188-armbian#1-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C-%D0%BD%D0%B5%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D0%BC%D1%8B%D0%B5-%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D1%8B">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">apt update</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">apt install linux-firmware</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">apt install zstd</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="2-распаковать-прошивку">2. Распаковать прошивку<a class="hash-link" aria-label="Прямая ссылка на 2. Распаковать прошивку" title="Прямая ссылка на 2. Распаковать прошивку" href="https://napiworld.ru/recipes/rtl8188-armbian#2-%D1%80%D0%B0%D1%81%D0%BF%D0%B0%D0%BA%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-%D0%BF%D1%80%D0%BE%D1%88%D0%B8%D0%B2%D0%BA%D1%83">​</a></h2>
<p>Пакет <code>linux-firmware</code> содержит прошивку в сжатом виде (<code>.zst</code>), но ядро Armbian по умолчанию не поддерживает автоматическую распаковку (<code>CONFIG_FW_LOADER_COMPRESS_ZSTD</code> не включён). Распаковываем вручную:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">zstd -d /lib/firmware/rtlwifi/rtl8188fufw.bin.zst</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="3-загрузить-драйвер">3. Загрузить драйвер<a class="hash-link" aria-label="Прямая ссылка на 3. Загрузить драйвер" title="Прямая ссылка на 3. Загрузить драйвер" href="https://napiworld.ru/recipes/rtl8188-armbian#3-%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%B8%D1%82%D1%8C-%D0%B4%D1%80%D0%B0%D0%B9%D0%B2%D0%B5%D1%80">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">modprobe rtl8xxxu</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Если драйвер уже был загружен ранее (с ошибкой), перезагрузить:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">rmmod rtl8xxxu &amp;&amp; modprobe rtl8xxxu</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="4-добавить-драйвер-в-автозагрузку">4. Добавить драйвер в автозагрузку<a class="hash-link" aria-label="Прямая ссылка на 4. Добавить драйвер в автозагрузку" title="Прямая ссылка на 4. Добавить драйвер в автозагрузку" href="https://napiworld.ru/recipes/rtl8188-armbian#4-%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D0%B4%D1%80%D0%B0%D0%B9%D0%B2%D0%B5%D1%80-%D0%B2-%D0%B0%D0%B2%D1%82%D0%BE%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D1%83">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">echo "rtl8xxxu" &gt;&gt; /etc/modules</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопи�ровать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>После этого драйвер будет загружаться автоматически при каждой загрузке системы.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="5-проверить">5. Проверить<a class="hash-link" aria-label="Прямая ссылка на 5. Проверить" title="Прямая ссылка на 5. Проверить" href="https://napiworld.ru/recipes/rtl8188-armbian#5-%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%B8%D1%82%D1%8C">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">root@napic:~# ip a</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    inet 127.0.0.1/8 scope host lo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       valid_lft forever preferred_lft forever</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2: end0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc mq state UP group default qlen 1000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    link/ether ea:b2:0d:09:2e:6c brd ff:ff:ff:ff:ff:ff</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    inet 192.168.30.64/24 metric 100 brd 192.168.30.255 scope global dynamic end0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       valid_lft 46523sec preferred_lft 46523sec</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    inet6 fe80::e8b2:dff:fe09:2e6c/64 scope link</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       valid_lft forever preferred_lft forever</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">3: wlx6c60ebe162ef: &lt;BROADCAST,MULTICAST&gt; mtu 1500 qdisc noop state DOWN group default qlen 1000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    link/ether 6c:60:eb:e1:62:ef brd ff:ff:ff:ff:ff:ff</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content:encoded>
            <category>armbian napi wifi</category>
        </item>
        <item>
            <title><![CDATA[NAPI2 поддерживает OpenWRT]]></title>
            <link>https://napiworld.ru/recipes/napi2-openwrt-support</link>
            <guid>https://napiworld.ru/recipes/napi2-openwrt-support</guid>
            <pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[OpenWrt для NAPI2 на Rockchip RK3568: готовый образ NapiWRT для прошивки и сборка из открытых исходников.]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>OpenWrt для NapiLab NAPI2 (RK3568): готовая прошивка и сборка из исходников</p>
</blockquote>
<p>NapiWRT теперь поддерживает <strong><a href="https://napiworld.ru/docs/napi2">NAPI2</a></strong> на базе Rockchip RK3568. Готовый образ можно скачать и залить на SD\eMMC, а можно собрать самостоятельно из открытых исходников.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="что-такое-napi2">Что такое NAPI2<a class="hash-link" aria-label="Прямая ссылка на Что такое NAPI2" title="Прямая ссылка на Что такое NAPI2" href="https://napiworld.ru/recipes/napi2-openwrt-support#%D1%87%D1%82%D0%BE-%D1%82%D0%B0%D0%BA%D0%BE%D0%B5-napi2">​</a></h2>
<p>NAPI2 - промышленный IoT-шлюз NapiLab на базе Rockchip RK3568:</p>
<table><thead><tr><th>Параметр</th><th>Значение</th></tr></thead><tbody><tr><td>CPU</td><td>Cortex-A55 × 4, 2.0 ГГц</td></tr><tr><td>RAM</td><td>4 ГБ DDR4</td></tr><tr><td>Хранилище</td><td>32 ГБ eMMC + SD</td></tr><tr><td>Ethernet</td><td>2× Gigabit (LAN + WAN + NAT)</td></tr><tr><td>USB</td><td>USB 2.0 + USB 3.0 OTG</td></tr><tr><td>RS-485</td><td>UART7, аппаратный RTS</td></tr><tr><td>CAN</td><td>CAN 2.0</td></tr><tr><td>HDMI</td><td>HDMI 2.0, framebuffer-консоль</td></tr><tr><td>RTC</td><td>DS1338</td></tr></tbody></table>
<p>Два гигабитных порта и NAT означают, что NAPI2 может одновременно работать как маршрутизатор между промышленной и офисной сетью и как Modbus TCP шлюз.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="скачать-готовый-образ">Скачать готовый образ<a class="hash-link" aria-label="Прямая ссылка на Скачать готовый образ" title="Прямая ссылка на Скачать готовый образ" href="https://napiworld.ru/recipes/napi2-openwrt-support#%D1%81%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C-%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D1%8B%D0%B9-%D0%BE%D0%B1%D1%80%D0%B0%D0%B7">​</a></h2>
<p>Готовые образы публикуются в GitHub Releases:</p>
<p><strong>→ <a href="https://github.com/lab240/napi-openwrt-build/releases" target="_blank" rel="noopener noreferrer">github.com/lab240/napi-openwrt-build/releases</a></strong></p>
<p>Файл прошивки: <code>openwrt-rockchip-armv8-napi2-rk3568-ext4-sysupgrade.img.gz</code></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="запись-на-emmc">Запись на eMMC<a class="hash-link" aria-label="Прямая ссылка на Запись на eMMC" title="Прямая ссылка на Запись на eMMC" href="https://napiworld.ru/recipes/napi2-openwrt-support#%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C-%D0%BD%D0%B0-emmc">​</a></h3>
<p>eMMC - встроенная память, напрямую с хост-машины к ней не подключиться. Процедура прошивки:</p>
<ol>
<li>Загрузите NAPI2 с SD-карты (любой рабочий Linux-образ)</li>
<li>Подключите USB-накопитель с файлом прошивки</li>
<li>Смонтируйте USB и запишите образ на eMMC:</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Монтируем USB-накопитель</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mount /dev/sda1 /mnt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Распаковываем образ</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">gunzip /mnt/openwrt-rockchip-armv8-napi2-rk3568-ext4-sysupgrade.img.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Записываем на eMMC</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dd if=/mnt/openwrt-rockchip-armv8-napi2-rk3568-ext4-sysupgrade.img \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   of=/dev/mmcblk0 bs=4M status=progress</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sync</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ol start="4">
<li>Выключите устройство, извлеките SD-карту, подайте питание - NAPI2 загрузится с eMMC.</li>
</ol>
<blockquote>
<p>Проверьте имя устройства eMMC через <code>lsblk</code> - обычно это <code>/dev/mmcblk0</code>.</p>
</blockquote>
<p>После подачи питания система автоматически расширит корневой раздел на весь носитель (две перезагрузки при первом старте), применит все настройки и будет готова к работе.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="доступ-по-умолчанию">Доступ по умолчанию<a class="hash-link" aria-label="Прямая ссылка на Доступ по умолчанию" title="Прямая ссылка на Доступ по умолчанию" href="https://napiworld.ru/recipes/napi2-openwrt-support#%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF-%D0%BF%D0%BE-%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E">​</a></h3>
<table><thead><tr><th>Параметр</th><th>Значение</th></tr></thead><tbody><tr><td>LAN</td><td>eth0, 192.168.1.1 (статика)</td></tr><tr><td>WAN</td><td>eth1, DHCP</td></tr><tr><td>Веб-интерфейс</td><td><a href="http://192.168.1.1/" target="_blank" rel="noopener noreferrer">http://192.168.1.1/</a></td></tr><tr><td>SSH</td><td>root@192.168.1.1</td></tr><tr><td>Консоль</td><td>ttyS2, 1 500 000 бод + HDMI</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="что-в-прошивке-из-коробки">Что в прошивке из коробки<a class="hash-link" aria-label="Прямая ссылка на Что в прошивке из коробки" title="Прямая ссылка на Что в прошивке из коробки" href="https://napiworld.ru/recipes/napi2-openwrt-support#%D1%87%D1%82%D0%BE-%D0%B2-%D0%BF%D1%80%D0%BE%D1%88%D0%B8%D0%B2%D0%BA%D0%B5-%D0%B8%D0%B7-%D0%BA%D0%BE%D1%80%D0%BE%D0%B1%D0%BA%D0%B8">​</a></h2>
<p>Прошивка содержит полный промышленный стек:</p>
<ul>
<li><strong>Modbus TCP</strong> - <code>mbusd</code> + <code>luci-app-mbusd</code> (RS-485 на UART7 → TCP)</li>
<li><strong>Modbus-сканер</strong> - <code>mbpoll</code> + <code>luci-app-mbpoll</code>, <code>mbscan</code></li>
<li><strong>MQTT</strong> - <code>mosquitto</code> уже настроен и запущен</li>
<li><strong>Метрики</strong> - <code>collectd</code> с модулями mqtt, rrdtool, modbus</li>
<li><strong>1-Wire</strong> - <code>owfs</code> / <code>owserver</code> для датчиков DS18B20</li>
<li><strong>I2C / GPIO</strong> - <code>i2c-tools</code>, <code>gpiod-tools</code></li>
<li><strong>LTE</strong> - поддержка Quectel EP06 через QMI</li>
<li><strong>HDMI-консоль</strong> - лог ядра и вход на мониторе, USB-клавиатура</li>
</ul>
<p>NAPI2 также готова к запуску Zigbee2MQTT - 4 ГБ RAM более чем достаточно. Готовый архив Z2M для musl/aarch64 есть в тех же Releases.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ключевые-возможности">Ключевые возможности<a class="hash-link" aria-label="Прямая ссылка на Ключевые возможности" title="Прямая ссылка на Ключевые возможности" href="https://napiworld.ru/recipes/napi2-openwrt-support#%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%B2%D1%8B%D0%B5-%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8">​</a></h2>
<ul>
<li><strong>Двойной Ethernet</strong> - eth0 (LAN, 192.168.1.1) + eth1 (WAN, DHCP). NAT и маршрутизация настроены из коробки.</li>
<li><strong>HDMI-консоль</strong> - framebuffer + DRM VOP2 встроены в ядро. Лог загрузки выводится одновременно на serial и HDMI. Подключите монитор и USB-клавиатуру - полноценный локальный доступ без USB-UART адаптера.</li>
<li><strong>RS-485 с аппаратным RTS</strong> - UART7 (<code>/dev/ttyS7</code>) с автоматическим управлением направлением передачи. Не нужен GPIO для переключения приём/передача.</li>
<li><strong>CAN 2.0</strong> - для подключения промышленного оборудования с CAN-интерфейсом.</li>
<li><strong>RTC DS1338</strong> - аппаратные часы на I2C5, время сохраняется при выключении питания.</li>
<li><strong>MAC из eMMC CID</strong> - стабильный MAC-адрес генерируется из уникального идентификатора eMMC (отдельные MAC для LAN и WAN).</li>
</ul>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="собрать-самостоятельно">Собрать самостоятельно<a class="hash-link" aria-label="Прямая ссылка на Собрать самостоятельно" title="Прямая ссылка на Собрать самостоятельно" href="https://napiworld.ru/recipes/napi2-openwrt-support#%D1%81%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D1%8C-%D1%81%D0%B0%D0%BC%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE">​</a></h2>
<p>Исходники кастомизаций открыты:</p>
<p><strong>→ <a href="https://github.com/lab240/napi-openwrt-build" target="_blank" rel="noopener noreferrer">github.com/lab240/napi-openwrt-build</a></strong></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="зависимости">Зависимости<a class="hash-link" aria-label="Прямая ссылка на Зависимости" title="Прямая ссылка на Зависимости" href="https://napiworld.ru/recipes/napi2-openwrt-support#%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo apt install build-essential clang flex bison g++ gawk gcc-multilib \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  gettext git libncurses-dev libssl-dev python3-distutils python3-setuptools \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  python3-dev python3-pyelftools rsync swig unzip zlib1g-dev</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="сборка">Сборка<a class="hash-link" aria-label="Прямая ссылка на Сборка" title="Прямая ссылка на Сборка" href="https://napiworld.ru/recipes/napi2-openwrt-support#%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B0">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Клонируем OpenWrt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">git clone https://github.com/openwrt/openwrt.git</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cd openwrt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./scripts/feeds update -a</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./scripts/feeds install -a</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Накладываем кастомизации NAPI2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cp -r /path/to/napi-openwrt/napi2-files/* .</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Применяем конфиг ядра для HDMI</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">bash apply-kernel-config.sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Сначала собираем NanoPi R5S (нужен U-Boot от того же RK3568)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">echo 'CONFIG_TARGET_rockchip_armv8_DEVICE_friendlyarm_nanopi-r5s=y' &gt;&gt; .config</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">make defconfig</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">make -j$(nproc)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Переключаемся на NAPI2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sed -i '/DEVICE_friendlyarm_nanopi-r5s/d' .config</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">echo 'CONFIG_TARGET_rockchip_armv8_DEVICE_napi2-rk3568=y' &gt;&gt; .config</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">make defconfig</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">make -j$(nproc)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Результат появится в <code>bin/targets/rockchip/armv8/</code>.</p>
<blockquote>
<p>Первая сборка занимает 30–60 минут (компилируется тулчейн). Пересборка с изменениями - 5–10 минут.</p>
</blockquote>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="зачем-двухэтапная-сборка">Зачем двухэтапная сборка<a class="hash-link" aria-label="Прямая ссылка на Зачем двухэтапная сборка" title="Прямая ссылка на Зачем двухэтапная сборка" href="https://napiworld.ru/recipes/napi2-openwrt-support#%D0%B7%D0%B0%D1%87%D0%B5%D0%BC-%D0%B4%D0%B2%D1%83%D1%85%D1%8D%D1%82%D0%B0%D0%BF%D0%BD%D0%B0%D1%8F-%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B0">​</a></h3>
<p>U-Boot для RK3568 берётся из конфигурации NanoPi R5S - это та же SoC, и defconfig от FriendlyElec хорошо поддерживается в апстриме OpenWrt. Первый проход собирает U-Boot, второй - финальный образ с нашим Device Tree и конфигурацией.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ссылки">Ссылки<a class="hash-link" aria-label="Прямая ссылка на Ссылки" title="Прямая ссылка на Ссылки" href="https://napiworld.ru/recipes/napi2-openwrt-support#%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8">​</a></h2>
<ul>
<li>Готовые образы: <a href="https://github.com/lab240/napi-openwrt-build/releases" target="_blank" rel="noopener noreferrer">github.com/lab240/napi-openwrt-build/releases</a></li>
<li>Исходники сборки: <a href="https://github.com/lab240/napi-openwrt-build" target="_blank" rel="noopener noreferrer">github.com/lab240/napi-openwrt-build</a></li>
<li>Документация по платам: <a href="https://github.com/napilab/napi-boards" target="_blank" rel="noopener noreferrer">github.com/napilab/napi-boards</a></li>
</ul>]]></content:encoded>
            <category>napiworld</category>
            <category>napi2</category>
            <category>openwrt</category>
            <category>linux</category>
        </item>
        <item>
            <title><![CDATA[Утилита modbus-slave. Эмулятор Modbus RTU датчиков]]></title>
            <link>https://napiworld.ru/recipes/mbslave</link>
            <guid>https://napiworld.ru/recipes/mbslave</guid>
            <pubDate>Sat, 21 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Как эмулировать до 30 Modbus RTU устройств на одном COM порту, подавать реальные данные датчиков и запустить всё как системный сервис]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>Когда разрабатываешь систему мониторинга или SCADA, часто нужно протестировать
опрос датчиков — но реального оборудования под рукой нет. Или нужно показать
демо заказчику без физических устройств. Или хочется отладить логику мастера
не выезжая на объект.</p>
</blockquote>
<p>Именно для этого мы написали <strong>modbus_slave</strong> — эмулятор Modbus RTU slave устройств
на C, который работает на Linux и Windows, не требует зависимостей и умеет отдавать
реальные данные из файлов.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="что-умеет">Что умеет<a class="hash-link" aria-label="Прямая ссылка на Что умеет" title="Прямая ссылка на Что умеет" href="https://napiworld.ru/recipes/mbslave#%D1%87%D1%82%D0%BE-%D1%83%D0%BC%D0%B5%D0%B5%D1%82">​</a></h2>
<ul>
<li>Эмулирует <strong>до 30 независимых Modbus RTU устройств</strong> на одном последовательном порту</li>
<li>Каждое устройство отвечает на <strong>FC03</strong> (Read Holding Registers), <strong>20 регистров</strong></li>
<li>Значения регистров — <strong>случайные</strong> (для тестирования) или из <strong>файла</strong> (реальные данные)</li>
<li>Работает на <strong>Linux x86_64</strong>, <strong>aarch64</strong> (NAPI2, RK3568, Raspberry Pi) и <strong>Windows x64</strong></li>
<li>Поддерживает <strong>RS-485</strong> — RTS direction control через DTS/GPIO</li>
<li>Режим <strong>демона</strong> с логами в syslog и <strong>systemd service</strong> для автозапуска</li>
<li><strong>Защита от устаревших данных</strong> — если скрипт-источник упал, регистры возвращают нули</li>
<li>Один <strong>статический бинарь</strong> без зависимостей — скопировал и запустил</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="архитектура">Архитектура<a class="hash-link" aria-label="Прямая ссылка на Архитектура" title="Прямая ссылка на Архитектура" href="https://napiworld.ru/recipes/mbslave#%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0">​</a></h2>
<p>Идея простая: один процесс слушает RS-485 шину и отвечает на запросы от любого
из 30 адресов. Для мастера это выглядит как несколько физических устройств на линии —
он не видит разницы.</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Мастер (PC/ПЛК)          RS-485 шина          modbus_slave (NAPI2)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  mbpoll -a 1    ──────────────────────────►   slave ID 1 → /tmp/cpu.dat</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  mbpoll -a 2    ──────────────────────────►   slave ID 2 → /tmp/time.dat</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  mbpoll -a 3    ──────────────────────────►   slave ID 3 → random</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Регистры читаются из обычных текстовых файлов — одно число на строку.
Файлы живут в <code>/tmp</code> (tmpfs — RAM диск), SD карта не изнашивается.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="быстрый-старт">Быстрый старт<a class="hash-link" aria-label="Прямая ссылка на Быстрый старт" title="Прямая ссылка на Быстрый старт" href="https://napiworld.ru/recipes/mbslave#%D0%B1%D1%8B%D1%81%D1%82%D1%80%D1%8B%D0%B9-%D1%81%D1%82%D0%B0%D1%80%D1%82">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="установка-на-napi2--aarch64">Установка на NAPI2 / aarch64<a class="hash-link" aria-label="Прямая ссылка на Установка на NAPI2 / aarch64" title="Прямая ссылка на Уста�новка на NAPI2 / aarch64" href="https://napiworld.ru/recipes/mbslave#%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-%D0%BD%D0%B0-napi2--aarch64">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Скачать статический бинарь</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">wget https://github.com/lab240/modpoll-slave/raw/main/bin/modbus_slave_aarch64</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">chmod +x modbus_slave_aarch64</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Запустить — 3 датчика, порт ttyS7</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./modbus_slave_aarch64 -p /dev/ttyS7 -b 115200 -a 3</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="запуск-на-windows">Запуск на Windows<a class="hash-link" aria-label="Прямая ссылка на Запуск на Windows" title="Прямая ссылка на Запуск на Windows" href="https://napiworld.ru/recipes/mbslave#%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA-%D0%BD%D0%B0-windows">​</a></h3>
<div class="language-cmd codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cmd codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">modbus_slave.exe -p COM4 -b 115200 -a 3</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="проверка-с-mbpoll">Проверка с mbpoll<a class="hash-link" aria-label="Прямая ссылка на Проверка с mbpoll" title="Прямая ссылка на Проверка с mbpoll" href="https://napiworld.ru/recipes/mbslave#%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0-%D1%81-mbpoll">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">mbpoll -m rtu -b 115200 -P none -a 1 -r 1 -c 20 /dev/ttyUSB0</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="реальные-данные-из-файлов">Реальные данные из файлов<a class="hash-link" aria-label="Прямая ссылка на Реальные данные из файлов" title="Прямая ссылка на Реальные данные из файлов" href="https://napiworld.ru/recipes/mbslave#%D1%80%D0%B5%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5-%D0%B8%D0%B7-%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2">​</a></h2>
<p>Самое интересное — каждому slave можно привязать файл с реальными значениями.
Формат простой: одно целое число на строку.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Запуск: slave 1 читает данные CPU, slave 2 — время, slave 3 — рандом</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./modbus_slave -p /dev/ttyS7 -b 115200 -a 3 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    -f 1:/tmp/cpu.dat \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    -f 2:/tmp/time.dat</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Файл обновляется внешним скриптом атомарно через <code>mv</code> — никакой гонки данных:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Температура ядер CPU (°C × 100)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">while true; do</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    for zone in /sys/class/thermal/thermal_zone*/temp; do</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        val=$(( $(cat $zone) / 10 ))</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        echo $val</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    done &gt; /tmp/cpu.tmp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    mv /tmp/cpu.tmp /tmp/cpu.dat</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    sleep 5</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">done</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Значение <code>4523</code> в регистре означает 45.23 °C — стандартное соглашение
для передачи дробных чисел в Modbus.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="защита-от-падения-скриптов">Защита от падения скриптов<a class="hash-link" aria-label="Прямая ссылка на Защита от падения скриптов" title="Прямая ссылка на Защита от падения скриптов" href="https://napiworld.ru/recipes/mbslave#%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B0-%D0%BE%D1%82-%D0%BF%D0%B0%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F-%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2">​</a></h2>
<p>Если скрипт обновления данных упал — файл перестаёт обновляться,
но данные в нём остаются старые. Мастер продолжал бы читать устаревшие значения.</p>
<p>Параметр <code>-t</code> задаёт максимальный возраст файла:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">./modbus_slave -p /dev/ttyS7 -b 115200 -f 1:/tmp/cpu.dat -t 10</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Если файл не обновлялся более 10 секунд — все регистры возвращают <strong>0</strong>.
Это сразу видно мастеру и SCADA системе. В лог пишется предупреждение
(не чаще раза в минуту чтобы не спамить):</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">file /tmp/cpu.dat is stale (45s &gt; 10s), returning zeros</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>По умолчанию <code>t=10</code>. Отключить: <code>-t 0</code>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="режим-демона-и-systemd">Режим демона и systemd<a class="hash-link" aria-label="Прямая ссылка на Режим демона и systemd" title="Прямая ссылка на Режим демона и systemd" href="https://napiworld.ru/recipes/mbslave#%D1%80%D0%B5%D0%B6%D0%B8%D0%BC-%D0%B4%D0%B5%D0%BC%D0%BE%D0%BD%D0%B0-%D0%B8-systemd">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Запуск как демон</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./modbus_slave -d -p /dev/ttyS7 -b 115200 -a 3 -f 1:/tmp/cpu.dat</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Статус</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./modbus_slave -s</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Остановка</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./modbus_slave -k</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Логи</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">journalctl -t modbus_slave -f</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Для автозапуска при загрузке — systemd service:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo cp modbus_slave /usr/local/bin/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sudo cp service/modbus_slave.service /etc/systemd/system/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sudo systemctl daemon-reload</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sudo systemctl enable --now modbus_slave</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Статистика запросов пишется в лог каждые 60 секунд:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">stats: slaves=3 total_ok=12480 total_err=0</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="windows">Windows<a class="hash-link" aria-label="Прямая ссылка н�а Windows" title="Прямая ссылка на Windows" href="https://napiworld.ru/recipes/mbslave#windows">​</a></h2>
<p>На Windows всё то же самое, только порт называется <code>COM4</code> вместо <code>/dev/ttyS7</code>,
файлы в <code>C:\temp\</code> вместо <code>/tmp/</code>, и <code>-bg</code> вместо <code>-d</code>:</p>
<div class="language-cmd codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cmd codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">modbus_slave.exe -bg -p COM4 -b 115200 -a 3 ^</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    -f 1:C:\temp\cpu.dat ^</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    -f 2:C:\temp\time.dat</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Логи пишутся в <code>C:\temp\modbus_slave.log</code>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="сборка-из-исходников">Сборка из исходников<a class="hash-link" aria-label="Прямая ссылка на Сборка из исходников" title="Прямая ссыл�ка на Сборка из исходников" href="https://napiworld.ru/recipes/mbslave#%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B0-%D0%B8%D0%B7-%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2">​</a></h2>
<p>Код разделён на три файла:</p>
<table><thead><tr><th>Файл</th><th>Содержимое</th></tr></thead><tbody><tr><td><code>modbus_core.h</code></td><td>Вся логика Modbus: CRC16, FC03, файлы, статистика</td></tr><tr><td><code>modbus_slave.c</code></td><td>Linux: termios, fork, syslog, /proc</td></tr><tr><td><code>modbus_slave_win.c</code></td><td>Windows: Win32 API, CreateFile, DCB</td></tr></tbody></table>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Linux x86_64</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">gcc -O2 -Wall -o modbus_slave src/modbus_slave.c</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Linux aarch64 статический</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">aarch64-linux-gnu-gcc -O2 -Wall -static -o modbus_slave_aarch64 src/modbus_slave.c</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Windows .exe с Linux</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">x86_64-w64-mingw32-gcc -O2 -Wall -o modbus_slave.exe src/modbus_slave_win.c</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="итог">Итог<a class="hash-link" aria-label="Прямая ссылка на Итог" title="Прямая ссылка на Итог" href="https://napiworld.ru/recipes/mbslave#%D0%B8%D1%82%D0%BE%D0%B3">​</a></h2>
<p><code>modbus_slave</code> решает конкретную задачу — дать возможность разрабатывать
и тестировать Modbus мастер без реального железа, или превратить одноплатный
компьютер в многоканальный шлюз данных в Modbus.</p>
<p>Код открытый, собирается одной командой, работает на том же NAPI2 где и
всё остальное.</p>
<p><strong>Репозиторий:</strong> <a href="https://github.com/lab240/modpoll-slave" target="_blank" rel="noopener noreferrer">github.com/lab240/modpoll-slave</a></p>]]></content:encoded>
            <category>modbus</category>
            <category>napi</category>
            <category>napi-c</category>
            <category>napi-p</category>
            <category>napi-slot</category>
            <category>linux</category>
            <category>mbscan</category>
        </item>
        <item>
            <title><![CDATA[Утилита mbscan  - быстрый поиск Modbus устройств на линии]]></title>
            <link>https://napiworld.ru/recipes/mbscan-tool</link>
            <guid>https://napiworld.ru/recipes/mbscan-tool</guid>
            <pubDate>Mon, 16 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[mbscan - быстрый сканер Modbus RTU шины на чистом C. 247 адресов за 2.5 секунды, без зависимостей, один файл.]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>247 адресов за 2.5 секунды, ноль зависимостей, один .c файл. Рассказываем, зачем мы написали свой сканер Modbus-шины и как он работает.</p>
</blockquote>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="проблема-а-что-вообще-висит-на-шине">Проблема: «а что вообще висит на шине?»<a class="hash-link" aria-label="Прямая ссылка на Проблема: «а что вообще висит на шине?»" title="Прямая ссылка на Проблема: «а что вообще висит на шине?»" href="https://napiworld.ru/recipes/mbscan-tool#%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0-%D0%B0-%D1%87%D1%82%D0%BE-%D0%B2%D0%BE%D0%BE%D0%B1%D1%89%D0%B5-%D0%B2%D0%B8%D1%81%D0%B8%D1%82-%D0%BD%D0%B0-%D1%88%D0%B8%D0%BD%D0%B5">​</a></h2>
<p>Кто работал с Modbus RTU, знает ситуацию: подключаешь шлюз к RS-485 шине, а там десяток устройств с неизвестными адресами. Или один датчик, но кто-то поставил ему адрес 117 вместо документированного 1. Или устройство просто не отвечает — и непонятно, проблема в адресе, скорости, чётности или в самом устройстве.</p>
<p>Стандартный подход - <code>mbpoll</code> или любой Modbus-клиент, которым вручную перебираешь адреса. Это работает, но медленно и неудобно: 247 возможных адресов, на каждый нужно отправить запрос, подождать таймаут, проверить ответ.</p>
<p>Мы решили автоматизировать это одной утилитой.</p>
<p><strong>Репозиторий:</strong> <a href="https://github.com/lab240/mbscan" target="_blank" rel="noopener noreferrer">github.com/lab240/mbscan</a></p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="что-такое-mbscan">Что такое mbscan<a class="hash-link" aria-label="Прямая ссылка на Что такое mbscan" title="Прямая ссылка на Что такое mbscan" href="https://napiworld.ru/recipes/mbscan-tool#%D1%87%D1%82%D0%BE-%D1%82%D0%B0%D0%BA%D0%BE%D0%B5-mbscan">​</a></h2>
<p><code>mbscan</code> - консольная утилита для сканирования Modbus RTU шины. Открывает последовательный порт, последовательно опрашивает диапазон адресов функцией FC03 (Read Holding Registers) и выводит найденные устройства с содержимым регистров.</p>
<p>Один файл на C, никаких внешних библиотек. Встроенная реализация CRC16, POSIX-совместимый код. Работает на Linux x86_64, aarch64, OpenWrt, Raspberry Pi — везде, где есть терминальный API POSIX.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="быстрый-старт">Быстрый старт<a class="hash-link" aria-label="Прямая ссылка на Быстрый старт" title="Прямая ссылка на Быстрый старт" href="https://napiworld.ru/recipes/mbscan-tool#%D0%B1%D1%8B%D1%81%D1%82%D1%80%D1%8B%D0%B9-%D1%81%D1%82%D0%B0%D1%80%D1%82">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Сканируем всё на /dev/ttyUSB0 (по умолчанию: 115200-8N1, таймаут 100мс)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mbscan -p /dev/ttyUSB0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Быстрый скан с таймаутом 10мс</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mbscan -p /dev/ttyUSB0 -o 10</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Конкретный диапазон, читаем 4 регистра</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mbscan -p /dev/ttyUSB0 -f 1 -t 30 -c 4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 9600 бод, чётность 8E1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mbscan -p /dev/ttyS1 -b 9600 -d 8E1</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Вывод выглядит так:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">mbscan: scanning /dev/ttyUSB0 115200-8N1, addresses 1-247, timeout 100ms</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mbscan: reading 4 register(s) starting at 0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Found slave 125: [0]=125 [1]=1 [2]=830 [3]=794</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mbscan: done. Found 1 device(s).</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Нашёл устройство на адресе 125, прочитал 4 регистра — готово.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="параметры">Параметры<a class="hash-link" aria-label="Прямая ссылка на Параметры" title="Прямая ссылка на Параметры" href="https://napiworld.ru/recipes/mbscan-tool#%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B">​</a></h2>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">mbscan -p PORT [опции]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -p PORT    Последовательный порт (обязательный)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -b BAUD    Скорость (по умолчанию: 115200)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -d PARAMS  Формат данных: 8N1, 8E1, 8O1, 7E1 и т.д. (по умолчанию: 8N1)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -f FROM    Начальный адрес (по умолчанию: 1)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -t TO      Конечный адрес (по умолчанию: 247)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -o MS      Таймаут на адрес в мс (по умолчанию: 100)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -r REG     Начальный регистр, 0-based (по умолчанию: 0)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -c COUNT   Количество регистров для чтения (по умолчанию: 1)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -v         Подробный вывод</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -h         Справка</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="как-это-работает-внутри">Как это работает внутри<a class="hash-link" aria-label="Прямая ссылка на Как это работает внутри" title="Прямая ссылка на Как это работает внутри" href="https://napiworld.ru/recipes/mbscan-tool#%D0%BA%D0%B0%D0%BA-%D1%8D%D1%82%D0%BE-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82-%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B8">​</a></h2>
<p>Алгоритм прямолинейный, но дьявол в деталях:</p>
<ol>
<li>
<p>Открывает последовательный порт, настраивает скорость, чётность, количество стоп-битов через <code>termios</code>.</p>
</li>
<li>
<p>Для каждого адреса в диапазоне:</p>
<ul>
<li>Сбрасывает буфер порта от предыдущих данных</li>
<li>Формирует 8-байтовый запрос Modbus RTU FC03 с CRC16</li>
<li>Отправляет запрос и ждёт ответ с настроенным таймаутом</li>
<li>Валидирует ответ: проверяет CRC, адрес slave, код функции</li>
<li>Если всё сходится — выводит найденное устройство с содержимым регистров</li>
</ul>
</li>
<li>
<p>Между запросами выдерживает межкадровую паузу Modbus (3.5 символьных времени) — это требование протокола, без него устройства могут путать конец одного кадра и начало другого.</p>
</li>
</ol>
<p>CRC16 реализован встроенный - нет зависимости от libmodbus или других библиотек. Весь код в одном файле <code>mbscan.c</code>.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="скорость-сканирования">Скорость сканирования<a class="hash-link" aria-label="Прямая ссылка на Скорость сканирования" title="Прямая ссылка на Скорость сканирования" href="https://napiworld.ru/recipes/mbscan-tool#%D1%81%D0%BA%D0%BE%D1%80%D0%BE%D1%81%D1%82%D1%8C-%D1%81%D0%BA%D0%B0%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F">​</a></h2>
<p>Скорость определяется таймаутом на адрес. Если устройство не отвечает — ждём полный таймаут. Если отвечает — переходим к следующему сразу после получения ответа.</p>
<table><thead><tr><th>Таймаут</th><th>Полный скан (1–247)</th><th>Когда использовать</th></tr></thead><tbody><tr><td>10 мс</td><td>~2.5 сек</td><td>Короткие кабели, лабораторный стенд</td></tr><tr><td>50 мс</td><td>~12 сек</td><td>Большинство установок</td></tr><tr><td>100 мс</td><td>~25 сек</td><td>По умолчанию, надёжно</td></tr><tr><td>200 мс</td><td>~50 сек</td><td>Длинные линии RS-485</td></tr></tbody></table>
<p>На практике 10 мс хватает для стенда с коротким кабелем. Для промышленных линий с десятками метров RS-485 лучше ставить 50-100 мс — на длинных линиях задержки растут из-за переотражений и ёмкости кабеля.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="сборка">Сборка<a class="hash-link" aria-label="Прямая ссылка на Сборка" title="Прямая ссылка на Сборка" href="https://napiworld.ru/recipes/mbscan-tool#%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B0">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="нативная-компиляция">Нативная компиляция<a class="hash-link" aria-label="Прямая ссылка на Нативная компиляция" title="Прямая ссылка на Нативная компиляция" href="https://napiworld.ru/recipes/mbscan-tool#%D0%BD%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F-%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">cd src</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">gcc -O2 -Wall -o mbscan mbscan.c</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Статическая сборка (один бинарник без зависимостей):</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">gcc -O2 -Wall -static -o mbscan mbscan.c</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="пакет-для-openwrt">Пакет для OpenWrt<a class="hash-link" aria-label="Прямая ссылка на Пакет для OpenWrt" title="Прямая ссылка на Пакет для OpenWrt" href="https://napiworld.ru/recipes/mbscan-tool#%D0%BF%D0%B0%D0%BA%D0%B5%D1%82-%D0%B4%D0%BB%D1%8F-openwrt">​</a></h3>
<p>Каталог <code>mbscan</code> кладётся в дерево пакетов OpenWrt:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">cp -r mbscan /path/to/openwrt/package/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cd /path/to/openwrt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">echo "CONFIG_PACKAGE_mbscan=y" &gt;&gt; .config</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">make package/mbscan/compile -j$(nproc)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Результат — <code>.ipk</code> (или <code>.apk</code>) пакет в <code>bin/packages/*/base/</code>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="кросс-компиляция-для-aarch64">Кросс-компиляция для aarch64<a class="hash-link" aria-label="Прямая ссылка на Кросс-компиляция для aarch64" title="Прямая ссылка на Кросс-компиляция для aarch64" href="https://napiworld.ru/recipes/mbscan-tool#%D0%BA%D1%80%D0%BE%D1%81%D1%81-%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F-%D0%B4%D0%BB%D1%8F-aarch64">​</a></h3>
<p>Если есть тулчейн OpenWrt:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">/path/to/openwrt/staging_dir/toolchain-aarch64_generic_gcc-*/bin/aarch64-openwrt-linux-gcc \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -O2 -Wall -static -o mbscan-linux-aarch64 src/mbscan.c</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Готовые бинарники для x86_64 и aarch64 доступны на странице <a href="https://github.com/lab240/mbscan/releases" target="_blank" rel="noopener noreferrer">Releases</a>.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="интеграция-с-luci-app-mbpoll">Интеграция с luci-app-mbpoll<a class="hash-link" aria-label="Прямая ссылка на Интеграция с luci-app-mbpoll" title="Прямая ссылка на Интеграция с luci-app-mbpoll" href="https://napiworld.ru/recipes/mbscan-tool#%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F-%D1%81-luci-app-mbpoll">​</a></h2>
<p><code>mbscan</code> - не просто самостоятельная утилита. Он используется как бэкенд для вкладки <strong>Scan Bus</strong> в веб-интерфейсе <a href="https://github.com/lab240/luci-app-mbpoll" target="_blank" rel="noopener noreferrer">luci-app-mbpoll</a> - нашем LuCI-приложении для опроса Modbus-устройств.</p>
<p>Схема простая: пользователь задаёт параметры порта и диапазон адресов в браузере, LuCI вызывает <code>mbscan</code> на устройстве, парсит вывод и отображает найденные устройства в таблице. Не нужно заходить по SSH, не нужно помнить синтаксис - всё через веб-интерфейс.</p>
<p><strong>Репозиторий luci-app-mbpoll:</strong> <a href="https://github.com/lab240/luci-app-mbpoll" target="_blank" rel="noopener noreferrer">github.com/lab240/luci-app-mbpoll</a></p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="где-используется">Где используется<a class="hash-link" aria-label="Прямая ссылка на Где используется" title="Прямая ссылка на Где используется" href="https://napiworld.ru/recipes/mbscan-tool#%D0%B3%D0%B4%D0%B5-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D0%B5%D1%82%D1%81%D1%8F">​</a></h2>
<p>Основная платформа - промышленные IoT-шлюзы <a href="https://napiworld.ru/" target="_blank" rel="noopener noreferrer">NapiLab Napi</a> на базе Rockchip RK3308 под управлением OpenWrt. Napi имеет встроенный RS-485 на <code>/dev/ttyS1</code> и два USB-порта для дополнительных адаптеров — типичная конфигурация для Modbus-шлюза.</p>
<p>Но <code>mbscan</code> работает на любом Linux с последовательным портом: обычный x86_64 с USB-RS485 адаптером (CH341, CP2102, FTDI), Raspberry Pi, любая embedded-плата.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="лицензия">Лицензия<a class="hash-link" aria-label="Прямая ссылка на Лицензия" title="Прямая ссылка на Лицензия" href="https://napiworld.ru/recipes/mbscan-tool#%D0%BB%D0%B8%D1%86%D0%B5%D0%BD%D0%B7%D0%B8%D1%8F">​</a></h2>
<p>GPL-2.0 - как и OpenWrt, как и остальные наши инструменты.</p>]]></content:encoded>
            <category>modbus</category>
            <category>napi</category>
            <category>napi-c</category>
            <category>napi-p</category>
            <category>napi-slot</category>
            <category>linux</category>
            <category>mbscan</category>
        </item>
        <item>
            <title><![CDATA[Сборка и запуск Zigbee2mqtt для OpenWRT]]></title>
            <link>https://napiworld.ru/recipes/z2m-openwrt</link>
            <guid>https://napiworld.ru/recipes/z2m-openwrt</guid>
            <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Сборка Zigbee2MQTT под musl/aarch64 с Docker и запуск на OpenWrt для NapiLab NAPI-C/P/Slot (RK3308).]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>Инструкция по сборке Zigbee2MQTT под musl/aarch64 на хост-машине с Docker и запуску на OpenWrt.</p>
</blockquote>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="почему-это-нетривиально">Почему это нетривиально<a class="hash-link" aria-label="Прямая ссылка на Почему это нетривиально" title="Прямая ссылка на Почему это нетривиально" href="https://napiworld.ru/recipes/z2m-openwrt#%D0%BF%D0%BE%D1%87%D0%B5%D0%BC%D1%83-%D1%8D%D1%82%D0%BE-%D0%BD%D0%B5%D1%82%D1%80%D0%B8%D0%B2%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE">​</a></h2>
<p>OpenWrt использует <strong>musl libc</strong> вместо стандартного glibc. Это означает:</p>
<ul>
<li>Официальные бинарники Node.js с nodejs.org (glibc) не запустятся</li>
<li>Пакет <code>node</code> в фидах OpenWrt — только host-инструмент для сборки (<code>PKG_HOST_ONLY=1</code>), в прошивку не попадает</li>
<li>Entware для aarch64 не содержит Node.js</li>
<li>Нативные модули (<code>@serialport/bindings-cpp</code>) нужно компилировать под musl</li>
</ul>
<p>Решение: собирать всё в Docker-контейнере на базе Alpine Linux (тоже использует musl).</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="требования">Требования<a class="hash-link" aria-label="Прямая ссылка на Требования" title="Прямая ссылка на Требования" href="https://napiworld.ru/recipes/z2m-openwrt#%D1%82%D1%80%D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="железо">Железо<a class="hash-link" aria-label="Прямая ссылка на Железо" title="Прямая ссылка на Железо" href="https://napiworld.ru/recipes/z2m-openwrt#%D0%B6%D0%B5%D0%BB%D0%B5%D0%B7%D0%BE">​</a></h3>
<p>Проверено на NAPI-C (rk3308\512Мб\4Гб Nand) c прошивкой OpenWRT (NapiWRT).
Репозиторий: <a href="https://github.com/lab240/napi-openwrt-build/" target="_blank" rel="noopener noreferrer">https://github.com/lab240/napi-openwrt-build/</a></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="программное-обеспечение-на-хост-машине">Программное обеспечение на хост-машине<a class="hash-link" aria-label="Прямая ссылка на Программное обеспечение на хост-машине" title="Прямая ссылка на Программное обеспечение на хост-машине" href="https://napiworld.ru/recipes/z2m-openwrt#%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B5-%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BD%D0%B0-%D1%85%D0%BE%D1%81%D1%82-%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%B5">​</a></h3>
<ul>
<li>Docker</li>
<li>Git</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="шаг-1-подготовка-носителя">Шаг 1: Подготовка носителя<a class="hash-link" aria-label="Прямая ссылка на Шаг 1: Подготовка носителя" title="Прямая ссылка на Шаг 1: Подготовка носителя" href="https://napiworld.ru/recipes/z2m-openwrt#%D1%88%D0%B0%D0%B3-1-%D0%BF%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B0-%D0%BD%D0%BE%D1%81%D0%B8%D1%82%D0%B5%D0%BB%D1%8F">​</a></h2>
<p>OpenWrt по умолчанию создаёт rootfs раздел ~104 МБ. Для Zigbee2MQTT нужно минимум 500 МБ свободного места.</p>
<p>В нашей сборке NapiWRT это решено автоматически через два <code>uci-defaults</code> скрипта которые при первой загрузке расширяют rootfs до конца носителя:</p>
<p><strong><code>files/etc/uci-defaults/70-rootpt-resize</code></strong> — расширяет раздел и перезагружается:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">if [ ! -e /etc/rootpt-resize ] \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&amp;&amp; type parted &gt; /dev/null \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&amp;&amp; lock -n /var/lock/root-resize</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">then</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ROOT_BLK="$(readlink -f /sys/dev/block/"$(awk -e \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">'$9=="/dev/root"{print $3}' /proc/self/mountinfo)")"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ROOT_DISK="/dev/$(basename "${ROOT_BLK%/*}")"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ROOT_PART="${ROOT_BLK##*[^0-9]}"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">echo "70-rootpt-resize: expanding ${ROOT_DISK} partition ${ROOT_PART} to 100%..."</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">parted -f -s "${ROOT_DISK}" resizepart "${ROOT_PART}" 100%</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">echo "70-rootpt-resize: done, rebooting..."</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mount_root done</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">touch /etc/rootpt-resize</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">reboot</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fi</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">exit 1</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong><code>files/etc/uci-defaults/80-rootfs-resize</code></strong> — расширяет файловую систему через losetup и перезагружается:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">if [ ! -e /etc/rootfs-resize ] \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&amp;&amp; [ -e /etc/rootpt-resize ] \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&amp;&amp; type losetup &gt; /dev/null \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&amp;&amp; type resize2fs &gt; /dev/null \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&amp;&amp; lock -n /var/lock/root-resize</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">then</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ROOT_BLK="$(readlink -f /sys/dev/block/"$(awk -e \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">'$9=="/dev/root"{print $3}' /proc/self/mountinfo)")"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ROOT_DEV="/dev/${ROOT_BLK##*/}"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">echo "80-rootfs-resize: resizing filesystem on ${ROOT_DEV}..."</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LOOP_DEV="$(losetup -f)"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">losetup "${LOOP_DEV}" "${ROOT_DEV}"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">resize2fs -f "${LOOP_DEV}"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">losetup -d "${LOOP_DEV}"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">echo "80-rootfs-resize: done, rebooting..."</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mount_root done</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">touch /etc/rootfs-resize</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">reboot</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fi</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">exit 1</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Необходимые пакеты в <code>.config</code> сборки:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">CONFIG_PACKAGE_parted=y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CONFIG_PACKAGE_losetup=y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CONFIG_PACKAGE_resize2fs=y</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="шаг-2-установка-nodejs-на-устройство">Шаг 2: Установка Node.js на устройство<a class="hash-link" aria-label="Прямая ссылка на Шаг 2: Установка Node.js на устройство" title="Прямая ссылка на Шаг 2: Установка Node.js на устройство" href="https://napiworld.ru/recipes/z2m-openwrt#%D1%88%D0%B0%D0%B3-2-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-nodejs-%D0%BD%D0%B0-%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%BE">​</a></h2>
<p>Node.js для musl/aarch64 предоставляет проект unofficial-builds от nodejs.org.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># На устройстве</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cd /tmp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">wget https://unofficial-builds.nodejs.org/download/release/v22.22.0/node-v22.22.0-linux-arm64-musl.tar.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mkdir -p /opt/node</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">tar xzf node-v22.22.0-linux-arm64-musl.tar.gz -C /opt/node --strip-components=1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">rm node-v22.22.0-linux-arm64-musl.tar.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Добавляем в PATH</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">export PATH=/opt/node/bin:$PATH</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Проверяем</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node --version   # v22.22.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">npm --version    # 10.9.4</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<blockquote>
<p>Официальный бинарник с nodejs.org (linux-arm64 без суффикса musl) не запустится — он скомпилирован под glibc.</p>
</blockquote>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="готовый-архив">Готовый архив<a class="hash-link" aria-label="Прямая ссылка на Готовый архив" title="Прямая ссылка на Готовый архив" href="https://napiworld.ru/recipes/z2m-openwrt#%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D1%8B%D0%B9-%D0%B0%D1%80%D1%85%D0%B8%D0%B2">​</a></h2>
<p>Если вы не хотите собирать самостоятельно — готовый архив Zigbee2MQTT для musl/aarch64 доступен в релизах репозитория:</p>
<p>👉 <strong><a href="https://github.com/lab240/napi-openwrt-build/releases" target="_blank" rel="noopener noreferrer">https://github.com/lab240/napi-openwrt-build/releases</a></strong></p>
<p>Скачайте файл <code>zigbee2mqtt-2.9.1-openwrt-aarch64-musl.tar.gz</code> и перейдите сразу к <a href="https://napiworld.ru/recipes/z2m-openwrt#%D1%88%D0%B0%D0%B3-4-%D0%BA%D0%BE%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BD%D0%B0-%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%BE">Шагу 4</a>.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="шаг-3-сборка-zigbee2mqtt-на-хост-машине">Шаг 3: Сборка Zigbee2MQTT на хост-машине<a class="hash-link" aria-label="Прямая ссылка на Шаг 3: Сборка Zigbee2MQTT на хост-машине" title="Прямая ссылка на Шаг 3: Сборка Zigbee2MQTT на хост-машине" href="https://napiworld.ru/recipes/z2m-openwrt#%D1%88%D0%B0%D0%B3-3-%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B0-zigbee2mqtt-%D0%BD%D0%B0-%D1%85%D0%BE%D1%81%D1%82-%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%B5">​</a></h2>
<p>Zigbee2MQTT содержит нативные модули (<code>@serialport/bindings-cpp</code>) которые нужно компилировать под целевую платформу. Делаем это в Docker с Alpine (musl) под arm64.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="на-хост-машине">На хост-машине<a class="hash-link" aria-label="Прямая ссылка на На хост-машине" title="Прямая ссылка на На хост-машине" href="https://napiworld.ru/recipes/z2m-openwrt#%D0%BD%D0%B0-%D1%85%D0%BE%D1%81%D1%82-%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%B5">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Клонируем репозиторий</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">git clone --depth 1 https://github.com/Koenkk/zigbee2mqtt.git ~/zigbee2mqtt-arm</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Собираем в Docker под Alpine/arm64/musl</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">docker run --rm -v ~/zigbee2mqtt-arm:/app \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --platform linux/arm64 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  node:22-alpine \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  sh -c "apk add python3 make g++ linux-headers &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">         cd /app &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">         npm install &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">         npm rebuild @serialport/bindings-cpp --build-from-source &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">         npm run build &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">         tar czf /app/z2m.tar.gz --dereference -C /app ."</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Ключевые флаги:</p>
<ul>
<li><code>--platform linux/arm64</code> — целевая архитектура aarch64</li>
<li><code>node:22-alpine</code> — Alpine использует musl как OpenWrt, Node.js 22 соответствует требованиям Z2M</li>
<li><code>linux-headers</code> — нужны для компиляции <code>@serialport/bindings-cpp</code></li>
<li><code>--build-from-source</code> — компилируем нативные модули вместо использования prebuilt glibc бинарников</li>
<li><code>--dereference</code> — разворачиваем симлинки в tar (иначе они сломаются при распаковке)</li>
</ul>
<p>Время сборки: 3–5 минут.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="шаг-4-копирование-на-устройство">Шаг 4: Копирование на устройство<a class="hash-link" aria-label="Прямая ссылка на Шаг 4: Копирование на устройство" title="Прямая ссылка на Шаг 4: Копирование на устройство" href="https://napiworld.ru/recipes/z2m-openwrt#%D1%88%D0%B0%D0%B3-4-%D0%BA%D0%BE%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BD%D0%B0-%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%BE">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># С устройства (через scp)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">scp dmn@&lt;IP_ХОСТА&gt;:~/zigbee2mqtt-arm/z2m.tar.gz /opt/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Распаковываем</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">rm -rf /opt/zigbee2mqtt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mkdir /opt/zigbee2mqtt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">tar xzf /opt/z2m.tar.gz -C /opt/zigbee2mqtt/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">rm /opt/z2m.tar.gz</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="шаг-5-зависимости-на-устройстве">Шаг 5: Зависимости на устройстве<a class="hash-link" aria-label="Прямая ссылка на Шаг 5: Зависимости на устройстве" title="Прямая ссылка на Шаг 5: Зависимости на устройстве" href="https://napiworld.ru/recipes/z2m-openwrt#%D1%88%D0%B0%D0%B3-5-%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8-%D0%BD%D0%B0-%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B5">​</a></h2>
<p>Для работы нативных модулей нужна <code>libstdc++</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">apk update</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">apk add libstdcpp6</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="шаг-6-запуск">Шаг 6: Запуск<a class="hash-link" aria-label="Прямая ссылка на Шаг 6: Запуск" title="Прямая ссылка на Шаг 6: Запуск" href="https://napiworld.ru/recipes/z2m-openwrt#%D1%88%D0%B0%D0%B3-6-%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">export PATH=/opt/node/bin:$PATH</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cd /opt/zigbee2mqtt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">npm start</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>При успешном запуске:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Starting Zigbee2MQTT without watchdog.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Onboarding page is available at http://0.0.0.0:8080/</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Откройте браузер: <code>http://&lt;IP_устройства&gt;:8080/</code> — онбординг страница для настройки координатора и MQTT.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="конфигурация">Конфигурация<a class="hash-link" aria-label="Прямая ссылка на Конфигурация" title="Прямая ссылка на Конфигурация" href="https://napiworld.ru/recipes/z2m-openwrt#%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D1%8F">​</a></h2>
<p>После онбординга конфиг сохраняется в <code>/opt/zigbee2mqtt/data/configuration.yaml</code>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">mqtt</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">server</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> mqtt</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//localhost   </span><span class="token comment" style="color:#999988;font-style:italic"># Mosquitto уже установлен в базовой сборке Napi</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">serial</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /dev/ttyUSB0        </span><span class="token comment" style="color:#999988;font-style:italic"># Порт Zigbee-координатора</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">adapter</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ember             </span><span class="token comment" style="color:#999988;font-style:italic"># или znp — зависит от координатора</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="автозапуск-через-procd">Автозапуск через procd<a class="hash-link" aria-label="Прямая ссылка на Автозапуск через procd" title="Прямая ссылка на Автозапуск через procd" href="https://napiworld.ru/recipes/z2m-openwrt#%D0%B0%D0%B2%D1%82%D0%BE%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA-%D1%87%D0%B5%D1%80%D0%B5%D0%B7-procd">​</a></h2>
<p>Создаём init-скрипт <code>/etc/init.d/zigbee2mqtt</code>:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">#!/bin/sh /etc/rc.common</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">START=99</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">STOP=10</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">USE_PROCD=1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">start_service() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    procd_open_instance</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    procd_set_param env PATH=/opt/node/bin:/usr/sbin:/usr/bin:/sbin:/bin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    procd_set_param command /opt/node/bin/node /opt/zigbee2mqtt/index.js</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    procd_set_param dir /opt/zigbee2mqtt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    procd_set_param stdout 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    procd_set_param stderr 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    procd_set_param respawn</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    procd_close_instance</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">chmod +x /etc/init.d/zigbee2mqtt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/etc/init.d/zigbee2mqtt enable</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/etc/init.d/zigbee2mqtt start</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="итог-что-получили">Итог: что получили<a class="hash-link" aria-label="Прямая ссылка на Итог: что получили" title="Прямая ссылка на Итог: что получили" href="https://napiworld.ru/recipes/z2m-openwrt#%D0%B8%D1%82%D0%BE%D0%B3-%D1%87%D1%82%D0%BE-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D0%BB%D0%B8">​</a></h2>
<table><thead><tr><th>Компонент</th><th>Версия</th><th>Источник</th></tr></thead><tbody><tr><td>Node.js</td><td>22.22.0</td><td>unofficial-builds.nodejs.org (musl/arm64)</td></tr><tr><td>npm</td><td>10.9.4</td><td>в составе Node.js</td></tr><tr><td>Zigbee2MQTT</td><td>2.9.x</td><td>собран в Docker/Alpine/arm64</td></tr><tr><td>libstdc++</td><td>из репозитория OpenWrt</td><td>apk</td></tr><tr><td>Mosquitto</td><td>из образа</td><td>встроен в сборку Napi</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="известные-ограничения">Известные ограничения<a class="hash-link" aria-label="Прямая ссылка на Известные ограничения" title="Прямая ссылка на Известные ограничения" href="https://napiworld.ru/recipes/z2m-openwrt#%D0%B8%D0%B7%D0%B2%D0%B5%D1%81%D1%82%D0%BD%D1%8B%D0%B5-%D0%BE%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D1%8F">​</a></h2>
<ul>
<li>Node.js не входит в стандартный образ — устанавливается вручную в <code>/opt</code></li>
<li>При обновлении прошивки <code>/opt</code> сохраняется (на отдельном разделе или eMMC)</li>
<li><code>udevadm</code> недоступен — автообнаружение адаптера не работает, порт указывается вручную в конфиге</li>
</ul>]]></content:encoded>
            <category>openwrt</category>
            <category>napi</category>
            <category>napi-c</category>
            <category>napi-p</category>
            <category>napi-slot</category>
            <category>linux</category>
            <category>embedded</category>
        </item>
        <item>
            <title><![CDATA[OpenWrt для Napi - архитектура и сборка]]></title>
            <link>https://napiworld.ru/recipes/openwrt-napi-architecture</link>
            <guid>https://napiworld.ru/recipes/openwrt-napi-architecture</guid>
            <pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Полный технический разбор сборки OpenWrt для NapiLab NAPI-C/P/Slot (RK3308): патчи U-Boot, DTS, uci-defaults, первый запуск.]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>Статья для тех, кто хочет собрать OpenWrt под платы NapiLab Napi самостоятельно и понимать, что именно происходит на каждом шаге — от патча U-Boot до первого входа по SSH.</p>
</blockquote>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="зачем-вообще-собирать-openwrt-для-napi">Зачем вообще собирать OpenWrt для Napi?<a class="hash-link" aria-label="Прямая ссылка на Зачем вообще собирать OpenWrt для Napi?" title="Прямая ссылка на Зачем вообще собирать OpenWrt для Napi?" href="https://napiworld.ru/recipes/openwrt-napi-architecture#%D0%B7%D0%B0%D1%87%D0%B5%D0%BC-%D0%B2%D0%BE%D0%BE%D0%B1%D1%89%D0%B5-%D1%81%D0%BE%D0%B1%D0%B8%D1%80%D0%B0%D1%82%D1%8C-openwrt-%D0%B4%D0%BB%D1%8F-napi">​</a></h2>
<p>NapiLab Napi — промышленный одноплатный компьютер (SBC) и системный модуль (SOM) на базе Rockchip RK3308. Платформа ориентирована на промышленный IoT: сбор данных с датчиков, шлюзы Modbus TCP/RTU, MQTT-брокеры, удалённый мониторинг.</p>
<p>Ванильный OpenWrt доступен для "родственной" платы RockPi-S, но  не знает особенностей Napi: нет device tree дополнительных портов, нет правильной конфигурации U-Boot, нет пакетов для промышленного применения. <a href="https://github.com/lab240/napi-openwrt-build" target="_blank" rel="noopener noreferrer">Наш репозиторий</a> — это набор патчей, DTS, uci-defaults и пакетов, которые превращают чистый снапшот OpenWrt в готовый промышленный одноплатник.</p>
<p>Если хотите сразу попробовать без сборки — готовые образы доступны на <a href="https://napiworld.ru/downloads/images#napi-pcslot---openwrt" target="_blank" rel="noopener noreferrer">странице загрузок napiworld.ru</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="что-даёт-кастомная-сборка">Что даёт кастомная сборка<a class="hash-link" aria-label="Прямая ссылка на Что даёт кастомная сборка" title="Прямая ссылка на Что даёт кастомная сборка" href="https://napiworld.ru/recipes/openwrt-napi-architecture#%D1%87%D1%82%D0%BE-%D0%B4%D0%B0%D1%91%D1%82-%D0%BA%D0%B0%D1%81%D1%82%D0%BE%D0%BC%D0%BD%D0%B0%D1%8F-%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B0">​</a></h3>
<ul>
<li><strong>Стабильный MAC-адрес</strong> — генерируется из OTP-данных чипа, не меняется после перезагрузки</li>
<li><strong>Правильный Device Tree</strong> — UART1 и UART2 в нужных режимах, Bluetooth отключён</li>
<li><strong>Готовый стек Modbus TCP</strong> — <code>mbusd</code> + веб-интерфейс <code>luci-app-mbusd</code> из коробки</li>
<li><strong>MQTT-брокер</strong> — <code>mosquitto</code> уже установлен и настроен</li>
<li><strong>Поддержка LTE-модемов</strong> — Quectel EP06 работает без дополнительных танцев</li>
<li><strong>Первый старт без консоли</strong> — все настройки применяются через <code>uci-defaults</code> автоматически</li>
</ul>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="поддерживаемое-железо">Поддерживаемое железо<a class="hash-link" aria-label="Прямая ссылка на Поддерживаемое железо" title="Прямая ссылка на Поддерживаемое железо" href="https://napiworld.ru/recipes/openwrt-napi-architecture#%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%B2%D0%B0%D0%B5%D0%BC%D0%BE%D0%B5-%D0%B6%D0%B5%D0%BB%D0%B5%D0%B7%D0%BE">​</a></h2>
<p>Все платы используют один и тот же SoC — Rockchip RK3308, поэтому собирается одна прошивка для всей линейки:</p>
<table><thead><tr><th>Плата</th><th>Хранилище</th><th>Тип</th></tr></thead><tbody><tr><td>NapiLab Napi-C</td><td>4 ГБ NAND — 32 ГБ eMMC</td><td>Промышленный SBC</td></tr><tr><td>NapiLab Napi-P</td><td>4 ГБ NAND — 32 ГБ eMMC</td><td>Промышленный SBC</td></tr><tr><td>NapiLab Napi-Slot</td><td>4 ГБ NAND — 32 ГБ eMMC</td><td>SOM</td></tr><tr><td>Radxa ROCK Pi S</td><td>—</td><td>Референсная плата, тот же RK3308</td></tr></tbody></table>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="характеристики-rk3308">Характеристики RK3308<a class="hash-link" aria-label="Прямая ссылка на Характеристики RK3308" title="Прямая ссылка на Характеристики RK3308" href="https://napiworld.ru/recipes/openwrt-napi-architecture#%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B8-rk3308">​</a></h3>
<table><thead><tr><th>Компонент</th><th>Детали</th></tr></thead><tbody><tr><td>CPU</td><td>Quad-core ARM Cortex-A35, 1.3 ГГц</td></tr><tr><td>RAM</td><td>256 МБ / 512 МБ DDR3</td></tr><tr><td>Ethernet</td><td>100 Мбит/с (GMAC + PHY RTL8201F)</td></tr><tr><td>USB</td><td>2× USB 2.0 Host</td></tr><tr><td>UART</td><td>3× UART (ttyS0 — консоль, ttyS1, ttyS2)</td></tr><tr><td>Wi-Fi</td><td>RTL8723DS (802.11b/g/n)</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="структура-репозитория-что-куда-кладётся">Структура репозитория: что куда кладётся<a class="hash-link" aria-label="Прямая ссылка на Структура репозитория: что куда кладётся" title="Прямая ссылка на Структура репозитория: что куда кладётся" href="https://napiworld.ru/recipes/openwrt-napi-architecture#%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F-%D1%87%D1%82%D0%BE-%D0%BA%D1%83%D0%B4%D0%B0-%D0%BA%D0%BB%D0%B0%D0%B4%D1%91%D1%82%D1%81%D1%8F">​</a></h2>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">./</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── files/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   └── etc/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│       └── uci-defaults/            # Скрипты первого старта</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│           ├── 91-bash</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│           ├── 92-timezone</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│           ├── 93-console-password</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│           ├── 94-macaddr</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│           ├── 95-network</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│           ├── 96-hostname</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│           ├── 97-luci-theme</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│           └── 99-dhcp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── package/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   ├── boot/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   │   └── uboot-rockchip/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   │       ├── Makefile</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   │       └── patches/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   │           └── 108-board-rockchip-add-napilab-napic.patch  # Патч U-Boot</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   └── luci-app-mbusd/              # Веб-интерфейс для mbusd</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│       ├── Makefile</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│       ├── htdocs/luci-static/resources/view/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│       │   └── mbusd.js</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│       └── root/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│           ├── etc/uci-defaults/luci-app-mbusd</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│           └── usr/share/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│               ├── luci/menu.d/luci-app-mbusd.json</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│               └── rpcd/acl.d/luci-app-mbusd.json</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">└── target/linux/rockchip/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ├── files/arch/arm64/boot/dts/rockchip/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    │   └── rk3308-napi-c.dts        # Кастомный Device Tree</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    └── image/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        └── armv8.mk                 # Описание целевого образа</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Разберём каждую часть подробно.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="u-boot-поч�ему-нужен-патч-и-что-он-делает">U-Boot: почему нужен патч и что он делает<a class="hash-link" aria-label="Прямая ссылка на U-Boot: почему нужен патч и что он делает" title="Прямая ссылка на U-Boot: почему нужен патч и что он делает" href="https://napiworld.ru/recipes/openwrt-napi-architecture#u-boot-%D0%BF%D0%BE%D1%87%D0%B5%D0%BC%D1%83-%D0%BD%D1%83%D0%B6%D0%B5%D0%BD-%D0%BF%D0%B0%D1%82%D1%87-%D0%B8-%D1%87%D1%82%D0%BE-%D0%BE%D0%BD-%D0%B4%D0%B5%D0%BB%D0%B0%D0%B5%D1%82">​</a></h2>
<p>OpenWrt собирает U-Boot из исходников вместе с прошивкой. Для RK3308 есть готовая конфигурация для Radxa ROCK Pi S — мы взяли её за основу, так как схемотехника близка к Napi.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="патч-0001-napic-rk3308-defconfigpatch">Патч <code>0001-napic-rk3308-defconfig.patch</code><a class="hash-link" aria-label="Прямая ссылка на патч-0001-napic-rk3308-defconfigpatch" title="Прямая ссылка на патч-0001-napic-rk3308-defconfigpatch" href="https://napiworld.ru/recipes/openwrt-napi-architecture#%D0%BF%D0%B0%D1%82%D1%87-0001-napic-rk3308-defconfigpatch">​</a></h3>
<p>Патч добавляет новый вариант <code>napic-rk3308</code> в систему сборки U-Boot:</p>
<div class="language-patch codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-patch codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">+++ b/configs/napic-rk3308_defconfig</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">@@ -0,0 +1,42 @@</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">+CONFIG_ARM=y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">+CONFIG_ARCH_ROCKCHIP=y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">+CONFIG_SYS_TEXT_BASE=0x00600000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">+CONFIG_ROCKCHIP_RK3308=y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">+CONFIG_TARGET_EVB_RK3308=y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">+CONFIG_DEFAULT_DEVICE_TREE="rk3308-napi-c"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">+CONFIG_DISTRO_DEFAULTS=y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">+CONFIG_SYS_MALLOC_F_LEN=0x4000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">+CONFIG_BAUDRATE=1500000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">+CONFIG_BOOTDELAY=0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">...</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Ключевые настройки:</p>
<ul>
<li><code>CONFIG_DEFAULT_DEVICE_TREE="rk3308-napi-c"</code> — указываем U-Boot использовать наш DTS</li>
<li><code>CONFIG_BAUDRATE=1500000</code> — нестандартная скорость консоли (1.5 Мбод), типичная для Rockchip</li>
<li><code>CONFIG_BOOTDELAY=0</code> — не ждём прерывания при старте (промышленное применение)</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="как-собрать-только-u-boot">Как собрать только U-Boot<a class="hash-link" aria-label="Прямая ссылка на Как собрать только U-Boot" title="Прямая ссылка на Как собрать только U-Boot" href="https://napiworld.ru/recipes/openwrt-napi-architecture#%D0%BA%D0%B0%D0%BA-%D1%81%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D1%8C-%D1%82%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE-u-boot">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">make package/boot/uboot-rockchip/compile VARIANT=napic-rk3308 -j$(nproc)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Флаг <code>VARIANT=napic-rk3308</code> говорит системе сборки использовать именно наш <code>defconfig</code>.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="device-tree-dts-описываем-железо-ядру">Device Tree (DTS): описываем железо ядру<a class="hash-link" aria-label="Прямая ссылка на Device Tree (DTS): описываем железо ядру" title="Прямая ссылка на Device Tree (DTS): описываем железо ядру" href="https://napiworld.ru/recipes/openwrt-napi-architecture#device-tree-dts-%D0%BE%D0%BF%D0%B8%D1%81%D1%8B%D0%B2%D0%B0%D0%B5%D0%BC-%D0%B6%D0%B5%D0%BB%D0%B5%D0%B7%D0%BE-%D1%8F%D0%B4%D1%80%D1%83">​</a></h2>
<p>Device Tree — это описание аппаратной конфигурации платы в текстовом формате. Ядро Linux не знает про периферию «само по себе», ему нужно явно сказать: «вот тут UART, вот тут Ethernet, вот GPIO».</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="файл-rk3308-napi-cdts">Файл <code>rk3308-napi-c.dts</code><a class="hash-link" aria-label="Прямая ссылка на файл-rk3308-napi-cdts" title="Прямая ссылка на файл-rk3308-napi-cdts" href="https://napiworld.ru/recipes/openwrt-napi-architecture#%D1%84%D0%B0%D0%B9%D0%BB-rk3308-napi-cdts">​</a></h3>
<p>Берём за основу <code>rk3308-rock-pi-s.dts</code> (Radxa ROCK Pi S — ближайший аналог по схемотехнике) и переопределяем то, что отличается у Napi.</p>
<div class="language-dts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-dts codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">/dts-v1/;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">#include "rk3308.dtsi"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">#include "rk3308-rock-pi-s.dtsi"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/ {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    model = "NapiLab Napi-C";</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    compatible = "napilab,napi-c", "rockchip,rk3308";</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">};</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/* UART1 → RS-485 через mbusd */</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&amp;uart1 {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    status = "okay";</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    pinctrl-names = "default";</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    pinctrl-0 = &lt;&amp;uart1_xfer&gt;;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">};</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/* UART2 — доступен как /dev/ttyS2 */</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&amp;uart2 {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    status = "okay";</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">};</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/* Bluetooth отключаем — не нужен в промышленном применении */</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&amp;bluetooth {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    status = "disabled";</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">};</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Что важно в этом DTS:</p>
<p><strong><code>uart1</code></strong> — маппится на <code>/dev/ttyS1</code>. Это главный последовательный порт, к которому подключаются RS-485 устройства Modbus. <code>mbusd</code> будет слушать именно его.</p>
<p><strong><code>uart2</code></strong> — маппится на <code>/dev/ttyS2</code>, доступен для дополнительных устройств.</p>
<p><strong><code>bluetooth disabled</code></strong> — RTL8723DS предоставляет и Wi-Fi, и Bluetooth через один чип. Bluetooth нам не нужен и только занимает UART, поэтому отключаем на уровне DTS — никаких лишних сервисов, никаких потерь производительности.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="где-лежит-dts-в-дереве-openwrt">Где лежит DTS в дереве OpenWrt<a class="hash-link" aria-label="Прямая ссылка на Где лежит DTS в дереве OpenWrt" title="Прямая ссылка на Где лежит DTS в дереве OpenWrt" href="https://napiworld.ru/recipes/openwrt-napi-architecture#%D0%B3%D0%B4%D0%B5-%D0%BB%D0%B5%D0%B6%D0%B8%D1%82-dts-%D0%B2-%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5-openwrt">​</a></h3>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3308-napi-c.dts</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>OpenWrt копирует файлы из <code>target/linux/&lt;arch&gt;/files/</code> поверх исходников ядра перед компиляцией. Это стандартный механизм добавления новых DTS без форка ядра.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="uci-defaults-автоматическая-�настройка-при-первом-старте">uci-defaults: автоматическая настройка при первом старте<a class="hash-link" aria-label="Прямая ссылка на uci-defaults: автоматическая настройка при первом старте" title="Прямая ссылка на uci-defaults: автоматическая настройка при первом старте" href="https://napiworld.ru/recipes/openwrt-napi-architecture#uci-defaults-%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%BF%D1%80%D0%B8-%D0%BF%D0%B5%D1%80%D0%B2%D0%BE%D0%BC-%D1%81%D1%82%D0%B0%D1%80%D1%82%D0%B5">​</a></h2>
<p><code>uci-defaults</code> — это скрипты, которые OpenWrt запускает <strong>один раз</strong> при первой загрузке и затем удаляет. Они позволяют настроить систему до того, как пользователь зашёл в веб-интерфейс или по SSH.</p>
<p>Скрипты лежат в:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">target/linux/rockchip/armv8/base-files/etc/uci-defaults/</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Нумерация определяет порядок выполнения. Разберём каждый:</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="91-bash--bash-как-оболочка-по-умолчанию"><code>91-bash</code> — bash как оболочка по умолчанию<a class="hash-link" aria-label="Прямая ссылка на 91-bash--bash-как-оболочка-по-умолчанию" title="Прямая ссылка на 91-bash--bash-как-оболочка-по-умолчанию" href="https://napiworld.ru/recipes/openwrt-napi-architecture#91-bash--bash-%D0%BA%D0%B0%D0%BA-%D0%BE%D0%B1%D0%BE%D0%BB%D0%BE%D1%87%D0%BA%D0%B0-%D0%BF%D0%BE-%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E">​</a></h3>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">#!/bin/sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Меняем /bin/ash на /bin/bash для root</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sed -i 's|/bin/ash|/bin/bash|' /etc/passwd</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>По умолчанию OpenWrt использует <code>ash</code> (BusyBox). Для работы с промышленными скриптами, которые рассчитаны на bash-синтаксис (массивы, <code>[[</code>, <code>$RANDOM</code>, process substitution), нужен настоящий bash. Скрипт делает одно изменение в <code>/etc/passwd</code>.</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="92-timezone--московское-время"><code>92-timezone</code> — московское время<a class="hash-link" aria-label="Прямая ссылка на 92-timezone--московское-время" title="Прямая ссылка на 92-timezone--московское-время" href="https://napiworld.ru/recipes/openwrt-napi-architecture#92-timezone--%D0%BC%D0%BE%D1%81%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B5-%D0%B2%D1%80%D0%B5%D0%BC%D1%8F">​</a></h3>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">#!/bin/sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set system.@system[0].timezone='MSK-3'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set system.@system[0].zonename='Europe/Moscow'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci commit system</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Промышленные устройства работают в конкретном часовом поясе. Временна́я метка в логах и данных должна быть правильной сразу, без ручной настройки. MSK-3 — это UTC+3 (Москва).</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="93-console-password--пароль-на-серийную-консоль"><code>93-console-password</code> — пароль на серийную консоль<a class="hash-link" aria-label="Прямая ссылка на 93-console-password--пароль-на-серийную-консоль" title="Прямая ссылка на 93-console-password--пароль-на-серийную-консоль" href="https://napiworld.ru/recipes/openwrt-napi-architecture#93-console-password--%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8C-%D0%BD%D0%B0-%D1%81%D0%B5%D1%80%D0%B8%D0%B9%D0%BD%D1%83%D1%8E-%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C">​</a></h3>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">#!/bin/sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Включаем запрос пароля на ttyS0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set system.@system[0].ttylogin='1'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci commit system</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>По умолчанию OpenWrt пускает на консоль без пароля — удобно при разработке, неприемлемо в продакшне. Скрипт включает запрос пароля на <code>ttyS0</code> (консоль 1.5 Мбод).</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="94-macaddr--стабильный-mac-из-otp"><code>94-macaddr</code> — стабильный MAC из OTP<a class="hash-link" aria-label="Прямая ссылка на 94-macaddr--стабильный-mac-из-otp" title="Прямая ссылка на 94-macaddr--стабильный-mac-из-otp" href="https://napiworld.ru/recipes/openwrt-napi-architecture#94-macaddr--%D1%81%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9-mac-%D0%B8%D0%B7-otp">​</a></h3>
<p>Это самый важный скрипт. Проблема: у RK3308 нет встроенного уникального MAC-адреса в eFuse — он генерируется случайно при каждой загрузке. Это катастрофа для промышленного применения: DHCP-сервер каждый раз выдаёт другой IP, ARP-таблицы засоряются, устройство теряется в сети.</p>
<p>Решение: генерировать MAC детерминированно из OTP (One-Time Programmable) памяти чипа. OTP содержит уникальные данные, которые прошиваются на заводе и никогда не меняются.</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">#!/bin/sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Читаем OTP и берём MD5 от него</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">MAC=$(cat /sys/bus/nvmem/devices/rockchip-otp0/nvmem | md5sum | \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  sed 's/\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*/02:\1:\2:\3:\4:\5/')</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Применяем MAC к интерфейсу</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set network.@device[0].macaddr="$MAC"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci commit network</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Разбор команды по частям:</p>
<ol>
<li><code>/sys/bus/nvmem/devices/rockchip-otp0/nvmem</code> — бинарный файл с содержимым OTP через интерфейс <code>nvmem</code> ядра</li>
<li><code>md5sum</code> — хешируем бинарные данные, получаем 32 hex-символа</li>
<li><code>sed</code> — берём первые 12 символов и форматируем как MAC</li>
<li>Первый байт <code>02</code> — бит Local (bit 1 = 1) установлен, бит Multicast (bit 0 = 0) сброшен. Это стандарт для locally-administered MAC</li>
</ol>
<p>Результат: каждая плата Napi получает один и тот же MAC при каждой загрузке, но разные платы имеют разные MAC — уникальность гарантирована уникальностью OTP.</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="95-network--настройка-ethernet-без-бриджа"><code>95-network</code> — настройка Ethernet без бриджа<a class="hash-link" aria-label="Прямая ссылка на 95-network--настройка-ethernet-без-бриджа" title="Прямая ссылка на 95-network--настройка-ethernet-без-бриджа" href="https://napiworld.ru/recipes/openwrt-napi-architecture#95-network--%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-ethernet-%D0%B1%D0%B5%D0%B7-%D0%B1%D1%80%D0%B8%D0%B4%D0%B6%D0%B0">​</a></h3>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">#!/bin/sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Убираем дефолтный бридж br-lan</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set network.lan.device='eth0'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set network.lan.type=''</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci delete network.@bridge-vlan[0] 2&gt;/dev/null</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci commit network</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Стандартный OpenWrt создаёт бридж <code>br-lan</code> из всех Ethernet-портов — это логично для роутера с несколькими портами. У Napi один Ethernet-порт, бридж избыточен. Скрипт переводит <code>lan</code> напрямую на <code>eth0</code>, убирая лишний сетевой уровень.</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="96-hostname--имя-устройства"><code>96-hostname</code> — имя устройства<a class="hash-link" aria-label="Прямая ссылка на 96-hostname--имя-устройства" title="Прямая ссылка на 96-hostname--имя-устройства" href="https://napiworld.ru/recipes/openwrt-napi-architecture#96-hostname--%D0%B8%D0%BC%D1%8F-%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0">​</a></h3>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">#!/bin/sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set system.@system[0].hostname='napiwrt'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci commit system</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><code>napiwrt</code> — имя по умолчанию. Устройство будет видно в сети как <code>napiwrt.local</code> (через mDNS). Пользователь может сменить имя через LuCI.</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="97-luci-theme--тема-веб-интерфейса"><code>97-luci-theme</code> — тема веб-интерфейса<a class="hash-link" aria-label="Прямая ссылка на 97-luci-theme--тема-веб-интерфейса" title="Прямая ссылка на 97-luci-theme--тема-веб-интерфейса" href="https://napiworld.ru/recipes/openwrt-napi-architecture#97-luci-theme--%D1%82%D0%B5%D0%BC%D0%B0-%D0%B2%D0%B5%D0%B1-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%D0%B0">​</a></h3>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">#!/bin/sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set luci.main.mediaurlbase='/luci-static/openwrt-2020'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci commit luci</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Тема <code>openwrt-2020</code> — современный Bootstrap-based интерфейс. Тема <code>bootstrap</code> (старая) выглядит устаревшей. Устанавливаем сразу нужную.</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="99-dhcp--конфигурация-dhcp"><code>99-dhcp</code> — конфигурация DHCP<a class="hash-link" aria-label="Прямая ссылка на 99-dhcp--конфигурация-dhcp" title="Прямая ссылка на 99-dhcp--конфигурация-dhcp" href="https://napiworld.ru/recipes/openwrt-napi-architecture#99-dhcp--%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D1%8F-dhcp">​</a></h3>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">#!/bin/sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Убираем dnsmasq с lan-интерфейса — устройство само получает IP по DHCP</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci set dhcp.lan.ignore='1'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uci commit dhcp</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Napi в типовой конфигурации — не роутер, а промышленный шлюз. Он не должен раздавать DHCP в сеть, он должен получать IP сам. Скрипт отключает DHCP-сервер на <code>lan</code>.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="пакеты-что-и-зачем-включено-в-сборку">Пакеты: что и зачем включено в сборку<a class="hash-link" aria-label="Прямая ссылка на Пакеты: что и зачем включено в сборку" title="Прямая ссылка на Пакеты: что и зачем включено в сборку" href="https://napiworld.ru/recipes/openwrt-napi-architecture#%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D1%8B-%D1%87%D1%82%D0%BE-%D0%B8-%D0%B7%D0%B0%D1%87%D0%B5%D0%BC-%D0%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%BE-%D0%B2-%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D1%83">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="промышленный-стек">Промышленный стек<a class="hash-link" aria-label="Прямая ссылка на Промышленный стек" title="Прямая ссылка на Промышленный стек" href="https://napiworld.ru/recipes/openwrt-napi-architecture#%D0%BF%D1%80%D0%BE%D0%BC%D1%8B%D1%88%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9-%D1%81%D1%82%D0%B5%D0%BA">​</a></h3>
<table><thead><tr><th>Пакет</th><th>Назначение</th></tr></thead><tbody><tr><td><code>mbusd</code></td><td>Шлюз Modbus RTU → Modbus TCP. Слушает <code>/dev/ttyS1</code> (RS-485) и пробрасывает на TCP-порт</td></tr><tr><td><code>luci-app-mbusd</code></td><td>Веб-интерфейс для <code>mbusd</code>: старт/стоп, конфигурация порта, мониторинг</td></tr><tr><td><code>mbpoll</code></td><td>CLI-инструмент для опроса Modbus-устройств с командной строки</td></tr><tr><td><code>mosquitto</code></td><td>MQTT-брокер. Устройства публикуют данные в топики, приложения подписываются</td></tr><tr><td><code>mosquitto-client</code></td><td>CLI-клиент: <code>mosquitto_pub</code> и <code>mosquitto_sub</code> для отладки</td></tr></tbody></table>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="поддержка-usb-serial-адаптеров">Поддержка USB-Serial адаптеров<a class="hash-link" aria-label="Прямая ссылка на Поддержка USB-Serial адаптеров" title="Прямая ссылка на Поддержка USB-Serial адаптеров" href="https://napiworld.ru/recipes/openwrt-napi-architecture#%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%BA%D0%B0-usb-serial-%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B5%D1%80%D0%BE%D0%B2">​</a></h3>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kmod-usb-serial-ch341   # WCH CH340/CH341 (самые распространённые)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kmod-usb-serial-cp210x  # Silicon Labs CP2102 и серия</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kmod-usb-serial-ftdi    # FTDI FT232 и совместимые</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kmod-usb-serial-pl2303  # Prolific PL2303</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Napi имеет 2× USB 2.0. Через USB-Serial можно подключить дополнительные RS-485/RS-232 адаптеры или устройства с USB-интерфейсом.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="поддержка-lte">Поддержка LTE<a class="hash-link" aria-label="Прямая ссылка на Поддержка LTE" title="Прямая ссылка на Поддержка LTE" href="https://napiworld.ru/recipes/openwrt-napi-architecture#%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%BA%D0%B0-lte">​</a></h3>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kmod-usb-net-qmi-wwan   # QMI-протокол для LTE-модемов</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uqmi                     # Пользовательский инструмент для управления QMI</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Поддержка Quectel EP06 (Cat-6 LTE). Модем подключается через USB, управляется через QMI. <code>uqmi</code> позволяет настроить APN, поднять PPP-соединение, смотреть сигнал.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="сетевые-инструменты">Сетевые инструменты<a class="hash-link" aria-label="Прямая ссылка на Сетевые инструменты" title="Прямая ссылка на Сетевые инструменты" href="https://napiworld.ru/recipes/openwrt-napi-architecture#%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D1%8B%D0%B5-%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B">​</a></h3>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">openssh-sftp-server   # SFTP — копирование файлов через SSH без FTP</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">luci-ssl-wolfssl      # HTTPS для LuCI (wolfSSL — лёгкая альтернатива OpenSSL)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">tcpdump               # Захват трафика прямо на устройстве</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ethtool               # Диагностика Ethernet</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="административные-утилиты">Административные утилиты<a class="hash-link" aria-label="Прямая ссылка на Административные утилиты" title="Прямая ссылка на Административные утилиты" href="https://napiworld.ru/recipes/openwrt-napi-architecture#%D0%B0%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5-%D1%83%D1%82%D0%B8%D0%BB%D0%B8%D1%82%D1%8B">​</a></h3>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">bash    # Полноценная оболочка</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">htop    # Мониторинг процессов</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">nano    # Редактор для тех, кто не любит vi</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">screen  # Мультиплексор терминала — незаменим при работе через последовательный порт</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="luci-app-mbusd-веб-интерфейс-для-modbus-шлюза">luci-app-mbusd: веб-интерфейс для Modbus-шлюза<a class="hash-link" aria-label="Прямая ссылка на luci-app-mbusd: веб-интерфейс для Modbus-шлюза" title="Прямая ссылка на luci-app-mbusd: веб-интерфейс для Modbus-шлюза" href="https://napiworld.ru/recipes/openwrt-napi-architecture#luci-app-mbusd-%D0%B2%D0%B5%D0%B1-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81-%D0%B4%D0%BB%D1%8F-modbus-%D1%88%D0%BB%D1%8E%D0%B7%D0%B0">​</a></h2>
<p>Пакет <code>luci-app-mbusd</code> — наша собственная разработка. <code>mbusd</code> — отличный Modbus-шлюз, но управляется только через конфиг-файл и командную строку. Для промышленного применения нужен удобный веб-интерфейс.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="что-умеет-luci-app-mbusd">Что умеет luci-app-mbusd<a class="hash-link" aria-label="Прямая ссылка на Что умеет luci-app-mbusd" title="Прямая ссылка на Что умеет luci-app-mbusd" href="https://napiworld.ru/recipes/openwrt-napi-architecture#%D1%87%D1%82%D0%BE-%D1%83%D0%BC%D0%B5%D0%B5%D1%82-luci-app-mbusd">​</a></h3>
<ul>
<li>Запуск / остановка / перезапуск службы <code>mbusd</code> через кнопки в браузере</li>
<li>Включение / отключение автозапуска при загрузке</li>
<li>Live-статус процесса с отображением реальных параметров запуска</li>
<li>Отображение IP-адреса и порта, на котором слушает шлюз</li>
<li>Полная конфигурация: последовательный порт, скорость, чётность, стоп-биты, параметры Modbus</li>
</ul>
<p>Интерфейс написан как стандартное LuCI-приложение на Lua + HTML, следует конвенциям OpenWrt UCl API.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="сборка-пошаговая-инструкция">Сборка: пошаговая инструкция<a class="hash-link" aria-label="Прямая ссылка на Сборка: пошаговая инструкция" title="Прямая ссылка на Сборка: пошаговая инструкция" href="https://napiworld.ru/recipes/openwrt-napi-architecture#%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B0-%D0%BF%D0%BE%D1%88%D0%B0%D0%B3%D0%BE%D0%B2%D0%B0%D1%8F-%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D1%8F">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-зависимости-ubuntudebian">1. Зависимости (Ubuntu/Debian)<a class="hash-link" aria-label="Прямая ссылка на 1. Зависимости (Ubuntu/Debian)" title="Прямая ссылка на 1. Зависимости (Ubuntu/Debian)" href="https://napiworld.ru/recipes/openwrt-napi-architecture#1-%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8-ubuntudebian">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo apt install build-essential clang flex bison g++ gawk gcc-multilib \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  gettext git libncurses-dev libssl-dev python3-distutils rsync unzip zlib1g-dev</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопироват�ь в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-клонируем-openwrt">2. Клонируем OpenWrt<a class="hash-link" aria-label="Прямая ссылка на 2. Клонируем OpenWrt" title="Прямая ссылка на 2. Клонируем OpenWrt" href="https://napiworld.ru/recipes/openwrt-napi-architecture#2-%D0%BA%D0%BB%D0%BE%D0%BD%D0%B8%D1%80%D1%83%D0%B5%D0%BC-openwrt">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">git clone https://github.com/openwrt/openwrt.git</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cd openwrt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Обновляем фиды (репозитории пакетов)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./scripts/feeds update -a</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./scripts/feeds install -a</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-накладываем-кастомизации">3. Накладываем кастомизации<a class="hash-link" aria-label="Прямая ссылка на 3. Накладываем кастомизации" title="Прямая ссылка на 3. Накладываем кастомизации" href="https://napiworld.ru/recipes/openwrt-napi-architecture#3-%D0%BD%D0%B0%D0%BA%D0%BB%D0%B0%D0%B4%D1%8B%D0%B2%D0%B0%D0%B5%D0%BC-%D0%BA%D0%B0%D1%81%D1%82%D0%BE%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8">​</a></h3>
<p>Архив с кастомизациями берём из <a href="https://github.com/lab240/napi-openwrt-build/releases" target="_blank" rel="noopener noreferrer">релизов репозитория</a>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Распаковываем наш архив поверх дерева OpenWrt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">tar xzf napic-openwrt-YYYYMMDD-HHMM-v1.0.tar.gz -C /path/to/openwrt/</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Архив содержит все файлы из нашего репозитория в том же дереве каталогов, что и OpenWrt. После распаковки:</p>
<ul>
<li><code>target/linux/rockchip/</code> — дополнен нашим DTS и uci-defaults</li>
<li><code>package/boot/uboot-rockchip/patches/</code> — содержит патч U-Boot</li>
<li><code>package/luci-app-mbusd/</code> — добавлен наш пакет</li>
<li><code>.config</code> — готовая конфигурация сборки</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="4-собираем-u-boot">4. Собираем U-Boot<a class="hash-link" aria-label="Прямая ссылка на 4. Собираем U-Boot" title="Прямая ссылка на 4. Собираем U-Boot" href="https://napiworld.ru/recipes/openwrt-napi-architecture#4-%D1%81%D0%BE%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC-u-boot">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">make package/boot/uboot-rockchip/compile VARIANT=napic-rk3308 -j$(nproc)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обм�ена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>U-Boot для Rockchip RK3308 состоит из нескольких стадий:</p>
<ul>
<li><strong>TPL</strong> (Tertiary Program Loader) — инициализация DDR</li>
<li><strong>SPL</strong> (Secondary Program Loader) — инициализация минимального железа</li>
<li><strong>U-Boot proper</strong> — полноценный загрузчик</li>
</ul>
<p>Все три стадии собираются автоматически, результат упаковывается в <code>idbloader.img</code> + <code>u-boot.itb</code>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="5-собираем-прошивку">5. Собираем прошивку<a class="hash-link" aria-label="Прямая ссылка на 5. Собираем прошивку" title="Прямая ссылка на 5. Собираем прошивку" href="https://napiworld.ru/recipes/openwrt-napi-architecture#5-%D1%81%D0%BE%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC-%D0%BF%D1%80%D0%BE%D1%88%D0%B8%D0%B2%D0%BA%D1%83">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">make -j$(nproc)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в �буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Система сборки OpenWrt:</p>
<ol>
<li>Компилирует кросс-тулчейн (gcc, binutils, musl libc)</li>
<li>Компилирует ядро Linux с нашим DTS</li>
<li>Компилирует все выбранные пакеты</li>
<li>Упаковывает rootfs + ядро + U-Boot в финальный образ</li>
</ol>
<p>Время сборки на современном железе (8 ядер): 30–60 минут при первой сборке, 5–10 минут при пересборке с изменениями.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="6-результат-сборки">6. Результат сборки<a class="hash-link" aria-label="Прямая ссылка на 6. Результат сборки" title="Прямая ссылка на 6. Результат сборки" href="https://napiworld.ru/recipes/openwrt-napi-architecture#6-%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82-%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B8">​</a></h3>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">bin/targets/rockchip/armv8/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">└── openwrt-rockchip-armv8-napilab_napic-ext4-sysupgrade.img.gz</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Образ содержит таблицу разделов GPT, U-Boot, ядро, rootfs — всё в одном файле.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="прошивка">Прошивка<a class="hash-link" aria-label="Прямая ссылка на Прошивка" title="Прямая ссылка на Прошивка" href="https://napiworld.ru/recipes/openwrt-napi-architecture#%D0%BF%D1%80%D0%BE%D1%88%D0%B8%D0%B2%D0%BA%D0%B0">​</a></h2>
<p>Если не хотите собирать самостоятельно — готовые образы доступны на <a href="https://napiworld.ru/downloads/images#napi-pcslot---openwrt" target="_blank" rel="noopener noreferrer">странице загрузок napiworld.ru</a>.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Распаковываем</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">gunzip openwrt-rockchip-armv8-napilab_napic-ext4-sysupgrade.img.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Пишем на носитель (замените /dev/sdX на реальное устройство!)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dd if=openwrt-rockchip-armv8-napilab_napic-ext4-sysupgrade.img \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   of=/dev/sdX \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   bs=4M \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   status=progress</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sync</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<blockquote>
<p>⚠️ Внимательно проверьте <code>/dev/sdX</code> командой <code>lsblk</code> перед записью. Ошибка в имени устройства приведёт к затиранию данных.</p>
</blockquote>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="первый-запуск">Первый запуск<a class="hash-link" aria-label="Прямая ссылка на Первый запуск" title="Прямая ссылка на Первый запуск" href="https://napiworld.ru/recipes/openwrt-napi-architecture#%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9-%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA">​</a></h2>
<p>После записи образа и подачи питания:</p>
<ol>
<li><strong>U-Boot</strong> стартует, инициализирует DDR, находит ядро в разделе</li>
<li><strong>Ядро</strong> загружается, парсит наш DTS, инициализирует периферию</li>
<li><strong>OpenWrt init</strong> запускает скрипты <code>uci-defaults</code> (один раз)</li>
<li>Устройство получает IP по DHCP (MAC стабилен — DHCP-сервер выдаст тот же IP)</li>
<li>LuCI доступен по <code>http://&lt;IP&gt;/</code></li>
</ol>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="параметры-доступа-по-умолчанию">Параметры доступа по умолчанию<a class="hash-link" aria-label="Прямая ссылка на Параметры доступа по умолчанию" title="Прямая ссылка на Параметры доступа по умолчанию" href="https://napiworld.ru/recipes/openwrt-napi-architecture#%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B-%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0-%D0%BF%D0%BE-%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E">​</a></h3>
<table><thead><tr><th>Параметр</th><th>Значение</th></tr></thead><tbody><tr><td>IP</td><td>DHCP (стабильный MAC гарантирует постоянный lease)</td></tr><tr><td>Веб-интерфейс</td><td><code>http://&lt;IP&gt;/</code> → LuCI</td></tr><tr><td>SSH</td><td><code>root@&lt;IP&gt;</code> (пароль не установлен, задаётся при первом входе)</td></tr><tr><td>Консоль</td><td><code>ttyS0</code>, 1 500 000 бод</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="типичные-вопросы">Типичные вопросы<a class="hash-link" aria-label="Прямая ссылка на Типичные вопросы" title="Прямая ссылка на Типи�чные вопросы" href="https://napiworld.ru/recipes/openwrt-napi-architecture#%D1%82%D0%B8%D0%BF%D0%B8%D1%87%D0%BD%D1%8B%D0%B5-%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%D1%8B">​</a></h2>
<p><strong>Почему скорость консоли 1.5 Мбод?</strong></p>
<p>Это стандарт Rockchip для отладочных UART. На такой скорости загрузочные сообщения U-Boot и ядра отображаются без задержек. Требуется адаптер USB-UART с поддержкой нестандартных скоростей (CP2102, FTDI — работают, CH340 — часто нет).</p>
<p><strong>Почему за основу взяли ROCK Pi S, а не официальный RK3308 EVB?</strong></p>
<p>ROCK Pi S — хорошо поддерживаемая в апстриме OpenWrt плата на RK3308. Её конфигурация U-Boot и DTS проверены сообществом, регулярно обновляются. EVB (Evaluation Board от Rockchip) в OpenWrt поддерживается хуже.</p>
<p><strong>Можно ли добавить свои пакеты?</strong></p>
<p>Да. Добавьте пакеты в <code>.config</code> (через <code>make menuconfig</code> или напрямую) и пересоберите. Кастомный пакет можно положить в <code>package/</code> или добавить внешний фид.</p>
<p><strong>Как обновить прошивку через LuCI?</strong></p>
<p>System → Backup / Flash Firmware → Flash new firmware image. Загрузите <code>sysupgrade.img.gz</code>. OpenWrt сохранит пользовательские настройки (<code>/etc/config/</code>) если не снять галочку «Keep settings».</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="скриншоты">Скриншоты<a class="hash-link" aria-label="Прямая ссылка на Скриншоты" title="Прямая ссылка на Скриншоты" href="https://napiworld.ru/recipes/openwrt-napi-architecture#%D1%81%D0%BA%D1%80%D0%B8%D0%BD%D1%88%D0%BE%D1%82%D1%8B">​</a></h2>
<ol>
<li></li>
</ol>
<p><img decoding="async" loading="lazy" src="https://napiworld.ru/assets/images/napiwrtconsole-7e737bf8d32c82c767ead3b5cebce92a.jpeg" width="603" height="250" class="img_ev3q">
Командная строка через консоль, ssh</p>
<ol start="2">
<li></li>
</ol>
<p><img decoding="async" loading="lazy" src="https://napiworld.ru/assets/images/openwrtweb-767a57cf153fef4a8477e3747695b1c9.jpeg" width="1227" height="760" class="img_ev3q">
Главная страница</p>
<ol start="3">
<li></li>
</ol>
<p><img decoding="async" loading="lazy" src="https://napiworld.ru/assets/images/openwrt-net-1d455542850478a256aff3ec22a576de.jpeg" width="1341" height="493" class="img_ev3q">
Настройка сети</p>
<ol start="4">
<li></li>
</ol>
<p><img decoding="async" loading="lazy" src="https://napiworld.ru/assets/images/openwrtupdate-08c3fa22795d2e40e21848cab9939b86.jpeg" width="1354" height="634" class="img_ev3q">
Обновление, бекап, рестор</p>
<ol start="5">
<li></li>
</ol>
<p><img decoding="async" loading="lazy" src="https://napiworld.ru/assets/images/openwrt-soft-ea63d2711c9d99525cbcfe9db4956645.jpeg" width="1361" height="966" class="img_ev3q">
Пакеты</p>
<ol start="6">
<li></li>
</ol>
<p><img decoding="async" loading="lazy" src="https://napiworld.ru/assets/images/photo_2026-03-12_02-17-31-1fb4445bd65788474d91c1681dcdaf61.jpg" width="1280" height="971" class="img_ev3q">
Mbusd</p>]]></content:encoded>
            <category>openwrt</category>
            <category>napi</category>
            <category>napi-c</category>
            <category>napi-p</category>
            <category>napi-slot</category>
            <category>linux</category>
            <category>embedded</category>
        </item>
        <item>
            <title><![CDATA[Подключение сетевых папок CIFS в Linux]]></title>
            <link>https://napiworld.ru/recipes/cifs-mount-linux</link>
            <guid>https://napiworld.ru/recipes/cifs-mount-linux</guid>
            <pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Монтирование сетевых папок CIFS/SMB в Linux из командной строки и через fstab. Подключение шар Windows/Samba.]]></description>
            <content:encoded><![CDATA[<p>Подключаем сетевые папки (шары) в Linux из командной строки. Простые способы монтирования CIFS/SMB ресурсов.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="предварительные-условия">Предварительные условия<a class="hash-link" aria-label="Прямая ссылка на Предварительные условия" title="Прямая ссылка на Предварительные условия" href="https://napiworld.ru/recipes/cifs-mount-linux#%D0%BF%D1%80%D0%B5%D0%B4%D0%B2%D0%B0%D1%80%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D1%8F">​</a></h2>
<p>Предполагаем, что:</p>
<ul>
<li>наш текущий пользователь в Linux - <code>dmn</code></li>
<li>сетевая папка называется <code>share</code></li>
<li>точка монтирования - <code>/home/dmn/dnld</code></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="подключение-без-пароля-гостевой-доступ">Подключение без пароля (гостевой доступ)<a class="hash-link" aria-label="Прямая ссылка на Подключение без пароля (гостевой доступ)" title="Прямая ссылка на Подключение без пароля (гостевой доступ)" href="https://napiworld.ru/recipes/cifs-mount-linux#%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B1%D0%B5%D0%B7-%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8F-%D0%B3%D0%BE%D1%81%D1%82%D0%B5%D0%B2%D0%BE%D0%B9-%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF">​</a></h2>
<p>Для публичных папок или ресурсов с гостевым доступом:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo mount -t cifs //&lt;IP&gt;/share /home/dmn/dnld \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -o guest,uid=dmn,gid=dmn,iocharset=utf8</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="подключение-с-аутентификацией">Подключение с аутентификацией<a class="hash-link" aria-label="Прямая ссылка на Подключение с аутентификацией" title="Прямая ссылка на Подключение с аутентификацией" href="https://napiworld.ru/recipes/cifs-mount-linux#%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D1%81-%D0%B0%D1%83%D1%82%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B5%D0%B9">​</a></h2>
<p>Подключение с пользовательским логином и паролем:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo mount -t cifs //&lt;ip&gt;/share /home/dmn/dnld \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -o username=dmn,uid=dmn,gid=dmn,iocharset=utf8</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>При выполнении команды система запросит пароль пользователя.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="объяснение-параметров">Объяснение параметров<a class="hash-link" aria-label="Прямая ссылка на Объяснение параметров" title="Прямая ссылка на Объяснение параметров" href="https://napiworld.ru/recipes/cifs-mount-linux#%D0%BE%D0%B1%D1%8A%D1%8F%D1%81%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%BE%D0%B2">​</a></h2>
<ul>
<li><strong>-t cifs</strong> - тип файловой системы</li>
<li><strong>guest</strong> - гостевой доступ без пароля</li>
<li><strong>username=dmn</strong> - имя пользователя для аутентификации</li>
<li><strong>uid=dmn,gid=dmn</strong> - назначение владельца файлов локальному пользователю</li>
<li><strong>iocharset=utf8</strong> - кодировка для корректного отображения русских имён файлов</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="отключение-сетевой-папки">Отключение сетевой папки<a class="hash-link" aria-label="Прямая ссылка на Отключение сетевой папки" title="Прямая ссылка на Отключение сетевой папки" href="https://napiworld.ru/recipes/cifs-mount-linux#%D0%BE%D1%82%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D0%BE%D0%B9-%D0%BF%D0%B0%D0%BF%D0%BA%D0%B8">​</a></h2>
<p>Для размонтирования:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo umount /home/dmn/dnld</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="постоянное-подключение">Постоянное подключение<a class="hash-link" aria-label="Прямая ссылка на Постоянное подключение" title="Прямая ссылка на Постоянное подключение" href="https://napiworld.ru/recipes/cifs-mount-linux#%D0%BF%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%BD%D0%BE%D0%B5-%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5">​</a></h2>
<p>Для автоматического монтирования при загрузке добавьте запись в <code>/etc/fstab</code>:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">//&lt;IP&gt;/share /home/dmn/dnld cifs username=dmn,uid=dmn,gid=dmn,iocharset=utf8 0 0</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Эти методы позволяют легко интегрировать сетевые ресурсы Windows/Samba в Linux окружение.</p>]]></content:encoded>
            <category>cifs</category>
            <category>smb</category>
            <category>samba</category>
            <category>share</category>
            <category>filesystem</category>
        </item>
        <item>
            <title><![CDATA[Настройка и тестирование CAN интерфейса в Linux]]></title>
            <link>https://napiworld.ru/recipes/can-interface-setup</link>
            <guid>https://napiworld.ru/recipes/can-interface-setup</guid>
            <pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Настройка и тестирование CAN шины через SocketCAN и can-utils в Linux. Примеры cansend и candump.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="настройка-can-интерфейса">Настройка CAN интерфейса<a class="hash-link" aria-label="Прямая ссылка на Настройка CAN интерфейса" title="Прямая ссылка на Настройка CAN интерфейса" href="https://napiworld.ru/recipes/can-interface-setup#%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-can-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%D0%B0">​</a></h2>
<p>Поднимаем и проверяем CAN интерфейс.</p>
<p>Интересно, что CAN в Linux это сетевой интерфейс. На него нельзя повесить IP, но Linux управлять можно через ip link.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ip link set can0 down</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ip link set can0 type can bitrate 500000 restart-ms 100</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ip link set can0 up</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="проверка-loopback">Проверка loopback<a class="hash-link" aria-label="Прямая ссылка на Проверка loopback" title="Прямая ссылка на Проверка loopback" href="https://napiworld.ru/recipes/can-interface-setup#%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0-loopback">​</a></h2>
<p>Проверяем loop (Аналог ping localhost).</p>
<p>Ставим пакет:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">apt install can-utils</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="тестирование">Тестирование<a class="hash-link" aria-label="Прямая ссылка на Тестирование" title="Прямая ссылка на Тестирование" href="https://napiworld.ru/recipes/can-interface-setup#%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5">​</a></h2>
<p>В одной сессии слушаем can0:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">root@napi2:~# candump -L can0</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>В другой на этот же интерфейс шлем посылку:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">cansend can0 123#11223344</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Должны получить ответ в сессии, где слушали:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">(1769774861.028890) can0 123#11223344</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>#can #napi2</p>]]></content:encoded>
            <category>can</category>
            <category>socketcan</category>
            <category>can-utils</category>
            <category>network</category>
            <category>automotive</category>
        </item>
        <item>
            <title><![CDATA[Управление светодиодами Ethernet через MDIO]]></title>
            <link>https://napiworld.ru/recipes/ethernet-led-control</link>
            <guid>https://napiworld.ru/recipes/ethernet-led-control</guid>
            <pubDate>Tue, 27 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Управление светодиодами Ethernet порта через регистры MDIO с помощью утилиты phytool в Linux.]]></description>
            <content:encoded><![CDATA[<p>Утилита для управления mdio (в частности, подсветкой лампочек Ethernet): <a href="https://github.com/wkz/phytool" target="_blank" rel="noopener noreferrer">https://github.com/wkz/phytool</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="классический-вид">Классический вид<a class="hash-link" aria-label="Прямая ссылка на Классический вид" title="Прямая ссылка на Классический вид" href="https://napiworld.ru/recipes/ethernet-led-control#%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9-%D0%B2%D0%B8%D0%B4">​</a></h2>
<p>Левый (зелёный) - линк, правый (рыжий) - данные:</p>
<ol>
<li>Выбрать страницу LED конфигурации:</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">./phytool write wan/0/0x1f 0x0d04</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ol start="2">
<li>(Опционально) отключить EEE LED влияние:</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">./phytool write wan/0/0x11 0x0000</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ol start="3">
<li>Установить: LED1=Link(any speed), LED2=Activity:</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">./phytool write wan/0/0x10 0xC160</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ol start="4">
<li>Вернуть страницу 0:</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">./phytool write wan/0/0x1f 0x0000</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="альтернативный-вид">Альтернативный вид<a class="hash-link" aria-label="Прямая ссылка на Альтернативный вид" title="Прямая ссылка на Альтернативный вид" href="https://napiworld.ru/recipes/ethernet-led-control#%D0%B0%D0%BB%D1%8C%D1%82%D0%B5%D1%80%D0%BD%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9-%D0%B2%D0%B8%D0%B4">​</a></h2>
<p>Слева (зелёный) Link+Act (подмешивает в один диод и линк и моргание данными) 10mbit, справа (рыжий) - Link + Act 100+Mbit:</p>
<ol>
<li>Выбрать страницу LED конфигурации:</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">./phytool write wan/0/0x1f 0x0d04</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ol start="2">
<li>(Опционально) отключить EEE LED влияние:</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">./phytool write wan/0/0x11 0x0000</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ol start="3">
<li>Установить: LED1=Link+Act 10mbit, LED2=Link+Act 100+Mbit:</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">./phytool write wan/0/0x10 0x6251</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ol start="4">
<li>Вернуть страницу 0:</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">./phytool write wan/0/0x1f 0x0000</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content:encoded>
            <category>ethernet</category>
            <category>mdio</category>
            <category>led</category>
            <category>phytool</category>
            <category>network</category>
        </item>
        <item>
            <title><![CDATA[Получение уникального ID процессора Rockchip]]></title>
            <link>https://napiworld.ru/recipes/cpu-unique-id</link>
            <guid>https://napiworld.ru/recipes/cpu-unique-id</guid>
            <pubDate>Sat, 17 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Получение уникального аппаратного ID процессора Rockchip через OTP регистры. Применение для лицензирования и безопасности.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="получение-уникального-id-процессора">Получение уникального ID процессора<a class="hash-link" aria-label="Прямая ссылка на Получение уникального ID процессора" title="Прямая ссылка на Получение уникального ID процессора" href="https://napiworld.ru/recipes/cpu-unique-id#%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D1%83%D0%BD%D0%B8%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE-id-%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D1%80%D0%B0">​</a></h2>
<p>Встал вопрос, как получить уникальный ID процессора для идентификации конкретного экземпляра <code>Napi-C/Napi-P/Napi-S</code>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="способ-через-otp">Способ через OTP<a class="hash-link" aria-label="Прямая ссылка на Способ через OTP" title="Прямая ссылка на Способ через OTP" href="https://napiworld.ru/recipes/cpu-unique-id#%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1-%D1%87%D0%B5%D1%80%D0%B5%D0%B7-otp">​</a></h3>
<p>Мы нашли такой способ:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ID=$(dd if=/sys/bus/nvmem/devices/rockchip-otp0/nvmem bs=1 skip=8 count=8 2&gt;/dev/null | xxd -p)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">echo -n "$ID" | sha256sum</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="описание-команд">Описание команд<a class="hash-link" aria-label="Прямая ссылка на Описание команд" title="Прямая ссылка на Описание команд" href="https://napiworld.ru/recipes/cpu-unique-id#%D0%BE%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4">​</a></h3>
<ul>
<li><code>dd</code> - читает 8 байт из OTP памяти процессора Rockchip начиная с 8-го байта</li>
<li><code>xxd -p</code> - конвертирует двоичные данные в hex строку</li>
<li><code>sha256sum</code> - создает SHA256 хеш для обеспечения уникальности</li>
</ul>]]></content:encoded>
            <category>cpu-id</category>
            <category>rockchip</category>
            <category>otp</category>
            <category>unique-identifier</category>
            <category>security</category>
        </item>
        <item>
            <title><![CDATA[Анализ сигналов Modbus RS485 на анализаторе]]></title>
            <link>https://napiworld.ru/recipes/modbus-signal-analysis</link>
            <guid>https://napiworld.ru/recipes/modbus-signal-analysis</guid>
            <pubDate>Sat, 17 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Анализ электрических сигналов Modbus RS485 с помощью логического анализатора. Диагностика RTS и тайминги.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="анализ-сигналов-modbus-rs485">Анализ сигналов Modbus RS485<a class="hash-link" aria-label="Прямая ссылка на Анализ сигналов Modbus RS485" title="Прямая ссылка на Анализ сигналов Modbus RS485" href="https://napiworld.ru/recipes/modbus-signal-analysis#%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7-%D1%81%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D0%BE%D0%B2-modbus-rs485">​</a></h2>
<p>Покажем передачу modbus пакетов, отображенную на анализаторе цифровых сигналов.</p>
<p><img decoding="async" loading="lazy" src="https://napiworld.ru/assets/images/modbus-analyzer-9baf950a547c34476ebf02b3b7f1baa2.jpg" width="1280" height="452" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="оборудование">Оборудование<a class="hash-link" aria-label="Прямая ссылка на Оборудование" title="Прямая ссылка на Оборудование" href="https://napiworld.ru/recipes/modbus-signal-analysis#%D0%BE%D0%B1%D0%BE%D1%80%D1%83%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5">​</a></h3>
<ul>
<li><strong>Хост:</strong> Napi-C с программным RTS</li>
<li><strong>Датчик:</strong> учебный Modbus Napi-датчик</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="конфигурация-каналов">Конфигурация каналов<a class="hash-link" aria-label="Прямая ссылка на Конфигурация каналов" title="Прямая ссылка на Конфигурация каналов" href="https://napiworld.ru/recipes/modbus-signal-analysis#%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D1%8F-%D0%BA%D0%B0%D0%BD%D0%B0%D0%BB%D0%BE%D0%B2">​</a></h3>
<ul>
<li><strong>Канал 1:</strong> RTS хоста</li>
<li><strong>Канал 2:</strong> RX хоста</li>
<li><strong>Канал 3:</strong> TX хоста</li>
<li><strong>Канал 4:</strong> RX датчика</li>
<li><strong>Канал 5:</strong> TX датчика</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="последовательность-обмена">Последовательность обмена<a class="hash-link" aria-label="Прямая ссылка на Последовательность обмена" title="Прямая ссылка на Последовательность обмена" href="https://napiworld.ru/recipes/modbus-signal-analysis#%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C-%D0%BE%D0%B1%D0%BC%D0%B5%D0%BD%D0%B0">​</a></h3>
<ol>
<li>Хост поднимает сигнал <strong>RTS</strong> (передача)</li>
<li>Посылает запрос по линии <strong>TX</strong></li>
<li>Датчик принимает запрос через <strong>RX</strong></li>
<li>Датчик передает ответ через <strong>TX</strong></li>
<li>Хост принимает ответ через <strong>RX</strong></li>
</ol>
<p>#rs485 #rts</p>]]></content:encoded>
            <category>modbus</category>
            <category>rs485</category>
            <category>signal-analysis</category>
            <category>rts</category>
            <category>logic-analyzer</category>
        </item>
        <item>
            <title><![CDATA[Настройка параметров последовательного порта в Linux]]></title>
            <link>https://napiworld.ru/recipes/serial-port-configuration</link>
            <guid>https://napiworld.ru/recipes/serial-port-configuration</guid>
            <pubDate>Sun, 07 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Настройка параметров последовательного порта в Linux через stty: скорость, биты данных, чётность, стоп-биты.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="настройка-последовательного-порта">Настройка последовательного порта<a class="hash-link" aria-label="Прямая ссылка на Настройка последовательного порта" title="Прямая ссылка на Настройка последовательного порта" href="https://napiworld.ru/recipes/serial-port-configuration#%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BF%D0%BE%D1%80%D1%82%D0%B0">​</a></h2>
<p>Установка параметров последовательного порта в Linux на примере <code>ttyS1</code></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="просмотр-текущих-параметров">Просмотр текущих параметров<a class="hash-link" aria-label="Прямая ссылка на Просмотр текущих параметров" title="Прямая ссылка на Просмотр текущих параметров" href="https://napiworld.ru/recipes/serial-port-configuration#%D0%BF%D1%80%D0%BE%D1%81%D0%BC%D0%BE%D1%82%D1%80-%D1%82%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D1%85-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%BE%D0%B2">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">stty -F /dev/ttyS1 -a</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Пример вывода:</strong></p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">speed 115200 baud; line = 0;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">-brkint -icrnl -imaxbel</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">opost -onlcr</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cs8 -parenb -cstopb</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="расшифровка-параметров">Расшифровка параметров<a class="hash-link" aria-label="Прямая ссылка на Расшифровка параметров" title="Прямая ссылка на Расшифровка параметров" href="https://napiworld.ru/recipes/serial-port-configuration#%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%BA%D0%B0-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%BE%D0%B2">​</a></h3>
<ul>
<li><strong><code>speed 115200 baud</code></strong> — текущая скорость</li>
<li><strong><code>cs8</code></strong> — 8 бит данных</li>
<li><strong><code>-parenb</code></strong> — без бита четности (N)</li>
<li><strong><code>-cstopb</code></strong> — 1 стоп-бит (если было <code>cstopb</code> → 2 стоп-бита)</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="установка-параметров-порта">Установка параметров порта<a class="hash-link" aria-label="Прямая ссылка на Установка параметров порта" title="Прямая ссылка на Установка параметров порта" href="https://napiworld.ru/recipes/serial-port-configuration#%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%BE%D0%B2-%D0%BF%D0%BE%D1%80%D1%82%D0%B0">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">stty -F /dev/ttyS1 115200 cs8 -cstopb -parenb -ixon -ixoff -crtscts</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="тестирование-порта">Тестирование порта<a class="hash-link" aria-label="Прямая ссылка на Тестирование порта" title="Прямая ссылка на Тестирование порта" href="https://napiworld.ru/recipes/serial-port-configuration#%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BF%D0%BE%D1%80%D1%82%D0%B0">​</a></h3>
<p>Дальше можно прямо из командной строки:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">echo "test" &gt; /dev/ttyS1</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content:encoded>
            <category>uart</category>
            <category>serial</category>
            <category>stty</category>
            <category>linux</category>
            <category>configuration</category>
        </item>
        <item>
            <title><![CDATA[Диагностика занятости GPIO пинов в Linux]]></title>
            <link>https://napiworld.ru/recipes/gpio-pinmux-debug</link>
            <guid>https://napiworld.ru/recipes/gpio-pinmux-debug</guid>
            <pubDate>Mon, 01 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Диагностика занятости GPIO пинов через /sys/kernel/debug/pinctrl и pinmux-pins в Linux на Rockchip.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="диагностика-занятости-gpio">Диагностика занятости GPIO<a class="hash-link" aria-label="Прямая ссылка на Диагностика занятости GPIO" title="Прямая ссылка на Диагностика занятости GPIO" href="https://napiworld.ru/recipes/gpio-pinmux-debug#%D0%B4%D0%B8%D0%B0%D0%B3%D0%BD%D0%BE%D1%81%D1%82%D0%B8%D0%BA%D0%B0-%D0%B7%D0%B0%D0%BD%D1%8F%D1%82%D0%BE%D1%81%D1%82%D0%B8-gpio">​</a></h2>
<p>В Linux можно посмотреть чем заняты все GPIO:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="пример-вывода-на-napi-c">Пример вывода на NAPI-C<a class="hash-link" aria-label="Прямая ссылка на Пример вывода на NAPI-C" title="Прямая ссылка на Пример вывода на NAPI-C" href="https://napiworld.ru/recipes/gpio-pinmux-debug#%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%D0%B0-%D0%BD%D0%B0-napi-c">​</a></h3>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">root@rockpi-s:~# cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Pinmux settings per pin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Format: pin (name): mux_owner gpio_owner hog?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pin 0 (gpio0-0): (MUX UNCLAIMED) (GPIO UNCLAIMED)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pin 1 (gpio0-1): (MUX UNCLAIMED) (GPIO UNCLAIMED)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pin 2 (gpio0-2): sdio-pwrseq gpio0:2 function sdio-pwrseq group wifi-enable-h</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pin 3 (gpio0-3): ff480000.mmc (GPIO UNCLAIMED) function sdmmc group sdmmc-det</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pin 4 (gpio0-4): (MUX UNCLAIMED) (GPIO UNCLAIMED)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pin 5 (gpio0-5): leds gpio0:5 function leds group heartbeat-led</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pin 6 (gpio0-6): leds gpio0:6 function leds group green-led</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pin 7 (gpio0-7): stmmac-0:01 gpio0:7 function gmac group mac-rst</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pin 8 (gpio0-8): (MUX UNCLAIMED) (GPIO UNCLAIMED)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pin 9 (gpio0-9): (MUX UNCLAIMED) (GPIO UNCLAIMED)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pin 10 (gpio0-10): (MUX UNCLAIMED) (GPIO UNCLAIMED)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pin 11 (gpio0-11): ff050000.i2c (GPIO UNCLAIMED) function i2c1 group i2c1-xfer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pin 12 (gpio0-12): ff050000.i2c (GPIO UNCLAIMED) function i2c1 group i2c1-xfer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pin 13 (gpio0-13): ff180000.pwm (GPIO UNCLAIMED) function pwm0 group pwm0-pin-pull-down</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pin 14 (gpio0-14): (MUX UNCLAIMED) (GPIO UNCLAIMED)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pin 15 (gpio0-15): (MUX UNCLAIMED) (GPIO UNCLAIMED)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="пример-занятого-gpio">Пример занятого GPIO<a class="hash-link" aria-label="Прямая ссылка на Пример занятого GPIO" title="Прямая ссылка на Пример занятого GPIO" href="https://napiworld.ru/recipes/gpio-pinmux-debug#%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D0%B7%D0%B0%D0%BD%D1%8F%D1%82%D0%BE%D0%B3%D0%BE-gpio">​</a></h3>
<p>Например, <code>GPIO0-A5</code> занят и мы не можем его использовать, например как DE для UART без лишних "процедур" по его освобождению:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">root@rockpi-s:~/S4-GPIO2_A5# cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins | grep gpio0-5</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pin 5 (gpio0-5): leds gpio0:5 function leds group heartbeat-led</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">root@rockpi-s:~/S4-GPIO2_A5#</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="пример-свободного-gpio">Пример свободного GPIO<a class="hash-link" aria-label="Прямая ссылка на Пример свободного GPIO" title="Прямая ссылка на Пример свободного GPIO" href="https://napiworld.ru/recipes/gpio-pinmux-debug#%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D1%81%D0%B2%D0%BE%D0%B1%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE-gpio">​</a></h3>
<p>А вот <code>GPIO2-B4</code> выглядит как свободный:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">root@rockpi-s:~/S4-GPIO2_A5# cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins | grep gpio2-12</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pin 76 (gpio2-12): (MUX UNCLAIMED) (GPIO UNCLAIMED)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>И мы можем его программно "дергать":</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">root@rockpi-s:~/S4-GPIO2_A5# gpioset gpiochip2 12=1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">root@rockpi-s:~/S4-GPIO2_A5# gpioset gpiochip2 12=0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">root@rockpi-s:~/S4-GPIO2_A5#</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="использование-gpio-в-dts">Использование GPIO в DTS<a class="hash-link" aria-label="Прямая ссылка на Использование GPIO в DTS" title="Прямая ссылка на Использование GPIO в DTS" href="https://napiworld.ru/recipes/gpio-pinmux-debug#%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-gpio-%D0%B2-dts">​</a></h3>
<p>А теперь "захватим" пин <code>GPIO2_A5</code> для DE в UART1 таким DTS:</p>
<div class="language-dts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-dts codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"> /dts-v1/;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/plugin/;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/ {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  compatible = "rockchip,rk3308";</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  fragment@0 {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    target = &lt;&amp;uart1&gt;;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    __overlay__ {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      status = "okay";</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      pinctrl-names = "default";</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      pinctrl-0 = &lt;&amp;uart1_xfer&gt;;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      linux,rs485-enabled-at-boot-time;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      rs485-rts-active-high;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      rs485-rts-delay = &lt;0 0&gt;;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      rts-gpios = &lt;&amp;gpio2 5 0&gt;;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    };</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  };</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">};</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="проверка-захвата-gpio">Проверка захвата GPIO<a class="hash-link" aria-label="Прямая ссылка на Проверка захвата GPIO" title="Прямая ссылка на Проверка захвата GPIO" href="https://napiworld.ru/recipes/gpio-pinmux-debug#%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0-%D0%B7%D0%B0%D1%85%D0%B2%D0%B0%D1%82%D0%B0-gpio">​</a></h3>
<p>Посмотрим как выглядит пин:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">root@rockpi-s:~/S4-GPIO2_A5# cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins | grep gpio2-5</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pin 69 (gpio2-5): (MUX UNCLAIMED) gpio2:69</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">root@rockpi-s:~/S4-GPIO2_A5#</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Тут не слишком понятно захватился он драйвером RS485 или нет. Но что важно, Linux не даст больше им "мигать", если он занят драйвером ядра:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">root@rockpi-s:~/S4-GPIO2_A5# gpioset gpiochip2 5=0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">gpioset: error setting the GPIO line values: Device or resource busy</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">root@rockpi-s:~/S4-GPIO2_A5# gpioset gpiochip2 5=1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">gpioset: error setting the GPIO line values: Device or resource busy</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">root@rockpi-s:~/S4-GPIO2_A5#</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="тестирование-uart1">Тестирование UART1<a class="hash-link" aria-label="Прямая ссылка на Тестирование UART1" title="Прямая ссылка на Тестирование UART1" href="https://napiworld.ru/recipes/gpio-pinmux-debug#%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-uart1">​</a></h3>
<p>Осталось убедиться, что мы получаем данные через UART1:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">root@rockpi-s:~/S4-GPIO2_A5# mbpoll -m rtu -P none -b 115200 -a 125 -r 1 -c 4 -t4   /dev/ttyS1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mbpoll 1.0-0 - FieldTalk(tm) Modbus(R) Master Simulator</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Copyright © 2015-2019 Pascal JEAN, https://github.com/epsilonrt/mbpoll</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">This program comes with ABSOLUTELY NO WARRANTY.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">This is free software, and you are welcome to redistribute it</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">under certain conditions; type 'mbpoll -w' for details.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Protocol configuration: Modbus RTU</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Slave configuration...: address = [125]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        start reference = 1, count = 4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Communication.........: /dev/ttyS1,     115200-8N1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        t/o 1.00 s, poll rate 1000 ms</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Data type.............: 16-bit register, output (holding) register table</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">-- Polling slave 125... Ctrl-C to stop)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[1]:   125</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[2]:   1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[3]:   851</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[4]:   772</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content:encoded>
            <category>gpio</category>
            <category>pinmux</category>
            <category>debug</category>
            <category>rockchip</category>
            <category>pinctrl</category>
        </item>
        <item>
            <title><![CDATA[Overlay для RS485 на UART1 с GPIO управлением направления]]></title>
            <link>https://napiworld.ru/recipes/rs485-uart1-overlay</link>
            <guid>https://napiworld.ru/recipes/rs485-uart1-overlay</guid>
            <pubDate>Sat, 29 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Device Tree Overlay для RS485 на UART1 с управлением направлением через GPIO (RTS) на NAPI-C.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="оверлей-для-rs485-на-uart1">Оверлей для RS485 на UART1<a class="hash-link" aria-label="Прямая ссылка на Оверлей для RS485 на UART1" title="Прямая ссылка на Оверлей для RS485 на UART1" href="https://napiworld.ru/recipes/rs485-uart1-overlay#%D0%BE%D0%B2%D0%B5%D1%80%D0%BB%D0%B5%D0%B9-%D0%B4%D0%BB%D1%8F-rs485-%D0%BD%D0%B0-uart1">​</a></h2>
<p>Оверлей для RS485 на UART1 (Napi-C) c контролем направления через GPIO (DE=GPIO2_B4)</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="конфигурация-dts">Конфигурация DTS<a class="hash-link" aria-label="Прямая ссылка на Конфигурация DTS" title="Прямая ссылка на Конфигурация DTS" href="https://napiworld.ru/recipes/rs485-uart1-overlay#%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D1%8F-dts">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">root@rockpi-s:~/S3# cat uart1-de.dts</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-dts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-dts codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">/dts-v1/;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/plugin/;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/ {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  compatible = "rockchip,rk3308";</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  fragment@0 {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    target = &lt;&amp;uart1&gt;;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    __overlay__ {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      status = "okay";</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      pinctrl-names = "default";</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      pinctrl-0 = &lt;&amp;uart1_xfer&gt;;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      linux,rs485-enabled-at-boot-time;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      rs485-rts-active-high;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      rs485-rts-delay = &lt;0 0&gt;;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      rts-gpios = &lt;&amp;gpio2 12 0&gt;;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    };</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  };</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">};</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>#rs485 #napic</p>]]></content:encoded>
            <category>rs485</category>
            <category>uart</category>
            <category>overlay</category>
            <category>gpio</category>
            <category>napi-c</category>
        </item>
        <item>
            <title><![CDATA[Получение текущего DTS из загруженной системы]]></title>
            <link>https://napiworld.ru/recipes/extract-running-dts</link>
            <guid>https://napiworld.ru/recipes/extract-running-dts</guid>
            <pubDate>Sun, 23 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Получение и декомпиляция текущего Device Tree Source из работающей Linux системы через dtc.]]></description>
            <content:encoded><![CDATA[<p>Получить текущий dts из dtb, с которой загрузилась система:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">dtc -I fs -O dts /sys/firmware/devicetree/base &gt; /tmp/running.dts</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Это ключевой файл, отображающий как система "понимает" всю перефирию и интерфейсы.</p>
<p>Внимательно изучайте файл <code>running.dts</code> через текстовый редактор - он ключ к пониманию как система интерпретирует интерфейсы.</p>
<p>И, кстати, этот dts можно "скормить" в ChatGPT и задавать вопросы или сформировать просьбу сделать overlay.</p>
<p>#kernel #dts</p>]]></content:encoded>
            <category>dts</category>
            <category>dtb</category>
            <category>kernel</category>
            <category>devicetree</category>
            <category>overlay</category>
        </item>
        <item>
            <title><![CDATA[Программное включение аппаратного reset в eMMC]]></title>
            <link>https://napiworld.ru/recipes/emmc-hardware-reset</link>
            <guid>https://napiworld.ru/recipes/emmc-hardware-reset</guid>
            <pubDate>Thu, 23 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Программное включение аппаратного сброса eMMC через команды mmc в Linux. Особенности Napi Slot и режим maskrom.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="продолжаем-исследовать-удивительный-мир-emmcsd">Продолжаем исследовать удивительный мир EMMC/SD<a class="hash-link" aria-label="Прямая ссылка на Продолжаем исследовать удивительный мир EMMC/SD" title="Прямая ссылка на Продолжаем исследовать удивительный мир EMMC/SD" href="https://napiworld.ru/recipes/emmc-hardware-reset#%D0%BF%D1%80%D0%BE%D0%B4%D0%BE%D0%BB%D0%B6%D0%B0%D0%B5%D0%BC-%D0%B8%D1%81%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-%D1%83%D0%B4%D0%B8%D0%B2%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9-%D0%BC%D0%B8%D1%80-emmcsd">​</a></h2>
<p>Столкнулись с удивительной ситуацией на Napi Slot - при нажатии кнопки MaskRom. Эта кнопка переводит процессор в режим прошивки (на самом деле кнопка подтягивает <code>MMC_RESET</code> к <code>GND</code> и отключает EMMC, чтобы процессор не нашел с чего грузить систему и вошёл в режим прошивки).</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="проблема">Проблема<a class="hash-link" aria-label="Прямая ссылка на Проблема" title="Прямая ссылка на Проблема" href="https://napiworld.ru/recipes/emmc-hardware-reset#%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0">​</a></h2>
<p>Так вот процессор никак не реагировал!</p>
<p>Выяснилось, что в некоторых EMMC аппаратный reset включается <strong>ПРОГРАММНО</strong>!</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="рецепт-команд-linux">Рецепт команд Linux<a class="hash-link" aria-label="Прямая ссылка на Рецепт команд Linux" title="Прямая ссылка на Рецепт команд Linux" href="https://napiworld.ru/recipes/emmc-hardware-reset#%D1%80%D0%B5%D1%86%D0%B5%D0%BF%D1%82-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4-linux">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="считать-текущий-статус">Считать текущий статус<a class="hash-link" aria-label="Прямая ссылка на Считать текущий статус" title="Прямая ссылка на Считать текущий статус" href="https://napiworld.ru/recipes/emmc-hardware-reset#%D1%81%D1%87%D0%B8%D1%82%D0%B0%D1%82%D1%8C-%D1%82%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B9-%D1%81%D1%82%D0%B0%D1%82%D1%83%D1%81">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo mmc extcsd read /dev/mmcblk0 | grep -i RST_N_FUNCTION</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="включить-аппаратный-reset-у-emmc">Включить аппаратный reset у eMMC<a class="hash-link" aria-label="Прямая ссылка на Включить аппаратный reset у eMMC" title="Прямая ссылка на Включить аппаратный reset у eMMC" href="https://napiworld.ru/recipes/emmc-hardware-reset#%D0%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B8%D1%82%D1%8C-%D0%B0%D0%BF%D0%BF%D0%B0%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%B9-reset-%D1%83-emmc">​</a></h3>
<p><strong>Операция необратимая:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo mmc hwreset enable /dev/mmcblk0</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="проверить-результат">Проверить результат<a class="hash-link" aria-label="Прямая ссылка на Проверить результат" title="Прямая ссылка на Проверить результат" href="https://napiworld.ru/recipes/emmc-hardware-reset#%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%B8%D1%82%D1%8C-%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo mmc extcsd read /dev/mmcblk0 | grep -i RST_N_FUNCTION</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Должно поменяться на <code>RST_N_FUNCTION: 0x01</code></p>
<p>#emmc #hard #napi</p>]]></content:encoded>
            <category>emmc</category>
            <category>hardware-reset</category>
            <category>mmc</category>
            <category>napi-slot</category>
            <category>maskrom</category>
        </item>
        <item>
            <title><![CDATA[Компиляция ядра NapiLinux - быстрый метод]]></title>
            <link>https://napiworld.ru/recipes/napilinux-kernel-compile</link>
            <guid>https://napiworld.ru/recipes/napilinux-kernel-compile</guid>
            <pubDate>Wed, 22 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Быстрая кросс-компиляция ядра NapiLinux для RK3308 без пересборки полного образа. Сборка overlays.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="как-скомпилировать-только-ядро-napilinux">Как скомпилировать только ядро NapiLinux<a class="hash-link" aria-label="Прямая ссылка на Как скомпилировать только ядро NapiLinux" title="Прямая ссылка на Как скомпилировать только ядро NapiLinux" href="https://napiworld.ru/recipes/napilinux-kernel-compile#%D0%BA%D0%B0%D0%BA-%D1%81%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-%D1%82%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE-%D1%8F%D0%B4%D1%80%D0%BE-napilinux">​</a></h2>
<p>Это "грязный" быстрый метод, который позволяет не компилировать всю систему, а быстро включить какие-то опции ядра и проверить новое ядро в системе.</p>
<p><strong>Правильный способ компиляции NapiLinux</strong> — через пакет Yocto.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-сделать-клон-ядра-с-нужной-ветки-branch">1. Сделать клон ядра с нужной ветки (branch)<a class="hash-link" aria-label="Прямая ссылка на 1. Сделать клон ядра с нужной ветки (branch)" title="Прямая ссылка на 1. Сделать клон ядра с нужной ветки (branch)" href="https://napiworld.ru/recipes/napilinux-kernel-compile#1-%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C-%D0%BA%D0%BB%D0%BE%D0%BD-%D1%8F%D0%B4%D1%80%D0%B0-%D1%81-%D0%BD%D1%83%D0%B6%D0%BD%D0%BE%D0%B9-%D0%B2%D0%B5%D1%82%D0%BA%D0%B8-branch">​</a></h3>
<p>Бранч — это версия репозитория ядра. Для разных платформ она разная, и нужно выбрать ту, которая вас интересует:</p>
<ul>
<li><code>rk-6.1</code></li>
<li><code>orange-pi-6.6</code></li>
<li><code>rk35xx</code></li>
</ul>
<p>и т. п. (выбирайте на сайте GitLab)</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">git clone https://gitlab.nnz-ipc.net/pub/napilinux/kernel.git --branch=rk-6.1 --depth=1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cd kernel/</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-настроить-переменные-для-архитектуры-arm64">2. Настроить переменные для архитектуры (ARM64)<a class="hash-link" aria-label="Прямая ссылка на 2. Настроить переменные для архитектуры (ARM64)" title="Прямая ссылка на 2. Настроить переменные для �архитектуры (ARM64)" href="https://napiworld.ru/recipes/napilinux-kernel-compile#2-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C-%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D0%B4%D0%BB%D1%8F-%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D1%8B-arm64">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">export ARCH=arm64</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">export CROSS_COMPILE=aarch64-linux-gnu-</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-подготовить-конфиг">3. Подготовить конфиг<a class="hash-link" aria-label="Прямая ссылка на 3. Подготовить конфиг" title="Прямая ссылка на 3. Подготовить конфиг" href="https://napiworld.ru/recipes/napilinux-kernel-compile#3-%D0%BF%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%B8%D1%82%D1%8C-%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3">​</a></h3>
<ul>
<li>Конфиги лежат в папке <code>/arch/arm64/configs</code></li>
<li>В каждой ветке нужно выбрать свой конфиг:</li>
</ul>
<p><strong>Для Napi:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">make napi_defconfig</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Для CM4:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">make opi_cm4_defconfig</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="4-настройка-конфигурации">4. Настройка конфигурации<a class="hash-link" aria-label="Прямая ссылка на 4. Настройка конфигурации" title="Прямая ссылка на 4. Настройка конфигурации" href="https://napiworld.ru/recipes/napilinux-kernel-compile#4-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D0%B8">​</a></h3>
<p>После этого появится файл <code>.config</code>, в котором вы можете изменить опции ядра под себя.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="5-запускаем-компиляцию-ядра">5. Запускаем компиляцию ядра<a class="hash-link" aria-label="Прямая ссылка на 5. Запускаем компиляцию ядра" title="Прямая ссылка на 5. Запускаем компиляцию ядра" href="https://napiworld.ru/recipes/napilinux-kernel-compile#5-%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%B0%D0%B5%D0%BC-%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8E-%D1%8F%D0%B4%D1%80%D0%B0">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">make -j10</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="6-результаты-сборки">6. Результаты сборки<a class="hash-link" aria-label="Прямая ссылка на 6. Результаты сборки" title="Прямая ссылка на 6. Результаты сборки" href="https://napiworld.ru/recipes/napilinux-kernel-compile#6-%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D1%8B-%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B8">​</a></h3>
<ul>
<li><strong>Имидж ядра</strong> — <code>arch/arm64/boot/Image</code></li>
<li><strong>Главная DTB</strong> (дерево устройств) — <code>arch/arm64/boot/&lt;файл&gt;.dtb</code></li>
<li><strong>Оверлеи</strong> — <code>arch/arm64/boot/dts/rockchip/</code></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="7-замена-ядра-в-системе">7. Замена ядра в системе<a class="hash-link" aria-label="Прямая ссылка на 7. Замена ядра в системе" title="Прямая ссылка на 7. Замена ядра в системе" href="https://napiworld.ru/recipes/napilinux-kernel-compile#7-%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D0%B0-%D1%8F%D0%B4%D1%80%D0%B0-%D0%B2-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B5">​</a></h3>
<p>Теперь можно заменить файлы <code>Image</code> и <code>.dtb</code> в <code>/boot</code>, затем перезагрузить систему.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="8-важно-про-overlay-root">8. Важно про overlay root!<a class="hash-link" aria-label="Прямая ссылка на 8. Важно про overlay root!" title="Прямая ссылка на 8. Важно про overlay root!" href="https://napiworld.ru/recipes/napilinux-kernel-compile#8-%D0%B2%D0%B0%D0%B6%D0%BD%D0%BE-%D0%BF%D1%80%D0%BE-overlay-root">​</a></h3>
<p>NapiLinux использует root (<code>/</code>) как виртуальную партицию overlay, поэтому просто переписать ядро и другие файлы из системы не получится (на деле вы запишете их в overlay, и u-boot их не увидит).</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="что-делать">Что делать?<a class="hash-link" aria-label="Прямая ссылка на Что делать?" title="Прямая ссылка на Что делать?" href="https://napiworld.ru/recipes/napilinux-kernel-compile#%D1%87%D1%82%D0%BE-%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C">​</a></h3>
<ul>
<li>
<p><strong>Если работаете на SD-карте</strong> — выньте SD, примонтируйте обе физические партиции и запишите новые файлы в их <code>/boot</code></p>
</li>
<li>
<p><strong>Если работаете с NAND/eMMC</strong> — загрузитесь с SD, примонтируйте обе партиции и запишите туда файлы вручную</p>
</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="просмотр-структуры-партиций">Просмотр структуры партиций<a class="hash-link" aria-label="Прямая ссылка на Просмотр структуры партиций" title="Прямая ссылка на Просмотр структуры партиций" href="https://napiworld.ru/recipes/napilinux-kernel-compile#%D0%BF%D1%80%D0%BE%D1%81%D0%BC%D0%BE%D1%82%D1%80-%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B-%D0%BF%D0%B0%D1%80%D1%82%D0%B8%D1%86%D0%B8%D0%B9">​</a></h3>
<p>Посмотреть структуру партиций можно командами:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">lsblk</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">lsblk -f</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Скопировать в буфер обмена" title="Скопировать" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>#napilinux #napikernel</p>]]></content:encoded>
            <category>napilinux</category>
            <category>kernel</category>
            <category>compilation</category>
            <category>cross-compile</category>
            <category>overlay</category>
        </item>
    </channel>
</rss>