Раздел подкачки Linux

Введение

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

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

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

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

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

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

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

Процедура

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

Отключите подкачку и создайте 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-раздел для подкачки.

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

Windows 3.1

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

Выйдите из Windows.

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, то вам, наверное, придется прочитать документацию и настройки, чтобы эти утилиты знали об изменениях, иначе это может привести к ошибкам.

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

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

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

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

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

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

# 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 <br>
^^^

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

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

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

Теперь мы исправим наши инициализационные скрипты, чтобы область подкачки создавалась при каждом запуске 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
# ----------------------------------------------------------------------

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

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

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

Нет никакой необходимости добавлять /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 <br>
# ./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 <br>
# mkswap -v1 /dev/winswap YYYYY <br>
# swapon /dev/winswap

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

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

И 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.

Скрипт swapinit.sh

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

#!/bin/sh

# swapinit.sh - активизируем раздел подкачки
# автор Rahul U. Joshi, перевод Станислав Рогин
# Проверяем и инициализируем область подкачки

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

loopcount=0

# Флаг, указывающий, активизирован ли раздел
activated=0

# Проверяем сигнатуру до 6 раз
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 "Активация раздела подкачки"
        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 "Подготовка раздела подкачки"
        mkswap /dev/winswap YYYYY
        echo "Активация раздела подкачки"
        swapon /dev/winswap
        activated=1
        break
    else
        let loopcount=loopcount+1
    fi
done


if [ $activated -ne 1 ] ; then
    echo "Сигнатура не найдена после $loopcount попыток"
    echo "Разделы подкачки не активизированы"
    exit 1
fi

Скрипт 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
        let 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

Скрипт 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

Изначальный файл 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 могли повредить этот файл. Даже если он не был бы поврежден, то он бы выводил сообщения на английском. Используйте скрипт из предыдущей главы.

Замечания для читателей версии 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, которые закомментировали ранее, и удалите из них все команды, добавленные вами для использования файла подкачки. Теперь с вашей системой все в порядке.