Мини-HOWTO: Раздел подкачки Linux

Rahul U. Joshi

     [email protected]
   

Перевод: Станислав Рогин, SWSoft Pte Ltd.

Версия 1.41, 9 декабря 1999

В этом документе содержится информация о том, как использовать раздел подкачки (swap partition) вашего Linux совместно с Windows.


1. Введение

Многие используют Linux и MS-Windows вместе. Возможность делать это - одно из условий "Linux-революции"; т.е. дать людям возможность экспериментировать с Linux (и привыкнуть к нему), сохраняя способы запускать их старые программы. Так как и Linux, и MS-Windows используют виртуальную память с подкачкой на диске, очень часто в конференции comp.os.linux.setup возникает вопрос "Как совместно использовать область подкачки", с целью сократить используемое дисковое пространство.

Существует несколько различных методов разделения областей подкачки - тот, который описывается в этом документе, видимо, самый сложный - но это единственный способ, достигающий максимального быстродействия в обеих системах без риска потерять данные на диске. Если вы используете DOS, то должны знать, что многие DOS-приложения также создают свои файлы подкачки. Можно использовать для этого раздел подкачки Linux так же, как и для Windows.

Предостережение

Внимание: В случае, если вы использовали советы старой версии этого документа (1.4), и сейчас ваш SCANDISK выдает ошибку на диске X:, прочтите раздел "Замечания для читателей версии 1.4 этого документа" , написанный специально для того, чтобы вы восстановили все в нормальное состояние.


2. Что вам понадобится

У всей этой процедуры очень немного требований. Однако, я настоятельно рекомендую, чтобы все эти требования были обязательно выполнены, т.к. с более старыми версиями возникают проблемы. Итак, потребуются:

  1. MS-DOS 5.0 или новее с MS-Windows 3.1/3.11 ИЛИ MS-Windows 95/98

  2. Программы shutdown/init, умеющие запускать файлы в процессе загрузки и выключения. (Пакет SysVinit-2.50, например, может это делать. SysVinit-2.50 можно найти на сайте sunsite.unc.edu в каталоге /pub/Linux/system/Daemons. Почти все нынешние дистрибутивы используют этот пакет.)


3. Изменения и дополнения

  • Версия 1.3 -- Написана H. Peter Anvin, и не поддерживается с 15 января 1998.

  • Версия 1.4 -- Основана на версии 1.3, но добавлено много деталей. Сейчас поддерживается Rahul U. Joshi

  • Версия 1.41 -- Изменены некоторые шаги процедуры для предотвращения ошибок на диске подкачки, который проверяется SCANDISK.

Изменения внесены Rahul U. Joshi

Дата: 26 ноября 1999

  • Добавлены детали, касающиеся Windows 95/98.

  • Добавлены замечания о Red Hat Linux.

  • Исправлена программа msinfo.

  • Добавлены разделы 5 - 12.

  • Полностью переписан раздел "Процедура", чтобы он был более удобочитаемым.

  • Инициализация области подкачки и остановка системы разделены в два скрипта.

  • Изменены скрипты: внесена поддержка многократной проверки сигнатуры.

  • Добавлены замечания о новых видах областей подкачки.

  • Добавлены несколько более надежных схем действий.


4. Административные упоминания

4.1. Copyright

Unless otherwise stated, Linux HOWTO documents are copyrighted by their respective authors. Linux HOWTO documents may be reproduced and distributed in whole or in part, in any medium physical or electronic, as long as this copyright notice is retained on all copies. Commercial redistribution is allowed and encouraged; however, the author would like to be notified of any such distributions.

All translations, derivative works, or aggregate works incorporating any Linux HOWTO documents must be covered under this copyright notice. That is, you may not produce a derivative work from a HOWTO and impose additional restrictions on its distribution. Exceptions to these rules may be granted under certain conditions; please contact the Linux HOWTO coordinator at the address given below.

In short, we wish to promote dissemination of this information through as many channels as possible. However, we do wish to retain copyright on the HOWTO documents, and would like to be notified of any plans to redistribute the HOWTOs.

If you have questions, please contact Tim Bynum, the Linux HOWTO coordinator, at [email protected] via email.


4.2. Авторские права

Авторские права на русский перевод этого текста принадлежат © 2000 SWSoft Pte Ltd. Все права зарезервированы.

Этот документ является частью проекта Linux HOWTO.

Авторские права на документы Linux HOWTO принадлежат их авторам, если явно не указано иное. Документы Linux HOWTO, а также их переводы, могут быть воспроизведены и распространены полностью или частично на любом носителе, физическом или электронном, при условии сохранения этой заметки об авторских правах на всех копиях. Коммерческое распространение разрешается и поощряется; но, так или иначе, автор текста и автор перевода желали бы знать о таких дистрибутивах.

Все переводы и производные работы, выполненные по документам Linux HOWTO, должны сопровождаться этой заметкой об авторских правах. Это делается в целях предотвращения случаев наложения дополнительных ограничений на распространение документов HOWTO. Исключения могут составить случаи получения специального разрешения у координатора Linux HOWTO, с которым можно связаться по адресу приведенному ниже.

Мы бы хотели распространить эту информацию по всем возможным каналам. Но при этом сохранить авторские права и быть уведомленными о всех планах распространения HOWTO. Если у вас возникли вопросы, пожалуйста, обратитесь к координатору проекта Linux HOWTO по электронной почте: или к координатору русского перевода Linux HOWTO компании SWSoft Pte Ltd. по адресу


4.3. Ответственность

Автор не несет ответственности ни за какие потери или искажения данных, в процессе использования информации данной в этом документе. Невозможно проверить вещи под всеми конфигурациями, поэтому что-то из данного здесь может быть ошибочно или не работать на вашей системе. В случае, если вы обнаружите ошибку - сначала сообщите об этом мне!

Этот документ распространяется "как есть". Я постарался описать весь процесс как можно точнее, но вы используете данную информацию на свой страх и риск. Я ни в коем случае не отвечаю за любые повреждения, явившиеся результатом использования этой информации.

Если вы планируете включить этот HOWTO в какой либо дистрибутив или использовать в печати, я буду рад получить уведомление об этом. В этом случае я могу предоставить вам последнюю версию этого документа.


5. Перед тем, как вы начнете

Этот документ не является пошаговой инструкцией. Предполагается, что читатель сначала изучит весь документ, чтобы быть осведомленным о различных подводных камнях и возможных трудностях. После того, как вы получите четкое представление о том, какие шаги будут вами предприняты, вы можете начать следовать инструкциям этого документа пошагово. Так как вы будете root-ом и вам предстоит изменять системные файлы инициализации, будьте осторожны с тем, что собираетесь делать. Пишите в этих файлах комментарии к тем секциям, которые добавляете, а когда хотите убрать секцию, не удаляйте ее - просто закомментируйте. (В скриптах комментарии начинаются с символа #). В случае, если что-то пойдет не так, вы сможете восстановить исходную конфигурацию, просто убрав те изменения, которые внесли. Несмотря на то, что вы не обязательно должны хорошо знать синтаксис скриптов, и то, что я дал в этом документе все, что необходимо, небольшие познания в этом вопросе могут быть полезны, как со стороны понимания, так и со стороны поиска ошибок.


6. Процедура

Предостережение

ВНИМАНИЕ: Эта глава написана с учетом особенностей RedHat Linux 6.0 Несмотря на то, что общие принципы, описанные здесь, применимы ко всем дистрибутивам, некоторые детали могут отличаться. Я приветствую любые отзывы с описанием деталей процедуры для других дистрибутивов. У многих пользователей существует раздел подкачки, выделенный специально для Linux. Я предполагаю, что вы - один из них.


6.1. Отключите подкачку и создайте DOS-раздел

  • Загрузите Linux. Отключите подкачку, отредактировав файл /etc/fstab, закомментировав в нем строки, описывающие раздел подкачки.

  • Используя команду fdisk в Linux, удалите раздел подкачки, таким образом освободив дисковое пространство.

  • Загрузите DOS. Создайте DOS-раздел (используя команду FDISK) с необходимым вам размером. Если вы не можете создать такой раздел (например, если DOS FDISK сообщает о том, что "в расширенном разделе все пространство занято под логические диски"), можно использовать fdisk или cfdisk из Linux для создания этого раздела. Вы даже можете просто сменить тип раздела подкачки с 82h (Раздел подкачки Linux) на 06h (FAT16). В этом случае не придется удалять этот раздел, а просто сменить тип.

  • После того, как создали раздел, загрузите DOS, если вы еще не в DOS. DOS выделит новому разделу букву диска. Используйте эту букву вместо X везде в этом тексте, где встретите команды типа "LABEL X:" или "COPY FOO X:DUMMY.DAT"

  • Отформатируйте этот раздел DOS-командой FORMAT.

     C:\>FORMAT X: 

  • Установите метку тома на эту новую "ОБЛАСТЬ ПОДКАЧКИ", используя DOS-команду LABEL. Проверьте правильность ее установки командой DIR. Проделайте это, как отдельный шаг. Некоторые версии FORMAT не устанавливали метку тома в загрузочный сектор, хотя должны были это делать. [Замечание: некоторые писали мне, что метка тома хранится в корневом каталоге. Это верно, но, начиная с DOS 5.0, она хранится также в загрузочном секторе.]

    C:\>LABEL X:
    C:\>DIR X:  

  • На этой фазе вы имеете готовый DOS-раздел для подкачки.


6.2. Укажите Windows местонахождение нового файла подкачки

6.2.1. Windows 3.1

  • Запустите Windows. Перейдите в Панель Управления (Control Panel), выберите пункт "386 расширенный" ("386 Enhanced"). Выберите "Виртуальная память" ("Virtual Memory") и создайте постоянный файл подкачки на диске X: максимально возможного размера (Его вам укажет Windows). Windows может пожаловаться, что не сможет использовать такой большой файл подкачки. Не обращайте на это внимания и все равно создайте файл.

  • Выйдите из Windows.


6.2.2. Windows 95/98

  • Запустите Windows. Перейдите в "Панель Управления" (Пуск| Настройка | Панель управления). Выберите пункт "Система". (В это окно можно попасть проще: нажмите Win+Break) В диалоговом окне "Свойства системы" выберите пункт "Быстродействие". Нажмите кнопку "Виртуальная память". На экране появится диалог настройки параметров виртуальной памяти. Выберите пункт "Я хочу задать параметры виртуальной памяти самостоятельно". Выберите диск, на котором хотите иметь разделенный с Linux раздел подкачки (X:). Оставьте максимальные и минимальные значения такими, какими их установит Windows. Нажмите OK. Windows попросит вас перезапустить компьютер. Так и сделайте.

  • После того, как вы перезапустите Windows, увидите, что на диске X: появился файл win386.swp. В дополнение к этому появился каталог Recycled. По той причине, что вы не собираетесь хранить другие файлы на этом диске, и одного файла будет более, чем достаточно (да и тот не жалко, в случае чего), укажите Windows не поддерживать корзину на этом диске (X:). На рабочем столе нажмите правую кнопку мыши на корзине и в открывшемся меню нажмите Свойства. На экране появится диалог настройки Корзины. Нажмите на закладку "Глобальные" и выберите "Независимая конфигурация дисков". После этого выберите диск X: drive (у которого будет метка SWAP SPACE). В этом диалоге сдвиньте указатель "Предельный объем корзины" на 0 процентов. В графе "Зарезервированное место" должно быть написано 0 байт. Нажмите ОК и перезагрузите компьютер.

  • Казалось бы: раз вы больше не поддерживаете корзину для диска X, то Windows каталог RECYCLED там больше не нужен, и она могла бы его удалить. Она не только не удаляет его, но и не разрешает вам сделать это. Как я говорил раньше, нам этот каталог не нужен, и мы хотим, чтобы на диске X: был только файл win386.swp. Чтобы удалить ненужный каталог, перезагрузите компьютер в Режиме Эмуляции MS-DOS. Выберите Пуск | Завершение работы | Перезапуск компьютера в режиме MS-DOS, или в момент загрузки Windows нажмите F8, и из появившегося меню выберите пункт "Command Prompt only". Попав в режим MS-DOS, выполните следующие команды:

    C:\>X:
    X:\>ATTRIB -R -H -S RECYCLED
    X:\>DELTREE RECYCLED

    Теперь на диске X: есть только один файл: win386.swp. Вы можете проверить этот факт, используя различные опции команды dir. Но это не означает, что каталог RECYCLED больше на диске X: не появится. Когда Windows загрузится и определит, что на диске X: нет каталога RECYCLED, то он его снова создаст. Однако, когда мы будем восстанавливать диск X: из Linux-а, он будет просто содержать один файл win386.swp. Если кто-нибудь знает способ избавиться от каталога RECYCLED в Windows, пишите мне.

  • Вас беспокоит "Очистка диска"?

    Если включена опция "Очистка диска", то иногда вы будете получать сообщения "Не хватает места на диске X:". Так как мы используем все пространство диска X: для подкачки, то нам это свободное место не нужно. Чтобы это предупреждение больше не появлялось запустите настройку Очистки Диска (Пуск | Программы | Стандартные | Служебные | Очистка диска). В появившемся диалоге выберите диск X: и нажмите OK. Появится диалоговое окно "Очистка диска X:". Нажмите пункт "Настройки" и отключите опцию "Если на диске останется меньше...".

Начиная с этого момента, Windows будет считать, что его диск подкачки - это диск X:. Поэтому диск X: должен быть доступен каждый раз при загрузке Windows. Если вы используете какие-нибудь дополнительные системные утилиты, например, Norton Utilities для Windows 95, то вам, наверное, придется прочитать документацию и настройки, чтобы эти утилиты знали об изменениях, иначе это может привести к ошибкам.


6.3. Сделайте резервную копию "Набора Специальных Секторов"

  • Загрузите Linux, и войдите в него как root.

  • Используйте команду fdisk, чтобы узнать название раздела и его размер в блоках. Создайте символьную ссылку /dev/winswap, указывающую на этот раздел. Например, если этот раздел - hda7, то наберите:

    # ln -s /dev/hda7 /dev/winswap 

    [ЗАМЕЧАНИЕ К ЛЮБИТЕЛЯМ ЧИСТОТЫ: Пожалуйста, используйте символьную ссылку. Название этого раздела попадет в некоторые конфигурационные файлы и несоответствия могут привести к фатальным результатам.]

  • Узнайте размер "Набора Специальных Секторов" для диска подкачки. Это ничто иное, как общее количество секторов, требуемое на загрузочный сектор, FAT и корневой каталог. Существует несколько способов узнать это число. Наиболее простой - использовать Разд. 11. Используйте следующие команды:

    # cp Swap-Space-HOWTO msinfo.sh
    # chmod +x msinfo.sh 

    (Кстати, это значительно проще сделать в редакторах из KDE или GNOME)

    Откройте файл msinfo.sh file, в редакторе удалите все строки, кроме файла msinfo.sh из раздела 8. После этого запустите его командой

    # ./msinfo.sh /dev/winswap 

    Эта программа выдаст информацию о разделе подкачки. Запишите число под названием "Общее количество специальных секторов", и проверьте, чтобы метка тома называлась "SWAP SPACE". Если это не так, то перезагрузитесь в DOS и перезапустите команду LABEL

  • Замечание: Вы также можете определить это число утилитами, показывающими содержание загрузочного диска, например, Norton Disk Editor или minfo из пакета mtools в Linux. В Norton Disk Editor, выберите пункт "Boot Sector" в меню Object. Запишите следующие числа:

    Reserved Sectors at beginning : r
    FAT Copies                    : f
    Sectors per FAT               : s
    Root directory entries        : r

    Теперь, "Общее количество специальных секторов" будет равно

    T = r + (s * f) + (d / 16)

    Однако, использовать программу из этого HOWTO значительно проще.

    Запишем "Общее Количество Специальных Секторов", как XXX.

  • [Необязательный шаг] Windows может оставить на этом разделе немного свободного места, даже если ему указать не делать этого. Не пытайтесь использовать свободное место, так как оно будет уничтожаться при каждом запуске Linux. Если вы хотите избежать случайного использования этого места (с последующей потерей данных), создайте на нем поддельный файл, заполняющий эту пустоту, используя следующие команды:

    mkdir /mnt
    mount -t msdos /dev/winswap /mnt
    dd if=/dev/zero of=/mnt/dummy.fil
    umount /mnt   

    оманда dd выдаст сообщение "No space left on device" (На устройстве не осталось места). Это именно то, что нам нужно.

  • В приглашении командной строки наберите:

    # dd if=/dev/winswap bs=512 count=XXX | gzip -9 > /etc/winswap.gz
                                      ^^^

    ... где XXX надо заменить на "Общее количество специальных секторов".

    Таким образом, мы создали резервную копию всех специальных секторов в компрессированной форме в файле /etc/winswap.gz


6.4. Исправьте скрипты загрузки и выключения для поддержки новой конфигурации

  • Теперь мы исправим наши инициализационные скрипты, чтобы область подкачки создавалась при каждом запуске Linux, и специальные сектора DOS/Windows восстанавливались каждый раз при завершении работы Linux.

  • Вместо того, чтобы вставлять команды, отвечающие за эту часть процедуры, прямо в инициализационные скрипты, мы подготовим два отдельных файла, под названиями swapinit.sh и swaphalt.sh. Пример этих файлов, который будет работать в Red Hat Linux, дан в приложениях к этому документу. Вы можете поместить эти файлы в любой каталог, но наиболее предпочтительным будет /etc/rc.d/init.d. Создайте два файла в этом каталоге и скопируйте туда скрипты, приведенные в приложениях. Самый простой способ - скопировать этот документ в файлы командами

    # cp Swap-Space-HOWTO  /etc/rc.d/init.d/swapinit.sh
    # cp Swap-Space-HOWTO  /etc/rc.d/init.d/swaphalt.sh

    и затем, используя свои любимый редактор, удалить из них все, кроме необходимых скриптов. Не забудьте проставить им флаг "исполняемых" командами

    # chmod +x swapinit.sh
    # chmod +x swaphalt.sh

  • Запустите fdisk и найдите в нем размер раздела подкачки. В обоих файлах (swap????.sh) замените YYYYY на это число.

  • Проверьте имя скрипта завершения работы системы. В SysVinit этот файл указан в /etc/inittab; добавьте ссылку на него, если там ее нет.

    # Уровень запуска 0 означает завершение работы системы
    
    l0:0:wait:/etc/brc 

    (В Red Hat Linux, это, скорее всего, будет файл /etc/rc.d/init.d/halt) Если вы не в состоянии выяснить это, поищите в каталоге /etc файл, содержащий команду "swapon -a" command. Достаточно об этом!

    Далее в тексте я буду предполагать, что это все-таки файл /etc/rc.d/init.d/halt (для краткости halt).

  • Проверьте название файла инициализации системы. В SysVinit этот файл также указан в /etc/inittab.

    # Инициализация системы
    
    si::sysinit:/etc/rc.d/rc.sysinit 

    Имя файла может отличаться, если у вас не Red Hat. Я предполагаю, что это файл /etc/rc.d/rc.sysinit (для краткости rc.sysinit)

  • Добавьте следующие строки в файл инициализации системы (rc.sysinit), вместо команды "swapon -a". Я бы советовал вам не удалять эту команду, а просто закомментировать ее, чтобы восстановить скрипт в исходное состояние, если что-то пойдет не так.

    Если ваша команда swapon находится в каталоге /etc, замените команду /sbin/swapon на /etc/swapon. Если она в /bin, замените на /bin/swapon. Проделайте то же самое с mkswap.

    # -----------------------------------------------------------------------
    # строки удалены ФИО
    # Запускаем подкачку.
    # action "Активизируем разделы подкачки" swapon -a
    # -----------------------------------------------------------------------
    
    # ----------------------------------------------------------------------
    # строки добавлены ФИО
    # Проверяем и инициализируем область подкачки
    #
    /etc/rc.d/init.d/swapinit.sh
    # ---------------------------------------------------------------------- 

  • Самый простой путь вставить текст в файл - это использовать две виртуальных консоли. Зарегистрируйтесь на обеих как root . Используйте свой любимый редактор, чтобы открыть это HOWTO на одной консоли, и модифицируемый скрипт на второй. Выделите кусок скрипта, приведенный выше, мышью и переключитесь на вторую консоль. Установите курсор в желаемую позицию и нажмите правую кнопку мыши. Выделенный ранее текст будет вставлен в скрипт.

  • Добавьте следующие строки в ваш скрипт завершения системы (halt). Поместите эти строки после всех команд, которые могут потребовать подкачку. Обычно, в этом файле будет команда "swapoff -a". Сначала замените -a на /dev/winswap. Затем, сразу после этой строки вставьте следующие команды.

    Предостережение

    Замечание для RedHat Linux 6.1: По-видимому, скрипт завершения работы в Red Hat Linux 6.1 автоматически находит все разделы подкачки и отключает их. Поэтому пользователям RedHat Linux 6.1 не требуется заменять команду swapoff $SWAPS на swapoff -a. В этом случае, просто добавьте команду /etc/rc.d/init.d/swaphalt.sh к файлу halt

    # ------------------------------------------------------------------------
    # Изменено ФИО
    # заменено "swapoff -a" на "swapoff /dev/winswap"
    #
    # Отключаем подкачку, затем отключаем фалйовые системы.
    runcmd "Отключаем подкачку и учет ресурсов" swapoff /dev/winswap
    [ -x /sbin/accton ] && /sbin/accton
    # ------------------------------------------------------------------------
    
    # ------------------------------------------------------------------------
    # Добавлено ФИО
    # проверяем сигнатуру области подкаки и восстанавливаем информацию о файле подкачки Windows
    /etc/rc.d/init.d/swaphalt.sh
    # ------------------------------------------------------------------------


6.5. Включите подкачку

Уберите комментарий со строки с разделом подкачки в файле /etc/fstab (который вы добавили ранее). (Это конечно необязательно, так как мы больше не используем fstab для разделов подкачки). Перезагрузите Linux. У вас должна быть включена подкачка на новом устройстве подкачки.


7. Пара замечаний

  • Нет никакой необходимости добавлять /dev/winswap в файл /etc/fstab. Скорее всего, это вообще нельзя делать (если только как комментарий).

  • Если ваш Linux однажды аварийно прекратит работу без выполнения /etc/rc.d/init.d/halt, то вам придется перезагрузиться, загрузить Linux и выйти из него корректно - только в этом случае подкачка в Windows будет работать нормально. Есть другой способ - дать команду FORMAT X: и создать файл подкачки Windows снова. Еще один путь был вроде очевиден - в файл AUTOEXEC.BAT DOS поместить некую программу-эквивалент /.../halt из Linux. Я пытался не раз написать подобную программу, но это ни к чему, кроме проблем, не привело! Первое и главное, что происходило - восстановление всех специальных секторов не удовлетворяет DOS. Скорее всего, необходимо также исправлять какие-то внутренние структуры DOS, чтобы он нормально понимал наличие диска, иначе DOS выдает примерно следующую ошибку:

    Invalid media type reading drive X:
    Abort, Retry or Fail ?
    Я не очень хорошо разбираюсь в деталях обработки дисков в DOS и Windows - я думаю, что по этому вопросу вам надо обратиться к специалистам по DOS. Конечно, если вас не беспокоит скорость загрузки, то вы просто можете при загрузке давать безусловную команду форматирования диска X: и после этого восстанавливать специальные сектора. Может быть, существуют другие решения. Если вы знаете такое решение, напишите мне сегодня!

  • Еще одним способом восстановления раздела подкачки Windows является следующий: загрузите Linux, отключите подкачку (как было описано выше) и затем дайте следующие команды:

    # swapoff -a
    # zcat /etc/winswap.gz > /dev/winswap
    # reboot 

  • Зачем необходимо удалять каталог RECYCLED? В соответствии с тем, что было описано выше, вы должны удалить каталог RECYCLED. Это необходимо потому, что мы будем сохранять и восстанавливать только сектора с начала раздела по корневой каталог включительно, но не более того. Другой нашей задачей является то, чтобы диск X: восстанавливался в "нормальном" состоянии и без ошибок. Если мы бы не удалили каталог RECYCLED, то сам он конечно бы восстановился, но его содержимое, а точнее точки "." и ".." не восстановились бы, и ScanDisk выдавал бы ошибку. Чтобы этого не случилось, мы удаляем каталог RECYCLED и, таким образом, восстанавливаться будет только строка, отвечающая за файл win386.swp.

  • Если FDISK из DOS сообщает, что наш раздел является "логическим диском DOS", то его номер 5 (т.е. /dev/hda5) или больше. В этом случае он *НЕ* является разделом, называемым "расширенным", с номером 4 или меньше!! Если ваш fdisk в Linux не показывает логические разделы, то у вас нерабочая версия fdisk (В Slackware 2.2, например, был такой fdisk.) Вы можете использовать "cfdisk", если он у вас есть, или вам придется найти работающий fdisk.

  • При отключенной подкачке Linux вынужден все обрабатывать в основной памяти самостоятельно. Если в вашей системе немного памяти, скажем 16 Мб, то некоторые большие приложения, запускаемые в процессе загрузки системы, могут функционировать не совсем корректно. Например, вы можете получить следующее сообщение в процессе загрузки:

    Finding module dependencies Out of memory

    Я не думаю, что это может вызвать какие-то проблемы до возврата к нормальному режиму подкачки. Но предосторожности никогда не помешают. Как вы узнаете из того, что написано ниже, Linux может использовать файл подкачки, вместо раздела. Поэтому, если вам кажется, что Linux не будет работать нормально, используя только основную память, создайте временный файл подкачки, который можно использовать до тех пор, пока не восстановите подкачку на разделе. Этот файл подкачки лучше всего разместить в корневом каталоге. Подсчитайте минимальный размер файла подкачки, который вам будет необходим. Скорее всего он будет равен размеру вашей основной памяти. Создайте файл подкачки следующими командами (предполагаем, что он размером 16 Мб):

    # dd if=/dev/zero of=/swap bs=1024 count=16384
    # mkswap /swap 16384
    # sync

    После этого поместите команду swapon /swap сразу после swapon -a в файле rc.sysinit. Таким образом ваша система будет настроена на использование файла подкачки, что, наверно, исключит ошибки типа "Не хватает памяти". После того, как вы получите работающий раздел подкачки (т.е. после исполнения всех инструкций этого HOWTO), вы можете убрать строку swapon /swap, которую добавили в файл rc.sysinit.

  • Пожалуйста, не пишите мне, пока не проверите дважды правильность копирования скриптов из этого документа. Больше половины проблем с применением этого Мини-HOWTO возникали из-за опечаток при переписывании скриптов. (Используйте копирование и вставку, если это возможно!). Даже неправильное использование пробелов может вызвать ошибку . Например, если при загрузке вы получаете ошибку типа

    Verifying swap space...Linux signature found
    swapon: /dev/winswap invalid argument 

    то, скорее всего, вы опечатались в скрипте. Еще раз перепроверьте все ваши скрипты.

  • Иногда скрипт не может определить принадлежность раздела ни к Linux, ни к Windows, и появляется ошибка "Сигнатура не найдена". Я пока еще точно не знаю, почему это происходит, но на этот случай я шесть раз запускаю в скриптах swap????.sh, код определения сигнатуры, перед тем, как выдавать ошибку. Обычно DOS-сигнатура находится с первого раза, но иногда на моей системе она обнаруживается со 2-го, 5-го раза или не обнаруживается даже после 12 попыток.. Вы можете просто увеличить количество попыток до 12 или 24, ничего страшного в этом нет. Однажды на моей системе скрипт не мог определить сигнатуру даже после 50 попыток! Если такая ситуация возникнет, то вы можете создать в вашем домашнем каталоге символьную ссылку на файл swapinit.sh и запускать его при запуске системы.

    # ln -s /etc/rc.d/init.d/swapinit.sh swapinit.sh
    # ./swapinit.sh  

    Однако. я еще подметил, что если несколько раз запускать этот скрипт, то сигнатуры начинают определяться без проблем с первого раза.

  • Для увеличения надежности

    В вашем Linux запускается нечто очень важное, или у вашей системы очень мало основной памяти, и приложения просто перестают работать? Вы настроили совместное с Windows использование раздела подкачки. Но, иногда, ваша система не может определить соответствующие сигнатуры и запрещает подкачку вообще. На свой собственный страх и риск вы можете удалить логику проверки сигнатур, но есть более приемлемое решение.

    Сначала прочтите советы, приведенные выше, и создайте файл подкачки в корневом каталоге вашего Linux, назвав его /swap. Его размер установите таким, какой вам необходимо. Затем откройте файл swapinit.sh и измените последний оператор if следующим образом:

    if [ $activated -ne 1 ] ; then
      echo "Сигнатура подкачки не найдена после $loopcount попыток (Swap signature not found after $loopcount tries)"
      echo "Активизирую файл подкачки (Activating swap file)"
      swapon /swap
      exit 1
    fi

    Таким образом, если на разделе подкачки отсутствуют необходимые сигнатуры, то мы разрешаем использование файла подкачки. Так как файл подкачки находится в корневом каталоге, а ядро Linux не запускается без подключения корневой файловой системы, то получается, что файл подкачки всегда будет нормально активизироваться. Вместо создания и хранения файла подкачки, использующего впустую дисковое пространство, вы можете изменит код скрипта, включив в него повторное создание файла подкачки на ходу.

  • Более эффективное использование дискового пространства Как мы уже показали, Linux и Windows могут совместно использовать раздел подкачки. Но что делать, если Windows не нужен такой большой файл подкачки, полностью занимающий раздел подкачки Linux? В этом случае, вы можете на разделе подкачки иметь свободное место (уменьшите размер файла подкачки Windows до необходимых размеров). Подкачка Windows-программ обрабатывается Windows самостоятельно. Но некоторые DOS-программы, например, Turbo C++ Compiler, Norton DOS и т.п. также создают свои файлы подкачки. В этом случае возможно их настроить таким образом, чтобы они свои личные файлы подкачки создавали на нашем разделе, вместо обычного местоположения. Это увеличит свободное место на основных дисках. Более того, некоторые из этих программ "забывают" удалить свои файлы подкачки, что приводит к неэффективному использованию дискового пространства. Но, используя нашу настройку, вы, каждый раз после завершения работы в Linux, получаете чистый раздел подкачки, тем самым исключая необходимость поиска и удаления старых файлов подкачки DOS-программ. Например, вы можете указать Turbo C++ использовать для подкачки, скажем, диск E:, запустив его командой

    C:\CLAN>TC /RE
    В Norton DOS настройте переменные файла NDOS.INI следующим образом:
    Swapping = E:\
    Многие программы используют переменные окружения TEMP или TMP для определения местоположения файлов подкачки. Вы можете настроить в файле AUTOEXEC.BAT эти переменные так, чтобы они тоже указывали на данный раздел.

  • Что делать, если раздел подкачки отформатирован как FAT32 ? К сожалению, нельзя отформатировать этот раздел в формате FAT32. Во-первых, Linux не может иметь раздел подкачки больше 128MB. Это означает, что если он больше 128MB, то часть этого раздела просто не используется. А Windows откажется конвертировать в FAT32 раздел размером 128MB.

  • Новый формат области подкачки Linux известны два формата областей подкачки - так называемые "новый" и "старый". По умолчанию вы будете использовать "старый" формат области подкачки с сигнатурой "SWAP-SPACE". Если вы хотите использовать "новый" формат этой области, то замените фразу "SWAP-SPACE" во всех приведенных здесь скиптах на "SWAPSPACE2". Также добавьте опцию -v1 к команде mkswap в скрипте swapinit.sh:

    /sbin/mkswap -v1 /dev/winswap YYYYY 

    И, в дополнение к этому, запустите следующие команды:

    # swapoff /dev/winswap
    # mkswap -v1 /dev/winswap YYYYY
    # swapon /dev/winswap 

    При использовании "нового" формата размер области подкачки может достигать 2 Гб на i386-платформах. Это означает, что вы можете использовать этот раздел больше чем 512 Мб, которые Windows может преобразовать в FAT32. Кто-нибудь, помогите мне с записью "Набора Специальных Секторов" с раздела FAT32.


8. Что же мы сделали на самом деле?

  • И Windows, и Linux используют области подкачки. Когда ОС выключена, эта область содержит абсолютно ненужный мусор, и ОС абсолютно не важно, что находится в области подкачки. Проблема состоит в следующем: выделять отдельно для Linux область подкачки размером 60 Мб и для Windows около 32 Мб не очень эффективно - в один момент времени работает только одна ОС (Возможно запустить одновременно и Linux и Windows - спасибо VMWare. За более подробной информацией обращайтесь на сайт VMWare). Итак, мы хотим чтобы Linux и Windows использовали одно и то же пространство на диске для подкачки.

  • Проблема состоит в том, что Linux использует для подкачки раздел на диске, а Windows использует файл. (Возможно использовать и в Linux файл подкачки, но это не рекомендуется. Смотрите "Руководство по установке и первому запуску Linux" автора Matt Welsh). Поэтому, если Linux будет использовать тот же раздел, где хранится файл подкачки Windows, он перезапишет загрузочный сектор, FAT и другие таблицы, которые должны быть, по предположению Windows, на каждом диске. В результате этого, Windows не обнаружит файл подкачки на этом разделе и создаст файл win386.swp в каталоге windows. Таким образом, если даже ваш Linux аварийно завершит работу, Windows сможет запуститься. Если это произойдет (т.е. файл подкачки Windows будет находиться в каталоге Windows), восстановите область подкачки DOS/Windows простым перезапуском Linux. После этого Windows будет использовать файл подкачки на диске X, и вы можете спокойно удалять файл win386.swp в каталоге windows.

  • Суть наших действий состоит в том, чтобы сохранять критичные для Windows таблицы данных с начала раздела подкачки где-нибудь в файле, находящемся в разделе Linux. При каждом запуске Linux мы проверяем, кто последний раз использовал область подкачки - Linux или Windows (используя метку, которую вы проставили этому разделу). Если это был Linux, то мы просто разрешаем подкачку, а иначе сначала создаем раздел подкачки на диске X: командой "mkswap /dev/winswap" и только затем разрешаем подкачку.

  • Очень важно для нормального последующего запуска Windows восстановить формат FAT на разделе подкачки при выключении Linux. Для этого мы используем команду

    /bin/zcat /etc/winswap.gz > /dev/winswap 

    в файле halt.


9. Скрипт swapinit.sh

Этот скрипт инициализирует область подкачки на разделе. Код, отвечающий за определение сигнатуры, повторяется 6 раз, так как сигнатура иногда правильно определяется со второго или третьего раза. (Основано на скрипте, приведенном в Swap-Space-HOWTO автора H. Peter Anvin)

#!/bin/sh
#
# swapinit.sh - активизируем раздел подкачки (activate the swap partition)
#
# автор Rahul U. Joshi, перевод Станислав Рогин
# Проверяем и инициализируем область подкачки (Verify and initialize swap space)
#

echo -n 'Проверка области подкачки (Verifying swap space...)'

loopcount=0

# Флаг, указывающий, активизирован ли раздел
# flag to indicate whether the partition has been activated or not)
activated=0

# Проверяем сигнатуру до 6 раз
# check for signatures 6 times before giving up
while [ $loopcount -lt 6 ]
  do

  if [ "`/bin/dd 2>/dev/null if=/dev/winswap bs=1 count=10  skip=4086`" = 'SWAP-SPACE' ]; then
    echo "Сигнатура Linux обнаружена с $loopcount раза"
    echo "Активация раздела подкачки"
    echo "Linux signature found, iteration $loopcount"
    echo "Activating swap partitions"
    swapon /dev/winswap
    activated=1
    break

  elif [ "`/bin/dd 2>/dev/null if=/dev/winswap bs=1 count=11 skip=43`" = 'SWAP SPACE ' ]; then
    echo "Сигнатура DOS обнаружена с $loopcount раза"
    echo "Подготовка раздела подкачки"
    echo "DOS signature found, iteration $loopcount"
    echo "Making swap partition"
    mkswap /dev/winswap YYYYY
    echo "Активация раздела подкачки"
    echo "Activating swap partitions"
    swapon /dev/winswap
    activated=1
    break

  else
   let loopcount=
  loopcount+1

  fi

done if [ $activated -ne 1 ] ;
  then echo "Сигнатура не найдена после $loopcount
  попыток" echo "Разделы подкачки не
  активизированы" echo "Swap signature not found after $loopcount
  tries" echo "No swapping partitions
  activated" exit
1
 fi


10. Скрипт swaphalt.sh

Этот скрипт сначала проверяет сигнатуру области подкачки Linux, а затем восстанавливает на разделе файловую систему Windows.

(Основано на скрипте, приведенном в Swap-Space-HOWTO автора H. Peter Anvin)

#!/bin/sh
#
# swaphalt.sh   Этот файл вызывается из /etc/rc.d/init.d/halt
#	       после того, как будут выключены учет ресурсов и подкачка
#
#               This file is executed through the /etc/rc.d/init.d/halt
#	       script after swapping and accounting has been turned off.
#
# Автор:        Rahul U. Joshi        Перевод: Станислав Рогин
#

# проверяем сигнатуру раздела подкачки и восстанавливаем таблицы данных Windows

loopcount=0

# флаг, указывающий была ли восстановлена информация раздела подкачки Windows
# flag to indicate whether the swap info has been restored or not
restored=0

# проверяем сигнатуру до 3 раз (check for swap signature 3 times before giving up)
while [ $loopcount -lt 3 ]
  do

  if [ "`/bin/dd 2>/dev/null if=/dev/winswap bs=1 count=10 skip=4086`" = 'SWAP-SPACE' ]; then
    echo "Восстановление структуры раздела подкачки DOS/Windows ($loopcount-я попытка)"
    echo "Restoring DOS/Windows swap info , iteration $loopcount)"
    /bin/zcat /etc/winswap.gz  >  /dev/winswap
    restored=1
    break
  else
    loopcount=loopcount+1
  fi

  done

if [ $restored -ne 1 ] ; then
   echo "Сигнатура области подкачки не обнаружена после $loopcount попыток"
   echo "Swap signature not found after $loopcount tries"
   echo "Восстановление таблиц не произведено"
   echo "Skipping restoring"
fi

 


11. Скрипт msinfo.sh

Этот скрипт анализирует загрузочный сектор заданного раздела и выдает различную информацию, включая "Общее Количество Специальных Секторов". Скрипт предполагает, что на данном разделе установлена файловая система FAT16. Если это не так, он выдаст сообщение об ошибке и прекратит работу. Скрипт запускается следующим образом

# msinfo <наименование раздела>
 

Для запуска этого скрипта вам понадобится программа "dialog", которая может выводить диалоговые окна на экран. Вы можете найти ее здесь.

#!/bin/sh
#
# msinfo.sh           Этот скрипт показывает содержание загрузочного
#                     сектора заданного раздела.
#                     This shell script displays the boot sector of the
#                     given partition.
#
# Автор:              Rahul U. Joshi
# Перевод:            Станислав Рогин
#
# Изменения           Убрано использование команды expr, замененной на команду let
# Modifications       Removed the use of expr and replaced it by the let
#                     command.


# проверяем параметры командной строки
# check for command line arguments
if [ $# -ne 1 ]; then
   echo "Использование: msinfo <наименование раздела>"
   exit 1
fi

# проверяем, является ли входной файл блочным устройством
# check whether the input name is a block device
if [ ! -b $1 ]; then
   echo "msinfo: $1 не является блочным устройством"
   exit 1
fi

# создаем два временных файла
# create two temporary files for use
TMPFILE=`mktemp -q /tmp/$0.XXXXXX`
if [ $? -ne 0 ]; then
    echo "msinfo: Не могу создать временный файл, прекращаю работу..."
    exit 1
fi

TXTFILE=`mktemp -q /tmp/$0.XXXXXX`
if [ $? -ne 0 ]; then
   echo "msinfo: Не могу создать временный файл, прекращаю работу..."
   rm -f $TMPFILE
   exit 1
fi

backtitle="`printf "%78s" "msinfo, Информация о файловой системе FAT16 -- Rahul Joshi"`"

dialog --title "Загрузочный сектор $1" --backtitle "$back_title" --infobox "\nАнализирую загрузочный сектор $1\nПодождите..."  14 60

# создаем пустой текстовый файл TXTFILE
# truncate TXTFILE to zero length
echo > $TXTFILE

# Получаем версию форматировавшей DOS
# get Formatting DOS version
dd 2>/dev/null if=$1  bs=1 count=8 skip=3 | dd 2>/dev/null of=$TMPFILE
printf >>$TXTFILE "%30s : %s\n" "Версия форматировавшей DOS" "`cat $TMPFILE`"


# Получаем файловую систему
# get file system
dd 2>/dev/null if=$1  bs=1 count=8 skip=54 | dd 2>/dev/null of=$TMPFILE
printf >>$TXTFILE "%30s : %s\n" "Файловая система" "`cat $TMPFILE`"

# проверяем, является ли файловая система FAT16
# check if filesystem in a FAT16
if [ "`cat $TMPFILE`" != "FAT16   " ]; then
  dialog --title "Загрузочный сектор $1" --backtitle "$back_title" --infobox  "\nФайловая система $1 не является FAT16"  14 60
  exit 2
fi

# Получаем метку тома из загрузочного сектора
# get volume label in boot sector
dd 2>/dev/null if=$1  bs=1 count=11 skip=43 | dd 2>/dev/null of=$TMPFILE
printf >>$TXTFILE "%30s : %s\n" "Метка тома в загрузочном секторе" "`cat $TMPFILE`"


# Получаем размер сектора
# get Sector size
dd 2>/dev/null if=$1  bs=1 count=2 skip=11| od -An -tdS | dd 2>/dev/null of=$TMPFILE
printf >>$TXTFILE "%30s : %d\n" "Размер сектора" `cat $TMPFILE`
sector_size=`cat $TMPFILE`


# Получаем количество резервных секторов
# get Reserved sectors
dd 2>/dev/null if=$1  bs=1 count=2 skip=14| od -An -tdS | dd 2>/dev/null of=$TMPFILE
printf >>$TXTFILE "%30s : %d\n" " Резервные сектора" `cat $TMPFILE`
reserved_sectors=`cat $TMPFILE`


# Получаем количество секторов FAT
# get FAT sectors
dd 2>/dev/null if=$1  bs=1 count=1 skip=16| od -An -tdS | dd 2>/dev/null of=$TMPFILE
fat_count=`cat $TMPFILE`

dd 2/dev/null if=$1  bs=1 count=2 skip=22| od -An -tdS | dd 2>/dev/null of=$TMPFILE
sectors_per_fat=`cat $TMPFILE`

# расчитываем количество секторов, занимаемых FAT
# calculate the no of sectors allocated for FAT's
let fat_sectors=fat_count*sectors_per_fat

printf >>$TXTFILE "%30s : %u (%u x %u) \n" "Секторов FAT" "$fat_sectors" "$fat_count" "$sectors_per_fat"


# Получаем количество секторов в корневом каталоге
# get root directory sectors
dd 2>/dev/null if=$1  bs=1 count=2 skip=17| od -An -tdS | dd 2>/dev/null of=$TMPFILE
root_sectors=`cat $TMPFILE`

# расчитываем количество секторов, занимаемых корневым каталогом
# calculate the no of sectors allocated for root directory
let root_sectors=root_sectors*32/sector_size

printf >$TXTFILE "%30s : %u\n" "Секторов корневого каталога" "$root_sectors"


# получаем Общее Количество Специальных Секторов
# get Total special sectors
let total=reserved_sectors+fat_sectors+root_sectors
printf >>$TXTFILE "%30s : %u\n" "Всего специальных секторов" "$total"


# вывод информации
dialog --title "Загрузочный сектор $1"  --backtitle "$back_title"  --msgbox "`cat $TXTFILE`" 14 60

# удаление временных файлов
# delete temporary files
rm -f $TMPFILE
rm -f $TXTFILE

# end of msinfo.sh


12. Изначальный файл msinfo

Здесь приведен файл msinfo, при помощи которого можно определить "Общее Количество Специальных Секторов". Он был включен первоначальным автором этого HOWTO в закодированной форме. Скопируйте текст, начиная со строки "begin 755 msinfo.gz" до строки "end" во временный файл, скажем temp.uu. Затем раскодируйте и разархивируйте этот файл, чтобы получить файл msinfo.

# uudecode temp.uu
# gunzip  msinfo.gz  

Затем запустите программу командой

# ./msinfo /dev/winswap 
Эта программа показывает информацию из загрузочного сектора, включая "Общее Количество Специальных Секторов".
begin 755 msinfo.gz
---------------------------------------------------------------------
   Примечание переводчика: В этом месте автором текста была приведена
   программа msinfo.gz в формате UUENCODE. Однако многократные
   преобразования этого HOWTO могли повредить этот файл. Даже если он не
   был бы поврежден, то он бы выводил сообщения на английском. Используйте
   скрипт из предыдущей главы.
---------------------------------------------------------------------
end 


13. Замечания для читателей версии 1.4 этого документа

Я, к сожалению, выяснил, что мои советы, данные в версии 1.4 этого документа содержали ошибку. Если вы использовали советы из версии 1.4 для настройки совместного использования пространства подкачки Linux и Windows и, в результате, получаете от ScanDisk сообщения об ошибках на диске X:, проделайте следующее:

  • Во-первых, загрузите Linux, и закомментируйте строку в файле rc.sysinit file строку, отвечающую за вызов скрипта swapinit.sh, а также из файла halt строку, отвечающую за вызов swaphalt.sh. В результате этого, при последующем запуске Linux у вас будут отсутствовать области подкачки. Если у вас мало системной памяти, создайте временный файл подкачки. Как это сделать, читайте в разделе "Пара замечаний".

  • Затем, выключите Linux, запустите Windows, нажмите F8 при начале загрузки и загрузите систему в режиме "Command prompt only" из появившегося меню. Затем выполните следующие команды:

    C:\>SCANDISK X:

    ScanDisk сообщит, что каталог RECYCLED поврежден. Укажите ему исправить ошибки. Он может также найти потерянные кластера. Укажите ему удалить их. Короче, исправьте все ошибки на диске X:, убедившись в том, что ScanDisk не затронул файл win386.swp. Вы можете, например, запомнить размер файла win386.swp до проверки, сравнив его затем с тем, что будет после ScanDisk. Если ScanDisk изменил размер win386.swp, добавьте что-нибудь к нему, или удалите из него лишнее, чтобы восстановить его размер.

  • Удалите все с диска X: кроме файла win386.swp. Удалите все другое содержимое, включая каталог RECYCLED. Чтобы его удалить, используйте следующие команды:

    C:\>X:
    X:\>ATTRIB -R -H -S RECYCLED
    X:\>DELTREE RECYCLED

  • Запустите Linux. Зайдите в систему root-ом и сделайте следующее:

    # dd if=/dev/winswap bs=512 count=XXX | gzip -9 > /etc/winswap.gz

    где XXX - известное уже вам "Общее Количество Специальных Секторов".

  • Раскомментируйте команды в файлах swapinit.sh и swaphalt.sh, которые закомментировали ранее, и удалите из них все команды, добавленные вами для использования файла подкачки. Теперь с вашей системой все в порядке.


14. Благодарности, отзывы и посвящения

Этот Mini-HOWTO в значительной степени отталкивается от документа Swap-Space Mini HOWTO (автор H. Peter Anvin). Я добавил сюда специфичные вещи для Windows 95/98. Программа msinfo, полученная из оригинального HOWTO, не работала на моей системе Red Hat Linux 6, я сделал подобную программу. Однако, я также включил сюда оригинальную программу msinfo. Спасибо всем людям, которые собрали превосходный дистрибутив Linux - Red Hat и особенно Sanjiv Guha - один из соавторов "Red Hat Linux 6 Unleashed". Спасибо Matt Welsh, Greg Hankins и Eric S. Raymond - авторам SGML-Tool's Users Guide, которые помогли мне конвертировать этот документ в SGML формат. Спасибо Peter Norton и John Goodman за издание "Peter Norton's Inside the PC", которое помогло мне разобраться в структуре файловой системы DOS.

Я полагаю, читатели, что этот HOWTO будет вам полезен. Если у вас появляться предложения, комментарии, исправления, вопросы, флейм и т.п., не стесняйтесь связаться со мной ([email protected] или [email protected]).

Наконец, я хотел бы выделить работу Robert Lafore - автора замечательных книг "Программирование на C с использованием Turbo C++" и "Объектно-ориентированное программирование с использованием Turbo C++".

Наслаждайтесь Linux,

Rahul :-)