<!--
     Copyright (c) 2001 The FreeBSD Documentation Project

     Redistribution and use in source (SGML DocBook) and 'compiled' forms
     (SGML, HTML, PDF, PostScript, RTF and so forth) with or without
     modification, are permitted provided that the following conditions
     are met:

      1. Redistributions of source code (SGML DocBook) must retain the above
         copyright notice, this list of conditions and the following
         disclaimer as the first lines of this file unmodified.

      2. Redistributions in compiled form (transformed to other DTDs,
         converted to PDF, PostScript, RTF and other formats) must reproduce
         the above copyright notice, this list of conditions and the
         following disclaimer in the documentation and/or other materials
         provided with the distribution.

     THIS DOCUMENTATION IS PROVIDED BY THE FREEBSD DOCUMENTATION PROJECT "AS
     IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NIK CLAYTON BE LIABLE FOR ANY
     DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
     ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE
     POSSIBILITY OF SUCH DAMAGE.

     The FreeBSD Russian Documentation Project

     $FreeBSD$
     $FreeBSDru: frdp/doc/ru_RU.KOI8-R/articles/solid-state/article.sgml,v 1.5 2004/02/01 22:11:06 maxim Exp $

     Original revision: 1.1
-->

<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
%man;
<!ENTITY legalnotice SYSTEM "../../share/sgml/legalnotice.sgml">
]>

<article>
  <articleinfo>
    <title>FreeBSD и твердотельные устройства</title>

    <authorgroup>
      <author>
	<firstname>John</firstname>
	<surname>Kozubik</surname>

	<affiliation>
	  <address><email>john@kozubik.com</email></address>
	</affiliation>
      </author>
    </authorgroup>
    
    <pubdate>$FreeBSD$</pubdate>

    <copyright>
      <year>2001</year>
      <holder>The FreeBSD Documentation Project</holder>
    </copyright>

    &legalnotice;
    
    <abstract>
      <para>В этой статье описывается использование твердотельных дисковых
        устройств для создания встраиваемых систем на основе FreeBSD.</para>
    
      <para>Встраиваемые системы имеют преимущество в повышенной надежности
        по причине отсутствия в них движущихся частей (жестких дисков).  Однако
        следует принять во внимание, что системе, как правило, доступно очень
        малое дисковое пространство и ограниченный объем запоминающего
        устройства.</para>

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

  <sect1 id="intro">
    <title>Твердотельные дисковые устройства</title>

    <para>Эта статья будет ограничиваться рассмотрением твердотельных дисковых
      устройств, которые делаются на основе флэш-памяти.  Флэш-память является
      твердотельным (здесь нет движущихся частей) запоминающим устройством,
      которое является энергонезависимым (данные остаются в памяти даже после
      отключения всех источников питания).  Флэш-память может быть
      нечувствительной к сильным физическим воздействиям и достаточно быстра
      (решения на основе флэш-памяти, описываемые в этой статье, гораздо
      медленнее, чем диски EIDE для операций записи, и гораздо быстрее их в
      случае выполнения операций чтения).  Одним из очень важных свойств
      флэш-памяти, различные варианты которого будут рассмотрены далее в этой
      статье, является то, что каждый сектор имеет ограниченные возможности по
      перезаписыванию.  Вы можете только записывать, стирать и снова записывать
      на сектор флэш-памяти определенное количество раз до того, как сектор
      станет полностью неработоспособным.  Хотя многие продукты на основе
      флэш-памяти автоматически перенаправляют испорченные блоки, а некоторые
      даже распределяют операции записи по всему модулю, фактом является
      наличие ограничения на количество операций записи, которые могут
      выполняться с устройством.  Современные модули имеют характеристики от
      1,000,000 до 10,000,000 циклов записи на сектор.  Эти характеристики
      могут зависеть от температуры рабочей среды.</para>

    <para>В частности, мы обсудим компактные модули флэш-памяти, совместимые со
      стандартом ATA и модули флэш-памяти Disk-On-Chip компании M-Systems.
      Совместимые с ATA компактные флэш-карты весьма популярны в качестве
      носителя данных для цифровых камер.  Особый интерес представляет тот
      факт, что они соответствуют шине IDE по контактам и совместимы с набором
      команд ATA.  Таким образом, при помощи очень простого и дешевого адаптера
      такие устройства могут подключаться непосредственно к шине IDE
      компьютера.  Если поступить таки образом, то такие операционные системы,
      как FreeBSD, распознают диск как обычный винчестер (весьма маленький).
      Продукт M-Systems Disk-On-Chip основан на той же самой технологии
      флэш-памяти, как и совместимые с ATA компактные флэш-карты, но отличаются
      форм-фактором DIP и не совместимы с ATA.  Для использования такого
      устройства, вы не только должны установить его на материнскую плату с
      разъемом Disk-On-Chip, но также встроить драйвер `fla` во все ядра
      FreeBSD, с которыми хотите его использовать.  Более того, в загрузочном
      секторе этого устройства находится критичные данные, так что бы не должны
      устанавливать загрузчик FreeBSD (и вообще какой-либо другой загрузчик)
      при его использовании.</para>

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

  <sect1 id="kernel">
      <title>Параметры ядра</title>

    <para>Для тех. кто создает встраиваемую систему FreeBSD, интерес
      представляют несколько параметров ядра.</para>

    <para>Во-первых, все встраиваемые системы FreeBSD, которые используют
      флэш-память в качестве системного диска, заинтересованы в использовании
      дисков в памяти и файловых систем в памяти.  Из-за ограниченного
      количества циклов записи, которые можно выполнить с флэш-памятью, диск
      и файловые системы на нем будут, скорее всего, монтироваться в режиме
      доступа только для чтения.  В таком случае файловые системы типа
      <filename>/tmp</filename> и <filename>/var</filename> монтируются как
      файловые системы в памяти для того, чтобы позволить системе создать
      журналы и обновить счетчики и временные файлы.  Файловые системы в памяти
      являются критическим компонентом успешной работы FreeBSD на твердотельных
      устройствах.</para>

    <para>Вы должны удостовериться, что в конфигурационном файле вашего ядра
      присутствуют следующие строки:</para>

    <programlisting>
options         MFS             # Memory Filesystem
options         MD_ROOT         # md device usable as a potential root device
pseudo-device   md              # memory disk
    </programlisting>

    <para>Во-вторых, если вы будете использовать продукт M-Systems
      Disk-On-Chip, вы должны также включить такую строку:</para>

    <programlisting>device          fla0    at isa?</programlisting>
  </sect1>

  <sect1 id="ro-fs">
    <title><filename>rc.diskless</filename> файловые системы в режиме только
      чтения</title>

    <para>Инициализация встраиваемой системы FreeBSD после загрузки управляется
      <filename>/etc/rc.diskless2</filename>
      (<filename>/etc/rc.diskless1</filename> для бездисковой загрузки
      посредством BOOTP).  Этот начальный скрипт вызывается, если поместить
      в файл <filename>/etc/rc.conf</filename> такую строку:</para>

    <programlisting>diskless_mount=/etc/rc.diskless2</programlisting>

    <para><filename>rc.diskless2</filename> монтирует
      <filename>/var</filename> как файловую систему в памяти, создает
      указываемый список каталогов в <filename>/var</filename> при помощи
      команды &man.mkdir.1;, изменяет режимы доступа на некоторые из этих
      каталогов и помещает целый набор файлов устройств копированием на
      доступный для записи (опять же, это файловая система в памяти) раздел
      <filename>/dev</filename>.  В процессе выполнения
      <filename>/etc/rc.diskless2</filename>, задействуется еще одна переменная
      <filename>rc.conf</filename> - <literal>varsize</literal>.  Скрипт
      <filename>/etc/rc.diskless2</filename> создает раздел
      <filename>/var</filename> на основе значения этой переменной из
      <filename>rc.conf</filename>:</para>

    <programlisting>varsize=8192</programlisting>

    <para>Запомните, что это значение указано в секторах.  Создание раздела
      <filename>/dev</filename> при помощи
      <filename>/etc/rc.diskless2</filename>, однако, ограничено
      предопределенным значением в 4096 секторов.  Легко изменить это значение
      непосредственно в файле <filename>/etc/rc.diskless2</filename>, хотя
      для каталога <filename>/dev</filename> вряд ли вам понадобится больше
      дискового пространства.</para>

    <para>Важно помнить, что скрипт <filename>/etc/rc.diskless2</filename>
      предполагает, что вы уже удалили ваш обычный раздел
      <filename>/tmp</filename> и заменили его символической ссылкой на
      <filename>/var/tmp</filename>.  Так как <filename>tmp</filename> является
      одним из каталогов, создаваемых в <filename>/var</filename> скриптом
      <filename>/etc/rc.diskless2</filename> и <filename>/var</filename>
      является файловой системой в памяти (которая монтируется с правами чтения
      и записи),  то <filename>/tmp</filename> будет каталогом, также доступным
      для чтения и записи.</para>

    <para>Тот факт, что <filename>/var</filename> и <filename>/dev</filename>
      являются файловыми системами, доступными для чтения и записи, является
      важным признаком, так как раздел <filename>/</filename> (и любые другие
      разделы, которые могут находиться на флэш-носителе) должен монтироваться
      в режиме только для чтения.  Вспомните, что <xref linkend="intro"> мы
      касались ограничений флэш-памяти - особенно ограничений, касающихся
      возможностей записи.  Важно не монтировать файловые системы на
      флэш-носителях в режимах чтения и записи, и важность отказа от файла
      подкачки не может быть переоценена.  Файл подкачки на загруженной системе
      может пережечь кусок флэш-носителя менее чем за год.  Частое
      журналирование и создание временных файлов приводят к тому же результату.
      Поэтому, кроме удаления записей <literal>swap</literal> и
      <literal>/proc</literal> из вашего файла <filename>/etc/fstab</filename>,
      вы должны также изменить поле параметров каждой файловой системы на
      <literal>ro</literal> таким образом:</para>

    <programlisting>
# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/ad0s1a             /               ufs     ro              1       1
    </programlisting>

    <para>В результате этих изменений в среднестатистической системе несколько
      приложений немедленно перестанут работать.  Например,  порты не будут
      устанавливаться из дерева портов из-за отсутствия файла
      <filename>/var/db/port.mkversion</filename>, cron не будет нормально
      запускаться в результате отсутствия таблиц для него в каталоге
      <filename>/var</filename>, созданном
      <filename>/etc/rc.diskless2</filename>, а syslog и dhcp будут испытывать
      проблемы из-за доступа файловой системы только для чтения, а также
      отсутствия записей в <filename>/var</filename>, который был создан
      скриптом <filename>/etc/rc.diskless2</filename>.  Хотя эти проблемы
      являются временными и обсуждаются вместе с решением проблем с запуском
      распространенных программных пакетов, в <xref
      linkend="strategies">.</para>

    <para>Важно помнить, что файловая система, которая была смонтирована
      только для чтения при помощи файла <filename>/etc/fstab</filename>, в
      любой момент может быть сделана доступной по чтению и записи выдачей
      команды:</para>

    <screen>
&prompt.root; <userinput>/sbin/mount -uw <replaceable>partition</replaceable></userinput>
    </screen>

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

    <screen>
&prompt.root; <userinput>/sbin/mount -ur <replaceable>partition</replaceable></userinput>
    </screen>
  </sect1>

  <sect1>
    <title>Создание файловой системы с нуля</title>

    <para>Так как совместимые с ATA компактные флэш-карты распознаются во
      FreeBSD как обычные жесткие диски IDE, как это происходит с продуктом
      M-Systems Disk-On-Chip (когда вы запускаете ядро с встроенным драйвером
      fla), то теоретически вы можете установить FreeBSD по сети при помощи
      дискет kern и mfsroot или с компакт-диска.  Кроме того, что вам не нужно
      записывать какой бы то ни было начальный загрузчик на устройство
      M-Systems, никаких дополнительных инструкций не требуется.</para>

    <para>Однако даже маленькая установка FreeBSD при помощи обычных процедур
      установки может привести к созданию системы размером, превышающим 200
      мегабайт.  Так как большинство людей используют устройства флэш-памяти
      меньшего размера (128 мегабайт считается весьма большим - 32 или даже 16
      мегабайт используются гораздо чаще), то установка обычным образом не
      подходит&mdash;просто на диске нет места даже для самой минимальной
      установки.</para>

    <para>Самым простым способом обойти это ограничение на объем является
      установка FreeBSD обычным образом на обычный жесткий диск.  После
      окончания установки, обрежьте операционную систему до размера, который
      помещается на ваш флэш-носитель, а затем полностью заархивируйте файловую
      систему.  Следующие шаги поведут вас через процесс подготовки части
      флэш-памяти для вашей заархивированной файловой системы.  Запомните, что
      из-за того, что обычная установка не выполнялась, такие операции, как
      разбиение на разделы, разметка, создание файловой системы и так далее
      должны быть выполнены вручную.  Кроме дискет kern и mfsroot вам также
      нужно воспользоваться дискетой fixit.  Если вы используете M-Systems
      Disk-On-Chip, то ядро с дискеты kern должно иметь вкомпилированный
      параметр <literal>fla</literal>, описываемый в <xref linkend="kernel">.
      Пожалуйста, обратитесь к <xref linkend="kern.flp"> для получения указаний
      по созданию нового ядра для <filename>kern.flp</filename>.</para>

    <procedure>
      <step>
	<title>Разбиение вашего флэш-носителя на разделы</title>

	<para>После загрузки при помощи дискет kern и mfsroot, выберите пункт
	  <literal>custom</literal> из меню установки.  Из следующего пункта
          меню выберите <literal>partition</literal>.  В меню работы с
          разделами вы должны удалить все существующие разделы при помощи
          клавиши <keycap>d</keycap>.  После удаления всех имеющихся разделов
          создайте раздел при помощи клавиши <keycap>c</keycap> и согласитесь
          с предлагаемым по умолчанию размером раздела.  Когда вы будете
          опрошены на предмет типа раздела, удостоверьтесь, что значение типа
          равно <literal>165</literal>.  Теперь запишите эту таблицу разделов
          на диск, нажав клавишу <keycap>w</keycap> (на этом экране эта опция
          скрыта).  Находясь в меню выбора менеджера загрузки, обратите
          внимание на выбор <literal>None</literal>, если вы используете
	  M-Systems Disk-On-Chip.  Если вы используете компактную флэш-карту,
          совместимую с ATA, вы должны выбрать FreeBSD Boot Manager.  Теперь
          нажмите клавишу <keycap>q</keycap> для выхода из меню работы с
          разделами.  Должно быть выдано еще раз меню для выбора менеджера
          загрузки - повторите то, что вы выбирали ранее.</para>
      </step>

      <step>
	<title>Создание файловых систем на вашем устройстве флэш-памяти</title>

	<para>Выйдите из меню установки custom, и из главного меню установки
          выберите пункт <literal>fixit</literal>.  После входа в режим работы
          fixit, введите следующие команды:</para>

	<informaltable frame="none">
        <tgroup cols="2">
          <thead>
            <row>
              <entry align="center">Совместимые с ATA</entry>

	      <entry align="center">Disk-On-Chip</entry>
            </row>
          </thead>

          <tbody>
            <row>
              <entry><para><screen>&prompt.root; <userinput>mknod /dev/ad0c c 116 0</userinput>
&prompt.root; <userinput>mknod /dev/ad0c c 116 2</userinput>		      
&prompt.root; <userinput>disklabel -e /dev/ad0c</userinput></screen></para></entry>

	      <entry><para><screen>&prompt.root; <userinput>mknod /dev/fla0c c 102 2</userinput>
&prompt.root; <userinput>mknod /dev/fla0c c 102 2</userinput>
&prompt.root; <userinput>disklabel -e /dev/fla0c</userinput></screen></para></entry>
            </row>
          </tbody>
        </tgroup>
	</informaltable>

	<para>В этот момент вы войдете в редактор vi из-под команды disklabel.
          Если вы используете Disk-On-Chip, то первым шагом будет изменение
          значения типа около начала файла с <literal>ESDI</literal> на
	  <literal>DOC2K</literal>.  Затем, вне зависимости от того,
          используете ли вы Disk-On-Chip или совместимый с ATA компактный
          флэш-носитель, вам нужно добавить строку a: в конце файла.  Эта
          строка <literal>a:</literal> должна выглядеть примерно так:</para>

	<programlisting>
a:      <replaceable>123456</replaceable>  0       4.2BSD  0       0
        </programlisting>

	<para>Здесь <replaceable>123456</replaceable> является числом, в
          точности совпадающим с тем, что характеризует размер имеющейся
          записи для <literal>c:</literal>.  В общем, вы копируете существующую
          строку для <literal>c:</literal> для строки <literal>a:</literal>,
          не забывая определить fstype как <literal>4.2BSD</literal>.
          Сохраните файл и завершите редактирование.</para>

	<informaltable frame="none">
        <tgroup cols="2">
          <thead>
            <row>
              <entry align="center">Совместимые с ATA</entry>

	      <entry align="center">Disk-On-Chip</entry>
            </row>
          </thead>
    
          <tbody>
            <row>
              <entry><para><screen>&prompt.root; <userinput>disklabel -B -r /dev/ad0c</userinput>
&prompt.root; <userinput>newfs /dev/ad0a</userinput></screen></para></entry>

	      <entry><para><screen>&prompt.root; <userinput>disklabel -B -r /dev/fla0c</userinput>
&prompt.root; <userinput>newfs /dev/fla0a</userinput></screen></para></entry>
	    </row>
	  </tbody>
        </tgroup>
	</informaltable>
      </step>

      <step>
	<title>Размещение вашей файловой системы на флэш-носителе</title>

	<para>Смонтируйте только что подготовленный флэш-носитель:</para>

	<informaltable frame="none">
	  <tgroup cols="2">
	    <thead>
	      <row>
		<entry align="center">Совместимые с ATA</entry>

		<entry align="center">Disk-On-Chip</entry>
	      </row>
	    </thead>
	    <tbody>
	      <row>
		<entry><para><screen>&prompt.root; <userinput>mount /dev/ad0a /flash</userinput></screen></para></entry>

		<entry><para><screen>&prompt.root; <userinput>mount /dev/fla0 /flash</userinput></screen></para></entry>
	      </row>
	    </tbody>
	  </tgroup>
	</informaltable>

	<para>Подключите эту машину к сети, чтобы можно было перенести наш
          tar-файл и распаковать его в файловую систему на флэш-носителе.  Вот
          пример того, как это можно сделать:</para>

	<screen>
&prompt.root; <userinput>ifconfig xl0 192.168.0.10 netmask 255.255.255.0</userinput>
&prompt.root; <userinput>route add default 192.168.0.1</userinput>
        </screen>

	<para>Теперь, когда машина находится в сети, перепишите ваш tar-файл.
          Здесь вы можете столкнуться с некоторой проблемой - если объем вашей
          флэш-памяти равен, к примеру, 128 мегабайтам, а ваш tar-файл
          превышает 64 мегабайта, то вы не можете одновременно разместить
          tar-файл на флэш-носителе и распаковать его - вам не хватит места.
          Одним из решений этой проблемы, если вы используете ftp, является
          распаковка файла во время его передачи по ftp.  Если вы передаете
          файл именно так, то вы никогда не получите на диске одновременно
          архивный файл и его содержимое:</para>

	<screen>
<prompt>ftp></prompt> <userinput>get tarfile.tar "| tar xvf -"</userinput>
        </screen>

	<para>Если ваш файл обработан утилитой gzip, вы также можете этого
          добиться:</para>

	<screen>
<prompt>ftp></prompt> <userinput>get tarfile.tar "| zcat | tar xvf -"</userinput>
        </screen>

	<para>После того, как вы получили содержимое вашей заархивированной
          файловой системы на файловой системе флэш-памяти, вы можете
          размонтировать флэш-память и выполнить перезагрузку:</para>

	<screen>
&prompt.root; <userinput>cd /</userinput>
&prompt.root; <userinput>umount /flash</userinput>
&prompt.root; <userinput>exit</userinput>
        </screen>

	<para>Полагая, что вы правильно настроили вашу файловую систему при
          ее построении на обычном диске (с вашей файловой системой,
          смонтированной в режиме доступа только для чтения и необходимыми
          параметрами, присутствующими в ядре) вы должны успешно загрузить вашу
          встраиваемую систему на основе FreeBSD.</para>
      </step>
    </procedure>
  </sect1>

  <sect1 id="kern.flp">
    <title>Построение установочной дискеты <filename>kern.flp</filename> с
      драйвером fla</title>

    <note>
      <para>Этот раздел статьи предназначен только тем, кто использует
        флэш-носители M-Systems Disk-On-Chip.</para>
    </note>

    <para>Возможно, что на загрузочная дискете <filename>kern.flp</filename>
      нет ядра со встроенным драйвером <devicename>fla</devicename>, который
      необходим для работы системы с Disk-On-Chip.  Если вы загрузились с
      установочных дискет и оказалось, что диски не были обнаружены, то,
      вероятно, в вашем ядре отсутствует драйвер
      <devicename>fla</devicename>.</para>

    <para>После построения вами ядра с поддержкой <devicename>fla</devicename>,
      которое имеет объем, меньший, чем 1.4 мегабайт, вы можете создать
      собственный образ дискеты <filename>kern.flp</filename> с этим ядром
      с помощью следующей последовательности действий:</para>

    <procedure>
      <step>
	<para>Возьмите существующий файл образа kern.flp</para>
      </step>

      <step>
	<para>
          <screen>
&prompt.root; <userinput>vnconfig vn0c kern.flp</userinput>
          </screen>
        </para>
      </step>

      <step>
	<para>
          <screen>
&prompt.root; <userinput>mount /dev/vn0c /mnt</userinput>
          </screen>
        </para>
      </step>
      
      <step>
	<para>Перепишите ваш файл ядра в каталог <filename>/mnt</filename>,
          заместив при этом уже находящееся там ядро</para>
      </step>

      <step>
	<para>
          <screen>
&prompt.root; <userinput>vnconfig -d vn0c</userinput>
          </screen>
        </para>
      </step>
    </procedure>

    <para>Теперь в вашем файле <filename>kern.flp</filename> находится новое
      ядро.</para>
  </sect1>

  <sect1 id="strategies">
    <title>Стратегии работы с системой для случаев небольших и доступных
      только для чтения файловых систем</title>

    <para>В <xref linkend="ro-fs"> было указано, что файловая система
      <filename>/var</filename>, создаваемая скриптом
      <filename>/etc/rc.diskless2</filename> и наличие корневой файловой
      системы, доступной только для чтения, приводят к проблемам при работе
      многих распространенных программных пакетов, используемых во FreeBSD.
      В этой статье будут даны рекомендации по настройке нормальной работы
      cron и syslog, установке портов и веб-сервера Apache.</para>

    <sect2>
      <title>cron</title>

      <para>В файле <filename>/etc/rc.diskless2</filename> имеется переменная
	<literal>var_dirs</literal>.  Эта переменная задает список каталогов,
        разделенных запятыми, которые будут созданы в каталоге
	<filename>/var</filename> после его монтирования как файловой системы
        в памяти.  <filename>cron</filename> и <filename>cron/tabs</filename>
        в этот список не входят, а без этих каталогов cron нормально работать
        не будет.  Включив <literal>cron</literal>,
        <literal>cron/tabs</literal> и, может быть, даже <literal>at</literal>
        и <literal>at/jobs</literal> в качестве элементов этой переменной, вы
        обеспечите работу даемонов &man.cron.8; и &man.at.1;.</para>

      <para>Однако это все же не решит проблему с сохранением cron-таблиц
        между перезагрузками.  Когда система перезагружается, то файловая
        система	<filename>/var</filename>, которая располагается в памяти,
        будет уничтожена, вместе со всеми cron-таблицами, которые вы могли там
        иметь.  Поэтому одним из решений может стать создание cron-таблиц для
        пользователей, которым они нужны, монтирование вашей файловой системы
	<filename>/</filename> в режиме чтения и записи и копирование этих
        cron-таблиц в безопасное место, например,
        <filename>/etc/tabs</filename> и последующее добавление строки в
        конец скрипта <filename>/etc/rc.diskless2</filename> для копирования
        этих cron-таблиц в каталог <filename>/var/cron/tabs</filename> после
        его создания во время инициализации системы.  Вам может также
        потребоваться добавить строку, которая изменяет режимы доступа и
        права на каталоги, которые вы создали и на файлы, которые вы
        скопировали в скрипте <filename>/etc/rc.diskless2</filename>.</para>
    </sect2>

    <sect2>
      <title>syslog</title>

      <para>В файле <filename>syslog.conf</filename> задано местоположение
        некоторых файлов протоколов, которые имеются в каталоге
	<filename>/var/log</filename>.  Эти файлы не создаются скриптом
	<filename>/etc/rc.diskless2</filename> во время инициализации системы
	Поэтому где-нибудь в скрипте <filename>/etc/rc.diskless2</filename>,
	после секции, создающей каталоги в <filename>/var</filename>, вам нужно
        добавить нечто вроде следующего:</para>

      <screen>
&prompt.root; <userinput>touch /var/log/security /var/log/maillog /var/log/cron /var/log/messages</userinput>
&prompt.root; <userinput>chmod 0644 /var/log/*</userinput>
      </screen>

      <para>Вам также потребуется добавить каталог с протоколами работы к
        списку каталогов, создаваемых скриптом
        <filename>/etc/rc.diskless2</filename>.</para>
    </sect2>

    <sect2>
      <title>Установка портов</title>

      <para>Перед тем, как обсудить изменения, которые нужно сделать для
        успешного использования дерева портов, необходимо напомнить о том,
        что ваши файловые системе на флэш-носителях доступны только для чтения.
        Поэтому вам нужно временно монтировать их в режиме чтения и записи,
        используя параметры командной строки, как это показано в 
	<xref linkend="ro-fs">.  Вы всегда должны перемонтировать эти файловые
        системы в режим только для чтения после окончания работ - опасно
        оставлять их в режиме чтения и записи, чтобы ни один процесс не смог
        начать протоколирование или каким-либо другим образом постоянно
        записывать данные на флэш-память и портить ее.</para>

      <para>Чтобы можно было войти в каталог с портами и успешно выполнить
        команду <command>make install</command>, необходимо наличие файла
	<filename>/var/db/port.mkversion</filename>, в котором записана
        правильная дата.  Затем мы должны создать каталог для пакаджей в
        файловой системе, не располагающейся в памяти, где будут храниться
        пакаджи между перезагрузками.  Так как для установки пакаджа в любом
        случае требуется монтирование ваших файловых систем для чтения и
        записи, имеет смысл выделить область флэш-носителя также и для записи
        информации о пакадже.</para>

      <para>Прежде всего создайте каталог с базой данных о пакаджах.  Обычно
        это каталог <filename>/var/db/pkg</filename>, но мы не можем разместить
        базу именно здесь, так как она исчезнет после перезагрузки
        системы.</para>

      <screen>&prompt.root; <userinput>mkdir /etc/pkg</userinput></screen>

      <para>Теперь в скрипт <filename>/etc/rc.diskless2</filename> добавьте
        строку, которая связывает каталог <filename>/etc/pkg</filename> с
	<filename>/var/db/pkg</filename>.  Например:</para>

      <screen>
&prompt.root; <userinput>ln -s /etc/pkg /var/db/pkg</userinput>
      </screen>
      
      <para>Добавьте в скрипт <filename>/etc/rc.diskless2</filename> еще одну
        строку, которая создает и копирует
	<filename>/var/db/port.mkversion</filename></para>

      <screen>
&prompt.root; <userinput>touch /var/db/port.mkversion</userinput>
&prompt.root; <userinput>chmod 0644 /var/db/port.mkversion</userinput>
&prompt.root; <userinput>echo <replaceable>20010412</replaceable> >> /var/db/port.mkversion</userinput>
      </screen>

      <para>где <replaceable>20010412</replaceable> является датой,
        соответствующей вашей версии FreeBSD.</para>

      <para>Теперь каждый раз при монтировании ваших файловых систем для чтения
        и записи и установки пакаджа, команда <command>make install</command>
        будет работать, потому что найдет подходящий файл
	<filename>/var/db/port.mkversion</filename>, а информация о пакадже
        будет успешно записана в каталог <filename>/etc/pkg</filename> (так как
        файловая система будут в это время смонтирована для чтения и записи),
        который всегда будет доступным операционной системе как
	<filename>/var/db/pkg</filename>.</para>
    </sect2>

    <sect2>
      <title>Веб-сервер Apache</title>

      <para>Apache хранит pid-файлы и протоколы в каталоге
	<filename><replaceable>apache_install</replaceable>/logs</filename>.
	Так как этот каталог, без сомнения, располагается на файловой системе,
        доступной только для чтения, то это работать не будет.  Необходимо
        добавить новый каталог к списку каталогов из
	<filename>/etc/rc.diskless2</filename> для их создания в каталоге
	<filename>/var</filename> и связать
	<filename><replaceable>apache_install</replaceable>/logs</filename> с
	<filename>/var/log/apache</filename>.  Нужно также задать права доступа
        и владельца нового каталога.</para>

      <para>Сначала добавьте каталог <literal>log/apache</literal> к списку
        каталогов, создаваемых скриптом
    	<filename>/etc/rc.diskless2</filename>.</para>
      
      <para>Затем добавьте в скрипт <filename>/etc/rc.diskless2</filename>
        после секции создания каталогов такие команды:</para>

      <screen>
&prompt.root; <userinput>chmod 0774 /var/log/apache</userinput>
&prompt.root; <userinput>chown nobody:nobody /var/log/apache</userinput>
      </screen>

      <para>И наконец, удалите существующий каталог
	<filename><replaceable>apache_install</replaceable>/logs</filename> и
	замените его ссылкой:</para>

      <screen>
&prompt.root; <userinput>rm -rf (apache_install)/logs</userinput>
&prompt.root; <userinput>ln -s /var/log/apache (apache_install)/logs</userinput>
      </screen>
    </sect2>
  </sect1>
</article>
