<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="FeedCreator 1.8" -->
<?xml-stylesheet href="http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/lib/exe/css.php?s=feed" type="text/css"?>
<rss version="2.0">
    <channel xmlns:g="http://base.google.com/ns/1.0">
        <title>worldwide open-source software</title>
        <description></description>
        <link>http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/</link>
        <lastBuildDate>Mon, 29 Jun 2026 23:18:39 +0000</lastBuildDate>
        <generator>FeedCreator 1.8</generator>
        <image>
            <url>http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/lib/exe/fetch.php?media=wiki:logo.png</url>
            <title>worldwide open-source software</title>
            <link>http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/</link>
        </image>
        <item>
            <title>tmp_27.06.2026</title>
            <link>http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?id=tmp_27.06.2026&amp;rev=1782563707</link>
            <description>
&lt;p&gt;
&lt;em&gt; assets/js/app.js

document.addEventListener(&amp;#039;DOMContentLoaded&amp;#039;, function() {
     &lt;/em&gt; — НАДЕЖНОЕ УПРАВЛЕНИЕ МОДАЛКОЙ С ДЕБАГ-МАЯКОМ —
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;  // --- УПРАВЛЕНИЕ ЗАГРУЗЧИКОМ ПРОЕКТОВ ---
  const btnCreateProject   = document.getElementById(&amp;#039;btn-create-project&amp;#039;);
  const projectModal       = document.getElementById(&amp;#039;project-modal&amp;#039;);
  const btnModalCancel     = document.getElementById(&amp;#039;btn-modal-cancel&amp;#039;);
  const btnModalSubmit     = document.getElementById(&amp;#039;btn-modal-submit&amp;#039;);
  const newProjectName     = document.getElementById(&amp;#039;new-project-name&amp;#039;);
  const modalErrorBox      = document.getElementById(&amp;#039;modal-error-box&amp;#039;);
  
  const folderInput        = document.getElementById(&amp;#039;project-folder-input&amp;#039;);
  const btnSelectFolder    = document.getElementById(&amp;#039;btn-select-folder&amp;#039;);
  const folderStatus       = document.getElementById(&amp;#039;selected-folder-status&amp;#039;);&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;  if (btnCreateProject &amp;amp;&amp;amp; projectModal) {
      
      // Функция проверки условий для активации кнопки &amp;quot;Загрузить&amp;quot;
      function checkInputsValidity() {
          const nameVal = newProjectName.value.trim();
          const hasFiles = folderInput.files &amp;amp;&amp;amp; folderInput.files.length &amp;gt; 0;
          
          if (nameVal !== &amp;quot;&amp;quot; &amp;amp;&amp;amp; hasFiles) {
              btnModalSubmit.disabled = false; // Включаем кнопку
              btnModalSubmit.style.opacity = &amp;quot;1&amp;quot;;
          } else {
              btnModalSubmit.disabled = true;  // Выключаем кнопку
              btnModalSubmit.style.opacity = &amp;quot;0.6&amp;quot;;
          }
      }&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;      // Следим за вводом имени
      newProjectName.addEventListener(&amp;#039;input&amp;#039;, checkInputsValidity);&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;      // Клик по кастомной кнопке -&amp;gt; триггерим скрытый системный инпут выбора папки
      btnSelectFolder.addEventListener(&amp;#039;click&amp;#039;, function() {
          folderInput.click();
      });&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;      // Следим за тем, что пользователь выбрал папку на ПК
      folderInput.addEventListener(&amp;#039;change&amp;#039;, function() {
          if (this.files &amp;amp;&amp;amp; this.files.length &amp;gt; 0) {
              // Берем имя корневой папки, которую выбрал юзер
              const firstFile = this.files[0];
              const rootFolderName = firstFile.webkitRelativePath.split(&amp;#039;/&amp;#039;)[0];
              folderStatus.innerHTML = `Выбрано файлов: &amp;lt;strong&amp;gt;${this.files.length}&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&amp;lt;span style=&amp;quot;font-size:11px; color:#2da44e;&amp;quot;&amp;gt;(из папки: ${rootFolderName})&amp;lt;/span&amp;gt;`;
          } else {
              folderStatus.textContent = &amp;quot;Папка не выбрана&amp;quot;;
          }
          checkInputsValidity();
      });&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;      // Открытие модалки
      btnCreateProject.addEventListener(&amp;#039;click&amp;#039;, function() {
          newProjectName.value = &amp;#039;&amp;#039;;
          folderInput.value = &amp;#039;&amp;#039;; // Сбрасываем выбранные файлы
          folderStatus.textContent = &amp;quot;Папка не выбрана&amp;quot;;
          if (modalErrorBox) modalErrorBox.classList.add(&amp;#039;hidden&amp;#039;);
          btnModalSubmit.disabled = true;
          btnModalSubmit.style.opacity = &amp;quot;0.6&amp;quot;;
          projectModal.classList.remove(&amp;#039;hidden&amp;#039;);
          newProjectName.focus();
      });&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;      // Отмена
      btnModalCancel.addEventListener(&amp;#039;click&amp;#039;, function() {
          projectModal.classList.add(&amp;#039;hidden&amp;#039;);
      });&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;      // Нажатие на кнопку &amp;quot;Загрузить&amp;quot; -&amp;gt; отправка терабайтов кода по AJAX
      btnModalSubmit.addEventListener(&amp;#039;click&amp;#039;, async function() {
          const projectName = newProjectName.value.trim();
          if (modalErrorBox) modalErrorBox.classList.add(&amp;#039;hidden&amp;#039;);&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;          const formData = new FormData();
          formData.append(&amp;#039;name&amp;#039;, projectName);&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;          // КРИТИЧЕСКИ ВАЖНО: Пакуем файлы вместе с их путями вложения
          for (let i = 0; i &amp;lt; folderInput.files.length; i++) {
              let file = folderInput.files[i];
              formData.append(&amp;#039;project_files[]&amp;#039;, file);
              // Передаем бэкенду относительный путь (например: &amp;quot;my_proj/src/main.php&amp;quot;)
              formData.append(&amp;#039;project_paths[]&amp;#039;, file.webkitRelativePath);
          }&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;          // Меняем статус кнопки на время тяжелой загрузки
          btnModalSubmit.disabled = true;
          btnModalSubmit.textContent = &amp;quot;Загрузка...&amp;quot;;&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;          try {
              const response = await fetch(&amp;#039;backend/router.php?action=create_project&amp;#039;, {
                  method: &amp;#039;POST&amp;#039;,
                  body: formData
              });
              const result = await response.json();
              
              if (result.success) {
                  projectModal.classList.add(&amp;#039;hidden&amp;#039;);
                  btnModalSubmit.textContent = &amp;quot;Загрузить&amp;quot;;
                  location.reload();
              } else {
                  btnModalSubmit.disabled = false;
                  btnModalSubmit.textContent = &amp;quot;Загрузить&amp;quot;;
                  if (modalErrorBox) {
                      modalErrorBox.textContent = result.error;
                      modalErrorBox.classList.remove(&amp;#039;hidden&amp;#039;);
                  }
              }
          } catch (error) {
              // Возвращаем кнопку в исходное рабочее состояние
              btnModalSubmit.disabled = false;
              btnModalSubmit.textContent = &amp;quot;Загрузить&amp;quot;;
              
              // КРАСИВО ВЫВОДИМ ОШИБКУ СЕТИ В ТВОЮ ПЛАШКУ БЕЗ ВСЯКИХ АЛЕРТОВ
              if (modalErrorBox) {
                  modalErrorBox.textContent = &amp;quot;Критическая ошибка отправки файлов на сервер.&amp;quot;;
                  modalErrorBox.classList.remove(&amp;#039;hidden&amp;#039;);
              }
          }
      });
  }&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;  // Локальное хранилище для текстов текущего выбранного релиза,
  // чтобы переключать вкладки мгновенно без повторных запросов к серверу
  let currentReleaseTexts = {
      readme: &amp;#039;&amp;#039;,
      license: &amp;#039;&amp;#039;,
      comment: &amp;#039;&amp;#039;,
      log: &amp;#039;Здесь будет выводиться лог действий (100 строк)...&amp;#039;
  };&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;  /**
   * Отрисовка таблицы файлов в верхнем окне
   * @param {Array} files Массив файлов из JSON
   */
  function renderFilesTable(files) {
      if (!files || files.length === 0) {
          filesList.innerHTML = `&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;4&amp;quot; class=&amp;quot;text-center text-muted&amp;quot;&amp;gt;В данном релизе нет файлов для скачивания.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;`;
          return;
      }&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;      let html = &amp;#039;&amp;#039;;
      files.forEach(file =&amp;gt; {
          const icon = file.is_dir ? &amp;#039;📁&amp;#039; : &amp;#039;📄&amp;#039;;
          html += `
              &amp;lt;tr&amp;gt;
                  &amp;lt;td&amp;gt;&amp;lt;span style=&amp;quot;margin-right: 8px;&amp;quot;&amp;gt;${icon}&amp;lt;/span&amp;gt; ${escapeHtml(file.name)}&amp;lt;/td&amp;gt;
                  &amp;lt;td class=&amp;quot;text-muted&amp;quot;&amp;gt;—&amp;lt;/td&amp;gt; &amp;lt;!-- Примечания (коммиты) прикрутим позже через .meta.json --&amp;gt;
                  &amp;lt;td class=&amp;quot;text-muted&amp;quot;&amp;gt;${file.date}&amp;lt;/td&amp;gt;
                  &amp;lt;td style=&amp;quot;text-align: right;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;text-muted&amp;quot; style=&amp;quot;font-size: 12px;&amp;quot;&amp;gt;${file.size}&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;
              &amp;lt;/tr&amp;gt;
          `;
      });
      filesList.innerHTML = html;
  }&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;  // Вспомогательная функция защиты от XSS при отрисовке имен файлов
  function escapeHtml(string) {
      return String(string).replace(/&amp;amp;/g, &amp;#039;&amp;amp;amp;&amp;#039;).replace(/&amp;lt;/g, &amp;#039;&amp;amp;lt;&amp;#039;).replace(/&amp;gt;/g, &amp;#039;&amp;amp;gt;&amp;#039;).replace(/&amp;quot;/g, &amp;#039;&amp;amp;quot;&amp;#039;);
  }&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;  // 1. СЛУШАЕМ ВЫБОР РЕЛИЗА В ВЫПАДАЮЩЕМ СПИСКЕ
  releasesDropdown.addEventListener(&amp;#039;change&amp;#039;, async function() {
      const selectedRelease = this.value;&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;      if (!selectedRelease) {
          // Если сбросили выбор — возвращаем интерфейс в исходное состояние
          btnDownloadZip.disabled = true;
          filesList.innerHTML = `&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;4&amp;quot; class=&amp;quot;text-center text-muted&amp;quot;&amp;gt;Выберите релиз из списка выше для просмотра файлов...&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;`;
          textEditor.value = &amp;#039;Текст файла отсутствует или релиз не выбран...&amp;#039;;
          return;
      }&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;      filesList.innerHTML = `&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;4&amp;quot; class=&amp;quot;text-center text-muted&amp;quot;&amp;gt;Загрузка данных релиза...&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;`;&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;      // Дергаем наш апи-модуль
      const result = await Api.getReleaseData(selectedRelease);&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;      if (result.success) {
          // Активируем кнопку ZIP
          btnDownloadZip.disabled = false;
          
          // Сохраняем тексты в память для вкладок
          currentReleaseTexts.readme = result.texts.readme || &amp;#039;Файл README.txt пуст.&amp;#039;;
          currentReleaseTexts.license = result.texts.license || &amp;#039;Файл LICENSE.txt пуст.&amp;#039;;
          currentReleaseTexts.comment = result.texts.comment || &amp;#039;Файл COMMENT.txt пуст.&amp;#039;;
          
          // Отрисовываем файлы в таблице верхнего окна
          renderFilesTable(result.files);&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;          // Автоматически показываем текст той вкладки, которая сейчас активна (по умолчанию README)
          const activeTab = document.querySelector(&amp;#039;.tab-btn.active&amp;#039;).getAttribute(&amp;#039;data-target&amp;#039;);
          textEditor.value = currentReleaseTexts[activeTab];
      } else {
          alert(&amp;quot;Ошибка загрузки: &amp;quot; + result.error);
          filesList.innerHTML = `&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;4&amp;quot; class=&amp;quot;text-center&amp;quot; style=&amp;quot;color: #cf222e;&amp;quot;&amp;gt;${result.error}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;`;
      }
  });&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;  // 2. СЛУШАЕМ ПЕРЕКЛЮЧЕНИЕ ВКЛАДОК НИЖНЕГО ОКНА
  tabButtons.forEach(button =&amp;gt; {
      button.addEventListener(&amp;#039;click&amp;#039;, function() {
          tabButtons.forEach(btn =&amp;gt; btn.classList.remove(&amp;#039;active&amp;#039;));
          this.classList.add(&amp;#039;active&amp;#039;);
          
          const targetTab = this.getAttribute(&amp;#039;data-target&amp;#039;);
          
          // Вытаскиваем текст из памяти без лишних запросов к PHP
          textEditor.value = currentReleaseTexts[targetTab] || `Текст для вкладки ${targetTab.toUpperCase()} отсутствует.`;
      });
  });&lt;/pre&gt;

&lt;p&gt;
});
&lt;/p&gt;
</description>
            <author>vladpolskiy@undisclosed.example.com (VladPolskiy)</author>
            <pubDate>Sat, 27 Jun 2026 12:35:07 +0000</pubDate>
        </item>
        <item>
            <title>voice_system.js - удалено</title>
            <link>http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?id=voice_system.js&amp;rev=1780842087</link>
            <description>
&lt;p&gt;
/&lt;strong&gt;
 * ============================================================================
 * ЕВА - ИНТЕЛЛЕКТУАЛЬНЫЙ ГОЛОСОВОЙ ПОМОЩНИК
 * Файл: logic.js
 * Назначение: Главный диспетчер ядра. Управление состояниями, маршрутизация 
 *             речевых конвейеров, автосохранение, таймеры и интеграция баз JSON
 * Версия: v5.8.2 (Ultra-Safe Tagging &amp;amp; Data Folder Edition)
 * ============================================================================
 */

&lt;em&gt; ============================================================================
&lt;/em&gt; БЛОК 1: ИНИЦИАЛИЗАЦИЯ И СИНХРОНИЗАЦИЯ ГЛОБАЛЬНЫХ ПЕРЕМЕННЫХ СЕССИИ
&lt;em&gt; ============================================================================

&lt;/em&gt; Флаг ожидания выбора пользователя: true, если Ева ждет команды (Поищи / Ответ / Отмена)
window.isWaitingDecision = window.isWaitingDecision || false;

&lt;em&gt; Временное хранилище вопроса пользователя, на который отсутствует ответ в локальной базе
window.pendingQuestion   = window.pendingQuestion || «»;

&lt;/em&gt; Хранилище вопроса для механизма прямого интерактивного пошагового обучения
window.lastQ             = window.lastQ || «»;

&lt;em&gt; Флаг блокировки: true, пока Ева воспроизводит длинный текст (статью), полученный из интернета
window.isSpeakingWiki    = window.isSpeakingWiki || false;

&lt;/em&gt; Флаг активности речевого синтезатора: true, когда Ева физически произносит фразу через TTS
window.isEvaSpeaking     = window.isEvaSpeaking || false;

&lt;em&gt; Глобальный объект для хранения структурированных массивов данных из баз JSON
window.allData           = window.allData || { base: [], aiBase: [], wiki: [], settings: {} };

&lt;/em&gt; Глобальное время ожидания проактивности Евы по умолчанию (в миллисекундах)
window.IDLE_TIME         = window.IDLE_TIME || 30000;


&lt;em&gt; ============================================================================
&lt;/em&gt; БЛОК 2: ВСПОМОГАТЕЛЬНЫЕ И СЛУЖЕБНЫЕ МЕТОДЫ (ПОЛИФИЛЫ РЕЧЕВОГО ТРАКТА)
&lt;em&gt; ============================================================================

/&lt;strong&gt;
 * Проверка и регистрация глобальной функции синтеза речи.
 * Интегрировано с локальным движком Piper TTS через бэкенд на Synology NAS.
 * @param {string} text - Строка текста, которую необходимо озвучить.
 */
if (typeof window.speak !== &amp;#039;function&amp;#039;) {
    window.speak = function(text) {
        console.log(«[TTS Попытка вызова полифила Piper]:», text);
        
        if (!text) return;

        &lt;em&gt; Прерываем любой текущий звук Piper, чтобы фразы не накладывались друг на друга
        if (window.evaAudioPlayer) { 
            window.evaAudioPlayer.pause(); 
        }

        &lt;/em&gt; Включаем глобальный флаг активности речи
        window.isEvaSpeaking = true;

        &lt;em&gt; Формируем запрос к вашему рабочему бэкенду tts.php на Synology
        const ttsApiUrl = `/ai/tts.php?text=${encodeURIComponent(text)}`;
        window.evaAudioPlayer = new Audio(ttsApiUrl);

        &lt;/em&gt; Функция сброса флага при окончании звука или ошибке
        const resetSpeechState = () ⇒ { 
            window.isEvaSpeaking = false; 
        };

        &lt;em&gt; Назначаем триггеры изменения глобального состояния активности речи
        window.evaAudioPlayer.onended = resetSpeechState;
        window.evaAudioPlayer.onerror = resetSpeechState;

        &lt;/em&gt; Передаем объект аудио в плеер браузера
        window.evaAudioPlayer.play().catch&lt;sup&gt;&lt;a href=&quot;#fn__1&quot; id=&quot;fnt__1&quot; class=&quot;fn_top&quot;&gt;1)&lt;/a&gt;&lt;/sup&gt;
&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
&lt;div class=&quot;fn&quot;&gt;&lt;sup&gt;&lt;a href=&quot;#fnt__1&quot; id=&quot;fn__1&quot; class=&quot;fn_bot&quot;&gt;1)&lt;/a&gt;&lt;/sup&gt; 
&lt;div class=&quot;content&quot;&gt;err) ⇒ {&lt;pre class=&quot;code&quot;&gt;          console.warn(&amp;quot;[TTS Ошибка]: Воспроизведение заблокировано политикой браузера. Нужен клик.&amp;quot;);
          resetSpeechState();
      });
  };&lt;/pre&gt;
}



&lt;em&gt; ============================================================================
&lt;/em&gt; БЛОК 3: УПРАВЛЕНИЕ ЖИЗНЕННЫМ ЦИКЛОМ ПРИЛОЖЕНИЯ (МЕНЕДЖЕР ЗАПУСКА STARTAPP)
&lt;em&gt; ============================================================================

/&lt;strong&gt;
 * Главная асинхронная функция инициализации Евы.
 * Выполняет каскадную загрузку локальных баз знаний из папки data/и подготавливает UI.
 */
async function startApp() {
    try {
        console.log(«[Инициализация]: Запуск загрузки баз данных из папки data/…»);
        
        &lt;em&gt; Асинхронно запрашиваем чтение всех файлов через внешний модуль Database из папки data/
        const allData = await Database.loadAll(); 
        
        &lt;/em&gt; Проверяем валидность структуры полученного объекта и наличие основной базы
        if (allData &amp;amp;&amp;amp; allData.base) {
            &lt;em&gt; КРИТИЧЕСКИЙ ШАГ: Дублируем данные в глобальное окно для доступности из любой точки системы
            window.allData = allData; 
            
            &lt;/em&gt; Передаем загруженные массивы в аналитический модуль нейросети (ИИ-мозг)
            AI.setData(allData);  
            
            &lt;em&gt; ПРИНУДИТЕЛЬНОЕ ОБНОВЛЕНИЕ ЛИЧНОСТИ ИЗ SETTINGS.JSON
            if (allData.settings) {
                if (allData.settings.voice &amp;amp;&amp;amp; typeof EvaConfig !== &amp;#039;undefined&amp;#039;) {
                    &lt;/em&gt; Заменяем сухие захардкоженные параметры голоса в config.js на серверные ползунки
                    EvaConfig.voice.pitch = allData.settings.voice.pitch;
                    EvaConfig.voice.rate = allData.settings.voice.rate;
                    EvaConfig.voice.volume = allData.settings.voice.volume;
                }
                
                &lt;em&gt; СИНХРОНИЗАЦИЯ ВСЕХ 8 КИБЕР-ЭМОЦИЙ И ШЕПОТА ИЗ АДМИНКИ НА ЛЕТУ
                if (allData.settings.emotions &amp;amp;&amp;amp; typeof EvaConfig !== &amp;#039;undefined&amp;#039;) {
                    for (let emoKey in allData.settings.emotions) {
                        if (EvaConfig.emotions[emoKey]) {
                            EvaConfig.emotions[emoKey].pitch = allData.settings.emotions[emoKey].pitch;
                            EvaConfig.emotions[emoKey].rate = allData.settings.emotions[emoKey].rate;
                            EvaConfig.emotions[emoKey].volume = allData.settings.emotions[emoKey].volume;
                            EvaConfig.emotions[emoKey].prefix = allData.settings.emotions[emoKey].prefix;
                        } else {
                            &lt;/em&gt; Если эмоции не было в базовом коде (например, страх или шёпот), создаем её на лету
                            EvaConfig.emotions[emoKey] = allData.settings.emotions[emoKey];
                        }
                    }
                }
            }
			
            &lt;em&gt; Обновляем счетчик записей на графическом интерфейсе пользователя
            Visual.updateLog(`READY (${allData.base.length})`); 
            
            &lt;/em&gt; Переключаем визуальное состояние аватара в режим дыхания/ожидания
            Visual.setState(&amp;#039;wait&amp;#039;); 
            
            &lt;em&gt; Если кнопка инициализации найдена в DOM, активируем её неоновую подсветку
            if (window.mainBtn) window.mainBtn.className = &amp;#039;btn-start-neon&amp;#039;;
            
            console.log(«[Инициализация]: Успешно завершена. Ева готова к работе.»);
        }
    } catch (e) {
        &lt;/em&gt; Логируем критическую ошибку (например, повреждение JSON файла или отсутствие файлов)
        console.error(«[Критическая ошибка инициализации]:», e);
        
        &lt;em&gt; Выводим тревожный статус на главный экран приложения
        Visual.updateLog(«ERROR»);
    }
}


&lt;/em&gt; ============================================================================
&lt;em&gt; БЛОК 4: ИНТЕГРАЦИЯ И ПАРСИНГ РЕЗУЛЬТАТОВ ИЗ СЕТИ ИНТЕРНЕТ (WIKIPEDIA)
&lt;/em&gt; ============================================================================

/&lt;/strong&gt;
 * Обработчик успешного получения данных из Wikipedia.
 * Выполняет вывод текста на экран, чанк-анимацию бегущей строки и запускает озвучку.
 * @param {string} responseText - Текст статьи, возвращенный парсером.
 * @param {string|null} incomingQuestion - Вопрос, на который был осуществлен поиск.
 */
function onWikiResultReceived(responseText, incomingQuestion = null) {
    &lt;/em&gt; Активируем системные блокировки, защищающие от прерывания речи новыми звуками микрофона&lt;pre class=&quot;code&quot;&gt;  window.isSpeakingWiki = true;
  window.isWaitingDecision = true; &lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;  // Вычисляем итоговый вопрос: берем переданный или вытягиваем из системного буфера ожидания
  const finalQuestion = incomingQuestion || window.pendingQuestion;
  console.log(&amp;quot;[Wiki Модуль]: Запуск обработки статьи. Вопрос:&amp;quot;, finalQuestion);
  // 💥 ИНТЕГРАЦИЯ СЕТЕВЫХ НАСТРОЕК: Извлекаем оранжевые подсказки из файла data/settings.json
  const currentDecisionHints = window.allData?.settings?.hints?.decision_hints || &amp;quot;ПОИЩИ / ПОДУМАЙ / ОТВЕТ... / ОТМЕНА&amp;quot;;
  
  // Принудительно выводим актуальные подсказки на верхний статус-бар экрана Евы
  if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.updateHints === &amp;#039;function&amp;#039;) {
      Visual.updateHints(true, currentDecisionHints);
  }&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;  // Добавляем полноценный блок ответа Евы в графическое окно диалога чата
  if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.addMsg === &amp;#039;function&amp;#039;) {
      Visual.addMsg(responseText, &amp;#039;eva-msg&amp;#039;);
  }
  
  // РЕАЛИЗАЦИЯ БЕГУЩЕЙ СТРОКИ: Дробим текст статьи на массив отдельных слов по пробелам
  const words = responseText.split(&amp;quot; &amp;quot;);
  let currentWordIndex = 0;&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;  // Создаем цикличный интервал для симуляции синхронного чтения текста Евой на экране
  const textTickerInterval = setInterval(() =&amp;gt; {
      // Условие остановки: массив слов исчерпан или внешняя логика принудительно сбросила флаг блокировки
              // 💥 АППАРАТНАЯ ЗАЩИТА: Останавливаем интервал только если слова закончились И синтезатор полностью замолчал
      if (currentWordIndex &amp;gt;= words.length || (!window.isSpeakingWiki &amp;amp;&amp;amp; !window.speechSynthesis.speaking)) {
          clearInterval(textTickerInterval);
          
          // Сбрасываем текст живой плашки в исходное состояние тишины
          if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.setLiveText === &amp;#039;function&amp;#039;) {
              Visual.setLiveText(&amp;quot;&amp;quot;);
          }
          return;
      }&lt;/pre&gt;

&lt;pre class=&quot;code&quot;&gt;      // Вырезаем порцию из 4-х слов для плавного отображения на экране
      const chunk = words.slice(currentWordIndex, currentWordIndex + 4);
      const tickerText = chunk.join(&amp;quot; &amp;quot;);&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;      // Отправляем сформированную порцию слов в текстовое поле живого вывода (синяя плашка статус-бара)
      if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.setLiveText === &amp;#039;function&amp;#039;) {
          Visual.setLiveText(tickerText);
      }&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;      // Сдвигаем курсор индекса вперед на размер обработанной порции
      currentWordIndex += 4;
  }, 1500); // Оптимальный интервал чтения порции в полторы секунды&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;  // Передаем полную статью на озвучивание в TTS-движок голосовой системы
  speak(responseText);&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;  // Валидация данных для запуска фонового автоматического сохранения в энциклопедическую базу wiki_base.json
  if (finalQuestion &amp;amp;&amp;amp; finalQuestion.length &amp;gt; 0 &amp;amp;&amp;amp; responseText.length &amp;gt; 10) {
      console.log(&amp;quot;[Wiki Модуль]: Условия выполнены. Отправка статьи на автосохранение...&amp;quot;);
      // Вызываем функцию фонового экспорта данных в базу знаний
      if (typeof autoSaveToWiki === &amp;#039;function&amp;#039;) {
          autoSaveToWiki(finalQuestion, responseText);
      } else {
          console.warn(&amp;quot;[Wiki Модуль Предупреждение]: Функция autoSaveToWiki не обнаружена в каскаде скриптов.&amp;quot;);
      }
  } else {
      // Если статья пустая или некорректная, превентивно снимаем блокировки и усыпляем микрофон
      window.isSpeakingWiki = false;
      window.isWaitingDecision = false;
      if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.updateHints === &amp;#039;function&amp;#039;) {
          Visual.updateHints(false);
      }
  }&lt;/pre&gt;
}


&lt;em&gt; ============================================================================
&lt;/em&gt; БЛОК 5: ИНТЕРФЕЙСНЫЙ ОБРАБОТЧИК ГЛАВНОЙ УПРАВЛЯЮЩЕЙ КНОПКИ
&lt;em&gt; ============================================================================

if (window.mainBtn) {
    /&lt;strong&gt;
     * Обработка нажатия на центральную неоновую кнопку управления Евой.
     * Реализует два режима: Вход (Активация микрофона) и Выход (Сортировка и сохранение баз).
     */
    window.mainBtn.onclick = async () ⇒ {
        
        &lt;em&gt; РЕЖИМ А: Приложение спало (window.isLive === false). Запускаем сессию.
        if (!window.isLive) {
            window.isLive = true;   &lt;/em&gt; Переводим систему в статус «В эфире»
            window.freeTalk = false; &lt;em&gt; По умолчанию включаем режим обращения по имени
            
            &lt;/em&gt; Меняем текстовое содержание и стиль кнопки на стоп-режим (красный неон)
            window.mainBtn.innerText = «ВЫЙТИ И СОХРАНИТЬ»;
            window.mainBtn.className = &amp;#039;btn-stop-neon&amp;#039;;
            
            &lt;em&gt; Инициализируем аудио-контекст захвата голоса и запускаем анализ частот микрофона
            if (typeof initVoiceSystem === &amp;#039;function&amp;#039;) initVoiceSystem();
            if (typeof startMicLevel === &amp;#039;function&amp;#039;) await startMicLevel();

            &lt;/em&gt; Извлекаем случайное приветствие Евы из конфигурационного файла проекта
            const hello = EvaConfig.getRandomGreeting(); 
            speak(hello); 
            Visual.addMsg(hello, &amp;#039;eva-msg&amp;#039;);
            
            &lt;em&gt; Запускаем таймер слежения за активностью пользователя
            resetIdleTimer();
            
        } else {
            &lt;/em&gt; РЕЖИМ Б: Приложение активно. Пользователь завершает сессию. Сортируем память.
            window.isLive = false;
            window.mainBtn.innerText = «СОРТИРОВКА…»; 

			&lt;em&gt; 💥 МГНОВЕННЫЙ ЗАПУСК АВТОМАТИЧЕСКОГО СЕРВЕРНОГО БЭКАПА 5 БАЗ ДАННЫХ
            try {
                console.log(«[Бэкап Модуль]: Инициирую создание точки восстановления перед выходом…»);
                const backupResponse = await fetch(&amp;#039;admin.php?api=create_backup&amp;#039;);
                if (backupResponse.ok) {
                    const backupData = await backupResponse.json();
                    if (backupData.status === &amp;#039;ok&amp;#039;) {
                        console.log(«%c[Бэкап Модуль]: Базы успешно заархивированы. Метка: » + backupData.timestamp, «color: green; font-weight: bold;»);
                    }
                }
            } catch (backupErr) {
                console.warn(«[Бэкап Модуль Предупреждение]: Не удалось создать резервную копию:», backupErr);
            }

            &lt;/em&gt; Сбрасываем фоновые таймеры и деактивируем медиа-потоки записи звука
            if (window.idleTimer) clearTimeout(window.idleTimer);
            if (window.rec) try { window.rec.stop(); } catch(e) {}

            &lt;em&gt; ИНТЕЛЛЕКТУАЛЬНАЯ СОРТИРОВКА: Разделяем временный буфер памяти AI.memory
            const wikiData = AI.memory.filter(item ⇒ item.isWiki === true);
            const baseData = AI.memory.filter(item ⇒ item.isWiki !== true);

            &lt;/em&gt; Очищаем временные маркеры &amp;#039;isWiki&amp;#039;, чтобы они не засоряли итоговые файлы базы данных
            wikiData.forEach(item ⇒ delete item.isWiki);

            try {
                console.log(«[Сохранение]: Запуск параллельной отправки данных на сервер в папку data/…»);
                
                &lt;em&gt; Асинхронно отправляем массив базовых знаний на обработку скрипту save.php (в папку data/)
                const saveBase = fetch(&amp;#039;save.php&amp;#039;, {
                    method: &amp;#039;POST&amp;#039;,
                    headers: { &amp;#039;Content-Type&amp;#039;: &amp;#039;application/json&amp;#039; },
                    body: JSON.stringify(baseData)
                });

                &lt;/em&gt; Одновременно отправляем энциклопедические данные скрипту save_wiki.php (в папку data/)
                const saveWiki = fetch(&amp;#039;save_wiki.php&amp;#039;, {
                    method: &amp;#039;POST&amp;#039;,
                    headers: { &amp;#039;Content-Type&amp;#039;: &amp;#039;application/json&amp;#039; },
                    body: JSON.stringify(wikiData)
                });

                &lt;em&gt; Синхронизируем завершение обоих сетевых запросов
                const [res1, res2] = await Promise.all([saveBase, saveWiki]);

                &lt;/em&gt; Проверяем успешность ответов сервера (HTTP статус 200)
                if (res1.ok &amp;amp;&amp;amp; res2.ok) {
                    window.mainBtn.innerText = «СОХРАНЕНО!»;
                    &lt;em&gt; Выполняем мягкую перезагрузку страницы через 1 секунду для обновления кэша данных
                    setTimeout(() ⇒ location.reload(), 1000);&lt;pre class=&quot;code&quot;&gt;              } else {
                  throw new Error(&amp;quot;Сервер ответил отказом при записи файлов.&amp;quot;);
              }
          } catch (err) {
              console.error(&amp;quot;[Ошибка сохранения баз данных в папку data/]:&amp;quot;, err);
              alert(&amp;quot;Не удалось сохранить данные. Проверьте права доступа (CHMOD 777) к папке data.&amp;quot;);
              
              // Возвращаем интерфейс в рабочее состояние для предотвращения потери сессии
              window.mainBtn.innerText = &amp;quot;ОШИБКА&amp;quot;;
              window.isLive = true; 
          }
      }
  };&lt;/pre&gt;
}


&lt;em&gt; ============================================================================
&lt;/em&gt; БЛОК 6: ГЛАВНЫЙ АСИНХРОННЫЙ КОНВЕЙЕР ОБРАБОТКИ РЕЧИ И КОМАНД
&lt;em&gt; ============================================================================

/&lt;strong&gt;
 * Объединенный монолитный обработчик распознанной речи.
 * Проводит входную строку через каскад фильтров: режимы, перехваты решений, инструменты, лингвистический анализ.
 * @param {string} text - Распознанная строка текста от голосового движка.
 */
async function handleSpeech(text) {
    &lt;em&gt; Предохранитель А: Если Ева говорит в данный момент, полностью игнорируем входящий сигнал
    if (window.isEvaSpeaking) return; 
    
    &lt;/em&gt; Предохранитель Б: Отсекаем пустые срабатывания микрофона или шумы
    if (!text || text.trim().length &amp;lt; 1) return;

    &lt;em&gt; Сбрасываем внутренний таймер инициативы, фиксируя активность пользователя
    if (typeof resetIdleTimer === &amp;#039;function&amp;#039;) resetIdleTimer(); 

    &lt;/em&gt; ПРИНУДИТЕЛЬНЫЙ ВЫВОД: Отображаем фразу пользователя в чате для исключения эффекта зависания
    if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.addMsg === &amp;#039;function&amp;#039;) {
        Visual.addMsg(text, &amp;#039;user-msg&amp;#039;);
    }

    &lt;em&gt; Очищаем текстовую плашку предварительного (живого) распознавания речевого потока
    if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.setLiveText === &amp;#039;function&amp;#039;) {
        Visual.setLiveText(«»); 
    }

    &lt;/em&gt; Приводим строку к нижнему регистру и очищаем от концевых пробелов для точного сравнения
    const cleanRaw = text.toLowerCase().trim();
    console.log(«[Речевой конвейер]: Начинаю анализ фразы:», cleanRaw);

    &lt;em&gt; ————————————————————————
    &lt;/em&gt; ШАГ 6.0: ПЕРЕКЛЮЧЕНИЕ РЕЖИМОВ ОБЩЕНИЯ (Мгновенная реакция)
    &lt;em&gt; ————————————————————————
    
    &lt;/em&gt; Переход в режим свободной беседы (без постоянного повторения имени «Ева»)
    if (cleanRaw.includes(«давай без имени») || cleanRaw.includes(«давай поболтаем») || cleanRaw.includes(«давай поговорим»)) {
        window.freeTalk = true;
        clearTimeout(window.idleTimer); 
        if (Visual.container) Visual.container.classList.add(&amp;#039;free-talk-mode&amp;#039;);
        if (window.mainBtn) window.mainBtn.className = &amp;#039;btn-free-neon&amp;#039;;
        
        const resp = Tools.humanize(window.allData?.settings?.phrases?.freetalk_on || «хорошо, давай поболтаем без имен» || «ладушки, давай без имен»);
        speak(resp);
        Visual.addMsg(resp, &amp;#039;eva-msg&amp;#039;);
        resetIdleTimer();
        return; &lt;em&gt; Прерываем конвейер
    }

    &lt;/em&gt; Возврат в строгий режим (Ева реагирует только тогда, когда зовут по имени)
    if (cleanRaw.includes(«хватит болтать») || cleanRaw.includes(«верни имя»)) {
        window.freeTalk = false;
        if (Visual.container) Visual.container.classList.remove(&amp;#039;free-talk-mode&amp;#039;);
        if (window.mainBtn) window.mainBtn.className = &amp;#039;btn-stop-neon&amp;#039;;
        
        const resp = Tools.humanize(window.allData?.settings?.phrases?.freetalk_off || «поняла, теперь зови меня по имени»);
        speak(resp);
        Visual.addMsg(resp, &amp;#039;eva-msg&amp;#039;);
        resetIdleTimer();
        return; &lt;em&gt; Прерываем конвейер
    }

    &lt;/em&gt; ————————————————————————
    &lt;em&gt; ШАГ 6.1: ПЕРЕХВАТ СОСТОЯНИЯ ОЖИДАНИЯ ВЫБОРА (window.isWaitingDecision)
    &lt;/em&gt; ————————————————————————
    if (window.isWaitingDecision) {

        &lt;em&gt; Перехват 1.1: Полный сброс операции и закрытие модальных окон обучения
        if (cleanRaw.includes(«отмена») || cleanRaw.includes(«проехали») || cleanRaw.includes(«не надо») || cleanRaw === &amp;#039;выйти&amp;#039; || cleanRaw === &amp;#039;закрой&amp;#039;) {
            window.isWaitingDecision = false;
            window.pendingQuestion   = «»;
            window.isSpeakingWiki    = false;
            window.isEvaSpeaking     = false;

            &lt;/em&gt; Прячем оранжевые текстовые подсказки управления
            if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.updateHints === &amp;#039;function&amp;#039;) Visual.updateHints(false);

            &lt;em&gt; Закрываем любые диалоговые окна обучения через поиск &lt;abbr title=&quot;Cascading Style Sheets&quot;&gt;CSS&lt;/abbr&gt; селекторов в DOM
            const windows = document.querySelectorAll(&amp;#039;.learn-window, .learn-form, #learnModal, [id*=«learn»], [class*=«learn»]&amp;#039;);
            windows.forEach(win ⇒ {
                win.style.display = &amp;#039;none&amp;#039;;
                win.classList.remove(&amp;#039;active&amp;#039;, &amp;#039;open&amp;#039;, &amp;#039;show&amp;#039;);
            });

            &lt;/em&gt; Возвращаем аватар в режим ожидания и озвучиваем отмену
            if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.setState === &amp;#039;function&amp;#039;) Visual.setState(&amp;#039;wait&amp;#039;);
            
            &lt;em&gt; Динамическое считывание фразы отмены из настроек settings.json
            const resp = Tools.humanize(window.allData?.settings?.phrases?.cancel || «хорошо, отменяю» || «ладно, забыли» || «Oкей, проехали»);
            speak(resp);
            Visual.addMsg(resp, &amp;#039;eva-msg&amp;#039;);
            return; 
        }
        &lt;/em&gt; ————————————————————————————————————————————————————————————————————————
        &lt;em&gt; Перехват 1.2: Команда принудительного асинхронного поиска в Wikipedia
		&lt;/em&gt; ————————————————————————————————————————————————————————————————————————
            if (cleanRaw.includes(«поищи») || cleanRaw.includes(«ну поищи») || cleanRaw.includes(«что такое») || cleanRaw.includes(«кто такой») || cleanRaw.includes(«интернет»)) {
            if (window.pendingQuestion &amp;amp;&amp;amp; window.pendingQuestion.length &amp;gt; 0) {
                window.isWaitingDecision = false;
                
                &lt;em&gt; Сбрасываем интерфейсные маркеры и переводим аватар в режим размышления
                if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.updateHints === &amp;#039;function&amp;#039;) Visual.updateHints(false);
                if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.setState === &amp;#039;function&amp;#039;) Visual.setState(&amp;#039;think&amp;#039;); 
                
                if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.setLiveText === &amp;#039;function&amp;#039;) {
                    Visual.setLiveText(window.allData?.settings?.phrases?.wiki_searching || «Связываюсь с Википедией…»);
                }

                try {
                    let wikiAnswer = null;
                    &lt;/em&gt; Каскадный поиск доступного метода интеграции с &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; Википедии
                    &lt;em&gt; 💥 УМНАЯ МОДУЛЬНАЯ МАРШРУТИЗАЦИЯ: Передаем управление модулю инструментов
                    &lt;/em&gt; Tools.searchWiki сам заглянет в settings.json и выберет правильную папку навыка!
                    if (typeof Tools !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Tools.searchWiki === &amp;#039;function&amp;#039;) {
                        wikiAnswer = await Tools.searchWiki(window.pendingQuestion);
                    } else {
                        console.error(«[Речевой конвейер]: Критическая ошибка: Модуль Tools.searchWiki не обнаружен!»);
                    }


                    &lt;em&gt; Если статья была успешно найдена и запущена внутри onWikiResultReceived (Блок 4)
                    if (window.isSpeakingWiki === true || (wikiAnswer &amp;amp;&amp;amp; wikiAnswer.trim().length &amp;gt; 5)) {
                        console.log(«[Речевой конвейер]: Вики-запрос успешно обработан в Блоке 4. Подавление дублей сработало.»);
                        
                        &lt;/em&gt; Дополнительная подстраховка: если Блок 4 почему-то не вывел текст сам
                        if (window.isSpeakingWiki === false &amp;amp;&amp;amp; wikiAnswer &amp;amp;&amp;amp; wikiAnswer.trim().length &amp;gt; 5) {
                            speak(wikiAnswer);
                            Visual.addMsg(wikiAnswer, &amp;#039;eva-msg&amp;#039;);
                        }
                    } else {
                        &lt;em&gt; Сюда система придет только если Википедия действительно сбойнула (ошибка 404 или пусто)
                        window.isLearning = true;
                        if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.updateHints === &amp;#039;function&amp;#039;) {
                            Visual.updateHints(true, «НЕ ЗАПОМИНАЙ / НЕ СОХРАНЯЙ»);
                        }
                        const resp = window.allData?.settings?.phrases?.wiki_not_found || «В интернете не нашла. Научишь меня сам?»;
                        speak(resp);
                        Visual.addMsg(resp, &amp;#039;eva-msg&amp;#039;);
                    }
                } catch (e) {
                    &lt;/em&gt; ВОССТАНОВЛЕННЫЙ БЛОК ОБРАБОТКИ ОШИБОК: Фиксируем сбой и разблокируем UI
                    console.error(«[Ошибка вызова Wiki &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;]:», e);
                    window.isSpeakingWiki = false;
                    window.isWaitingDecision = false;
                }
                
                &lt;em&gt; Возвращаем аватар в режим прослушивания
                if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.setState === &amp;#039;function&amp;#039;) Visual.setState(&amp;#039;listen&amp;#039;); 
            } else {
                speak(«Что именно мне поискать в интернете?»);
            }
            return; 
        }

		&lt;/em&gt; ————————————————————————————————————————————————————————————————————————
        &lt;em&gt; Перехват 1.3: Команда ручного обучения текущему вопросу фразами «ответ [текст]»
		&lt;/em&gt; ————————————————————————————————————————————————————————————————————————
        if (cleanRaw.includes(«правильный ответ») || cleanRaw.includes(«ответ») || cleanRaw.includes(«запомни»)) {
            &lt;em&gt; Вырезаем системные триггеры, оставляя чистый текст ответа пользователя
            let userAnswer = cleanRaw.replace(/правильный ответ|ответ|запомни/g, «»).trim();
            
            if (userAnswer.length &amp;gt; 1) {
                &lt;/em&gt; Записываем пару Вопрос→Ответ в структуру оперативной памяти ИИ
                AI.learn(window.pendingQuestion, userAnswer);
                window.isWaitingDecision = false;
                
                if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.updateHints === &amp;#039;function&amp;#039;) {
                    Visual.updateHints(false);
                }
                
                &lt;em&gt; Динамическое считывание фразы успешного обучения из настроек settings.json
                const resp = Tools.humanize(window.allData?.settings?.phrases?.learned || «Запомнила, теперь я буду это знать!» || «Окей, запомнила» || «Записала!»);
                speak(resp);
                if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.addMsg === &amp;#039;function&amp;#039;) {
                    Visual.addMsg(resp, &amp;#039;eva-msg&amp;#039;);
                }
            } else {
                &lt;/em&gt; Если пользователь не назвал сам текст ответа, Ева запрашивает его
                speak(«Я слушаю, какой правильный ответ?»);
            }
            return; &lt;em&gt; Прерываем речевой конвейер на этом шаге
        }
		
		    &lt;/em&gt; ————————————————————————————————————————————————————————————————————————
			&lt;em&gt; Перехват 1.4: Команда принудительного обращения к локальной нейросети Ollama
			&lt;/em&gt; ————————————————————————————————————————————————————————————————————————
			if (cleanRaw.includes(«подумай») || cleanRaw.includes(«думай») || cleanRaw.includes(«ну подумай») || cleanRaw.includes(«хорошо, подумай») || cleanRaw.includes(«включи мозг») || cleanRaw.includes(«поразмысли»)) {
				if (window.pendingQuestion &amp;amp;&amp;amp; window.pendingQuestion.length &amp;gt; 0) {
					window.isWaitingDecision = false;
					
					&lt;em&gt; Гасим подсказки, включаем режим размышления Евы
					if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.updateHints === &amp;#039;function&amp;#039;) Visual.updateHints(false);
					if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.setState === &amp;#039;function&amp;#039;) Visual.setState(&amp;#039;think&amp;#039;);
					if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.setLiveText === &amp;#039;function&amp;#039;) {
						Visual.setLiveText(«Ева думает…»);
					}

					(async () ⇒ {
						try {
							&lt;/em&gt; Отправляем сохраненный вопрос в ollama.php
							const response = await fetch(&amp;#039;ollama.php&amp;#039;, { 
								method: &amp;#039;POST&amp;#039;,
								headers: { &amp;#039;Content-Type&amp;#039;: &amp;#039;application/json&amp;#039; },
								body: JSON.stringify({ message: window.pendingQuestion }) 
							});

							const data = await response.json();
							let aiResponse = data.message?.content || data.reply || «Не удалось сформулировать ответ.»;

							if (typeof Tools !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Tools.humanize === &amp;#039;function&amp;#039;) {
								aiResponse = Tools.humanize(aiResponse);
							}

							&lt;em&gt; 💾 Сохраняем диалог в базу знаний ai_base.json через save_ai.php
							fetch(&amp;#039;save_ai.php&amp;#039;, {
								method: &amp;#039;POST&amp;#039;,
								headers: { &amp;#039;Content-Type&amp;#039;: &amp;#039;application/json&amp;#039; },
								body: JSON.stringify({ q: window.pendingQuestion, a: aiResponse })
							})
							.then(res ⇒ res.json())
							.then(saveResult ⇒ console.log(«[База Данных ИИ]:», saveResult.message))
							.catch(err ⇒ console.error(«[База Данных ИИ Ошибка записи]:», err));

							&lt;/em&gt; Озвучка и вывод в чат речевого конвейера
							if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.setState === &amp;#039;function&amp;#039;) Visual.setState(&amp;#039;speak&amp;#039;);
							speak(aiResponse);
							if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.addMsg === &amp;#039;function&amp;#039;) {
								Visual.addMsg(aiResponse, &amp;#039;eva-msg&amp;#039;);
							}

							window.pendingQuestion = «»; &lt;em&gt; Очищаем буфер

						} catch (error) {
							console.error(«[Ollama Модуль Критическая ошибка]:», error);
							window.isWaitingDecision = true;
							if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.setState === &amp;#039;function&amp;#039;) Visual.setState(&amp;#039;listen&amp;#039;);
							speak(«Ошибка связи с нейросетью. Попробуйте ещё раз.»);
						}
					})();
				} else {
					speak(«О чём именно мне подумать?»);
				}
				return;
			}		
    }
    &lt;/em&gt; ————————————————————————
    &lt;em&gt; ШАГ 6.2: РЕЖИМ ПРЯМОГО ПОШАГОВОГО ИНТЕРАКТИВНОГО ОБУЧЕНИЯ (window.isLearning)
    &lt;/em&gt; ————————————————————————
    if (window.isLearning) {
        &lt;em&gt; Проверяем команду выхода из жесткого пошагового режима обучения фраз
        if (cleanRaw.includes(«не запоминай») || cleanRaw.includes(«отмена») || cleanRaw.includes(«проехали»)) {
            window.isLearning = false;
            if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.updateHints === &amp;#039;function&amp;#039;) Visual.updateHints(false);
            
            &lt;/em&gt; Динамическое считывание фразы сброса проехали (forgot) из админки личности Евы
            speak(Tools.humanize(window.allData?.settings?.phrases?.forgot || «хорошо, проехали»));
            return; 
        }
        
        &lt;em&gt; Обучаем систему: связываем прошлый зафиксированный вопрос window.lastQ с текущей репликой ответа
        AI.learn(window.lastQ, text);
        window.isLearning = false;
        if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.updateHints === &amp;#039;function&amp;#039;) Visual.updateHints(false);
        
        &lt;/em&gt; Динамическое считывание короткой фразы успеха (learned) для пошагового обучения
        speak(Tools.humanize(window.allData?.settings?.phrases?.learned || «запомнила» || «записала»));
        return; 
    }

    &lt;em&gt; ————————————————————————
    &lt;/em&gt; ШАГ 6.3: ИНСТРУМЕНТЫ АВТОМАТИЗАЦИИ (МАТЕМАТИКА, ВРЕМЯ, СЛОВАРЬ ХАРАКТЕРА)
    &lt;em&gt; ————————————————————————
    
    &lt;/em&gt; Проверка 3.1: Поиск совпадений в текстовой матрице характера личности Евы из tools.js
    const personalResp = Tools.processPersonality(cleanRaw);
    if (personalResp &amp;amp;&amp;amp; !window.isWaitingDecision) {
        speak(personalResp);
        Visual.addMsg(personalResp, &amp;#039;eva-msg&amp;#039;);
        return; 
    }

    &lt;em&gt; Проверка 3.2: Математический калькулятор (вычисление регулярными выражениями фраз типа «пять плюс два»)
    const mathResult = Tools.calculate(cleanRaw);
    if (mathResult) {
        speak(mathResult);
        Visual.addMsg(mathResult, &amp;#039;eva-msg&amp;#039;);
        return; 
    }

    &lt;/em&gt; Проверка 3.3: Запрос текущего системного времени или даты с веб-сервера
    if (cleanRaw.includes(«время») || cleanRaw.includes(«час») || cleanRaw.includes(«число»)) {
        const timeStr = await Tools.getServerDateTime();
        speak(timeStr);
        Visual.addMsg(timeStr, &amp;#039;eva-msg&amp;#039;);
        return; 
    }

    &lt;em&gt; ————————————————————————
    &lt;/em&gt; ШАГ 6.4: ПРОВЕРКА НАЛИЧИЯ ИМЕНИ (АКТИВАЦИОННЫЙ ФИЛЬТР ВХОДНОГО ПОТОКА)
    &lt;em&gt; ————————————————————————
    &lt;/em&gt; Система реагирует, если найдено имя «Ева», «Еву» ИЛИ активирован режим freeTalk (без имени)
    const hasName = cleanRaw.includes(«ева») || cleanRaw.includes(«еву») || window.freeTalk;
    if (!hasName) {
        &lt;em&gt; Если имя не произнесено, просто пишем текст в плашку, не запуская глубокий анализ логики баз данных
        Visual.setLiveText(text);
        return;
    }

    &lt;/em&gt; Вычленяем чистый запрос для передачи в ассоциативный ИИ-мозг (ai.js)
    const cleanForAI = text.replace(/ева|еву/gi, &amp;#039;&amp;#039;).trim();
    if (cleanForAI.length &amp;lt; 1) return; &lt;em&gt; Выходим, если пользователь назвал только имя Евы без вопроса
    
    &lt;/em&gt; Рендерим статус размышлений аватара на верхней панели
    Visual.setState(&amp;#039;think&amp;#039;);

    &lt;em&gt; ————————————————————————
    &lt;/em&gt; ШАГ 6.5: СЕМАНТИЧЕСКИЙ АССОЦИАТИВНЫЙ ПОИСК В БАЗАХ ЗНАНИЙ (AI.THINK)
    &lt;em&gt; ————————————————————————
	
	&lt;/em&gt; Каскад 1: Ищем в основной ассоциативной базе знаний
    let aiResult = (typeof AI !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof AI.think === &amp;#039;function&amp;#039;) ? AI.think(cleanForAI) : null;

    &lt;em&gt; Каскад 2: Если в основной базе пусто — ищем в базе ИИ (ai_base.json)
    if ((!aiResult || !aiResult.found) &amp;amp;&amp;amp; window.allData?.aiBase) {&lt;pre class=&quot;code&quot;&gt;      // Пробегаем по массиву вопросов ai_base.json, приводя строки к нижнему регистру
      const aiBaseMatch = window.allData.aiBase.find(item =&amp;gt; 
          item.questions &amp;amp;&amp;amp; item.questions.some(q =&amp;gt; q.toLowerCase().trim() === cleanForAI.toLowerCase())
      );&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;      if (aiBaseMatch) {
          console.log(&amp;quot;[Ева]: Ответ успешно найден в ai_base.json&amp;quot;);
          aiResult = {
              found: { answers: aiBaseMatch.answers || [&amp;quot;По памяти.&amp;quot;] },
              clean: cleanForAI
          };
      }
  }&lt;/pre&gt;


&lt;pre class=&quot;code&quot;&gt;  // Третий каскад: Если и в ai_base пусто — ищем в энциклопедической Wiki-базе (wiki_base.json)
  if ((!aiResult || !aiResult.found) &amp;amp;&amp;amp; window.allData?.wiki) {
      // Пробегаем по массиву вопросов wiki-базы, приводя строки к нижнему регистру
      const wikiMatch = window.allData.wiki.find(item =&amp;gt; 
          item.questions &amp;amp;&amp;amp; item.questions.some(q =&amp;gt; q.toLowerCase().trim() === cleanForAI.toLowerCase())
      );
      
      if (wikiMatch) {
          // ЗАЩИТНЫЙ МЕХАНИЗМ: Формируем искусственный массив answers, если структура Wiki-объекта отличается
          console.log(&amp;quot;[Ева]: Ответ успешно найден в wiki_base.json&amp;quot;);
          const fallbackAnswers = wikiMatch.answers || [wikiMatch.text || wikiMatch.description || &amp;quot;По записям.&amp;quot;];
          aiResult = { 
              found: { answers: fallbackAnswers || [&amp;quot;По записям.&amp;quot;] }, 
              clean: cleanForAI 
          };
      }
  }&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;  // ВЫВОД РЕЗУЛЬТАТОВ АНАЛИЗА БАЗ ДАННЫХ
  if (aiResult &amp;amp;&amp;amp; aiResult.found &amp;amp;&amp;amp; aiResult.found.answers &amp;amp;&amp;amp; aiResult.found.answers.length &amp;gt; 0) {
      // Реакция А: Ответ НАЙДЕН. Выбираем случайный вариант из массива ответов для живости диалога
      let response = aiResult.found.answers[Math.floor(Math.random() * aiResult.found.answers.length)];&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;      // Прогоняем сухой ответ через фильтр лингвистического очеловечивания и обращения по имени
      if (typeof Tools !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Tools.humanize === &amp;#039;function&amp;#039;) {
          response = Tools.humanize(response);     
      }&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;      // Переводим аватар в статус генерации реплики
      Visual.setState(&amp;#039;speak&amp;#039;);
      speak(response);
      Visual.addMsg(response, &amp;#039;eva-msg&amp;#039;);
      
      // Фиксируем контекст текущей ноды для обеспечения поддержки древовидных sub-веток
      if (typeof AI !== &amp;#039;undefined&amp;#039;) AI.currentContext = aiResult.found;
      
  } else {
      // ============================================================================
      // 💥 РЕАКЦИЯ Б: ОТВЕТ АБСОЛЮТНО НЕ НАЙДЕН В ПАМЯТИ ИИ ЕВЫ
      // Активируем шлюзы интерактивного диалога обучения и ожидания решения
      // ============================================================================
      window.isWaitingDecision = true; 
      window.pendingQuestion   = cleanForAI; 
      
      // Запоминаем текущий чистый вопрос для режима прямого пошагового обучения
      window.lastQ = cleanForAI;
      
      // Считываем строку оранжевых подсказок выбора действий из папки data/settings.json
      const currentDecisionHints = window.allData?.settings?.hints?.decision_hints || &amp;quot;ПОИЩИ / ПОДУМАЙ / ОТВЕТ... / ОТМЕНА&amp;quot;;
      
      // Обновляем оранжевые подсказки действий на верхнем статус-баре экрана Евы
      if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.updateHints === &amp;#039;function&amp;#039;) {
          Visual.updateHints(true, currentDecisionHints);
      }
      
      // Считываем главный предустановленный вопрос Евы из папки data/settings.json
      const prompt = window.allData?.settings?.phrases?.no_answer || &amp;quot;Я не знаю ответа, но могу подумать! А может подскажешь ответ? Или мне поискать в интернете?&amp;quot;;
      
      // Запускаем генерацию речи ИИ через TTS речевую систему voice_system.js
      speak(prompt);
      
      // Выводим текстовое облако сообщения ассистента в центральный чат приложения
      if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.addMsg === &amp;#039;function&amp;#039;) {
          Visual.addMsg(prompt, &amp;#039;eva-msg&amp;#039;);
      }
  }&lt;/pre&gt;
}


&lt;em&gt; ============================================================================
&lt;/em&gt; БЛОК 7: АВТОНОМНЫЙ ТАЙМЕР ИНИЦИАТИВЫ И ПРОАКТИВНОСТИ ЕВЫ (СКУКА)
&lt;em&gt; ============================================================================

/&lt;strong&gt;
 * Сброс и перезапуск таймера неактивности пользователя.
 * Если пользователь молчит, Ева с вероятностью 30% может проявить инициативу и задать вопрос сама.
 */
function resetIdleTimer() {
    &lt;em&gt; Стираем предыдущий запущенный таймер активности
    clearTimeout(window.idleTimer);
    
    &lt;/em&gt; Защитные условия: Ева молчит, если микрофон выключен, идет обучение или ожидается решение команды
    if (!window.isLive || window.isLearning || window.isWaitingDecision) return;
    
    &lt;em&gt; Запускаем новый таймер ожидания на базе глобальной конфигурации window.IDLE_TIME
    window.idleTimer = setTimeout(() ⇒ {
        &lt;/em&gt; Проверяем, не говорит ли Ева прямо сейчас, и вычисляем случайный шанс (30%)
        if (!window.speechSynthesis.speaking &amp;amp;&amp;amp; Math.random() ⇐ 0.3) {
            
            &lt;em&gt; Запрашиваем из ИИ случайную заготовку вопроса для пользователя
            const entry = AI.getEvaQuestionEntry();
            if (entry) {
                &lt;/em&gt; Выбираем случайный вариант вопроса, очеловечиваем его и воспроизводим
                const text = Tools.humanize(entry.answers[Math.floor(Math.random() * entry.answers.length)]);
                AI.currentContext = entry; &lt;em&gt; Запоминаем контекст для анализа ответа пользователя
                
                speak(text);
                Visual.addMsg(text, &amp;#039;eva-msg&amp;#039;);
            }
            &lt;/em&gt; Рекурсивно перезапускаем таймер для следующего шага проверки
            resetIdleTimer();
        } else {
            &lt;em&gt; Если условия рандома не прошли, просто уходим на новый круг ожидания
            resetIdleTimer();
        }
    }, window.IDLE_TIME);
}


&lt;/em&gt; ============================================================================
&lt;em&gt; БЛОК 8: СЕРВЕРНОЕ АВТОМАТИЧЕСКОЕ СОХРАНЕНИЕ ДАННЫХ И СБРОС БЛОКИРОВОК
&lt;/em&gt; ============================================================================

/&lt;/strong&gt;
 * Асинхронное автоматическое сохранение полученных из интернета знаний на server.
 * Выполняет обновление оперативной памяти, запись в файл и полную разблокировку UI.
 * @param {string} question - Вопрос пользователя.
 * @param {string} answer - Текст найденной статьи из Wikipedia.
 */
async function autoSaveToWiki(question, answer) {
    console.log(«[AutoSave Модуль]: Подготовка структуры объекта данных для записи…»);

    &lt;/em&gt; Создаем каноничную структуру сущности знаний для базы данных&lt;pre class=&quot;code&quot;&gt;  const newEntry = {
      type: &amp;quot;qa&amp;quot;,
      questions: [question.toLowerCase().trim()],
      answers: [answer],
      sub: []
  };&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;  // Проверяем существование массива и пушим новый элемент в оперативную память браузера
  if (!window.allData.wiki) window.allData.wiki = [];
  window.allData.wiki.push(newEntry);&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;  console.log(&amp;quot;[AutoSave Модуль]: Отправка обновленного массива в Database.saveWiki...&amp;quot;);
  
  // Асинхронно передаем массив модулю сохранения и дожидаемся ответа от сервера
  const success = await Database.saveWiki(window.allData.wiki);
  
  // Анализируем маркер успешности проведения дисковой операции записи сервером
  if (success) {
      console.log(&amp;quot;%c[AutoSave Модуль]: УСПЕШНО ЗАПИСАНО В wiki_base.json&amp;quot;, &amp;quot;color: green; font-weight: bold;&amp;quot;);
      
      // --- КРИТИЧЕСКИЙ СБРОС ВСЕХ СИСТЕМНЫХ БЛОКИРОВОК ДЛЯ ПОДДЕРЖАНИЯ ДИАЛОГА ---
      window.isWaitingDecision = false; // Разблокируем шлюзы обработки новых фраз (Слон, Бублик)
      window.pendingQuestion   = &amp;quot;&amp;quot;;     // Очищаем буфер временного вопроса
      window.isSpeakingWiki    = false;   // Отключаем защиту чтения статьи Википедии
      window.isEvaSpeaking     = false;    // Сбрасываем статус речи&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;      // --- ИНТЕРФЕЙСНАЯ ОЧИСТКА ЭКРАНА ---
      // Полностью очищаем текстовую строку от застрявших серых/мусорных букв
      if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.setLiveText === &amp;#039;function&amp;#039;) {
          Visual.setLiveText(&amp;quot;&amp;quot;); 
      }&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;      // Деактивируем оранжевую строку подсказок команд
      if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.updateHints === &amp;#039;function&amp;#039;) {
          Visual.updateHints(false); 
      }&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;      // Автоматически закрываем всплывающие формы обучения диалогов изменением инлайновых CSS свойств
      const windows = document.querySelectorAll(&amp;#039;.learn-window, .learn-form, #learnModal, [id*=&amp;quot;learn&amp;quot;], [class*=&amp;quot;learn&amp;quot;]&amp;#039;);
      windows.forEach(win =&amp;gt; {
          win.style.display = &amp;#039;none&amp;#039;; 
          win.classList.remove(&amp;#039;active&amp;#039;, &amp;#039;open&amp;#039;, &amp;#039;show&amp;#039;); 
      });&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;      if (typeof Visual !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; typeof Visual.setState === &amp;#039;function&amp;#039;) {
          Visual.setState(&amp;#039;wait&amp;#039;);
      }&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;      // --- ПРОАКТИВНАЯ АКТИВАЦИЯ МИКРОФОНА ---
      // Если сессия продолжается, принудительно перезапускаем аудиопоток захвата голоса
      if (window.isLive &amp;amp;&amp;amp; window.rec) {
          try {
              window.rec.start();
              console.log(&amp;quot;%c[AutoSave Модуль]: МИКРОФОН СНОВА АКТИВЕН ДЛЯ НОВОГО ДИАЛОГА!&amp;quot;, &amp;quot;color: green; font-weight: bold;&amp;quot;);
          } catch(e) { 
              console.log(&amp;quot;[AutoSave Модуль]: Поток микрофона уже запущен или управляется извне.&amp;quot;); 
          }
      }
  } else {
      console.error(&amp;quot;[AutoSave Модуль]: КРИТИЧЕСКАЯ ОШИБКА: Сервер вернул статус false при записи файла.&amp;quot;);
  }&lt;/pre&gt;
}


&lt;em&gt; ============================================================================
&lt;/em&gt; БЛОК 9: ТОЧКА ВХОДА И РЕГИСТРАЦИЯ КОМПОНЕНТОВ СИСТЕМЫ
&lt;em&gt; ============================================================================

&lt;/em&gt; Автоматический выпуск первичного каскада инициализации при подключении скрипта
startApp();

&lt;em&gt; ГЛОБАЛЬНАЯ РЕГИСТРАЦИЯ: Назначаем финальную монолитную функцию handleSpeech в глобальное окно window
window.handleSpeech = handleSpeech;

&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
</description>
            <author>vladpolskiy@undisclosed.example.com (VladPolskiy)</author>
            <pubDate>Sun, 07 Jun 2026 14:21:27 +0000</pubDate>
        </item>
        <item>
            <title>ai_chat_bot_eva_v3</title>
            <link>http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?id=software:development:demo:ai_eva:ai_chat_bot_eva_v3&amp;rev=1780842018</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;js_chatbot_evav3&quot;&gt;JS chatbot eva.v3&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;JS chatbot eva.v3&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;js_chatbot_evav3&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-32&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;введение&quot;&gt;Введение&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Чат-бот &lt;strong&gt;Eva v3&lt;/strong&gt;, — это пример самообучающейся системы на связке &lt;strong&gt;JavaScript + PHP&lt;/strong&gt;, которая хранит свои знания в обычном текстовом файле &lt;strong&gt;base.json&lt;/strong&gt;.
&lt;/p&gt;
&lt;div class=&quot;plugin_note noteshadow&quot;&gt;
&lt;iframe height=&quot;350&quot; width=&quot;550&quot; scrolling=&quot;yes&quot; title=&quot;Untitled&quot; src=&quot;./demo_ai/ai/index.php&quot; frameborder=&quot;no&quot; loading=&quot;lazy&quot; allowtransparency=&quot;true&quot; allowfullscreen=&quot;true&quot;&gt;
&lt;/iframe&gt;


&lt;/div&gt;
&lt;p&gt;
Особенностью версии v3 является поддержка &lt;strong&gt;древовидной структуры диалогов&lt;/strong&gt;, позволяющая боту удерживать контекст беседы и создавать вложенные ветки ответов через &lt;strong&gt;массив sub&lt;/strong&gt;. &lt;br/&gt;

Благодаря интеграции &lt;strong&gt;Web Speech &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;&lt;/strong&gt;, система способна не только анализировать текстовые команды, но и &lt;strong&gt;воспринимать живую речь&lt;/strong&gt;, превращаясь в полноценного голосового ассистента. &lt;br/&gt;

В отличие от жестко запрограммированных скриптов, Ева динамически &lt;strong&gt;расширяет свой кругозор&lt;/strong&gt;: если ответ на вопрос отсутствует, она переходит в &lt;strong&gt;режим активного обучения&lt;/strong&gt;, запоминая реакцию пользователя и мгновенно применяя её в будущих диалогах. &lt;br/&gt;

Вся архитектура построена на принципе &lt;strong&gt;максимальной автономности&lt;/strong&gt;, где PHP-сервер выступает лишь в роли надежного хранилища, гарантируя сохранность накопленного опыта между сессиями.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;33-1989&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;основные_характеристики_евы&quot;&gt;Основные характеристики «Евы»:&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u00ab\u0415\u0432\u044b\u00bb:&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435_\u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438_\u0435\u0432\u044b&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1990-2059&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit4&quot; id=&quot;архитектура_системы&quot;&gt;Архитектура системы&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;Front-end (JS):&lt;/strong&gt; Работает в браузере. Отвечает за распознавание речи, логику поиска ответа в ОЗУ и озвучку.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;Back-end (PHP):&lt;/strong&gt; Нужен только для того, чтобы сохранять изменения из памяти браузера обратно в файл на сервере (через save.php).&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;База данных (base.json):&lt;/strong&gt; Простой JSON-массив, где хранятся объекты с вопросами, ответами и ветками диалогов.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430_\u0441\u0438\u0441\u0442\u0435\u043c\u044b&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;2060-2709&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit5&quot; id=&quot;как_она_думает_логика_поиска&quot;&gt;Как она «думает» (Логика поиска)&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Ева не просто ищет точное совпадение строки. В коде используется функция &lt;strong&gt;normalize()&lt;/strong&gt;, которая убирает лишние символы и приводит текст к одному регистру.
&lt;/p&gt;

&lt;p&gt;
* Она ищет ваш вопрос в массиве &lt;strong&gt;questions&lt;/strong&gt;.
* Если находит — выбирает случайный вариант из массива answers (чтобы общение не было однообразным).
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041a\u0430\u043a \u043e\u043d\u0430 \u00ab\u0434\u0443\u043c\u0430\u0435\u0442\u00bb (\u041b\u043e\u0433\u0438\u043a\u0430 \u043f\u043e\u0438\u0441\u043a\u0430)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043a\u0430\u043a_\u043e\u043d\u0430_\u0434\u0443\u043c\u0430\u0435\u0442_\u043b\u043e\u0433\u0438\u043a\u0430_\u043f\u043e\u0438\u0441\u043a\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;2710-3310&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit6&quot; id=&quot;режим_обучения_self-learning&quot;&gt;Режим обучения (Self-Learning)&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Это главная «фишка» кода. Если Ева не находит ответ в базе:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Она переходит в состояние &lt;strong&gt;isLearning = true&lt;/strong&gt; (режим обучения).&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Спрашивает пользователя: «Как мне ответить на это?».&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Следующую фраза пользователя она не обрабатывает как вопрос, а записывает как ответ для предыдущей фразы.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Новая пара «вопрос-ответ» добавляется в общую базу в памяти.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0420\u0435\u0436\u0438\u043c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f (Self-Learning)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0435\u0436\u0438\u043c_\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f_self-learning&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;3311-3996&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit7&quot; id=&quot;контекст_и_вложенность_sub&quot;&gt;Контекст и вложенность (sub)&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Вчерашний пример кода показал, что Ева умеет работать с контекстом. У каждой записи есть массив sub. Это позволяет создавать древовидные диалоги:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1 node&quot;&gt;&lt;div class=&quot;li&quot;&gt; Вы: «Давай поиграем».&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; Ева: «Окей, во что?». (Здесь Ева запоминает контекст)&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;level1 node&quot;&gt;&lt;div class=&quot;li&quot;&gt; Вы: «В города».&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; Ева поймет, что «В города» — это ответ на её вопрос про игру, а не просто случайная фраза.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c (sub)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442_\u0438_\u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c_sub&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:7,&amp;quot;range&amp;quot;:&amp;quot;3997-4663&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit8&quot; id=&quot;слабые_места_исправлено_07052026&quot;&gt;Слабые места (Исправлено 07.05.2026)&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Кэширование: Браузер часто «подсовывал» Еве старую базу из памяти, поэтому мы добавили &lt;strong&gt;?v=Date.now()&lt;/strong&gt; к запросу.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Потеря данных: При сохранении файл мог затереться, если в коде была ошибка или база была пуста. Мы добавили проверку &lt;strong&gt;if (responses.length === 0)&lt;/strong&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Синтаксис JSON: Ручное редактирование часто ломало базу из-за лишних запятых, что приводило к &lt;span style=&quot;color:#ff0000;&quot;&gt;&lt;strong&gt;ошибке JSON CORRUPT&lt;/strong&gt;&lt;/span&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043b\u0430\u0431\u044b\u0435 \u043c\u0435\u0441\u0442\u0430 (\u0418\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e 07.05.2026)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043b\u0430\u0431\u044b\u0435_\u043c\u0435\u0441\u0442\u0430_\u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e_07052026&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:8,&amp;quot;range&amp;quot;:&amp;quot;4664-5411&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit9&quot; id=&quot;изменения_070626&quot;&gt;изменения 07.06.26&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Добавлена интеграция нейросети.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Добавлена интеграция голоса&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f 07.06.26&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f_070626&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:9,&amp;quot;range&amp;quot;:&amp;quot;5412-5570&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit10&quot; id=&quot;планы&quot;&gt;Планы&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Обработку данных в оперативной памяти браузера.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Разобрать проект по архитектурным папкам&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Добавить «если ева не знает», то на ее выбор Алиса/вика&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; В базе вопросы «про погоду» и «про кота», подогнать наблон под 100% ответ Алисы, пока 30-35%&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Добавить вопрос «кто такой» и «что такое» искать без этих слов&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u043b\u0430\u043d\u044b&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u043b\u0430\u043d\u044b&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:10,&amp;quot;range&amp;quot;:&amp;quot;5571-6141&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit11&quot; id=&quot;см_так_же&quot;&gt;См. так же&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?id=software:development:demo:cms:ucms:appendix:appendix_js_speech_chat_bot_eva_v2&quot; class=&quot;wikilink1&quot; title=&quot;software:development:demo:cms:ucms:appendix:appendix_js_speech_chat_bot_eva_v2&quot; data-wiki-id=&quot;software:development:demo:cms:ucms:appendix:appendix_js_speech_chat_bot_eva_v2&quot;&gt;JS chatbot eva.v2&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?id=software:development:demo:cms:ucms:appendix:appendix_js_speech_audio_search_v2_comment&quot; class=&quot;wikilink1&quot; title=&quot;software:development:demo:cms:ucms:appendix:appendix_js_speech_audio_search_v2_comment&quot; data-wiki-id=&quot;software:development:demo:cms:ucms:appendix:appendix_js_speech_audio_search_v2_comment&quot;&gt;Код примера Speech Audio Seach v2&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?id=software:development:demo:cms:ucms:appendix:appendix_js_speech_audio_search_v2&quot; class=&quot;wikilink1&quot; title=&quot;software:development:demo:cms:ucms:appendix:appendix_js_speech_audio_search_v2&quot; data-wiki-id=&quot;software:development:demo:cms:ucms:appendix:appendix_js_speech_audio_search_v2&quot;&gt;JS audio searhe.v2&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043c. \u0442\u0430\u043a \u0436\u0435&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043c_\u0442\u0430\u043a_\u0436\u0435&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:11,&amp;quot;range&amp;quot;:&amp;quot;6142-6520&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit12&quot; id=&quot;дополнения_и_файлы&quot;&gt;Дополнения и Файлы&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/lib/exe/fetch.php?media=software:development:demo:cms:ucms:appendix:js_speech_chat_bot_eva_v2.rar&quot; class=&quot;media mediafile mf_rar&quot; title=&quot;software:development:demo:cms:ucms:appendix:js_speech_chat_bot_eva_v2.rar (51.6 MB)&quot;&gt; Архив с примером AI ассистента Eva v2&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?id=software:development:demo:cms:ucms:appendix:js_speech_chat_bot_eva_v2_comment&quot; class=&quot;wikilink1&quot; title=&quot;software:development:demo:cms:ucms:appendix:js_speech_chat_bot_eva_v2_comment&quot; data-wiki-id=&quot;software:development:demo:cms:ucms:appendix:js_speech_chat_bot_eva_v2_comment&quot;&gt; Код примера AI ассистента Eva v2&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/lib/exe/fetch.php?media=software:development:demo:cms:ucms:appendix:ai_%D0%B0%D0%B1%D0%BE%D1%87%D0%B0%D1%8F_%D1%81_%D0%B2%D0%B8%D0%BA%D0%B8_%D1%81%D1%82%D0%B0%D1%80%D0%B0%D1%8F.rar&quot; class=&quot;media mediafile mf_rar&quot; title=&quot;software:development:demo:cms:ucms:appendix:ai_абочая_с_вики_старая.rar (46.2 KB)&quot;&gt;Код примера AI ассистента Eva v2 старый код&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/lib/exe/fetch.php?media=software:development:demo:cms:ucms:appendix:ai_%D1%80%D0%B0%D0%B1%D0%BE%D1%87%D0%B0%D1%8F_07.06.2026.rar&quot; class=&quot;media mediafile mf_rar&quot; title=&quot;software:development:demo:cms:ucms:appendix:ai_рабочая_07.06.2026.rar (227.9 MB)&quot;&gt;ai_рабочая_07.06.2026.rar&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0414\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438 \u0424\u0430\u0439\u043b\u044b&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f_\u0438_\u0444\u0430\u0439\u043b\u044b&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:12,&amp;quot;range&amp;quot;:&amp;quot;6521-&amp;quot;} --&gt;</description>
            <author>vladpolskiy@undisclosed.example.com (VladPolskiy)</author>
            <pubDate>Sun, 07 Jun 2026 14:20:18 +0000</pubDate>
        </item>
        <item>
            <title>appendix_js_speech_chat_bot_eva_v2 - [Дополнения и Файлы] </title>
            <link>http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?id=software:development:demo:cms:ucms:appendix:appendix_js_speech_chat_bot_eva_v2&amp;rev=1780840255</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;js_chatbot_evav2&quot;&gt;JS chatbot eva.v2&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;JS chatbot eva.v2&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;js_chatbot_evav2&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-32&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;введение&quot;&gt;Введение&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Чат-бот &lt;strong&gt;Eva v2&lt;/strong&gt;, — это пример самообучающейся системы на связке &lt;strong&gt;JavaScript + PHP&lt;/strong&gt;, которая хранит свои знания в обычном текстовом файле &lt;strong&gt;base.json&lt;/strong&gt;.
&lt;/p&gt;
&lt;div class=&quot;plugin_note noteshadow&quot;&gt;
&lt;iframe height=&quot;350&quot; width=&quot;550&quot; scrolling=&quot;yes&quot; title=&quot;Untitled&quot; src=&quot;./demo_ucms/js_speech_chat_bot_eva/speech_chat_bot_eva_v2.php&quot; frameborder=&quot;no&quot; loading=&quot;lazy&quot; allowtransparency=&quot;true&quot; allowfullscreen=&quot;true&quot;&gt;
&lt;/iframe&gt;


&lt;/div&gt;
&lt;p&gt;
Особенностью версии v2 является поддержка &lt;strong&gt;древовидной структуры диалогов&lt;/strong&gt;, позволяющая боту удерживать контекст беседы и создавать вложенные ветки ответов через &lt;strong&gt;массив sub&lt;/strong&gt;. &lt;br/&gt;

Благодаря интеграции &lt;strong&gt;Web Speech &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;&lt;/strong&gt;, система способна не только анализировать текстовые команды, но и &lt;strong&gt;воспринимать живую речь&lt;/strong&gt;, превращаясь в полноценного голосового ассистента. &lt;br/&gt;

В отличие от жестко запрограммированных скриптов, Ева динамически &lt;strong&gt;расширяет свой кругозор&lt;/strong&gt;: если ответ на вопрос отсутствует, она переходит в &lt;strong&gt;режим активного обучения&lt;/strong&gt;, запоминая реакцию пользователя и мгновенно применяя её в будущих диалогах. &lt;br/&gt;

Вся архитектура построена на принципе &lt;strong&gt;максимальной автономности&lt;/strong&gt;, где PHP-сервер выступает лишь в роли надежного хранилища, гарантируя сохранность накопленного опыта между сессиями.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;33-2028&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;основные_характеристики_евы&quot;&gt;Основные характеристики «Евы»:&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u00ab\u0415\u0432\u044b\u00bb:&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435_\u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438_\u0435\u0432\u044b&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;2029-2098&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit4&quot; id=&quot;архитектура_системы&quot;&gt;Архитектура системы&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;Front-end (JS):&lt;/strong&gt; Работает в браузере. Отвечает за распознавание речи, логику поиска ответа в ОЗУ и озвучку.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;Back-end (PHP):&lt;/strong&gt; Нужен только для того, чтобы сохранять изменения из памяти браузера обратно в файл на сервере (через save.php).&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;База данных (base.json):&lt;/strong&gt; Простой JSON-массив, где хранятся объекты с вопросами, ответами и ветками диалогов.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430_\u0441\u0438\u0441\u0442\u0435\u043c\u044b&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;2099-2748&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit5&quot; id=&quot;как_она_думает_логика_поиска&quot;&gt;Как она «думает» (Логика поиска)&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Ева не просто ищет точное совпадение строки. В коде используется функция &lt;strong&gt;normalize()&lt;/strong&gt;, которая убирает лишние символы и приводит текст к одному регистру.
&lt;/p&gt;

&lt;p&gt;
* Она ищет ваш вопрос в массиве &lt;strong&gt;questions&lt;/strong&gt;.
* Если находит — выбирает случайный вариант из массива answers (чтобы общение не было однообразным).
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041a\u0430\u043a \u043e\u043d\u0430 \u00ab\u0434\u0443\u043c\u0430\u0435\u0442\u00bb (\u041b\u043e\u0433\u0438\u043a\u0430 \u043f\u043e\u0438\u0441\u043a\u0430)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043a\u0430\u043a_\u043e\u043d\u0430_\u0434\u0443\u043c\u0430\u0435\u0442_\u043b\u043e\u0433\u0438\u043a\u0430_\u043f\u043e\u0438\u0441\u043a\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;2749-3349&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit6&quot; id=&quot;режим_обучения_self-learning&quot;&gt;Режим обучения (Self-Learning)&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Это главная «фишка» кода. Если Ева не находит ответ в базе:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Она переходит в состояние &lt;strong&gt;isLearning = true&lt;/strong&gt; (режим обучения).&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Спрашивает пользователя: «Как мне ответить на это?».&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Следующую фраза пользователя она не обрабатывает как вопрос, а записывает как ответ для предыдущей фразы.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Новая пара «вопрос-ответ» добавляется в общую базу в памяти.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0420\u0435\u0436\u0438\u043c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f (Self-Learning)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0435\u0436\u0438\u043c_\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f_self-learning&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;3350-4035&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit7&quot; id=&quot;контекст_и_вложенность_sub&quot;&gt;Контекст и вложенность (sub)&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Вчерашний пример кода показал, что Ева умеет работать с контекстом. У каждой записи есть массив sub. Это позволяет создавать древовидные диалоги:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1 node&quot;&gt;&lt;div class=&quot;li&quot;&gt; Вы: «Давай поиграем».&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; Ева: «Окей, во что?». (Здесь Ева запоминает контекст)&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;level1 node&quot;&gt;&lt;div class=&quot;li&quot;&gt; Вы: «В города».&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; Ева поймет, что «В города» — это ответ на её вопрос про игру, а не просто случайная фраза.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c (sub)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442_\u0438_\u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c_sub&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:7,&amp;quot;range&amp;quot;:&amp;quot;4036-4702&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit8&quot; id=&quot;слабые_места_исправлено_07052026&quot;&gt;Слабые места (Исправлено 07.05.2026)&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Кэширование: Браузер часто «подсовывал» Еве старую базу из памяти, поэтому мы добавили &lt;strong&gt;?v=Date.now()&lt;/strong&gt; к запросу.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Потеря данных: При сохранении файл мог затереться, если в коде была ошибка или база была пуста. Мы добавили проверку &lt;strong&gt;if (responses.length === 0)&lt;/strong&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Синтаксис JSON: Ручное редактирование часто ломало базу из-за лишних запятых, что приводило к &lt;span style=&quot;color:#ff0000;&quot;&gt;&lt;strong&gt;ошибке JSON CORRUPT&lt;/strong&gt;&lt;/span&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043b\u0430\u0431\u044b\u0435 \u043c\u0435\u0441\u0442\u0430 (\u0418\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e 07.05.2026)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043b\u0430\u0431\u044b\u0435_\u043c\u0435\u0441\u0442\u0430_\u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e_07052026&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:8,&amp;quot;range&amp;quot;:&amp;quot;4703-5450&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit9&quot; id=&quot;планы&quot;&gt;Планы&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Дописать интеграцию нейросетей.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Обработку данных в оперативной памяти браузера.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u043b\u0430\u043d\u044b&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u043b\u0430\u043d\u044b&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:9,&amp;quot;range&amp;quot;:&amp;quot;5451-5629&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit10&quot; id=&quot;дополнения_и_файлы&quot;&gt;Дополнения и Файлы&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/lib/exe/fetch.php?media=software:development:demo:cms:ucms:appendix:js_speech_chat_bot_eva_v2.rar&quot; class=&quot;media mediafile mf_rar&quot; title=&quot;software:development:demo:cms:ucms:appendix:js_speech_chat_bot_eva_v2.rar (51.6 MB)&quot;&gt; Архив с примером AI ассистента Eva v2&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?id=software:development:demo:cms:ucms:appendix:js_speech_chat_bot_eva_v2_comment&quot; class=&quot;wikilink1&quot; title=&quot;software:development:demo:cms:ucms:appendix:js_speech_chat_bot_eva_v2_comment&quot; data-wiki-id=&quot;software:development:demo:cms:ucms:appendix:js_speech_chat_bot_eva_v2_comment&quot;&gt; Код примера AI ассистента Eva v2&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/lib/exe/fetch.php?media=software:development:demo:cms:ucms:appendix:ai_%D0%B0%D0%B1%D0%BE%D1%87%D0%B0%D1%8F_%D1%81_%D0%B2%D0%B8%D0%BA%D0%B8_%D1%81%D1%82%D0%B0%D1%80%D0%B0%D1%8F.rar&quot; class=&quot;media mediafile mf_rar&quot; title=&quot;software:development:demo:cms:ucms:appendix:ai_абочая_с_вики_старая.rar (46.2 KB)&quot;&gt;Код примера AI ассистента Eva v2 старый код&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/lib/exe/fetch.php?media=software:development:demo:cms:ucms:appendix:ai_%D1%80%D0%B0%D0%B1%D0%BE%D1%87%D0%B0%D1%8F_07.06.2026.rar&quot; class=&quot;media mediafile mf_rar&quot; title=&quot;software:development:demo:cms:ucms:appendix:ai_рабочая_07.06.2026.rar (227.9 MB)&quot;&gt;ai_рабочая_07.06.2026.rar&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0414\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438 \u0424\u0430\u0439\u043b\u044b&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f_\u0438_\u0444\u0430\u0439\u043b\u044b&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:10,&amp;quot;range&amp;quot;:&amp;quot;5630-&amp;quot;} --&gt;</description>
            <author>vladpolskiy@undisclosed.example.com (VladPolskiy)</author>
            <pubDate>Sun, 07 Jun 2026 13:50:55 +0000</pubDate>
        </item>
        <item>
            <title>ai_рабочая_07.06.2026.rar - создано</title>
            <link>http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?image=software%3Adevelopment%3Ademo%3Acms%3Aucms%3Aappendix%3Aai_%D1%80%D0%B0%D0%B1%D0%BE%D1%87%D0%B0%D1%8F_07.06.2026.rar&amp;ns=software%3Adevelopment%3Ademo%3Acms%3Aucms%3Aappendix&amp;rev=1780840237&amp;do=media</link>
            <description>&lt;img src=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/lib/images/fileicons/svg/rar.svg&quot; alt=&quot;ai_рабочая_07.06.2026.rar&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; /&gt;</description>
            <author>vladpolskiy@undisclosed.example.com (VladPolskiy)</author>
            <pubDate>Sun, 07 Jun 2026 13:50:37 +0000</pubDate>
        </item>
        <item>
            <title>ai_абочая_с_вики_старая.rar - создано</title>
            <link>http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?image=software%3Adevelopment%3Ademo%3Acms%3Aucms%3Aappendix%3Aai_%D0%B0%D0%B1%D0%BE%D1%87%D0%B0%D1%8F_%D1%81_%D0%B2%D0%B8%D0%BA%D0%B8_%D1%81%D1%82%D0%B0%D1%80%D0%B0%D1%8F.rar&amp;ns=software%3Adevelopment%3Ademo%3Acms%3Aucms%3Aappendix&amp;rev=1780840174&amp;do=media</link>
            <description>&lt;img src=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/lib/images/fileicons/svg/rar.svg&quot; alt=&quot;ai_абочая_с_вики_старая.rar&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; /&gt;</description>
            <author>vladpolskiy@undisclosed.example.com (VladPolskiy)</author>
            <pubDate>Sun, 07 Jun 2026 13:49:34 +0000</pubDate>
        </item>
        <item>
            <title>30.05.2026 - [6.3 Монтирование нового ISO-образа в CD-привод ...</title>
            <link>http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?id=30.05.2026&amp;rev=1780179870</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;ручная_сборка_arch_iso_headless_webui&quot;&gt;Ручная сборка Arch ISO (Headless + WebUI)&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0420\u0443\u0447\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 Arch ISO (Headless + WebUI)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0443\u0447\u043d\u0430\u044f_\u0441\u0431\u043e\u0440\u043a\u0430_arch_iso_headless_webui&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-70&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;этап_1_подготовка_диска_sdb_на_хосте_tom_1&quot;&gt;Этап 1. Подготовка диска sdb на хосте tom_1&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Выполняется на живом хосте tom_1 (IP: 192.168.1.72). Диск sdb выступает временным 
накопителем-донором. с доступом в интернет.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u042d\u0442\u0430\u043f 1. \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0434\u0438\u0441\u043a\u0430 sdb \u043d\u0430 \u0445\u043e\u0441\u0442\u0435 tom_1&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u044d\u0442\u0430\u043f_1_\u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430_\u0434\u0438\u0441\u043a\u0430_sdb_\u043d\u0430_\u0445\u043e\u0441\u0442\u0435_tom_1&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;71-361&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit3&quot; id=&quot;создание_рабочих_директорий&quot;&gt;1.1 Создание рабочих директорий&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Схема создаваемой структуры:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;/home
└── eva
    ├── new_iso
    │   ├── boot
    │   └── etc
    │       └── fstab
    └── original_iso_image
        └── archlinux-x86_64.iso&lt;/pre&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=1&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;co0&quot;&gt;# original_iso_image - для оригинального образа iso&lt;/span&gt;
&lt;span class=&quot;kw2&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-p&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;original_iso_image&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;
&lt;span class=&quot;co0&quot;&gt;# new_iso - рабочай директория, где будем собирать новый образа iso&lt;/span&gt;
&lt;span class=&quot;kw2&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-p&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Как это работает
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; mkdir имя_папки — создает новую директорию.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Проаерка создания
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=2&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;co0&quot;&gt;# original_iso_image - для оригинального образа iso&lt;/span&gt;
&lt;span class=&quot;kw2&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-ld&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;original_iso_image&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;
&lt;span class=&quot;co0&quot;&gt;# new_iso - рабочай директория, где будем собирать новый образа iso&lt;/span&gt;
&lt;span class=&quot;kw2&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-ld&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Как это работает
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; ls -ld имя_папки — выводит информацию о конкретной папке и её правах без показа содержимого.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;1.1 \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435_\u0440\u0430\u0431\u043e\u0447\u0438\u0445_\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;362-1567&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit4&quot; id=&quot;разметка_виртуального_диска_sdb_будущий_arch-flash&quot;&gt;1.2 Разметка виртуального диска sdb (будущий arch-flash)&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;/div&gt;

&lt;h4 id=&quot;просмотр_списка_дисков_и_разделов&quot;&gt;Просмотр списка дисков и разделов&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Самый наглядный способ увидеть все подключенные накопители, их размер и структуру:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=3&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;lsblk&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
скрипт создаст правильную структуру для UEFI + BIOS:
&lt;/p&gt;
&lt;div class=&quot;plugin_note noteblue&quot;&gt;sdb1 — BIOS Boot (1 МБ) → для загрузки старого BIOS.&lt;br/&gt;

sdb2 — EFI System (1 ГБ, FAT32) → для загрузки UEFI (ваш boot).&lt;br/&gt;

sdb3 — Linux root (Все оставшееся место, BTRFS)

&lt;/div&gt;
&lt;p&gt;
Используйте один из следующих вариантов размеи дисков с 
использованием утилит fdisk или sfdisk
&lt;/p&gt;

&lt;p&gt;
1.2.1 Использование утилиты fdisk
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=4&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;fdisk&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;dev&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;sdb &lt;span class=&quot;co2&quot;&gt;&amp;lt;&amp;lt;EOF
g
n
1
&amp;nbsp;
+1M
t
4
n
2
&amp;nbsp;
+1G
t
2
1
n
3
&amp;nbsp;
&amp;nbsp;
&amp;nbsp;
w
EOF&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
1.2.2 Использование утилиты sfdisk
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=5&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; sfdisk &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;dev&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;sdb &lt;span class=&quot;co2&quot;&gt;&amp;lt;&amp;lt; EOF
label: gpt
device: /dev/sdb
unit: sectors
&amp;nbsp;
/dev/sdb1 : start=        2048, size=        2048, type=21686148-6449-6E6F-744E-656564454649
/dev/sdb2 : start=        4096, size=     2097152, type=C12A7328-F81F-11D2-BA4B-00A0C93EC93B
/dev/sdb3 : start=     2101248, size=            +, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4
EOF&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Поверим
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=6&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;lsblk&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;1.2 \u0420\u0430\u0437\u043c\u0435\u0442\u043a\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0430 sdb (\u0431\u0443\u0434\u0443\u0449\u0438\u0439 arch-flash)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0430_\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e_\u0434\u0438\u0441\u043a\u0430_sdb_\u0431\u0443\u0434\u0443\u0449\u0438\u0439_arch-flash&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;1568-3072&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit5&quot; id=&quot;форматирование_разделов_с_метками_label&quot;&gt;1.3 Форматирование разделов с метками (LABEL)&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
1.3.1 Назначение метки ARCH_BOOT для UEFI-загрузчикаFAT32:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=7&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; mkfs.vfat &lt;span class=&quot;re5&quot;&gt;-F&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;32&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;ARCH_BOOT&amp;quot;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;dev&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;sdb2&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
1.3.2 Назначение метки ARCH_ROOT для корневой системы BTRFS:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=8&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; mkfs.btrfs &lt;span class=&quot;re5&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-L&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;ARCH_ROOT&amp;quot;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;dev&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;sdb3&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
&lt;em&gt;(Утилита isohybrid из пакета syslinux сама запишет туда MBR-загрузчик на этапе сборки ISO).&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
1.3.3. Проверка
Показывает структуру, тип файловой системы (FSTYPE) и метку (LABEL):
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=9&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;lsblk &lt;span class=&quot;re5&quot;&gt;-f&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
1.3.4 Проверка текущего монтирования
&lt;br/&gt;
 Чтобы загрузчик установился корректно, 
разделы должны быть смонтированы внутри вашей среды arch-chroot. 
Обычная структура выглядит так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;NAME   FSTYPE FSVER LABEL     UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sda
├─sda1 vfat   FAT32           64D4-DC3F                             977.5M     4% /boot
└─sda2 btrfs                  53b73831-4cdb-4783-8dd1-e2342ec6c2bf   42.1G    13% /var/log
                                                                                  /var/cache/pacman/pkg
                                                                                  /home
                                                                                  /
sdb
├─sdb1
├─sdb2 vfat   FAT32 ARCH_BOOT AAD6-B042
└─sdb3 btrfs        ARCH_ROOT cb7b1794-2e34-456c-b4c6-b470a4d3df26
zram0  swap   1     zram0     2fad77bf-318e-45ee-8f60-87fee0c1c882                [SWAP]
&lt;/pre&gt;

&lt;/div&gt;

&lt;h5 id=&quot;структура_разделов_на_диске_sdb&quot;&gt;Структура разделов на диске sdb&lt;/h5&gt;
&lt;div class=&quot;level5&quot;&gt;

&lt;p&gt;
Для универсальной загрузки (и на старых компьютерах с BIOS, и на современных с UEFI) 
диск размечается в таблице GPT на три раздела:
&lt;/p&gt;
&lt;div class=&quot;plugin_note noteblue&quot;&gt;&lt;div class=&quot;table sectionedit6&quot;&gt;&lt;table class=&quot;inline&quot;&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;Раздел&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Назначение&lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Размер&lt;/td&gt;&lt;td class=&quot;col3&quot;&gt;Файловая система&lt;/td&gt;&lt;td class=&quot;col4&quot;&gt;Метка (LABEL)&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;/dev/sdb1&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Загрузчик BIOS Boot (нужен для Syslinux/GRUB на старом железе)&lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;1 МБ&lt;/td&gt;&lt;td class=&quot;col3&quot;&gt;Нет (пустой)&lt;/td&gt;&lt;td class=&quot;col4&quot;&gt;Нет&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row2&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;/dev/sdb2&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Системный раздел EFI (EFI System Partition) для UEFI&lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;1 ГБFAT32&lt;/td&gt;&lt;td class=&quot;col3&quot;&gt;ARCH_BOOT&lt;/td&gt;&lt;td class=&quot;col4&quot;&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row3&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;/dev/sdb3&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Корневой раздел системы (RootFS)&lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Всё оставшееся&lt;/td&gt;&lt;td class=&quot;col3&quot;&gt;BTRFS&lt;/td&gt;&lt;td class=&quot;col4&quot;&gt;ARCH_ROOT&lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;table&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;table&amp;quot;,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;5219-5675&amp;quot;} --&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;h4 id=&quot;монтирование_корневого_раздела_диска_в_домашнюю_папку&quot;&gt;Монтирование корневого раздела диска в домашнюю папку.&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=11&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;mount&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;dev&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;sdb3 ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Разбор команды:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; sudo: запускает команду с правами администратора (root).&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; mount: команда для подключения файловой системы устройства к дереву папок.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; /dev/sdb3: третий раздел на втором жестком диске (sdb).&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; ~/new_iso: целевая папка (точка монтирования) внутри вашей домашней директории.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Результат:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; содержимое раздела /dev/sdb3 станет доступно для чтения и записи внутри папки ~/new_iso.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;

&lt;h4 id=&quot;проверка_монтирования_корневого_раздела&quot;&gt;Проверка монтирования корневого раздела.&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Найти все активные монтирования, связанные с 
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=12&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;mount&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;grep&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Разбор команды:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; mount: без параметров выводит список всех вообще примонтированных устройств в системе.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; | (конвейер): передает этот огромный список на вход следующей команде.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; grep : фильтрует строки, оставляя только те, где встречается текст .&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Результат:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; вы увидите, примонтировано ли что-то в ~/new_iso или системный , а также узнаете параметры этого подключения (например, rw — чтение/запись, или ro — только чтение).&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;

&lt;h4 id=&quot;создать_папку_etc_внутри_точки_монтирования&quot;&gt;Создать папку etc внутри точки монтирования.&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=13&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-p&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Разбор команды:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; mkdir: команда создания директорий.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; -p (parents): полезный флаг. Он создаст всю цепочку папок (~/new_iso/, ~/new_iso/ и etc), если какого-то из этих промежуточных каталогов еще не существует. Также этот флаг защищает от ошибок, если папка уже создана.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Результат:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; создается каталог etc. Если перед этим вы успешно выполнили первую команду (mount), то эта папка создастся прямо внутри раздела /dev/sdb3.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;

&lt;h4 id=&quot;проверка_создания_папки_etc&quot;&gt;Проверка создания папки /etc&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=14&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;tree&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
&lt;em&gt;(Команда tree ~/new_iso выведет структуру каталогов и файлов внутри этой папки в виде наглядного дерева.)&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
1.3.6 Автоматическая генерация fstab
Команда ls -ld ~/new_iso/etc/ выводит подробную информацию о самой папке etc, а не о файлах внутри неё.
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=15&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-ld&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Важно: Эту команду нужно выполнять снаружи chroot-окружения (внутри установочной флешки), 
когда все ваши разделы уже смонтированы в папку .
&lt;br/&gt;

Выполните команду:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=16&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; genfstab &lt;span class=&quot;re5&quot;&gt;-U&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso &lt;span class=&quot;sy0&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;tee&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-a&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;fstab&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
&lt;em&gt;(
  * Флаг -U указывает утилите использовать уникальные UUID разделов вместо имен вроде /dev/sdb3. 
Это гарантирует, что система загрузится, даже если вы вставите диск в другой ПК или другой SATA-разъем.
  * Команда sudo tee запускает саму утилиту записи с правами администратора (root). Это позволяет успешно сохранить сгенерированную таблицу разделов в файл fstab
  * Флаг -a (сокращение от append — добавить) переключает утилиту в режим добавления. Новый текст дописывается в самый конец файла, а старые данные не удаляются
)&lt;/em&gt;
&lt;/p&gt;

&lt;/div&gt;

&lt;h4 id=&quot;проверка_результата&quot;&gt;Проверка результата&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Откройте файл для проверки:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=17&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;cat&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;fstab&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Если вы ставили систему без подтомов (прямо в корень BTRFS), 
ваш файл должен выглядеть примерно так:text
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;[eva@tom1 ~]$ cat ~/new_iso/etc/fstab
# /dev/sdb3 LABEL=ARCH_ROOT
UUID=cb7b1794-2e34-456c-b4c6-b470a4d3df26 / btrfs rw,noatime,space_cache=v2,compress=zstd,ssd 0 0
[eva@tom1 ~]$&lt;/pre&gt;
&lt;div class=&quot;plugin_note noteblue&quot;&gt;⚠️ Оптимизация для BTRFS (Рекомендуется)&lt;br/&gt;

Стандартные настройки genfstab рабочие, но для BTRFS 
(особенно если у вас SSD-диск) крайне полезно вручную отредактировать опции монтирования 
для корня (/).&lt;br/&gt;

Откройте файл через nano /etc/fstab и добавьте в строку с btrfs следующие параметры через запятую:
ssd — включает оптимизацию под твердотельные накопители (если у вас SSD).&lt;br/&gt;

compress=zstd — включает прозрачное сжатие данных (сильно экономит место и продлевает жизнь SSD).

&lt;/div&gt;
&lt;/div&gt;

&lt;h4 id=&quot;редактирование_файла_fstab&quot;&gt;Редактирование файла fstab&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=19&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;nano&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;fstab&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Пример оптимизированной строки:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=20&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;fstab&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;co0&quot;&gt;# /dev/sdb3 LABEL=ARCH_ROOT&lt;/span&gt;
&lt;span class=&quot;re2&quot;&gt;UUID&lt;/span&gt;=cb7b1794-2e34-456c-b4c6-b470a4d3df26   &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;   btrfs   rw,noatime,&lt;span class=&quot;re2&quot;&gt;discard&lt;/span&gt;=async,&lt;span class=&quot;re2&quot;&gt;space_cache&lt;/span&gt;=v2,&lt;span class=&quot;re2&quot;&gt;compress&lt;/span&gt;=zstd,ssd   &lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
&lt;em&gt;(Сохраните файл (Ctrl + O, Enter) и выйдете из nano (Ctrl + X).&lt;/em&gt;
&lt;/p&gt;

&lt;/div&gt;

&lt;h4 id=&quot;проверить_что_вы_всё_сделали_правильно&quot;&gt;Проверить, что вы всё сделали правильно&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=21&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;cat&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;fstab&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Посчитайте количество элементов в строке с UUID (разделенных пробелами). Их должно быть ровно 6:
&lt;/p&gt;
&lt;ol&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; UUID=…&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; /&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; btrfs&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; rw,noatime,discard=async,space_cache=v2,compress=zstd,ssd&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 0&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 0&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;/div&gt;

&lt;h4 id=&quot;отключение_диска_sdb3_от_системы&quot;&gt;Отключение диска sdb3 от системы&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Команда sudo umount -l /dev/sdb3 выполняет «ленивое» (lazy) размонтирование раздела диска.
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=22&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;umount&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-l&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;dev&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;sdb3&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Разбор параметров команды
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; sudo: запускает операцию с правами администратора.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; umount: стандартная системная команда для отключения файловой системы.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; -l (lazy): ключевой флаг, который активирует режим «ленивого» (или отложенного) отключения.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; /dev/sdb3: целевой раздел диска, который нужно отключить.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;1.3 \u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u043e\u0432 \u0441 \u043c\u0435\u0442\u043a\u0430\u043c\u0438 (LABEL)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435_\u0440\u0430\u0437\u0434\u0435\u043b\u043e\u0432_\u0441_\u043c\u0435\u0442\u043a\u0430\u043c\u0438_label&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:7,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;3073-13221&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit7&quot; id=&quot;этап_2_сборка_rootfs_внутри_нового_образа_new_iso&quot;&gt;Этап 2. Сборка RootFS внутри нового образа (~/new_iso/)&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;/div&gt;

&lt;h4 id=&quot;🗺️_визуальная_схема_структуры_монтирования&quot;&gt;🗺️ Визуальная схема структуры монтирования.&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
В процессе сборки (Этап 2.1) создается иерархическая структура, 
где один раздел накопителя-донора монтируется внутрь другого:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;/ (Корень хоста tom_1)         &amp;lt;─── раздел sda2
├── boot/                      &amp;lt;─── загрузочный раздел хоста (/dev/sda1)
├── [BIOS Boot]                &amp;lt;─── X (НЕ смонтирован / раздел /dev/sdb1)
└── home/
    └── eva/
        └── new_iso/           &amp;lt;─── сюда монтируется /dev/sdb3 (ARCH_ROOT)
            └── boot/          &amp;lt;─── сюда монтируется /dev/sdb2 (ARCH_BOOT)&lt;/pre&gt;

&lt;p&gt;
Выполните команду для проверки текущего дерева монтирования:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=24&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;lsblk &lt;span class=&quot;re5&quot;&gt;-f&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Как выглядит идеальный результат для вашего диска:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=25&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;NAME   FSTYPE FSVER LABEL     UUID                                 FSAVAIL FSUSE&lt;span class=&quot;sy0&quot;&gt;%&lt;/span&gt; MOUNTPOINTS
sda
├─sda1 vfat   FAT32           64D4-DC3F                             977.5M     &lt;span class=&quot;nu0&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;boot
└─sda2 btrfs                  53b73831-4cdb-&lt;span class=&quot;nu0&quot;&gt;4783&lt;/span&gt;-8dd1-e2342ec6c2bf   42.1G    &lt;span class=&quot;nu0&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;var&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;log
                                                                                  &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;var&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;cache&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;pacman&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;pkg
                                                                                  &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;home
                                                                                  &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;
sdb
├─sdb1
├─sdb2 vfat   FAT32 ARCH_BOOT AAD6-B042
└─sdb3 btrfs        ARCH_ROOT cb7b1794-2e34-456c-b4c6-b470a4d3df26
zram0  swap   &lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;     zram0     2fad77bf-318e-45ee-8f60-87fee0c1c882                &lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;SWAP&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Вот список из 4 ключевых вещей, которые вам нужно проверить в терминале:
&lt;/p&gt;
&lt;ol&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 1. Колонка &lt;strong&gt;FSTYPE&lt;/strong&gt; (Тип файловой системы)&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
Убедитесь, что система правильно видит форматирование ваших разделов:
&lt;/p&gt;
&lt;ol&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Для /dev/&lt;strong&gt;sdb2&lt;/strong&gt; (загрузочный) там должно быть строго &lt;strong&gt;vfat&lt;/strong&gt; (или fat32).&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; Для /dev/&lt;strong&gt;sdb3&lt;/strong&gt; (корневой) там должно быть написано &lt;strong&gt;btrfs&lt;/strong&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; Если там пусто, значит раздел еще не отформатирован.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; 2. Колонка &lt;strong&gt;LABEL&lt;/strong&gt; (Метка диска)&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
Проверьте, соответствуют ли имена вашему плану:
&lt;/p&gt;
&lt;ol&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; У загрузочного раздела должно стоять &lt;strong&gt;ARCH_BOOT&lt;/strong&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; У корневого раздела должно стоять &lt;strong&gt;ARCH_ROOT&lt;/strong&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; Метки помогают визуально не перепутать разделы местами.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; 3. Колонка &lt;strong&gt;UUID&lt;/strong&gt; (Уникальный идентификатор)&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
Это длинная строка из букв, цифр и дефисов. Именно её вы записывали в файл fstab.
&lt;/p&gt;
&lt;ol&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Убедитесь, что &lt;strong&gt;UUID&lt;/strong&gt; для /dev/&lt;strong&gt;sdb3&lt;/strong&gt; в выводе команды символ в символ совпадает с тем &lt;strong&gt;UUID&lt;/strong&gt;, который вы оставили в файле &lt;strong&gt;~/new_iso/etc/fstab&lt;/strong&gt;. Если они отличаются, система выдаст ошибку при загрузке.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; 4. Колонка &lt;strong&gt;MOUNTPOINTS&lt;/strong&gt; (Точки монтирования)&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; В этой колонке напротив строк &lt;strong&gt;sdb2&lt;/strong&gt; и &lt;strong&gt;sdb3&lt;/strong&gt; должно быть абсолютно &lt;strong&gt;пусто&lt;/strong&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u042d\u0442\u0430\u043f 2. \u0421\u0431\u043e\u0440\u043a\u0430 RootFS \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0430 (~\/new_iso\/)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u044d\u0442\u0430\u043f_2_\u0441\u0431\u043e\u0440\u043a\u0430_rootfs_\u0432\u043d\u0443\u0442\u0440\u0438_\u043d\u043e\u0432\u043e\u0433\u043e_\u043e\u0431\u0440\u0430\u0437\u0430_new_iso&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:23,&amp;quot;secid&amp;quot;:7,&amp;quot;range&amp;quot;:&amp;quot;13222-17096&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit8&quot; id=&quot;монтирование_новых_дисов_для_загрузки_системы&quot;&gt;2.1 Монтирование новых дисов для загрузки системы&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Монтируются два раздела диска sdb в рабочую папку сборки (~/new_iso):
&lt;/p&gt;
&lt;div class=&quot;plugin_note noteblue&quot;&gt;&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;sdb1&lt;/strong&gt; (BIOS Boot) — &lt;strong&gt;не монтируется&lt;/strong&gt; (нужен просто как «маяк» для старого BIOS).&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;sdb2&lt;/strong&gt; (FAT32, метка ARCH_BOOT) — монтируется в папку &lt;strong&gt;~/new_iso/boot&lt;/strong&gt;. Нужен для размещения файлов EFI-загрузчика (systemd-boot), ядра Linux (vmlinuz-linux) и загрузочного образа initramfs&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;sdb3&lt;/strong&gt; (Btrfs, метка ARCH_ROOT) — монтируется в корень сборки &lt;strong&gt;~/new_iso&lt;/strong&gt;. Сюда через утилиту rsync копируется вся основная корневая файловая система (RootFS) с текущего рабочего хоста tom_1.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;p&gt;
&lt;em&gt;&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;em&gt;&lt;/em&gt;
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=26&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;co0&quot;&gt;# mkdir -p ~/new_iso - создана в Этап1 раздел 1.1 Создание рабочих директорий&lt;/span&gt;
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;mount&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;dev&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;sdb3 ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso       &lt;span class=&quot;co0&quot;&gt;# Корень BTRFS монтируем в корень сборки&lt;/span&gt;
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-p&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;boot
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;mount&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;dev&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;sdb2 ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;boot  &lt;span class=&quot;co0&quot;&gt;# FAT32 монтируем в boot&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;/div&gt;

&lt;h5 id=&quot;dev_sdb1_bios_boot_не_монтируется&quot;&gt;1. /dev/sdb1 (BIOS Boot) — НЕ МОНТИРУЕТСЯ&lt;/h5&gt;
&lt;div class=&quot;level5&quot;&gt;

&lt;p&gt;
Этот раздел действительно &lt;strong&gt;остается несмонтированным&lt;/strong&gt; на протяжении всего процесса.
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; В инструкции на Этапе 1.3.4 прямо указано: «Раздел sdb1 (bios boot) должен оставаться пустым и не смонтированным».&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Зачем он нужен: Этот раздел имеет крошечный размер (всего 1 МБ). Он нужен только для разметки GPT, чтобы старые материнские платы (BIOS/Legacy) могли найти загрузочный код утилиты Syslinux. Файловая система на нем не создается, файлы туда не копируются, и монтировать его в папки Linux нельзя.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;

&lt;h5 id=&quot;dev_sdb3_корень_btrfs_монтируется&quot;&gt;3. /dev/sdb3 (Корень Btrfs) — МОНТИРУЕТСЯ&lt;/h5&gt;
&lt;div class=&quot;level5&quot;&gt;

&lt;p&gt;
Этот раздел монтируется в первую очередь.
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; В инструкции на Этапе 2.1 выполняется команда: sudo mount /dev/sdb3 ~/new_iso.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Зачем: Это самый большой раздел, куда копируется вся операционная система (папки /etc, /usr, /var и т.д.). Папка ~/new_iso становится отображением этого диска.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;

&lt;h5 id=&quot;dev_sdb2_папка_boot_монтируется&quot;&gt;2. /dev/sdb2 (папка boot) — МОНТИРУЕТСЯ&lt;/h5&gt;
&lt;div class=&quot;level5&quot;&gt;

&lt;p&gt;
Этот раздел действительно &lt;strong&gt;остается несмонтированным&lt;/strong&gt; на протяжении всего процесса.
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; В инструкции на Этапе 1.3.4 прямо указано: «Раздел sdb1 (bios boot) должен оставаться пустым и не смонтированным».&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Зачем он нужен: Этот раздел имеет крошечный размер (всего 1 МБ). Он нужен только для разметки GPT, чтобы старые материнские платы (BIOS/Legacy) могли найти загрузочный код утилиты Syslinux. Файловая система на нем не создается, файлы туда не копируются, и монтировать его в папки Linux нельзя.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=27&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;lsblk &lt;span class=&quot;re5&quot;&gt;-f&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;
&lt;pre class=&quot;code&quot;&gt;[eva@tom1 ~]$ lsblk -f
NAME   FSTYPE FSVER LABEL     UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sda
├─sda1 vfat   FAT32           64D4-DC3F                             977.5M     4% /boot
└─sda2 btrfs                  53b73831-4cdb-4783-8dd1-e2342ec6c2bf   42.1G    13% /var/log
                                                                                  /var/cache/pacman/pkg
                                                                                  /home
                                                                                  /
sdb
├─sdb1
├─sdb2 vfat   FAT32 ARCH_BOOT AAD6-B042                              1022M     0% /home/eva/new_iso/boot
└─sdb3 btrfs        ARCH_ROOT cb7b1794-2e34-456c-b4c6-b470a4d3df26   25.5G     0% /home/eva/new_iso
zram0  swap   1     zram0     2fad77bf-318e-45ee-8f60-87fee0c1c882                [SWAP]
&lt;/pre&gt;

&lt;p&gt;
Итоговая схема п.2.1
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;[eva@tom1 ~]$ tree /home
/home
└── eva
    └── new_iso
        ├── boot
        └── etc
            └── fstab

5 directories, 1 file&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;2.1 \u041c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0434\u0438\u0441\u043e\u0432 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435_\u043d\u043e\u0432\u044b\u0445_\u0434\u0438\u0441\u043e\u0432_\u0434\u043b\u044f_\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438_\u0441\u0438\u0441\u0442\u0435\u043c\u044b&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:26,&amp;quot;secid&amp;quot;:8,&amp;quot;range&amp;quot;:&amp;quot;17097-22030&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit9&quot; id=&quot;копируем_корень_tom_1_исключая_виртуальные_и_временные_папки&quot;&gt;2.2 копируем корень tom_1, исключая виртуальные и временные папки.&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=30&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; rsync &lt;span class=&quot;re5&quot;&gt;-aAXv&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;--exclude&lt;/span&gt;=&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;/dev/*&amp;quot;&lt;/span&gt;,&lt;span class=&quot;st0&quot;&gt;&amp;quot;/proc/*&amp;quot;&lt;/span&gt;,&lt;span class=&quot;st0&quot;&gt;&amp;quot;/sys/*&amp;quot;&lt;/span&gt;,&lt;span class=&quot;st0&quot;&gt;&amp;quot;/tmp/*&amp;quot;&lt;/span&gt;,&lt;span class=&quot;st0&quot;&gt;&amp;quot;/run/*&amp;quot;&lt;/span&gt;,&lt;span class=&quot;st0&quot;&gt;&amp;quot;/mnt/*&amp;quot;&lt;/span&gt;,&lt;span class=&quot;st0&quot;&gt;&amp;quot;/media/*&amp;quot;&lt;/span&gt;,&lt;span class=&quot;st0&quot;&gt;&amp;quot;/lost+found&amp;quot;&lt;/span&gt;,&lt;span class=&quot;st0&quot;&gt;&amp;quot;/home/*/.cache/*&amp;quot;&lt;/span&gt;,&lt;span class=&quot;st0&quot;&gt;&amp;quot;/home/eva/new_iso/*&amp;quot;&lt;/span&gt;,&lt;span class=&quot;st0&quot;&gt;&amp;quot;/home/eva/original_iso_image/*&amp;quot;&lt;/span&gt;,&lt;span class=&quot;st0&quot;&gt;&amp;quot;/etc/fstab&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;home&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;eva&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;/div&gt;

&lt;h4 id=&quot;проверим_выполнение_с_вложенностью_3_уровня&quot;&gt;Проверим выполнение с вложенностью 3 уровня&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Выведем только интересующие нас папку /boot и файл /etc/fstab
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=31&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;find&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;home&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;eva&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso &lt;span class=&quot;re5&quot;&gt;-maxdepth&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt; \&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-path&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;*/boot&amp;quot;&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-path&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;*/etc&amp;quot;&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-path&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;*/etc/fstab&amp;quot;&lt;/span&gt; \&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;tree&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;--fromfile&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;
&lt;pre class=&quot;code&quot;&gt;└── home
    └── eva
        └── new_iso
            ├── boot
            └── etc
                └── fstab

5 directories, 2 files&lt;/pre&gt;

&lt;/div&gt;

&lt;h4 id=&quot;проверка_файла_etc_fstab&quot;&gt;Проверка файла /etc/fstab&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Проверим, что файл /home/eva/new_iso/etc/fstab существует, не затерт и содержит правильные данные — 
выведем его содержимое на экран с помощью команды cat.
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=33&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;home&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;eva&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;fstab&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;
&lt;pre class=&quot;code&quot;&gt;# /dev/sdb3 LABEL=ARCH_ROOT
UUID=85f23d27-9469-4c60-89d5-79242d2e1e17       /               btrfs           rw,noatime,discard=async,space_cache=v2,compress=zstd,ssd        0 0&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;2.2 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0440\u0435\u043d\u044c tom_1, \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0430\u043f\u043a\u0438.&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c_\u043a\u043e\u0440\u0435\u043d\u044c_tom_1_\u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044f_\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435_\u0438_\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435_\u043f\u0430\u043f\u043a\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:30,&amp;quot;secid&amp;quot;:9,&amp;quot;range&amp;quot;:&amp;quot;22031-23474&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit10&quot; id=&quot;этап_3_настройка_системы_через_chroot_chroot_new_iso&quot;&gt;Этап 3. Настройка системы через Chroot (chroot ~/new_iso/)&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Переходим внутрь создаваемой системы для изоляции настроек.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u042d\u0442\u0430\u043f 3. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0447\u0435\u0440\u0435\u0437 Chroot (chroot ~\/new_iso\/)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u044d\u0442\u0430\u043f_3_\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430_\u0441\u0438\u0441\u0442\u0435\u043c\u044b_\u0447\u0435\u0440\u0435\u0437_chroot_chroot_new_iso&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:35,&amp;quot;secid&amp;quot;:10,&amp;quot;range&amp;quot;:&amp;quot;23475-23683&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit11&quot; id=&quot;вход_в_окружение&quot;&gt;3.1 Вход в окружение&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=35&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; arch-chroot ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;
&lt;pre class=&quot;code&quot;&gt;[eva@tom1 ~]$ sudo arch-chroot ~/new_iso/
[root@tom1 /]#&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;3.1 \u0412\u0445\u043e\u0434 \u0432 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0432\u0445\u043e\u0434_\u0432_\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:35,&amp;quot;secid&amp;quot;:11,&amp;quot;range&amp;quot;:&amp;quot;23684-23856&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit12&quot; id=&quot;время_и_офлайн-режим&quot;&gt;3.2 Время и Офлайн-режим&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Во время установки Arch Linux с помощью скрипта archinstall или официального образа служба 
синхронизации времени включается автоматически. По умолчанию за это отвечает служба systemd-timesyncd
&lt;/p&gt;

&lt;/div&gt;

&lt;h4 id=&quot;настройка_времени_универсальное_utc_запрет_синхронизации&quot;&gt;3.2.1 Настройка времени (Универсальное UTC + запрет синхронизации):&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Эти команды используются для настройки системного времени и управления синхронизацией часов в Linux.
&lt;br/&gt;

Обычно такой набор команд применяется в изолированных окружениях, контейнерах или при сборке 
кастомных ISO-образов, где нужно жестко зафиксировать всемирное время (UTC) и отключить 
фоновые сетевые службы времени.
&lt;/p&gt;

&lt;/div&gt;

&lt;h5 id=&quot;устанавливаем_часовой_пояс_utc_europe_moscow_внутри_chroot&quot;&gt;1. Устанавливаем часовой пояс UTC / Europe/Moscow внутри chroot&lt;/h5&gt;
&lt;div class=&quot;level5&quot;&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=37&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;ln&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-sf&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;usr&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;share&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;zoneinfo&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;UTC &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;localtime&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
или
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=38&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;ln&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-sf&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;usr&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;share&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;zoneinfo&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;Europe&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;Moscow &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;localtime&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Установка системного часового пояса в UTC / Europe/Moscow.
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; ln: утилита для создания ссылок между файлами.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; -s (symbolic): создает символическую ссылку (ярлык), а не жесткую копию.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; -f (force): принудительно перезаписывает старую ссылку /etc/localtime, если она уже существовала.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Как это работает:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; файл /etc/localtime указывает операционной системе, какое локальное время отображать. &lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Эта команда привязывает вашу систему к эталонному всемирному времени UTC (Zero timezone). 
Все логи и системные часы теперь будут работать без смещения на зимнее/летнее время или региональные пояса.
&lt;/p&gt;

&lt;/div&gt;

&lt;h5 id=&quot;проверка_часового_пояса_utc_europe_moscow&quot;&gt;Проверка часового пояса (UTC / Europe/Moscow)&lt;/h5&gt;
&lt;div class=&quot;level5&quot;&gt;

&lt;p&gt;
Выполните команду ls -l для файла /etc/localtime. Она должна показать, что этот файл 
является символической ссылкой, указывающей именно на файл UTC / Europe/Moscow:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=39&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-l&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;localtime&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Идеальный вывод:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;# UTC
lrwxrwxrwx 1 root root 23 May 31 19:08 /etc/localtime -&amp;gt; /usr/share/zoneinfo/UTC
# Europe/Moscow
lrwxrwxrwx 1 root root 33 May 31 22:35 /etc/localtime -&amp;gt; /usr/share/zoneinfo/Europe/Moscow&lt;/pre&gt;

&lt;p&gt;
Также можно запустить команду date -u — она покажет текущее системное время в формате UTC / Europe/Moscow.
&lt;/p&gt;

&lt;/div&gt;

&lt;h5 id=&quot;переносим_системное_время_в_аппаратное&quot;&gt;2. Переносим системное время в аппаратное&lt;/h5&gt;
&lt;div class=&quot;level5&quot;&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=41&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;hwclock &lt;span class=&quot;re5&quot;&gt;--systohc&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Запись текущего системного времени в аппаратные часы материнской платы.
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; hwclock: утилита для работы с аппаратными часами (RTC — Real Time Clock), &lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
которые питаются от батарейки на материнской плате вашего компьютера.
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; –systohc (System to Hardware Clock): берет точное время из операционной памяти &lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
(которое настроено в Linux) и принудительно записывает его в чип BIOS/UEFI.
Зачем это нужно:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; чтобы при следующей перезагрузке компьютера материнская плата сразу передала ядру &lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Linux правильное время, даже если не будет интернета.
&lt;/p&gt;

&lt;/div&gt;

&lt;h5 id=&quot;проверка_переноса_времени_в_аппаратное&quot;&gt;Проверка переноса времени в аппаратное&lt;/h5&gt;
&lt;div class=&quot;level5&quot;&gt;

&lt;p&gt;
Чтобы убедиться, что время успешно записалось в аппаратную часть, просто вызовите утилиту чтения часов без флагов:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=42&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;hwclock &lt;span class=&quot;re5&quot;&gt;--show&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Идеальный вывод:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;2026-05-31 19:49:22.992460+00:00&lt;/pre&gt;

&lt;p&gt;
Идеальный вывод: Команда должна вывести актуальную дату и точное время 
(обычно с припиской .000000+00:00), не выдавая ошибок доступа к устройству /dev/rtc.
&lt;/p&gt;

&lt;/div&gt;

&lt;h5 id=&quot;ручной_mask_службы_связываем_её_с_dev_null&quot;&gt;3. Ручной &amp;quot;mask&amp;quot; службы — связываем её с /dev/null&lt;/h5&gt;
&lt;div class=&quot;level5&quot;&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=44&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;ln&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-sf&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;dev&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;null &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;systemd&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;system&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;systemd-timesyncd.service&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Полная блокировка («замораживание») службы синхронизации времени.
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; mask: это самая сильная форма отключения сервиса в Systemd. Она связывает файл службы с пустой директорией /dev/null.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Результат:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; службу systemd-timesyncd теперь невозможно запустить вообще никак — ни автоматически, &lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
ни вручную, ни в качестве зависимости для других программ. Любая попытка включить 
её вызовет ошибку. Это гарантирует, что интернет-соединение во время работы системы 
случайно не изменит зафиксированное вами время.
&lt;/p&gt;

&lt;/div&gt;

&lt;h5 id=&quot;как_это_сработает_на_конечной_машине&quot;&gt;Как это сработает на конечной машине?&lt;/h5&gt;
&lt;div class=&quot;level5&quot;&gt;

&lt;p&gt;
Когда ваш кастомный образ загрузится на компьютере без интернета, 
systemd попытается прочитать конфигурацию службы systemd-timesyncd.service, 
наткнется на пустышку /dev/null и просто проигнорирует её запуск, 
вообще не тратя системные ресурсы.
&lt;/p&gt;

&lt;/div&gt;

&lt;h5 id=&quot;проверка_ручной_блокировки_службы_mask&quot;&gt;Проверка ручной блокировки службы (mask)&lt;/h5&gt;
&lt;div class=&quot;level5&quot;&gt;

&lt;p&gt;
Проверьте, куда указывает созданный ярлык службы. Для этого выведите информацию о файле сервиса:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=45&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-l&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;systemd&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;system&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;systemd-timesyncd.service&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Идеальный вывод:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;lrwxrwxrwx 1 root root 9 May 31 19:44 /etc/systemd/system/systemd-timesyncd.service -&amp;gt; /dev/null&lt;/pre&gt;

&lt;p&gt;
Идеальный вывод: systemd-timesyncd.service → /dev/null
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;3.2 \u0412\u0440\u0435\u043c\u044f \u0438 \u041e\u0444\u043b\u0430\u0439\u043d-\u0440\u0435\u0436\u0438\u043c&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0432\u0440\u0435\u043c\u044f_\u0438_\u043e\u0444\u043b\u0430\u0439\u043d-\u0440\u0435\u0436\u0438\u043c&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:37,&amp;quot;secid&amp;quot;:12,&amp;quot;range&amp;quot;:&amp;quot;23857-30812&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit13&quot; id=&quot;настройка_статического_офлайн-репозитория&quot;&gt;3.3 Настройка статического офлайн-репозитория&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Для настройки статического офлайн-репозитория на Arch Linux скачайте 
нужные .pkg.tar.zst пакеты и их зависимости, поместите их в отдельную 
папку (например, /var/local/repo), создайте базу данных утилитой repo-add, 
а затем добавьте полученный путь в конфигурационный файл /etc/pacman.conf 
перед официальными репозиториями.
&lt;/p&gt;

&lt;p&gt;
3.3.1 Создаем локальный репозиторий внутри образа из кэша tom_1,
База пакетов уже скопирована вместе с /var/cache/pacman/pkg/. 
&lt;/p&gt;

&lt;p&gt;
&lt;br/&gt;
 Перейдем в папку /var/cache/pacman/pkg/
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=47&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;var&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;cache&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;pacman&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;pkg&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
вывод
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;[root@tom1 /]# cd /var/cache/pacman/pkg/
[root@tom1 pkg]#&lt;/pre&gt;

&lt;p&gt;
Создаем локальную БД:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=49&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;repo-add custom.db.tar.gz &lt;span class=&quot;sy0&quot;&gt;*&lt;/span&gt;.pkg.tar.zst&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
вывод
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;[root@tom1 pkg]# repo-add custom.db.tar.gz *.pkg.tar.zst

  -&amp;gt; Computing checksums...
  -&amp;gt; Creating &amp;#039;desc&amp;#039; db entry...
  -&amp;gt; Creating &amp;#039;files&amp;#039; db entry...
==&amp;gt; Creating updated database file &amp;#039;custom.db.tar.gz&amp;#039;
[root@tom1 pkg]#
&lt;/pre&gt;

&lt;p&gt;
3.3.2 Настройка секции [custom] в pacman.conf для полной изоляции
Чтобы система на tom_2 гарантированно не ломилась в сеть и брала 
пакеты только из локального кэша, мы полностью отключаем внешние 
репозитории и зеркала.
&lt;/p&gt;

&lt;p&gt;
3.3.3 Настраиваем pacman.conf внутри образа, чтобы он смотрел только 
в локальный кэш:
3.3.3.1 Откройте конфигурационный файл:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=51&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;nano&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;pacman.conf&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
3.3.4 Настройка файла:
&lt;/p&gt;

&lt;p&gt;
3.3.4.1 Найди и закомментируй (поставь # в начале строки) 
все стандартные репозитории: [core], [extra], [community]. 
Вместе с ними закомментируй строки Include = /etc/pacman.d/mirrorlist.
&lt;/p&gt;

&lt;p&gt;
3.3.4.2 В самый конец файла добавь твою локальную секцию [custom].
Итоговый блок репозиториев в /etc/pacman.conf должен выглядеть строго так:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=52&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_conf&quot;&gt;pacman.conf&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;co0&quot;&gt;# Полностью отключаем внешние репозитории&lt;/span&gt;
&lt;span class=&quot;co0&quot;&gt;#[core]&lt;/span&gt;
&lt;span class=&quot;co0&quot;&gt;#Include = /etc/pacman.d/mirrorlist&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;co0&quot;&gt;#[extra]&lt;/span&gt;
&lt;span class=&quot;co0&quot;&gt;#Include = /etc/pacman.d/mirrorlist&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;co0&quot;&gt;# Добавляем изолированный локальный репозиторий&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;custom&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;
SigLevel = Optional TrustAll
Server = file:&lt;span class=&quot;sy0&quot;&gt;///&lt;/span&gt;var&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;cache&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;pacman&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;pkg&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
После правки
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;#[core]
#Include = /etc/pacman.d/mirrorlist

#[extra-testing]
#Include = /etc/pacman.d/mirrorlist
 
#[extra]
#Include = /etc/pacman.d/mirrorlist

# Добавляем изолированный локальный репозиторий
[custom]
SigLevel = Optional TrustAll
Server = file:///var/cache/pacman/pkg&lt;/pre&gt;

&lt;p&gt;
&lt;em&gt;(Нажмите сочетание клавиш Ctrl + O, 
затем Enter для подтверждения записи файла, 
и наконец Ctrl + X для выхода)&lt;/em&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;3.3 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0444\u043b\u0430\u0439\u043d-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430_\u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e_\u043e\u0444\u043b\u0430\u0439\u043d-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:47,&amp;quot;secid&amp;quot;:13,&amp;quot;range&amp;quot;:&amp;quot;30813-34317&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit14&quot; id=&quot;проверка_внутри_chroot&quot;&gt;3.3.5 Проверка внутри Chroot&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
После сохранения файла обязательно обнови локальную базу данных, 
чтобы проверить работу:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=54&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;pacman &lt;span class=&quot;re5&quot;&gt;-Sy&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
вывод
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;[root@tom1 pkg]# pacman -Sy
:: Synchronizing package databases...
 custom                                 148.1 KiB   145 MiB/s 00:00 [######################################] 100%
[root@tom1 pkg]#&lt;/pre&gt;

&lt;p&gt;
&lt;em&gt;(Результат: Система должна моментально считать базу данных 
custom.db напрямую из папки без единого сетевого запроса.)&lt;/em&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;3.3.5 \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 Chroot&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430_\u0432\u043d\u0443\u0442\u0440\u0438_chroot&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:54,&amp;quot;secid&amp;quot;:14,&amp;quot;range&amp;quot;:&amp;quot;34318-35012&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit15&quot; id=&quot;настройка_сети_статический_ip_флешки_в_озу&quot;&gt;3.4 Настройка сети (Статический IP флешки в ОЗУ)&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;/div&gt;

&lt;h4 id=&quot;прописываем_параметры_для_работы_в_озу_ip1921681150&quot;&gt;Прописываем параметры для работы в ОЗУ (IP: 192.168.1.150).&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Т.к. файл профиля systemd-networkd скопирован с основной системы
tom_1 и имеет IP:192.168.1.72, то откроем его для редактирования:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=56&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;nano&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;systemd&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;network&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;20&lt;/span&gt;-wired.network&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Изменим одержимое:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=57&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_network&quot;&gt;20-wired.network&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;Match&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;
&lt;span class=&quot;re2&quot;&gt;Name&lt;/span&gt;=en&lt;span class=&quot;sy0&quot;&gt;*&lt;/span&gt;
&lt;span class=&quot;re2&quot;&gt;Name&lt;/span&gt;=eth&lt;span class=&quot;sy0&quot;&gt;*&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;Network&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;
&lt;span class=&quot;re2&quot;&gt;Address&lt;/span&gt;=192.168.1.150&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;24&lt;/span&gt;
&lt;span class=&quot;re2&quot;&gt;Gateway&lt;/span&gt;=192.168.1.1
&lt;span class=&quot;re2&quot;&gt;DNS&lt;/span&gt;=1.1.1.1&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
!!!!!!!!!!!!!!!!!!!!!Я ТУТ!!!!!!!!!!!!!!!!!!!!!!!!!&lt;br/&gt;

!!!!!!!!!!!!!!!!!!!!!Я ТУТ!!!!!!!!!!!!!!!!!!!!!!!!!
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;3.4 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0435\u0442\u0438 (\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 IP \u0444\u043b\u0435\u0448\u043a\u0438 \u0432 \u041e\u0417\u0423)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430_\u0441\u0435\u0442\u0438_\u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439_ip_\u0444\u043b\u0435\u0448\u043a\u0438_\u0432_\u043e\u0437\u0443&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:56,&amp;quot;secid&amp;quot;:15,&amp;quot;range&amp;quot;:&amp;quot;35013-35765&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit16&quot; id=&quot;включение_сервисов_nginx_порт_7000_ssh&quot;&gt;3.5 Включение сервисов (Nginx порт 7000 + SSH)&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;/div&gt;

&lt;h4 id=&quot;настройка_ssh&quot;&gt;Настройка SSH&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Убедитесь, что служба OpenSSH включена, чтобы иметь возможность удаленного подключения:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=58&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;systemctl &lt;span class=&quot;kw3&quot;&gt;enable&lt;/span&gt; sshd&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
По умолчанию Nginx слушает 80-й порт. Чтобы изменить его на 7000:
Откройте конфигурационный файл в текстовом редакторе (например, nano):
&lt;/p&gt;

&lt;p&gt;
3.5.1 Правим порт Nginx: 
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=59&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;nano&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;nginx&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;nginx.conf&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Найдите блок server { … } и проверьте/ измените директиву listen:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=60&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_conf&quot;&gt;nginx.conf&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;listen       &lt;span class=&quot;nu0&quot;&gt;7000&lt;/span&gt;;
server_name  localhost;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
&lt;em&gt;Сохраните изменения (в nano: нажмите Ctrl + O, затем Enter, для выхода — Ctrl + X).&lt;/em&gt;
&lt;br/&gt;

Включите службу Nginx
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=61&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;systemctl &lt;span class=&quot;kw3&quot;&gt;enable&lt;/span&gt; nginx&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;/div&gt;

&lt;h5 id=&quot;systemd-networkd&quot;&gt;1. systemd-networkd&lt;/h5&gt;
&lt;div class=&quot;level5&quot;&gt;

&lt;p&gt;
Это системный демон для управления сетевыми интерфейсами и подключениями
&lt;/p&gt;

&lt;/div&gt;

&lt;h5 id=&quot;systemd-resolved&quot;&gt;2. systemd-resolved&lt;/h5&gt;
&lt;div class=&quot;level5&quot;&gt;

&lt;p&gt;
Это локальный кэширующий &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;-клиент (распознаватель)
&lt;/p&gt;

&lt;/div&gt;

&lt;h5 id=&quot;как_они_работают_вместе&quot;&gt;Как они работают вместе:&lt;/h5&gt;
&lt;div class=&quot;level5&quot;&gt;

&lt;p&gt;
systemd-networkd поднимает соединение и получает от 
провайдера IP-адрес и адреса &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;-серверов. Затем он передает эти &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;-адреса 
службе systemd-resolved, которая берет на себя всю обработку запросов от 
ваших приложений (например, браузера).
&lt;/p&gt;

&lt;p&gt;
3.5.2 Активируем автозапуск:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=62&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;systemctl &lt;span class=&quot;kw3&quot;&gt;enable&lt;/span&gt; systemd-networkd systemd-resolved&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Вывод:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;[root@tom1 ~]# systemctl enable systemd-networkd systemd-resolved sshd nginx
Created symlink &amp;#039;/etc/systemd/system/dbus-org.freedesktop.resolve1.service&amp;#039; → &amp;#039;/usr/lib/systemd/system/systemd-resolved.service&amp;#039;.
Created symlink &amp;#039;/etc/systemd/system/sysinit.target.wants/systemd-resolved.service&amp;#039; → &amp;#039;/usr/lib/systemd/system/systemd-resolved.service&amp;#039;.
Created symlink &amp;#039;/etc/systemd/system/sockets.target.wants/systemd-resolved-varlink.socket&amp;#039; → &amp;#039;/usr/lib/systemd/system/systemd-resolved-varlink.socket&amp;#039;.
Created symlink &amp;#039;/etc/systemd/system/sockets.target.wants/systemd-resolved-monitor.socket&amp;#039; → &amp;#039;/usr/lib/systemd/system/systemd-resolved-monitor.socket&amp;#039;.
[root@tom1 ~]# &lt;/pre&gt;

&lt;/div&gt;

&lt;h4 id=&quot;проверка_автозапуска_служб&quot;&gt;Проверка автозапуска служб&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
В среде chroot команда systemctl status 
может работать некорректно из-за отсутствия запущенного менеджера 
инициализации (systemd). Чтобы гарантировать, что службы добавлены 
в автозагрузку, выполните:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=64&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;systemctl is-enabled sshd
systemctl is-enabled nginx
systemctl is-enabled systemd-networkd
systemctl is-enabled systemd-resolved&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Если службы добавлены в автозагрузку, все команды вернут ответ enabled.
&lt;br/&gt;

&lt;/p&gt;

&lt;p&gt;
Вывод:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;[root@tom1 ~]# systemctl is-enabled sshd
enabled
[root@tom1 ~]# systemctl is-enabled nginx
enabled
[root@tom1 ~]# systemctl is-enabled systemd-networkd
enabled
[root@tom1 ~]# systemctl is-enabled systemd-resolved
enabled
[root@tom1 ~]#&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;3.5 \u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 (Nginx \u043f\u043e\u0440\u0442 7000 + SSH)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435_\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432_nginx_\u043f\u043e\u0440\u0442_7000_ssh&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:58,&amp;quot;secid&amp;quot;:16,&amp;quot;range&amp;quot;:&amp;quot;35766-39331&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit17&quot; id=&quot;настройка_swap_в_озу_zram-generator&quot;&gt;3.6 Настройка Swap в ОЗУ (zram-generator)&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=66&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;nano&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;systemd&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;zram-generator.conf&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Содержимое:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=67&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_conf&quot;&gt;zram-generator.conf&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;zram0&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;
zram-size = ram &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt;
compression-algorithm = zstd&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;3.6 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Swap \u0432 \u041e\u0417\u0423 (zram-generator)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430_swap_\u0432_\u043e\u0437\u0443_zram-generator&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:66,&amp;quot;secid&amp;quot;:17,&amp;quot;range&amp;quot;:&amp;quot;39332-39584&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit18&quot; id=&quot;перезапись_fstab_под_новые_метки_label&quot;&gt;3.7 Перезапись fstab под новые метки (LABEL)&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=68&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;co0&quot;&gt;# Так как rsync скопировал реальный fstab с UUID хоста tom_1,&lt;/span&gt;
&lt;span class=&quot;co0&quot;&gt;# мы полностью очищаем его внутри chroot, чтобы Live-система на tom_2 работала в ОЗУ без привязки к дискам.&lt;/span&gt;
&lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;fstab&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
( Если система при загрузке в ОЗУ затребует UUID дисков, то пробуем этот пункт
3.7 Перезапись fstab под новые метки (LABEL):
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=69&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;EOF &lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;fstab
&lt;span class=&quot;re2&quot;&gt;LABEL&lt;/span&gt;=ARCH_ROOT    &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;        btrfs    defaults,noatime,&lt;span class=&quot;re2&quot;&gt;compress&lt;/span&gt;=zstd    &lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;re2&quot;&gt;LABEL&lt;/span&gt;=ARCH_BOOT    &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;boot  vfat  defaults,&lt;span class=&quot;re2&quot;&gt;fmask&lt;/span&gt;=0077,&lt;span class=&quot;re2&quot;&gt;dmask&lt;/span&gt;=0077  &lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt;  &lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt;
EOF&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
)
&lt;/p&gt;

&lt;p&gt;
nano /etc/fstab
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;3.7 \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044c fstab \u043f\u043e\u0434 \u043d\u043e\u0432\u044b\u0435 \u043c\u0435\u0442\u043a\u0438 (LABEL)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044c_fstab_\u043f\u043e\u0434_\u043d\u043e\u0432\u044b\u0435_\u043c\u0435\u0442\u043a\u0438_label&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:68,&amp;quot;secid&amp;quot;:18,&amp;quot;range&amp;quot;:&amp;quot;39585-40408&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit19&quot; id=&quot;установка_и_обновление_efi-загрузчика&quot;&gt;3.8 Установка и обновление EFI-загрузчика&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Перемонтируйте раздел повторно
Теперь примените новые параметры монтирования 
из обновленного fstab:
&lt;/p&gt;

&lt;p&gt;
mount -o remount /boot
&lt;/p&gt;

&lt;p&gt;
Смонтируйте вручную с правильными правами
&lt;/p&gt;

&lt;p&gt;
mount -t vfat -o fmask=0077,dmask=0077 /dev/disk/by-label/ARCH_BOOT /boot
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=70&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;bootctl &lt;span class=&quot;kw2&quot;&gt;install&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Выход из chroot:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=71&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;exit&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;3.8 \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 EFI-\u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430_\u0438_\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435_efi-\u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:70,&amp;quot;secid&amp;quot;:19,&amp;quot;range&amp;quot;:&amp;quot;40409-40959&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit20&quot; id=&quot;этап_4_конфигурация_загрузчика_systemd-boot_и_syslinux&quot;&gt;Этап 4. Конфигурация загрузчика systemd-boot  и Syslinux&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Установка загрузчика (Выполняется на хосте tom_1. На этом этапе разделы 
диска sdb все еще примонтированы в ~/new_iso/!):
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u042d\u0442\u0430\u043f 4. \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0430 systemd-boot  \u0438 Syslinux&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u044d\u0442\u0430\u043f_4_\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f_\u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0430_systemd-boot_\u0438_syslinux&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:72,&amp;quot;secid&amp;quot;:20,&amp;quot;range&amp;quot;:&amp;quot;40960-41259&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit21&quot; id=&quot;настройка_параметров_загрузки_loaderconf&quot;&gt;4.1 Настройка параметров загрузки (loader.conf)&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=72&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;nano&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;boot&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader.conf&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Содержимое (выбор 3 секунды):
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=73&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_conf&quot;&gt;loader.conf&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;inidefault &lt;span class=&quot;kw2&quot;&gt;arch&lt;/span&gt;
timeout &lt;span class=&quot;nu0&quot;&gt;3&lt;/span&gt;
console-mode max
editor no&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;4.1 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 (loader.conf)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430_\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432_\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438_loaderconf&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:72,&amp;quot;secid&amp;quot;:21,&amp;quot;range&amp;quot;:&amp;quot;41260-41555&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit22&quot; id=&quot;настройка_записи_загрузки_параметры_ядра_archconf&quot;&gt;4.2 Настройка записи загрузки параметры ядра (arch.conf)&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Привязка к глобальной метке ARCH_ROOT, COM-порт и отключение прерываний Hyper-V:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=74&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;nano&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;boot&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;entries&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;arch.conf&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Содержимое:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=75&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;ini&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;co0&quot;&gt;# Для ~/new_iso/boot/loader/entries/arch.conf и isolinux.cfg&lt;/span&gt;
title Arch Linux Custom Live &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;SquashFS Manual&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
linux &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;vmlinuz-linux
initrd &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;initramfs-linux.img
options &lt;span class=&quot;re2&quot;&gt;archisolabel&lt;/span&gt;==ARCH_202605 &lt;span class=&quot;re2&quot;&gt;archisobasedir&lt;/span&gt;=&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;arch&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;x86_64&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;airootfs.sfs rw &lt;span class=&quot;re2&quot;&gt;console&lt;/span&gt;=ttyS0,115200n8 &lt;span class=&quot;re2&quot;&gt;earlyprintk&lt;/span&gt;=ttyS0,&lt;span class=&quot;nu0&quot;&gt;115200&lt;/span&gt; hv_utils.disable_gpadl_match=&lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;4.2 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044f\u0434\u0440\u0430 (arch.conf)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430_\u0437\u0430\u043f\u0438\u0441\u0438_\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438_\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b_\u044f\u0434\u0440\u0430_archconf&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:74,&amp;quot;secid&amp;quot;:22,&amp;quot;range&amp;quot;:&amp;quot;41556-42231&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit23&quot; id=&quot;подготовка_syslinux_bios_для_физического_железа&quot;&gt;4.3 Подготовка Syslinux (BIOS) для физического железа&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=76&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; pacman &lt;span class=&quot;re5&quot;&gt;-S&lt;/span&gt; syslinux &lt;span class=&quot;re5&quot;&gt;--noconfirm&lt;/span&gt;
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-p&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;boot&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;syslinux
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;cp&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;usr&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;lib&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;syslinux&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;bios&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;isolinux.bin,ldlinux.c32,libcom.c32,libutil.c32,vesamenu.c32&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;boot&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;syslinux&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=77&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;nano&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;boot&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;syslinux&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;isolinux.cfg&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Содержимое:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=78&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;ini&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;UI vesamenu.c32
PROMPT &lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt;
TIMEOUT &lt;span class=&quot;nu0&quot;&gt;30&lt;/span&gt;
DEFAULT &lt;span class=&quot;kw2&quot;&gt;arch&lt;/span&gt;
&amp;nbsp;
LABEL &lt;span class=&quot;kw2&quot;&gt;arch&lt;/span&gt;
LINUX &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;vmlinuz-linux
INITRD &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;initramfs-linux.img
APPEND &lt;span class=&quot;re2&quot;&gt;archisolabel&lt;/span&gt;==ARCH_202605 &lt;span class=&quot;re2&quot;&gt;archisobasedir&lt;/span&gt;=&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;arch&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;x86_64&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;airootfs.sfs rw &lt;span class=&quot;re2&quot;&gt;console&lt;/span&gt;=ttyS0,115200n8 &lt;span class=&quot;re2&quot;&gt;earlyprintk&lt;/span&gt;=ttyS0,&lt;span class=&quot;nu0&quot;&gt;115200&lt;/span&gt; hv_utils.disable_gpadl_match=&lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;4.3 \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 Syslinux (BIOS) \u0434\u043b\u044f \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0436\u0435\u043b\u0435\u0437\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430_syslinux_bios_\u0434\u043b\u044f_\u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e_\u0436\u0435\u043b\u0435\u0437\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:76,&amp;quot;secid&amp;quot;:23,&amp;quot;range&amp;quot;:&amp;quot;42232-42934&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit24&quot; id=&quot;настройка_родного_initramfs_для_поддержки_squashfs_и_overlayfs&quot;&gt;4.4. Настройка родного initramfs для поддержки SquashFS и OverlayFS&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Чтобы система загрузилась в режиме «только чтение» из SquashFS, но позволяла изменять файлы в ОЗУ (принцип LiveCD), 
стандартный initramfs должен 
уметь работать с модулями loop и overlay.
&lt;/p&gt;

&lt;p&gt;
Выполните следующие действия на хосте tom_1:
Зайдите в окружение Chroot:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=79&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; arch-chroot ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Включите поддержку модулей в конфигурации сборщика:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=80&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;nano&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;mkinitcpio.conf&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Найдите строку MODULES=(…) и добавьте туда модули для работы с петлевыми устройствами и 
сжатыми файловыми системами:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=81&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;re2&quot;&gt;MODULES&lt;/span&gt;=&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;loop overlay squashfs vfat btrfs&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Проверьте хуки:
В строке HOOKS=(…) убедитесь, что присутствуют systemd и block:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=82&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;re2&quot;&gt;HOOKS&lt;/span&gt;=&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;base udev modconf memdisk archiso_loop_mnt archiso archiso_pxe_common archiso_pxe_nbd archiso_pxe_http archiso_pxe_nfs block filesystems keyboard&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Пересоберите initramfs:
Генерируем новый образ загрузки, который теперь аппаратно готов смонтировать наш будущий .sfs файл:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=83&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;mkinitcpio &lt;span class=&quot;re5&quot;&gt;-p&lt;/span&gt; linux&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Выйдите из chroot:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=84&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;exit&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;4.4. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0440\u043e\u0434\u043d\u043e\u0433\u043e initramfs \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 SquashFS \u0438 OverlayFS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430_\u0440\u043e\u0434\u043d\u043e\u0433\u043e_initramfs_\u0434\u043b\u044f_\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438_squashfs_\u0438_overlayfs&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:79,&amp;quot;secid&amp;quot;:24,&amp;quot;range&amp;quot;:&amp;quot;42935-44596&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit25&quot; id=&quot;этап_5_выбор_варианта_генерация_uefi-образа_squashfs_и_сборка_iso_для_через_xorriso&quot;&gt;Этап 5. Выбор варианта Генерация UEFI-образа, SquashFS и сборка ISO для через xorriso&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
【 ВАРИАНТ А 】 
&lt;br/&gt;

Сборка «на лету» прямо из ~/new_iso/ (Быстрый метод)&lt;br/&gt;

Метод собирает ISO прямо из рабочей директории, где смонтирован диск sdb. &lt;br/&gt;

&lt;em&gt;(Идеально для быстрых тестов.)&lt;/em&gt;
&lt;br/&gt;

【 ВАРИАНТ Б 】
&lt;br/&gt;

Сборка через изолированную структуру 
~/iso_source (Классический метод)
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;              [ Этап 3. Настройка через Chroot ]
                                │
                                ▼
              [ Этап 4. Конфигурация loader.conf ]
                                │
       ┌────────────────────────┴────────────────────────┐
       ▼                                                 ▼
【 ВАРИАНТ А 】                                    【 ВАРИАНТ Б 】
Сборка &amp;quot;на лету&amp;quot; из ~/new_iso/                    Сборка через копирование структуры
(Быстрый метод)                                   (Классический метод)
       │                                                 │
       ▼                                                 ▼
 [ Этап 5А ]                                        [ Этап 5Б ]
Генерация efi.img и                              Создание папки ~/iso_source,
прямой запуск xorriso                            перенос данных и запуск скрипта
       │                                                 │
       └────────────────────────┬────────────────────────┘
                                │
                                ▼
             [ Этап 6. Экспорт и запуск в Hyper-V ]&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u042d\u0442\u0430\u043f 5. \u0412\u044b\u0431\u043e\u0440 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f UEFI-\u043e\u0431\u0440\u0430\u0437\u0430, SquashFS \u0438 \u0441\u0431\u043e\u0440\u043a\u0430 ISO \u0434\u043b\u044f \u0447\u0435\u0440\u0435\u0437 xorriso&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u044d\u0442\u0430\u043f_5_\u0432\u044b\u0431\u043e\u0440_\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430_\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f_uefi-\u043e\u0431\u0440\u0430\u0437\u0430_squashfs_\u0438_\u0441\u0431\u043e\u0440\u043a\u0430_iso_\u0434\u043b\u044f_\u0447\u0435\u0440\u0435\u0437_xorriso&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:85,&amp;quot;secid&amp;quot;:25,&amp;quot;range&amp;quot;:&amp;quot;44597-46828&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit26&quot; id=&quot;этап_5а_генерация_uefi-образа_squashfs_и_сборка_iso_для_через_xorriso&quot;&gt;Этап 5А. Генерация UEFI-образа, SquashFS и сборка ISO для через xorriso&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
【 ВАРИАНТ А 】 
&lt;br/&gt;

Сборка «на лету» прямо из ~/new_iso/ (Быстрый метод)&lt;br/&gt;

Метод собирает ISO прямо из рабочей директории, где смонтирован диск sdb.
&lt;br/&gt;

&lt;em&gt;(Идеально для быстрых тестов.)&lt;/em&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u042d\u0442\u0430\u043f 5\u0410. \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f UEFI-\u043e\u0431\u0440\u0430\u0437\u0430, SquashFS \u0438 \u0441\u0431\u043e\u0440\u043a\u0430 ISO \u0434\u043b\u044f \u0447\u0435\u0440\u0435\u0437 xorriso&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u044d\u0442\u0430\u043f_5\u0430_\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f_uefi-\u043e\u0431\u0440\u0430\u0437\u0430_squashfs_\u0438_\u0441\u0431\u043e\u0440\u043a\u0430_iso_\u0434\u043b\u044f_\u0447\u0435\u0440\u0435\u0437_xorriso&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:85,&amp;quot;secid&amp;quot;:26,&amp;quot;range&amp;quot;:&amp;quot;46829-47263&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit27&quot; id=&quot;а1_создание_внутренней_структуры_arch_iso_и_сжатие_rootfs&quot;&gt;5А.1 Создание внутренней структуры Arch ISO и сжатие RootFS&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
# 1. Создаем целевой каталог внутри сборки
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=85&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-p&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;arch&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;x86_64&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
# 2. Упаковываем RootFS во временный файл в /tmp/ хоста
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=86&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; mksquashfs ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;tmp&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;airootfs.sfs &lt;span class=&quot;re5&quot;&gt;-comp&lt;/span&gt; zstd &lt;span class=&quot;re5&quot;&gt;-noappend&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;arch&lt;/span&gt; tmp lost+found&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
# 3. Перемещаем готовый изолированный образ внутрь структуры
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=87&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;mv&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;tmp&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;airootfs.sfs ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;arch&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;x86_64&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;airootfs.sfs&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;5\u0410.1 \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b Arch ISO \u0438 \u0441\u0436\u0430\u0442\u0438\u0435 RootFS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u04301_\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435_\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439_\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b_arch_iso_\u0438_\u0441\u0436\u0430\u0442\u0438\u0435_rootfs&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:85,&amp;quot;secid&amp;quot;:27,&amp;quot;range&amp;quot;:&amp;quot;47264-47906&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit28&quot; id=&quot;а2_создание_внутреннего_efiimg_внутри_структуры&quot;&gt;5А.2 Создание внутреннего efi.img внутри структуры&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
# 1. Создаем образ efi.img во временной папке хоста в ~/new_iso/boot
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=88&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;dd&lt;/span&gt; &lt;span class=&quot;re2&quot;&gt;if&lt;/span&gt;=&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;dev&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;zero &lt;span class=&quot;re2&quot;&gt;of&lt;/span&gt;=~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;boot&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;efi.img &lt;span class=&quot;re2&quot;&gt;bs&lt;/span&gt;=1M &lt;span class=&quot;re2&quot;&gt;count&lt;/span&gt;=&lt;span class=&quot;nu0&quot;&gt;64&lt;/span&gt; &lt;span class=&quot;re2&quot;&gt;status&lt;/span&gt;=none
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; mkfs.vfat &lt;span class=&quot;re5&quot;&gt;-F&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;16&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;ARCH_202605&amp;quot;&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;boot&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;efi.img &lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;dev&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;null&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
# 2. Монтируем его для наполнения
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=89&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;tmp&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;efi_mnt
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;mount&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-o&lt;/span&gt; loop &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;tmp&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;efi.img &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;tmp&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;efi_mnt&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
# 3. Копируем файлы загрузчика ИЗ смонтированного диска во временный efi.img
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=90&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;tmp&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;efi_mnt&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;EFI&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;BOOT &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;tmp&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;efi_mnt&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;entries
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;cp&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;boot&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;EFI&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;BOOT&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;BOOTX64.EFI &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;tmp&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;efi_mnt&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;EFI&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;BOOT&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;cp&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;boot&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader.conf &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;tmp&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;efi_mnt&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;cp&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;boot&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;entries&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;arch.conf &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;tmp&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;efi_mnt&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;entries&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
# 4. Размонтируем и удаляем точку монтирования
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=91&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;umount&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;tmp&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;efi_mnt
&lt;span class=&quot;kw2&quot;&gt;rmdir&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;tmp&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;efi_mnt&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;5\u0410.2 \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e efi.img \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u04302_\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435_\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e_efiimg_\u0432\u043d\u0443\u0442\u0440\u0438_\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:88,&amp;quot;secid&amp;quot;:28,&amp;quot;range&amp;quot;:&amp;quot;47907-49018&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit29&quot; id=&quot;а3_прямой_запуск_xorriso_сборки_гибридного_iso&quot;&gt;5А.3  Прямой запуск xorriso сборки гибридного ISO&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
# Запускаем сборку из директории ~/new_iso/. Результат положим в корень домашней директории.
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=92&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; xorriso &lt;span class=&quot;re5&quot;&gt;-as&lt;/span&gt; mkisofs \
  &lt;span class=&quot;re5&quot;&gt;-iso-level&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;3&lt;/span&gt; \
  &lt;span class=&quot;re5&quot;&gt;-full-iso9660-filenames&lt;/span&gt; \
  &lt;span class=&quot;re5&quot;&gt;-volid&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;ARCH_202605&amp;quot;&lt;/span&gt; \
  &lt;span class=&quot;re5&quot;&gt;-eltorito-boot&lt;/span&gt; boot&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;syslinux&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;isolinux.bin \
  &lt;span class=&quot;re5&quot;&gt;-eltorito-catalog&lt;/span&gt; boot&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;syslinux&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;boot.cat \
  &lt;span class=&quot;re5&quot;&gt;-no-emul-boot&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-boot-load-size&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-boot-info-table&lt;/span&gt; \
  &lt;span class=&quot;re5&quot;&gt;-isohybrid-mbr&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;usr&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;lib&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;syslinux&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;bios&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;isohdpfx.bin \
  &lt;span class=&quot;re5&quot;&gt;-eltorito-alt-boot&lt;/span&gt; \
  &lt;span class=&quot;re5&quot;&gt;-e&lt;/span&gt; boot&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;efi.img \
  &lt;span class=&quot;re5&quot;&gt;-no-emul-boot&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-isohybrid-gpt-basdat&lt;/span&gt; \
  &lt;span class=&quot;re5&quot;&gt;-hide&lt;/span&gt; EFI \
  &lt;span class=&quot;re5&quot;&gt;-hide&lt;/span&gt; loader \
  &lt;span class=&quot;re5&quot;&gt;-output&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;ARCH_202605.iso \
  ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;5\u0410.3  \u041f\u0440\u044f\u043c\u043e\u0439 \u0437\u0430\u043f\u0443\u0441\u043a xorriso \u0441\u0431\u043e\u0440\u043a\u0438 \u0433\u0438\u0431\u0440\u0438\u0434\u043d\u043e\u0433\u043e ISO&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u04303_\u043f\u0440\u044f\u043c\u043e\u0439_\u0437\u0430\u043f\u0443\u0441\u043a_xorriso_\u0441\u0431\u043e\u0440\u043a\u0438_\u0433\u0438\u0431\u0440\u0438\u0434\u043d\u043e\u0433\u043e_iso&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:92,&amp;quot;secid&amp;quot;:29,&amp;quot;range&amp;quot;:&amp;quot;49019-49749&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit30&quot; id=&quot;а4_безопасное_размонтирование_диска_донора&quot;&gt;5А.4 Безопасное размонтирование диска донора&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
# Только теперь, когда ISO-образ успешно создан, освобождаем накопитель:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=93&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;co0&quot;&gt;# Размонтируем разделы диска sdb, которые были подключены к хосту tom_1&lt;/span&gt;
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;umount&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;boot
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;umount&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso
&lt;span class=&quot;kw2&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;tmp&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;efi.img&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;
&lt;div class=&quot;plugin_note noteblue&quot;&gt;Примечание: «Этап сборки завершен. Пропустите Вариант Б и переходите сразу к Этапу 6».

&lt;/div&gt;
&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;5\u0410.4 \u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u0440\u0430\u0437\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0438\u0441\u043a\u0430 \u0434\u043e\u043d\u043e\u0440\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u04304_\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435_\u0440\u0430\u0437\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435_\u0434\u0438\u0441\u043a\u0430_\u0434\u043e\u043d\u043e\u0440\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:93,&amp;quot;secid&amp;quot;:30,&amp;quot;range&amp;quot;:&amp;quot;49750-50368&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit31&quot; id=&quot;этап_5б_подготовка_структуры_и_сборка_iso_через_xorriso&quot;&gt;Этап 5Б. Подготовка структуры и сборка ISO через xorriso&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
【 ВАРИАНТ Б 】Сборка через изолированную структуру 
~/iso_source (Классический метод)
&lt;/p&gt;
&lt;div class=&quot;plugin_note noteblue&quot;&gt;Этот этап применяется, если не использовался Вариант А, 
позволяя упаковать систему в SquashFS и создать гибридный 
ISO-образ, используя временную директорию ~/iso_source.

&lt;/div&gt;
&lt;p&gt;
&lt;em&gt;(Метод копирует все данные в отдельную директорию на хосте, 
освобождая диск донор sdb сразу.)&lt;/em&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u042d\u0442\u0430\u043f 5\u0411. \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 \u0441\u0431\u043e\u0440\u043a\u0430 ISO \u0447\u0435\u0440\u0435\u0437 xorriso&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u044d\u0442\u0430\u043f_5\u0431_\u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430_\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b_\u0438_\u0441\u0431\u043e\u0440\u043a\u0430_iso_\u0447\u0435\u0440\u0435\u0437_xorriso&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:94,&amp;quot;secid&amp;quot;:31,&amp;quot;range&amp;quot;:&amp;quot;50369-51108&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit32&quot; id=&quot;б1_создание_структуры_и_копирование_данных&quot;&gt;5Б.1 Создание структуры и копирование данных&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Создаем рабочую директорию и синхронизируем в нее данные, исключая временный образ EFI:
# Создаем чистую директорию
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=94&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-p&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;iso_source&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
# Синхронизируем содержимое sdb в папку сборки для xorriso
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=95&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; rsync &lt;span class=&quot;re5&quot;&gt;-aAXv&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;--exclude&lt;/span&gt;=&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;/boot/efi.img&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;iso_source&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;5\u0411.1 \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u04311_\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435_\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b_\u0438_\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435_\u0434\u0430\u043d\u043d\u044b\u0445&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:94,&amp;quot;secid&amp;quot;:32,&amp;quot;range&amp;quot;:&amp;quot;51109-51655&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit33&quot; id=&quot;б2_освобождение_диска-донора&quot;&gt;5Б.2 Освобождение диска-донора&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Размонтируем исходный диск sdb, так как данные уже скопированы в iso_source:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=96&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;umount&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;boot
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;umount&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;5\u0411.2 \u041e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0434\u0438\u0441\u043a\u0430-\u0434\u043e\u043d\u043e\u0440\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u04312_\u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435_\u0434\u0438\u0441\u043a\u0430-\u0434\u043e\u043d\u043e\u0440\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:96,&amp;quot;secid&amp;quot;:33,&amp;quot;range&amp;quot;:&amp;quot;51656-51926&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit34&quot; id=&quot;б3_упаковка_rootfs_в_squashfs&quot;&gt;5Б.3 Упаковка RootFS в SquashFS&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Упаковываем файловую систему в сжатый образ airootfs.sfs с использованием zstd, 
исключая служебные каталоги:
&lt;/p&gt;

&lt;p&gt;
# 1. Создаем целевой каталог внутри изолированной структуры
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=97&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-p&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;iso_source&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;arch&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;x86_64&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
# 2. Упаковываем RootFS во временный файл из папки ~/iso_source, исключая arch, tmp и lost+found
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=98&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; mksquashfs ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;iso_source &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;tmp&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;airootfs.sfs &lt;span class=&quot;re5&quot;&gt;-comp&lt;/span&gt; zstd &lt;span class=&quot;re5&quot;&gt;-noappend&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;arch&lt;/span&gt; tmp lost+found&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
# 3. Перемещаем готовый изолированный образ внутрь правильной структуры
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=99&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;mv&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;tmp&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;airootfs.sfs ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;iso_source&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;arch&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;x86_64&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;airootfs.sfs&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;5\u0411.3 \u0423\u043f\u0430\u043a\u043e\u0432\u043a\u0430 RootFS \u0432 SquashFS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u04313_\u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0430_rootfs_\u0432_squashfs&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:97,&amp;quot;secid&amp;quot;:34,&amp;quot;range&amp;quot;:&amp;quot;51927-52825&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit35&quot; id=&quot;б4_создание_скрипта_сборки_iso_глобальной_меткой_arch_202605&quot;&gt;5Б.4 Создание скрипта сборки ISO глобальной меткой ARCH_202605.&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Так как мы собираем чистый гибридный UEFI/BIOS образ вручную (без archiso), 
нам нужен готовый скрипт, который соберет структуру папки ~/iso_source/ 
в правильный .iso файл.
Выполняется на хосте tom_1, вне Chroot.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;5\u0411.4 \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 ISO \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0435\u0442\u043a\u043e\u0439 ARCH_202605.&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u04314_\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435_\u0441\u043a\u0440\u0438\u043f\u0442\u0430_\u0441\u0431\u043e\u0440\u043a\u0438_iso_\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439_\u043c\u0435\u0442\u043a\u043e\u0439_arch_202605&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:100,&amp;quot;secid&amp;quot;:35,&amp;quot;range&amp;quot;:&amp;quot;52826-53283&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit36&quot; id=&quot;б41_создай_файл_скрипта&quot;&gt;5Б.4.1. Создай файл скрипта&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=100&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;nano&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;build_iso.sh&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;5\u0411.4.1. \u0421\u043e\u0437\u0434\u0430\u0439 \u0444\u0430\u0439\u043b \u0441\u043a\u0440\u0438\u043f\u0442\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043141_\u0441\u043e\u0437\u0434\u0430\u0439_\u0444\u0430\u0439\u043b_\u0441\u043a\u0440\u0438\u043f\u0442\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:100,&amp;quot;secid&amp;quot;:36,&amp;quot;range&amp;quot;:&amp;quot;53284-53386&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit37&quot; id=&quot;б42_вставь_в_него_следующий_код&quot;&gt;5Б.4.2. Вставь в него следующий код&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=101&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;co0&quot;&gt;#!/bin/bash&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;co0&quot;&gt;# Настройка путей&lt;/span&gt;
&lt;span class=&quot;re2&quot;&gt;SOURCE_DIR&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;&lt;span class=&quot;es2&quot;&gt;$HOME&lt;/span&gt;/iso_source&amp;quot;&lt;/span&gt;
&lt;span class=&quot;re2&quot;&gt;OUTPUT_ISO&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;&lt;span class=&quot;es2&quot;&gt;$HOME&lt;/span&gt;/ARCH_202605.iso&amp;quot;&lt;/span&gt;
&lt;span class=&quot;re2&quot;&gt;VOLUME_ID&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;ARCH_202605&amp;quot;&lt;/span&gt;
&lt;span class=&quot;re2&quot;&gt;TMP_EFI_MNT&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;/tmp/efi_mnt&amp;quot;&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;kw3&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;=== Старт автоматической сборки гибридного ISO (BIOS + UEFI) ===&amp;quot;&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;co0&quot;&gt;# 1. Проверка утилит&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;kw3&quot;&gt;command&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-v&lt;/span&gt; xorriso &lt;span class=&quot;sy0&quot;&gt;&amp;amp;&amp;gt;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;dev&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;null; &lt;span class=&quot;kw1&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;kw3&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;Ошибка: xorriso не установлен. Выполните: sudo pacman -S xorriso&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;kw3&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;fi&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;co0&quot;&gt;# 2. Безопасный бэкап файлов загрузчика перед операциями, если sdb2 еще примонтирован&lt;/span&gt;
&lt;span class=&quot;co0&quot;&gt;# Если sdb2 уже размонтирован, скрипт возьмет файлы из структуры копии&lt;/span&gt;
&lt;span class=&quot;kw3&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;→ Синхронизация файлов загрузчика...&amp;quot;&lt;/span&gt;
&lt;span class=&quot;kw2&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;tmp&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader_backup&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;EFI&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;BOOT
&lt;span class=&quot;kw2&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;tmp&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader_backup&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;entries
&amp;nbsp;
&lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; mountpoint &lt;span class=&quot;re5&quot;&gt;-q&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;boot; &lt;span class=&quot;kw1&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;kw2&quot;&gt;cp&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-r&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;boot&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;EFI &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;tmp&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader_backup&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;
    &lt;span class=&quot;kw2&quot;&gt;cp&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-r&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;new_iso&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;boot&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;tmp&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader_backup&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;else&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;&lt;span class=&quot;es2&quot;&gt;$SOURCE_DIR&lt;/span&gt;/boot/EFI&amp;quot;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;; &lt;span class=&quot;kw1&quot;&gt;then&lt;/span&gt;
        &lt;span class=&quot;kw2&quot;&gt;cp&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;&lt;span class=&quot;es2&quot;&gt;$SOURCE_DIR&lt;/span&gt;/boot/EFI&amp;quot;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;tmp&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader_backup&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;
        &lt;span class=&quot;kw2&quot;&gt;cp&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;&lt;span class=&quot;es2&quot;&gt;$SOURCE_DIR&lt;/span&gt;/boot/loader&amp;quot;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;tmp&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader_backup&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;else&lt;/span&gt;
        &lt;span class=&quot;kw3&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;Критическая ошибка: Файлы UEFI-загрузчика не найдены ни в ~/new_iso/boot, ни в &lt;span class=&quot;es2&quot;&gt;$SOURCE_DIR&lt;/span&gt;/boot!&amp;quot;&lt;/span&gt;
        &lt;span class=&quot;kw3&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;fi&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;fi&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;co0&quot;&gt;# 3. Генерация EFI-образа для загрузки UEFI&lt;/span&gt;
&lt;span class=&quot;kw3&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;→ Подготовка EFI boot image...&amp;quot;&lt;/span&gt;
&lt;span class=&quot;kw2&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;&lt;span class=&quot;es2&quot;&gt;$SOURCE_DIR&lt;/span&gt;/boot/efi.img&amp;quot;&lt;/span&gt;
&lt;span class=&quot;kw2&quot;&gt;dd&lt;/span&gt; &lt;span class=&quot;re2&quot;&gt;if&lt;/span&gt;=&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;dev&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;zero &lt;span class=&quot;re2&quot;&gt;of&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;&lt;span class=&quot;es2&quot;&gt;$SOURCE_DIR&lt;/span&gt;/boot/efi.img&amp;quot;&lt;/span&gt; &lt;span class=&quot;re2&quot;&gt;bs&lt;/span&gt;=1M &lt;span class=&quot;re2&quot;&gt;count&lt;/span&gt;=&lt;span class=&quot;nu0&quot;&gt;64&lt;/span&gt; &lt;span class=&quot;re2&quot;&gt;status&lt;/span&gt;=none
mkfs.vfat &lt;span class=&quot;re5&quot;&gt;-F&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;16&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;ARCH_202605&amp;quot;&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;&lt;span class=&quot;es2&quot;&gt;$SOURCE_DIR&lt;/span&gt;/boot/efi.img&amp;quot;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;dev&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;null
&amp;nbsp;
&lt;span class=&quot;co0&quot;&gt;# 4. Монтируем efi.img и копируем туда файлы загрузчика systemd-boot&lt;/span&gt;
&lt;span class=&quot;kw2&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;tmp&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;efi_mnt
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;mount&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-o&lt;/span&gt; loop &lt;span class=&quot;st0&quot;&gt;&amp;quot;&lt;span class=&quot;es2&quot;&gt;$SOURCE_DIR&lt;/span&gt;/boot/efi.img&amp;quot;&lt;/span&gt; &lt;span class=&quot;re1&quot;&gt;$TMP_EFI_MNT&lt;/span&gt;
&amp;nbsp;
&amp;nbsp;
&lt;span class=&quot;co0&quot;&gt;# 5. Проверяем успешность монтирования перед тем, как работать с директорией&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; mountpoint &lt;span class=&quot;re5&quot;&gt;-q&lt;/span&gt; &lt;span class=&quot;re1&quot;&gt;$TMP_EFI_MNT&lt;/span&gt;; &lt;span class=&quot;kw1&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;kw3&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;→ Наполнение efi.img файлами загрузчика...&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;re1&quot;&gt;$TMP_EFI_MNT&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;EFI&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;BOOT
    &lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;re1&quot;&gt;$TMP_EFI_MNT&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;entries
&amp;nbsp;
    &lt;span class=&quot;co0&quot;&gt;# Копируем из гарантированного бэкапа&lt;/span&gt;
    &lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;cp&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;tmp&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader_backup&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;EFI&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;BOOT&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;BOOTX64.EFI &lt;span class=&quot;re1&quot;&gt;$TMP_EFI_MNT&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;EFI&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;BOOT&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;
    &lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;cp&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;tmp&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader_backup&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader.conf &lt;span class=&quot;re1&quot;&gt;$TMP_EFI_MNT&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;
    &lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;cp&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;tmp&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader_backup&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;entries&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;arch.conf &lt;span class=&quot;re1&quot;&gt;$TMP_EFI_MNT&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;entries&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;
&amp;nbsp;
    &lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;umount&lt;/span&gt; &lt;span class=&quot;re1&quot;&gt;$TMP_EFI_MNT&lt;/span&gt;
    &lt;span class=&quot;kw2&quot;&gt;rmdir&lt;/span&gt; &lt;span class=&quot;re1&quot;&gt;$TMP_EFI_MNT&lt;/span&gt;
    &lt;span class=&quot;kw2&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-rf&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;tmp&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;loader_backup
&lt;span class=&quot;kw1&quot;&gt;else&lt;/span&gt;
    &lt;span class=&quot;kw3&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;Критическая ошибка: Не удалось примонтировать efi.img!&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;kw2&quot;&gt;rmdir&lt;/span&gt; &lt;span class=&quot;re1&quot;&gt;$TMP_EFI_MNT&lt;/span&gt;
    &lt;span class=&quot;kw3&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;fi&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;co0&quot;&gt;# 6. Безопасная проверка готовности каталога boot перед сборкой ISO&lt;/span&gt;
&lt;span class=&quot;co0&quot;&gt;# Вместо деструктивного удаления файлов, мы просто проверяем наличие efi.img&lt;/span&gt;
&lt;span class=&quot;kw3&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;→ Проверка загрузочной структуры в boot...&amp;quot;&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;&lt;span class=&quot;es2&quot;&gt;$SOURCE_DIR&lt;/span&gt;/boot/efi.img&amp;quot;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;; &lt;span class=&quot;kw1&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;kw3&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;Критическая ошибка: efi.img отсутствует в &lt;span class=&quot;es2&quot;&gt;$SOURCE_DIR&lt;/span&gt;/boot/!&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;kw3&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;fi&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;co0&quot;&gt;# Чтобы xorriso не затягивал дублирующие папки EFI и loader в корень ISO &lt;/span&gt;
&lt;span class=&quot;co0&quot;&gt;# (они уже упакованы внутрь efi.img), мы укажем утилите xorriso исключить их &lt;/span&gt;
&lt;span class=&quot;co0&quot;&gt;# прямо во время сборки на Шаге 7 с помощью флага -hide.&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;co0&quot;&gt;# 7. Сборка полноценного гибридного ISO через xorriso&lt;/span&gt;
&lt;span class=&quot;kw3&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;→ Запуск xorriso (Сборка гибридного образа)...&amp;quot;&lt;/span&gt;
xorriso &lt;span class=&quot;re5&quot;&gt;-as&lt;/span&gt; mkisofs \
  &lt;span class=&quot;re5&quot;&gt;-iso-level&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;3&lt;/span&gt; \
  &lt;span class=&quot;re5&quot;&gt;-full-iso9660-filenames&lt;/span&gt; \
  &lt;span class=&quot;re5&quot;&gt;-volid&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;&lt;span class=&quot;es2&quot;&gt;$VOLUME_ID&lt;/span&gt;&amp;quot;&lt;/span&gt; \
  &lt;span class=&quot;re5&quot;&gt;-eltorito-boot&lt;/span&gt; boot&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;syslinux&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;isolinux.bin \
  &lt;span class=&quot;re5&quot;&gt;-eltorito-catalog&lt;/span&gt; boot&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;syslinux&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;boot.cat \
  &lt;span class=&quot;re5&quot;&gt;-no-emul-boot&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-boot-load-size&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-boot-info-table&lt;/span&gt; \
  &lt;span class=&quot;re5&quot;&gt;-isohybrid-mbr&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;usr&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;lib&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;syslinux&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;bios&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;isohdpfx.bin \
  &lt;span class=&quot;re5&quot;&gt;-eltorito-alt-boot&lt;/span&gt; \
  &lt;span class=&quot;re5&quot;&gt;-e&lt;/span&gt; boot&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;efi.img \
  &lt;span class=&quot;re5&quot;&gt;-no-emul-boot&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-isohybrid-gpt-basdat&lt;/span&gt; \
  &lt;span class=&quot;re5&quot;&gt;-hide&lt;/span&gt; EFI \
  &lt;span class=&quot;re5&quot;&gt;-hide&lt;/span&gt; loader \
  &lt;span class=&quot;re5&quot;&gt;-output&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;&lt;span class=&quot;es2&quot;&gt;$OUTPUT_ISO&lt;/span&gt;&amp;quot;&lt;/span&gt; \
  &lt;span class=&quot;st0&quot;&gt;&amp;quot;&lt;span class=&quot;es2&quot;&gt;$SOURCE_DIR&lt;/span&gt;/&amp;quot;&lt;/span&gt;
&amp;nbsp;
&amp;nbsp;
&lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt; &lt;span class=&quot;re4&quot;&gt;$?&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;; &lt;span class=&quot;kw1&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;kw3&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;=== Сборка успешно завершена! ===&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;kw3&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;Файл образа: &lt;span class=&quot;es2&quot;&gt;$OUTPUT_ISO&lt;/span&gt;&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;kw3&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;Этот образ готов к записи через Rufus (в режиме DD/ISO) для флешек ИЛИ прямого монтирования в Hyper-V Gen1/Gen2.&amp;quot;&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;else&lt;/span&gt;
    &lt;span class=&quot;kw3&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;=== Ошибка при сборке ISO ===&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;kw3&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;fi&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;5\u0411.4.2. \u0412\u0441\u0442\u0430\u0432\u044c \u0432 \u043d\u0435\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043142_\u0432\u0441\u0442\u0430\u0432\u044c_\u0432_\u043d\u0435\u0433\u043e_\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439_\u043a\u043e\u0434&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:101,&amp;quot;secid&amp;quot;:37,&amp;quot;range&amp;quot;:&amp;quot;53387-58104&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit38&quot; id=&quot;б5_запуск_сборки&quot;&gt;5Б.5 Запуск сборки&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Делаем скрипт исполняемым и запускаем его для создания финального образа:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=102&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;#bash&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;chmod&lt;/span&gt; +x ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;build_iso.sh
~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;build_iso.sh&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
&lt;em&gt;(Примечание: Параметры xorriso могут адаптироваться под структуру папки boot вашего диска sdb).&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
Скрипт автоматически упакует систему, создаст правильный UEFI-загрузочный 
сектор efi.img с твоей глобальной меткой ARCH_202605 и положит готовый файл 
в твою домашнюю директорию.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;5\u0411.5 \u0417\u0430\u043f\u0443\u0441\u043a \u0441\u0431\u043e\u0440\u043a\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u04315_\u0437\u0430\u043f\u0443\u0441\u043a_\u0441\u0431\u043e\u0440\u043a\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:102,&amp;quot;secid&amp;quot;:38,&amp;quot;range&amp;quot;:&amp;quot;58105-58829&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit39&quot; id=&quot;этап_6_экспорт_iso_в_windows_и_монтирование_в_cd-привод_hyper-v_tom_2&quot;&gt;Этап 6. Экспорт ISO в Windows и монтирование в CD-привод Hyper-V (tom_2)&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u042d\u0442\u0430\u043f 6. \u042d\u043a\u0441\u043f\u043e\u0440\u0442 ISO \u0432 Windows \u0438 \u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 CD-\u043f\u0440\u0438\u0432\u043e\u0434 Hyper-V (tom_2)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u044d\u0442\u0430\u043f_6_\u044d\u043a\u0441\u043f\u043e\u0440\u0442_iso_\u0432_windows_\u0438_\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435_\u0432_cd-\u043f\u0440\u0438\u0432\u043e\u0434_hyper-v_tom_2&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:103,&amp;quot;secid&amp;quot;:39,&amp;quot;range&amp;quot;:&amp;quot;58830-58946&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit40&quot; id=&quot;передача_файла_на_windows-хост&quot;&gt;6.1 Передача файла на Windows-хост&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Используте WinSCP  на Windows:
&lt;/p&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?do=export_code&amp;amp;id=30.05.2026&amp;amp;codeblock=103&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_&quot;&gt;cmd&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code bash&quot;&gt;pscp eva&lt;span class=&quot;sy0&quot;&gt;@&lt;/span&gt;192.168.1.72:&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;home&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;eva&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;ARCH_202605.iso C:\ISO\&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;6.1 \u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0444\u0430\u0439\u043b\u0430 \u043d\u0430 Windows-\u0445\u043e\u0441\u0442&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430_\u0444\u0430\u0439\u043b\u0430_\u043d\u0430_windows-\u0445\u043e\u0441\u0442&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:103,&amp;quot;secid&amp;quot;:40,&amp;quot;range&amp;quot;:&amp;quot;58947-59135&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit41&quot; id=&quot;запись_на_arch-flash_опционально_для_физ_теста&quot;&gt;6.2 Запись на arch-flash (опционально, для физ. теста)&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Открываешь Rufus, выбираешь флешку, выбираешь созданный ARCH_202605.iso
 и пишешь в режиме DD/ISO.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;6.2 \u0417\u0430\u043f\u0438\u0441\u044c \u043d\u0430 arch-flash (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e, \u0434\u043b\u044f \u0444\u0438\u0437. \u0442\u0435\u0441\u0442\u0430)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0437\u0430\u043f\u0438\u0441\u044c_\u043d\u0430_arch-flash_\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e_\u0434\u043b\u044f_\u0444\u0438\u0437_\u0442\u0435\u0441\u0442\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:104,&amp;quot;secid&amp;quot;:41,&amp;quot;range&amp;quot;:&amp;quot;59136-59387&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit42&quot; id=&quot;монтирование_нового_iso-образа_в_cd-привод_hyper-v_для_tom_2&quot;&gt;6.3 Монтирование нового ISO-образа в CD-привод Hyper-V (для tom_2)&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Открой Диспетчер Hyper-V.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Выбери изолированную виртуальную машину tom_2.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Нажми Параметры (Settings) → vIDE-контроллер или SCSI-контроллер (в зависимости от поколения ВМ Gen1/Gen2).&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Выбери Накопитель DVD (DVD Drive).&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Установи переключатель в положение Файл образа (ISO) (Image file).&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Нажми Обзор (Browse) и укажи путь к скачанному файлу C:\ISO\ARCH_202605.iso.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Нажми Применить (Apply) и запусти ВМ tom_2.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;6.3 \u041c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e ISO-\u043e\u0431\u0440\u0430\u0437\u0430 \u0432 CD-\u043f\u0440\u0438\u0432\u043e\u0434 Hyper-V (\u0434\u043b\u044f tom_2)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435_\u043d\u043e\u0432\u043e\u0433\u043e_iso-\u043e\u0431\u0440\u0430\u0437\u0430_\u0432_cd-\u043f\u0440\u0438\u0432\u043e\u0434_hyper-v_\u0434\u043b\u044f_tom_2&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:104,&amp;quot;secid&amp;quot;:42,&amp;quot;range&amp;quot;:&amp;quot;59388-&amp;quot;} --&gt;</description>
            <author>vladpolskiy@undisclosed.example.com (VladPolskiy)</author>
            <pubDate>Sat, 30 May 2026 22:24:30 +0000</pubDate>
        </item>
        <item>
            <title>nginx_html.rar - создано</title>
            <link>http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?image=software%3Alinux_server%3Aarch_linux%3Anginx_html.rar&amp;ns=software%3Alinux_server%3Aarch_linux&amp;rev=1779823702&amp;do=media</link>
            <description>&lt;img src=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/lib/images/fileicons/svg/rar.svg&quot; alt=&quot;nginx_html.rar&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; /&gt;</description>
            <author>vladpolskiy@undisclosed.example.com (VladPolskiy)</author>
            <pubDate>Tue, 26 May 2026 19:28:22 +0000</pubDate>
        </item>
        <item>
            <title>iso_image_arch_linux_server_259.png - создано</title>
            <link>http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?image=software%3Alinux_server%3Aarch_linux%3Aiso_image_arch_linux_server_259.png&amp;ns=software%3Alinux_server%3Aarch_linux&amp;rev=1779821963&amp;do=media</link>
            <description>&lt;img src=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/lib/exe/fetch.php?w=500&amp;amp;h=500&amp;amp;tok=38c70d&amp;amp;media=software:linux_server:arch_linux:iso_image_arch_linux_server_259.png&quot; alt=&quot;iso_image_arch_linux_server_259.png&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; /&gt;</description>
            <author>vladpolskiy@undisclosed.example.com (VladPolskiy)</author>
            <pubDate>Tue, 26 May 2026 18:59:23 +0000</pubDate>
        </item>
        <item>
            <title>iso_image_arch_linux_server_258.png - создано</title>
            <link>http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?image=software%3Alinux_server%3Aarch_linux%3Aiso_image_arch_linux_server_258.png&amp;ns=software%3Alinux_server%3Aarch_linux&amp;rev=1779821963&amp;do=media</link>
            <description>&lt;img src=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/lib/exe/fetch.php?w=500&amp;amp;h=500&amp;amp;tok=b49524&amp;amp;media=software:linux_server:arch_linux:iso_image_arch_linux_server_258.png&quot; alt=&quot;iso_image_arch_linux_server_258.png&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; /&gt;</description>
            <author>vladpolskiy@undisclosed.example.com (VladPolskiy)</author>
            <pubDate>Tue, 26 May 2026 18:59:23 +0000</pubDate>
        </item>
        <item>
            <title>iso_image_arch_linux_server_257.png - создано</title>
            <link>http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?image=software%3Alinux_server%3Aarch_linux%3Aiso_image_arch_linux_server_257.png&amp;ns=software%3Alinux_server%3Aarch_linux&amp;rev=1779821415&amp;do=media</link>
            <description>&lt;img src=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/lib/exe/fetch.php?w=500&amp;amp;h=500&amp;amp;tok=80d02c&amp;amp;media=software:linux_server:arch_linux:iso_image_arch_linux_server_257.png&quot; alt=&quot;iso_image_arch_linux_server_257.png&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; /&gt;</description>
            <author>vladpolskiy@undisclosed.example.com (VladPolskiy)</author>
            <pubDate>Tue, 26 May 2026 18:50:15 +0000</pubDate>
        </item>
        <item>
            <title>iso_image_arch_linux_server_256.png - создано</title>
            <link>http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?image=software%3Alinux_server%3Aarch_linux%3Aiso_image_arch_linux_server_256.png&amp;ns=software%3Alinux_server%3Aarch_linux&amp;rev=1779821187&amp;do=media</link>
            <description>&lt;img src=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/lib/exe/fetch.php?w=500&amp;amp;h=500&amp;amp;tok=4ba4da&amp;amp;media=software:linux_server:arch_linux:iso_image_arch_linux_server_256.png&quot; alt=&quot;iso_image_arch_linux_server_256.png&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; /&gt;</description>
            <author>vladpolskiy@undisclosed.example.com (VladPolskiy)</author>
            <pubDate>Tue, 26 May 2026 18:46:27 +0000</pubDate>
        </item>
        <item>
            <title>iso_image_arch_linux_server_255.png - создано</title>
            <link>http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?image=software%3Alinux_server%3Aarch_linux%3Aiso_image_arch_linux_server_255.png&amp;ns=software%3Alinux_server%3Aarch_linux&amp;rev=1779820817&amp;do=media</link>
            <description>&lt;img src=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/lib/exe/fetch.php?w=500&amp;amp;h=500&amp;amp;tok=76f06a&amp;amp;media=software:linux_server:arch_linux:iso_image_arch_linux_server_255.png&quot; alt=&quot;iso_image_arch_linux_server_255.png&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; /&gt;</description>
            <author>vladpolskiy@undisclosed.example.com (VladPolskiy)</author>
            <pubDate>Tue, 26 May 2026 18:40:17 +0000</pubDate>
        </item>
        <item>
            <title>iso_image_arch_linux_server_254.png - создано</title>
            <link>http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?image=software%3Alinux_server%3Aarch_linux%3Aiso_image_arch_linux_server_254.png&amp;ns=software%3Alinux_server%3Aarch_linux&amp;rev=1779820551&amp;do=media</link>
            <description>&lt;img src=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/lib/exe/fetch.php?w=500&amp;amp;h=500&amp;amp;tok=7fd701&amp;amp;media=software:linux_server:arch_linux:iso_image_arch_linux_server_254.png&quot; alt=&quot;iso_image_arch_linux_server_254.png&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; /&gt;</description>
            <author>vladpolskiy@undisclosed.example.com (VladPolskiy)</author>
            <pubDate>Tue, 26 May 2026 18:35:51 +0000</pubDate>
        </item>
        <item>
            <title>iso_image_arch_linux_server_253.png - создано</title>
            <link>http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?image=software%3Alinux_server%3Aarch_linux%3Aiso_image_arch_linux_server_253.png&amp;ns=software%3Alinux_server%3Aarch_linux&amp;rev=1779820352&amp;do=media</link>
            <description>&lt;img src=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/lib/exe/fetch.php?w=500&amp;amp;h=500&amp;amp;tok=646a7b&amp;amp;media=software:linux_server:arch_linux:iso_image_arch_linux_server_253.png&quot; alt=&quot;iso_image_arch_linux_server_253.png&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; /&gt;</description>
            <author>vladpolskiy@undisclosed.example.com (VladPolskiy)</author>
            <pubDate>Tue, 26 May 2026 18:32:32 +0000</pubDate>
        </item>
        <item>
            <title>iso_image_arch_linux_server_252.png - создано</title>
            <link>http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?image=software%3Alinux_server%3Aarch_linux%3Aiso_image_arch_linux_server_252.png&amp;ns=software%3Alinux_server%3Aarch_linux&amp;rev=1779813623&amp;do=media</link>
            <description>&lt;img src=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/lib/exe/fetch.php?w=500&amp;amp;h=500&amp;amp;tok=2416f1&amp;amp;media=software:linux_server:arch_linux:iso_image_arch_linux_server_252.png&quot; alt=&quot;iso_image_arch_linux_server_252.png&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; /&gt;</description>
            <author>vladpolskiy@undisclosed.example.com (VladPolskiy)</author>
            <pubDate>Tue, 26 May 2026 16:40:23 +0000</pubDate>
        </item>
        <item>
            <title>iso_image_arch_linux_server_251.png - создано</title>
            <link>http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?image=software%3Alinux_server%3Aarch_linux%3Aiso_image_arch_linux_server_251.png&amp;ns=software%3Alinux_server%3Aarch_linux&amp;rev=1779813120&amp;do=media</link>
            <description>&lt;img src=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/lib/exe/fetch.php?w=500&amp;amp;h=500&amp;amp;tok=d09366&amp;amp;media=software:linux_server:arch_linux:iso_image_arch_linux_server_251.png&quot; alt=&quot;iso_image_arch_linux_server_251.png&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; /&gt;</description>
            <author>vladpolskiy@undisclosed.example.com (VladPolskiy)</author>
            <pubDate>Tue, 26 May 2026 16:32:00 +0000</pubDate>
        </item>
        <item>
            <title>iso_image_arch_linux_server_250.png - создано</title>
            <link>http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?image=software%3Alinux_server%3Aarch_linux%3Aiso_image_arch_linux_server_250.png&amp;ns=software%3Alinux_server%3Aarch_linux&amp;rev=1779812879&amp;do=media</link>
            <description>&lt;img src=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/lib/exe/fetch.php?w=500&amp;amp;h=500&amp;amp;tok=33112c&amp;amp;media=software:linux_server:arch_linux:iso_image_arch_linux_server_250.png&quot; alt=&quot;iso_image_arch_linux_server_250.png&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; /&gt;</description>
            <author>vladpolskiy@undisclosed.example.com (VladPolskiy)</author>
            <pubDate>Tue, 26 May 2026 16:27:59 +0000</pubDate>
        </item>
        <item>
            <title>iso_image_arch_linux_server_249.png - создано</title>
            <link>http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?image=software%3Alinux_server%3Aarch_linux%3Aiso_image_arch_linux_server_249.png&amp;ns=software%3Alinux_server%3Aarch_linux&amp;rev=1779811653&amp;do=media</link>
            <description>&lt;img src=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/lib/exe/fetch.php?w=500&amp;amp;h=500&amp;amp;tok=7a09d3&amp;amp;media=software:linux_server:arch_linux:iso_image_arch_linux_server_249.png&quot; alt=&quot;iso_image_arch_linux_server_249.png&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; /&gt;</description>
            <author>vladpolskiy@undisclosed.example.com (VladPolskiy)</author>
            <pubDate>Tue, 26 May 2026 16:07:33 +0000</pubDate>
        </item>
        <item>
            <title>iso_image_arch_linux_server_248.png - создано</title>
            <link>http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/doku.php?image=software%3Alinux_server%3Aarch_linux%3Aiso_image_arch_linux_server_248.png&amp;ns=software%3Alinux_server%3Aarch_linux&amp;rev=1779811441&amp;do=media</link>
            <description>&lt;img src=&quot;http://synoinstall-gqctx9n8ug2b3eq1.direct.quickconnect.to/lib/exe/fetch.php?w=500&amp;amp;h=500&amp;amp;tok=e30396&amp;amp;media=software:linux_server:arch_linux:iso_image_arch_linux_server_248.png&quot; alt=&quot;iso_image_arch_linux_server_248.png&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; /&gt;</description>
            <author>vladpolskiy@undisclosed.example.com (VladPolskiy)</author>
            <pubDate>Tue, 26 May 2026 16:04:01 +0000</pubDate>
        </item>
    </channel>
</rss>
