<!--
     The FreeBSD Russian Documentation Project

     $FreeBSD$
     $FreeBSDru: frdp/doc/ru_RU.KOI8-R/books/handbook/boot/chapter.sgml,v 1.5 2001/02/09 14:49:15 andy Exp $

     Original revision: 1.10
-->

<chapter id="boot">
  <title>Процесс загрузки FreeBSD</title>

  <sect1 id="boot-synopsis">
    <title>Описание</title>

    <para>Во FreeBSD по умолчанию используется трехэтапный процесс загрузки,
      в котором задействованы три программы, последовательно вызывающие друг
      друга (два <link linkend="boot-blocks">загрузочных блока</link> и <link
      linkend="boot-loader">загрузчик</link>).	Каждая их этих трех программ
      строится на функциях предыдущей программы и становится все более
      сложной.</para>

    <para>Затем стартует ядро, которое детектирует устройства и выполняет
      их инициализацию.  После завершения процесса своей загрузки, ядро
      передает управление пользовательскому процессу с именем &man.init.8;,
      который выполняет проверку дисков на возможность использования.  Затем
      &man.init.8; запускает пользовательский процесс настройки ресурсов,
      выполняющий монтирование файловых систем, настройку сетевых адаптеров
      для работы в сети и вообще запуск всех процессов, обычно выполняемых
      в системе FreeBSD при загрузке.</para>
  </sect1>

  <sect1 id="boot-blocks">
    <title>Загрузочные блоки: первый и второй этапы начальной загрузки</title>

    <para><firstterm>Начальная загрузка</firstterm> представляет собой
      процесс, в течение которого компьютер распознает и инициализирует свои
      устройства и определяет, какие программы должны быть запущены.</para>

    <para>В этом процессе задействованы специальные микросхемы Постоянных
      Запоминающих Устройств (ПЗУ), которые определяют, что делать и в свою
      очередь, передают управление другим микросхемам, которые выполняют
      проверку памяти и целостности системы, конфигурируют устройства и
      предоставляют другим программам способ выяснить подробную информацию о
      настройках.</para>

    <para>В случае обычных персональных компьютеров в этом процессе участвует
      BIOS (который ответственен на начальную загрузку) и CMOS (которая
      хранит конфигурацию).  BIOS и CMOS умеют работать с дисками и также
      знают, где на диске находится программа, которая знает, как загрузить
      операционную систему.</para>

    <para>Эта глава не описывает первую часть процесса начальной загрузки.
      Вместо этого она посвящена тому, что происходит после передачи
      управления программе, находящейся на диске.</para>

    <para>Загрузочные блоки (как правило) отвечают за поиск загрузчика, его
      запуск и поэтому должны уметь находить программу в файловой системе,
      уметь ее запустить, а также должны иметь возможность выполнять
      некоторую настройку своей работы.</para>

    <sect2 id="boot-boot0">
      <title>boot0</title>

      <para>На самом деле это предшествующий всему загрузочный блок по имени
	boot0, который находится в <firstterm>Главной Загрузочной
	Записи</firstterm> (Master Boot Record), особой части диска, которая
	используется при начальной загрузке системы для определения порядка
	загрузки, и содержит список возможных слайсов для загрузки.</para>

      <para>boot0 очень прост, так как программа в <abbrev>MBR</abbrev> может
	иметь размер, не превышающий 512 байт.</para>

      <para>Эта программа выводит нечто вроде следующего:</para>

      <example id="boot-boot0-example">
	<title>Образец экрана boot0</title>

	<screen>
F1 DOS
F2 FreeBSD
F3 Linux
F4 ??
F5 Drive 1

Default: F2
	</screen>
      </example>
    </sect2>

    <sect2 id="boot-boot1">
      <title>boot1</title>

      <para>boot1 находится в загрузочном секторе загрузочного слайса,
	то есть там, где <link linkend="boot-boot0">boot0</link> или
	любая другая программа из <abbrev>MBR</abbrev> ожидает найти
	программу, которую следует запустить для продолжения процесса
	загрузки.</para>

      <para>boot1 очень прост, так как он тоже может иметь размер, не
	превышающий 512 байт, и знает достаточно о <firstterm>метке
	диска</firstterm> FreeBSD, хранящей информацию о слайсе, для того,
	чтобы найти и запустить <link
	linkend="boot-boot2">boot2</link>.</para>
    </sect2>

    <sect2 id="boot-boot2">
      <title>boot2</title>

      <para>boot2 устроен несколько более сложно, и умеет работать с файловой
	системой FreeBSD в объеме, достаточном для нахождения в ней файлов и
	может предоставлять простой интерфейс для выбора и передачи
	управления ядру или загрузчику.</para>

      <para>Так как <link linkend="boot-loader">загрузчик</link> устроен
	гораздо более сложно, и дает удобный и простой способ настройки
	процесса загрузки, boot2 обычно запускает его, однако раньше его
	задачей был запуск непосредственно самого ядра.</para>

      <example id="boot-boot2-example">
	<title>Образец экрана boot2</title>

	<screen>
&gt;&gt; FreeBSD/i386 BOOT
Default: 0:wd(0,a)/kernel
boot:
	</screen>
      </example>
    </sect2>
  </sect1>

  <sect1 id="boot-loader">
    <title>Загрузчик: третий этап процесса начальной загрузки</title>

    <para>Передача управления загрузчику является последним, третьим этапом в
      процессе начальной загрузки, а сам загрузчик находится в файловой
      системе, обычно как <filename>/boot/loader</filename>.</para>

    <note>
      <para>Когда как файлы <filename>/boot/boot0</filename>,
	<filename>/boot/boot1</filename> и
	<filename>/boot/boot2</filename> здесь присутствуют, они не являются
	реальными копиями <abbrev>MBR</abbrev>, загрузочного сектора или
	метки диска соответственно.</para>
    </note>

    <para>Загрузчик являет собой удобный в использовании инструмент для
      настройки при помощи простого набора команд, управляемого более мощным
      интерпретатором с более сложным набором команд.</para>

    <sect2 id="boot-loader-flow">
      <title>Процесс работы загрузчика</title>

      <para>Во время инициализации загрузчик пытается произвести поиск
	консоли, дисков и определить, с какого диска он был запущен.
	Соответствующим образом он задает значения переменных и после этого
	запускает интерпретатор, а простые команды передаются уже ему.</para>

      <para>Затем загрузчик читает файл
	<filename>/boot/loader.rc</filename>, который по умолчанию использует
	файл <filename>/boot/defaults/loader.conf</filename>, устанавливающий
	подходящие значения по умолчанию для переменных и читает файл
	<filename>/boot/loader.conf</filename> для изменения в этих
	переменных.  Затем с этими переменными работает
	<filename>loader.rc</filename>, загружающий выбранные модули и
	ядро.</para>

      <para>И наконец, по умолчанию загрузчик выдерживает 10-секундную паузу,
        ожидая нажатия клавиши, и загружает ядро, если этого не произошло.
	Если ожидание было прервано, пользователю выдается
	приглашение, которое воспринимает простой набор команд, в помощью
	которых пользователь может изменить значения переменных, выгрузить
	все модули, загрузить модули и окончательно продолжить процесс
	загрузки или перезагрузить машину.</para>

      <para>Более подробное техническое описание этого процесса дается на
	странице Справочника &man.loader.8;</para>
    </sect2>

    <sect2 id="boot-loader-commands">
      <title>Встроенные команды загрузчика</title>

      <para>Простой набор команд состоит из:</para>

      <variablelist>
	<varlistentry>
	  <term>autoboot <replaceable>секунды</replaceable></term>

	  <listitem>
	    <para>Продолжает загрузку ядра, если не будет прерван в течение
	      указанного в секундах промежутка времени.  Он выводит счетчик,
	      и по умолчанию выдерживается интервал в 10 секунд.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term>boot
	    <optional><replaceable>-параметры</replaceable></optional>
	    <optional><replaceable>имя ядра</replaceable></optional></term>

	  <listitem>
	    <para>Продолжить процесс загрузки указанного ядра, если оно было
	      указано, и с указанными параметрами, если они были
	      указаны.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term>boot-conf</term>

	  <listitem>
	    <para>Повторно провести тот же самый процесс автоматической
	      настройки модулей на основе переменных, что был произведен при
	      загрузке.  Это имеет смысл, если до этого вы выполнили команду
	      <command>unload</command>, изменили некоторые переменные,
	      например, наиболее часто меняемую <envar>kernel</envar>.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term>help
	    <optional><replaceable>тема</replaceable></optional></term>

	  <listitem>
	    <para>Вывод сообщений подсказки из файла
	      <filename>/boot/loader.help</filename>.  Если в качестве темы
	      указано слово <literal>index</literal>, то выводится список
	      имеющихся тем.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term>include <replaceable>имя файла</replaceable>
	    &hellip;</term>

	  <listitem>
	    <para>Выполнить файл с указанным именем.  Файл считывается и
	      его содержимое интерпретируется строчка за строчкой.  Ошибка
	      приводит к немедленному прекращению выполнения команды
	      include.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term>load <optional><option>-t</option>
	    <replaceable>тип</replaceable></optional>
	    <replaceable>имя файла</replaceable></term>

	  <listitem>
	    <para>Загружает ядро, модуль ядра или файл указанного типа с
	      указанным именем.  Все аргументы после имени файла передаются в
	      файл.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term>ls <optional><option>-l</option></optional>
	    <optional><replaceable>маршрут</replaceable></optional></term>

	  <listitem>
	    <para>Выводит список файлов по указанному маршруту или в корневом
	      каталоге, если маршрут не был указан.  Если указан параметр
	      <option>-l</option>, будут выводиться и размеры файлов.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term>lsdev <optional><option>-v</option></optional></term>

	  <listitem>
	    <para>Выводится список всех устройств, с которых могут быть
	      загружены модули.  Если указан параметр <option>-v</option>,
	      выводится дополнительная информация.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term>lsmod <optional><option>-v</option></optional></term>

	  <listitem>
	    <para>Выводит список загруженных модулей.  Если указан параметр
	      <option>-v</option>, то выводится дополнительная
	      информация.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term>more <replaceable>имя файла</replaceable></term>

	  <listitem>
	    <para>Вывод указанного файла с паузой при выводе каждой строки
	      <varname>LINES</varname>.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term>reboot</term>

	  <listitem>
	    <para>Выполнить немедленную перезагрузку машины.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term>set <replaceable>переменная</replaceable></term>
	  <term>set
	    <replaceable>переменная</replaceable>=<replaceable>значение</replaceable></term>

	  <listitem>
	    <para>Задает значения переменных окружения загрузчика.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term>unload</term>

	  <listitem>
	    <para>Удаление из памяти всех загруженных модулей.</para>
	  </listitem>
	</varlistentry>
      </variablelist>
    </sect2>

    <sect2 id="boot-loader-examples">
      <title>Примеры использования загрузчика</title>

      <para>Вот несколько практического использования загрузчика.</para>

      <itemizedlist>
	<listitem>
	  <para>Чтобы просто загрузить ваше ядро обычным образом, но в
	    однопользовательском режиме:</para>

	  <screen><userinput>boot -s</userinput></screen>
	</listitem>

	<listitem>
	  <para>Для выгрузки обычных ядра и модулей, а потом просто загрузить
	    ваше старое (или другое) ядро:</para>

	  <screen>
<userinput>unload</userinput>
<userinput>load <replaceable>kernel.old</replaceable></userinput>
	  </screen>

	  <para>Вы можете использовать <filename>kernel.GENERIC</filename>
	    для обозначения стандартного ядра, поставляемого на установочном
	    диске, или <filename>kernel.old</filename> для обращения к ранее
	    установленному ядру (после того, как, например, вы обновили или
	    отконфигурировали новое ядро).</para>

	  <note>
	    <para>Для загрузки ваших обычных модулей с другим ядром
	      используйте такие команды:</para>

	    <screen>
<userinput>unload</userinput>
<userinput>set kernel="<replaceable>kernel.old</replaceable>"</userinput>
<userinput>boot-conf</userinput>
	    </screen>
	  </note>
	</listitem>

	<listitem>
	  <para>Для загрузки скрипта конфигурации ядра (автоматизированный
	    скрипт, который выполняет то, что вы обычно делаете в
	    конфигураторе ядра во время загрузки):</para>

	  <screen>
<userinput>load -t userconfig_script
<replaceable>/boot/kernel.conf</replaceable></userinput>
	  </screen>
	</listitem>
      </itemizedlist>
    </sect2>
  </sect1>

  <sect1 id="boot-kernel">
    <title>Взаимодействие с ядром во время загрузки</title>

    <para>Как только ядро окажется загруженным при помощи <link
      linkend="boot-loader">загрузчика</link> (обычный способ) или <link
      linkend="boot-boot2">boot2</link> (минуя загрузчик), оно проверяет
      флаги загрузки, если они есть, и действует соответствующим
      образом.</para>

    <sect2 id="boot-kernel-bootflags">
      <title>Флаги загрузки ядра</title>

      <para>Вот наиболее часто используемые флаги загрузки:</para>

      <variablelist id="boot-kernel-bootflags-list">
	<varlistentry>
	  <term><option>-a</option></term>

	  <listitem>
	    <para>во время инициализации ядра запрашивать устройство для
	      его монтирования в качестве корневой файловой системы.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><option>-C</option></term>

	  <listitem>
	    <para>загрузка с компакт-диска.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><option>-c</option></term>

	  <listitem>
	    <para>запустить UserConfig для конфигурации ядра во время
	      загрузки</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><option>-s</option></term>

	  <listitem>
	    <para>после загрузки перейти в однопользовательский режим</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><option>-v</option></term>

	  <listitem>
	    <para>во время запуска ядра выводить более подробную
	      информацию</para>
	  </listitem>
	</varlistentry>
      </variablelist>

      <note>
	<para>Есть и другие флаги загрузки, обратитесь к странице
	  справочника по &man.boot.8; для выяснения подробной информации по
	  ним.</para>
      </note>
    </sect2>

<!--	<sect2 id="boot-kernel-userconfig">
      <title>UserConfig: Конфигурация ядра во время загрузки</title>

      <para> </para>
    </sect2> -->
  </sect1>

  <sect1 id="boot-init">
    <title>Init: инициализация управления процессами</title>

    <para>После того, как ядро завершит загрузку, оно передает управление
      пользовательскому процессу <command>init</command>, который расположен
      в файле <filename>/sbin/init</filename> или в файле, маршрут к которому
      указан в переменной <envar>init_path</envar>
      <command>загрузчика</command>.</para>

    <sect2 id="boot-autoreboot">
      <title>Процесс автоматической перезагрузки</title>

      <para>Процесс автоматической перезагрузки проверяет целостность
	имеющихся файловых систем.  Если это не так, и утилита
	<command>fsck</command> не может исправить положение, то
	<command>init</command> переводит систему в <link
	linkend="boot-singleuser">однопользовательский режим</link> для того,
	чтобы системный администратор сам разобрался с возникающими
	проблемами.</para>
    </sect2>

    <sect2 id="boot-singleuser">
      <title>Однопользовательский режим</title>

      <para>В этот режим можно перейти во время <link
	linkend="boot-autoreboot">процесса автоматической
	перезагрузки</link>, при ручной загрузке с флагом <option>-s</option>
	или заданием переменной <envar>boot_single</envar> в
	<command>загрузчике</command>.</para>

      <para>Этот режим может быть также вызван запуском программы
	<command>shutdown</command> без параметров перезагрузки
	(<option>-r</option>) или останова (<option>-h</option>) из
	<link linkend="boot-multiuser">многопользовательского
	режима</link>.</para>

      <para>Если режим доступа к системной консоли <literal>console</literal>
	установлен в файле <filename>/etc/ttys</filename> в
	<literal>insecure</literal>, то система выведет запрос на ввод пароля
	пользователя root перед входом в однопользовательский режим.</para>

      <example id="boot-insecure-console">
	<title>Незащищенная консоль в /etc/ttys</title>

	<programlisting>
# name	getty				type	status		comments
#
# This entry needed for asking password when init goes to single-user mode
# If you want to be asked for password, change "secure" to "insecure" here
console none				unknown off insecure
	</programlisting>
      </example>

      <note>
	<para>Обозначение консоли как <literal>insecure</literal> означает,
	  что вы считаете физический доступ к консоли незащищенным, и хотите,
	  чтобы только тот, кто знает пароль пользователя root, мог
	  воспользоваться однопользовательским режимом, но это не значит, что
	  вы хотите работать с консолью небезопасным способом.	Таким
	  образом, если вы хотите добиться защищенности, указывайте
	  <literal>insecure</literal>, а не <literal>secure</literal>.</para>
      </note>
    </sect2>

    <sect2 id="boot-multiuser">
      <title>Многопользовательский режим</title>

      <para>Если <command>init</command> определит, что ваши файловые системы
	находятся в полном порядке, или после того, как пользователь выйдет
	из <link linkend="boot-singleuser">однопользовательского
	режима</link>, система перейдет в многопользовательский режим, работа
	в котором начинается с настройки ресурсов системы.</para>

      <sect3 id="boot-rc">
	<title>Настройка ресурсов (rc)</title>

	<para>Система настройки ресурсов считывает настройки, применяемые по
	  умолчанию, из файла <filename>/etc/defaults/rc.conf</filename>, а
	  настройки, специфичные для конкретной системы, из
	  <filename>/etc/rc.conf</filename>, после чего осуществляется
	  монтирование файловых систем, перечисленных в файле
	  <filename>/etc/fstab</filename>, запуск сетевых служб, различных
	  системных даемонов и, наконец, выполнение скриптов запуска
	  дополнительно установленных пакаджей.</para>

	<para>Страница справочника по &man.rc.8; является хорошим источником
	  информации о системе настройки ресурсов. так же, как и
	  самостоятельное изучение скриптов.</para>
      </sect3>
    </sect2>
  </sect1>

  <sect1 id="boot-shutdown">
    <title>Процесс остановки системы</title>

    <para>Во время контролируемого процесса остановки системы через утилиту
      <command>shutdown</command>, программа <command>init</command> будет
      пытаться запустить скрипт <filename>/etc/rc.shutdown</filename>, после
      чего будет посылать всем процессам сигнал прекращения работы, и затем
      сигнал принудительного прекращения работы тем процессам, которые не
      завершили работу вовремя.</para>
  </sect1>
</chapter>

<!--
     Local Variables:
     mode: sgml
     sgml-declaration: "../chapter.decl"
     sgml-indent-data: t
     sgml-omittag: nil
     sgml-always-quote-attributes: t
     sgml-parent-document: ("../book.sgml" "part" "chapter")
     End:
-->
