Больше места или сделаем swap общим...

Для работы и для большей части развлечений я использую Linux, но когда появляется потребность запустить игрушку, использующую OpenGL, или посмотреть фильм... Именно тогда я начинаю стучать в барабаны, жечь ритуальные костры, протыкать иголкой тряпичные фигурки и слать смертельные проклятья как в адрес самой корпорации Intel так и ее видеокарты Intel 740 (самый обычный образчик которой есть и у меня). Наступает время Windows 9x... т.к. под Windows 2000 нормальных драйверов под Intel тоже нет. Впрочем это к делу не относится, а всего лишь объясняет зачем мне понадобилась Windows (кстати, может кто-нибудь подскажет мне другой выход из ситуации, когда нет нормальных (OpenGL, DGA2, DRI) драйверов под Linux для Intel 740?).

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

Мне давно не давало покоя сознание того, что впустую расходуется мегабайт 150 - 200 под Linux'овый swap-раздел когда я загружаю Windows, и примерно столько же когда работает Linux, а на разделе FAT лежит жирный pagefile.sys (это в случае Windows NT, если же Вы используете Win9x, то роль «жирного» выполняет win386.swp). Идея напрашивалась сама собой - сделать так, чтобы две (или больше, если Вы большой выдумщик) операционки использовали под swap один и тот же раздел на диске. Итак начинаем.

Пусть у нас имеется жесткий диск с разбиением следующей конфигурации:

Disk /dev/hda: 255 heads, 63 sectors, 1216 cylinders  
Units = cylinders of 16065 * 512 bytes     
Device Boot Start End Blocks Id System  
/dev/hda1 1 117 939771 b Win95 FAT32  
/dev/hda2 118 955 6731235 5 Extended 
/dev/hda3 * 956 1216 2096482+ 83 Linux  
/dev/hda5 118 955 6731172 b Win95 FAT32  
/dev/hda6 923 955 265041 82 Linux swap  

Мы видим следующие разделы:

  • Основной раздел DOS с файловой системой FAT32 размером в 917.74М (надеюсь все помнят, что 917.74М это вовсе не 917740К, а 939771К, т.е. 917.74*1024, ведь 1М = 1024К, а 1К = 1024 байт) [/dev/hda1];
  • Дополнительный раздел DOS (размером, как Вы уже догадались 6731235К / 1024 = 6573.47М / 1024 = 6.41G) [/dev/hda2]. В дополнительном разделе определены:
  • досовский диск FAT32 (диск D:) [/dev/hda5] и
  • раздел для свопа Linux [/dev/hda6].
  • Раздел Linux [/dev/hda3].

Немного слов о том, почему разделы нумеруются именно таким образом. На диске может быть до четырех первичных разделов (primary partition). Эти разделы получают номера от единицы до четверки. Остальные разделы могут создаваться в разделе Extended и являются логическими (logical). Они получают номера начиная с пятерки.

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

Дам небольшую наводку. Linux может использовать как своп очень много чего. В принципе даже на дискете можно попробовать сделать swap ;). Windows же умеет только файл подкачки. Правда, о чудо! (и в этом наше счастье) может размещать его на различных дисках. Значит все наше шаманство будет осуществляться средствами Linux, а продукту Самой Доброжелательной Компании в Мире мы просто сообщим куда (следует читать 'на какой диск') положить этот самый злополучный файл.

Если Вы еще не догадались, то теперь настало время раскрыть стратегию этого замысла. Раздел /dev/hda6 должен быть логическим диском DOS, полностью (это ВАЖНО) отдаваемым под swap файл windows. Ни в коем случае не размещайте на нем какие-либо другие файлы кроме файлов подкачки. Размещать там что-либо еще нельзя, потому как Linux будет использовать этот же раздел, как свой swap, а следовательно данные будут потеряны.

Вот какие операции должны выполняться для реализации задуманной нами схемы:

1. Задачи Linux:

  • Создать swap на разделе, который для этого выделен;
  • Подключить только что созданный swap;
  • Работать;
  • При получении команды на перезагрузку или выключение питания сделать раздел, используемый под swap, обычным диском DOS;
  • Остановить работу компьютера или перезагрузить его.

2. Задачи Windows:

  • Создать win386.swp на диске, созданном на этапе 1;
  • Работать;
  • При получении команды на перезагрузку или выключение питания завершить работу или повиснуть :).

Теперь займемся реализацией.

Прежде всего нужно отключить swap раздел Linux'а (я предполагаю, что именно это место на диске мы хотим сделать общим для свопа Windows и Linux). Для этого скажем 'cat /proc/swaps' и далее 'swapoff $device', где $device - имя раздела, который у Вас используется как swap раздел (это имя будет написано в выводе предыдущей команды в графе Filename).


Далее все действия выполняем от пользователя root. Создадим раздел, который будет использоваться как swap. Процесс создания подробнее описывать не буду - здесь вроде все должно быть понятно. Берется досовский или линуховый fdisk и - вперед (те кому не нравится fdisk могут пользоваться другими утилитами, например, parted, Partition Magic и т.д.). Форматируем этот раздел в FAT16 (мне кажется, что для windows свопа FAT16 более предпочтительный вариант, чем FAT32 в плане скорости и меньшего размера самой таблицы размещения файлов). Для форматирования можно использовать как штатные досовские средства, так и mkdosfs из пакета dosfstools. Partition Magic, если мне не изменяет память, сразу же сам форматирует создаваемый раздел;

Здесь и далее по тексту я предполагаю, что для свопа мы используем /dev/hda6. Вы, в свою очередь вместо него используете имя того раздела, который выделили под swap. Итак в командной строке Linux'а даем команду 'mount -t vfat /dev/hda6 /mnt/temp', чем монтируем /dev/hda6 в каталог /mnt/temp (естественно он должен существовать к этому моменту);

Затем забьем нулями содержимое этого досовского диска (зачем - расскажу позднее). Для этого скажем в командной строчке 'dd if=/dev/zero of=/mnt/temp/zeros'. Команда завершится сообщением о том, что на устройстве назначения больше нет места и сколько записей произведено;

На всякий случай отмонтируем /dev/hda6 командой 'umount /mnt/temp' (это может делать и не обязательно, но так мы будем уверены, что в кэше ничего не осталось и все нули дошли до адресата :). Теперь примонтируем его снова 'mount -t vfat /dev/hda6 /mnt/temp' и удалим файл zeros командой 'rm -f /mnt/temp/zeros'. Теперь опять отмонтируем /dev/hda6 ('umount /mnt/temp');
Теперь у нас есть раздел с пустой fat16 и нулями в области данных.
У меня нет информации о том, как рассчитать сколько занимает места на разделе таблица размещения для FAT16. На диске емкостью 250М мне хватало примерно пяти мегабайт (те кто заинтересован разобраться во всем до конца могут попробовать найти старую досовскую программу TechHelp - там наверняка будет информация о DOS FAT). Возможно и меньшее число могло бы быть использовано, но мне нравиться цифра 5 ;). Вы спросите зачем нам это нужно? Для того, чтобы после использования Linux'ом раздела /dev/hda6 для свопа, можно было бы легко восстановить на диске таблицу размещения файлов.

Командой 'dd if=/dev/hda6 of=/etc/winswap bs=1k count=5000' мы создадим копию нашей таблицы в файле /etc/winswap. Команда последовательно скопирует пять тысяч блоков (count=5000) размером в один килобайт (Block Size = 1К) с исходного устройства или файла (Input File) в устройство или файл назначения (Output File). Получившийся файл занимает почти 5 мегабайт. Но мы же очень жадные люди на мегабайты, верно? Поэтому мы говорим 'gzip -9 /etc/winswap'. В результате пятимегабайтный winswap превращается в пятикилобайтный(!) winswap.gz (помните, мы забили диск нулями, а это значит, что файл очень хорошо сожмется. Ключ -9 задает максимальный уровень компрессии).

Теперь настало время позаботиться собственно о пункте 1.г. Для этого открываем на редактирование файл /etc/init.d/halt и делаем поиск слова 'swap'. Вы увидите что-нибудь вроде:

# Turn off swap, then unmount file systems.  
SWAPS=`awk '! /^Filename/ { print $1 }' 
/proc/swaps`  [ -n "$SWAPS" ] && runcmd $"Turning off swap: " swapoff $SWAPS  

Во всяком случае так обстоит дело с RedHat. Если у Вас другой дистрибутив, то, возможно, файл будет называться по-другому. Во всяком случае Вы должны будете найти скрипт, куда можно будет вставить строчку так, чтобы она выполнилась _после_ отключения swap. А строчка будет такой:

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

Она восстанавливает таблицу размещения файлов на устройстве /dev/hda6 (точнее zcat выводит распакованное содержимое указанного ей сжатого файла в стандартное устройство вывода, но '>/dev/hda6' перенаправляет вывод на раздел где был swap). Итак о досовском диске для swap файла Windows позаботились. Пришло время позаботиться о Linux.

Открываем файл, где включаются swap разделы (для RedHat это - /etc/rc.d/rc.sysinit). Опять ищем 'swap'. Видим:

# Start up swapping.  action $"Activating swap partitions: " swapon -a -e  

комментируем эту строчку и пишем новые:

action "Build swap on /dev/hda6" mkswap /dev/hda6 265041  
action "Activating swap..." swapon /dev/hda6  

265041 - размер раздела /dev/hda6 и размер соответственно swap'а Linux. Это число Вы заменяете своим.

Открываем файл /etc/fstab на редактирование и комментируем строчку "что-то вроде этого":

/dev/hda6 swap swap defaults 0 0    

Да! Cейчас внезапно подумал... Если кто не знает - строка комментируется подстановкой символа '#' в ее начало.

После перезагрузки, загружаете windows и в установках 'My Computer' / 'Settings' / 'Perfomance' / 'Virtual Memory' устанавливаете swap файл на новый диск. Параметры minimum size и maximum size лучше установить одинаковыми (фиксированный файл подкачки) и максимально возможными (файл подкачки на весь диск).

Положительным моментом для файла подкачки windows является еще и то, что он не будет фрагментирован, что несколько повысит быстродействие. Из отрицательных моментов можно назвать то, что при переразбиении диска (которое Вам возможно понадобиться в будущем) нужно будет повторить некоторые из рассмотренных операций заново с новыми условиями.

Вот, наверное, и все. Попробуйте - должно получиться.

Напоследок - совет. При выполнении указанных мною пунктов читайте соответствующие страницы руководства ('man mount', 'man swapon', 'man dd' и т.п.) для того, чтобы Вы точно представляли что именно Вы делаете на данном этапе. Удачи!

Автор:
free-templates.ru