пятница, 4 февраля 2011 г.

MultiBoot для чайников: как переустановить Windows.

Пользователь В. установил на свой ноутбук Debian Linux и некоторое время радовался. Пока ранее установленная ОС Windows не доставила ему несколько неприятных моментов и появилась необходимость переустановить эту систему. Есть ли тут подводные камни? Разумеется есть (иначе о чем бы нам говорить).

Введение

Небольшая теоретическая ремарка: BIOS ничего не знает об операционных системах. При первоначальной загрузке компьютера управление получает маленькая программа - загрузчик, размещенная в MBR (master boot record - запись начальной загрузки). После установки linux роль этой программы выполнял GRUB (GRand Unified Butloader), умеющий загружать различные ОС и обеспечивающий удобное меню выбора нужной из них. Основная проблема заключается в том, что ревнивая сука Windows рассчитывает на свою единственность в вашей жизни и не терпит связей на стороне. Исходя из этих соображений установщик ОС от Microsoft затирает все прочие загрузчики и оставляет возможность загрузки единственной системы (опытные знают лазейку через ntldr, но это выходит за пределы нашего обсуждения).
Итак, поскольку процесс установки Windows прям и прост, как жезл ГАИшника, нашей задачей будет восстановление загрузчика GRUB после установки Windows.

Процесс

Несколько комментариев по [пере]установке Windows.
Я предпочитаю делать это удалением раздела со старой ОС и созданием его заново. Такая страховка гарантирует, что установщик не потянет за собой старые болячки умирающей Windows. Но есть два момента:
  1. Следует удалять разделы осторожно. Нужный нам раздел вероятнее всего называется установщиком диском C:, а незнакомые ему linux-разделы называются "неизвестными". Часто проще всего идентифицировать раздел по размеру.
  2. Если установщик Windows криво допишет себя в конец таблицы разделов и ваша версия linux ещё не перешла на uuid'ы в fstab и grub.conf - вам придётся сделать это за неё позже, иначе Linux откажется грузится. Как это сделать - читайте в сети, а если не найдёте - спросите у меня. Я покажу вам, где почитать.
Итак, перезагружаем компьютер сразу после завершения установки. На этом этапе нам понадобится любой работоспособный Linux - я воспользовался LiveDVD Kubuntu 9.10, но как вы скоро поймёте, это совершенно не критично. Загружаем правильную систему, запускаем там терминал, становимся админом и смотрим таблицу разделов (многое опущено для ясности):
$ sudo su
# fdisk -l
Disk /dev/sda: 160.0 GB, 160041885696 bytes
Ага, наш вроде диск...
   Device Boot     Id  System
/dev/sda1          83  Linux
/dev/sda2   *      7  HPFS/NTFS
/dev/sda3          5  Extended
/dev/sda5          83  Linux
/dev/sda2 - наш windows-раздел, а вот /dev/sda1 либо /dev/sda5 - явно linux. Какой-то из них корневой.
Далее делаем
# mkdir /mnt/sda1; mount /dev/sda1 /mnt/sda1
здесь сказано "создать каталог с заданным именем; примонтировать устройство в этот каталог". После этого можно для каждого устройства посмотреть его содержимое:
# ls /mnt/sda5
если мы видим что-то вроде
bin    dev   initrd    lib    opt   sbin .... 
очевидно, это корень.
Готовим этот корень к работе. Нам понадобиться в нём наличие каталога boot. Если "ls /mnt/sda5/boot" (здесь и далее подставляем своё корневое устройство) не выводит ничего - значит нужно монтировать сюда один из разделов. Заглядываем в в каталог /mnt/sda1 и если видим
grub config... initrd...
значит, это наш клиент. Приказываем
# mount /dev/sda1 /mnt/sda5/boot
и содержимое boot соответствует действительности. Возможно, похожие операции придётся произвести с каталогами /dev и /proc. Смотрим их содержимое:
#ls /mnt/sda5/dev /mnt/sda5/proc
если там пусто - значит потребуется создать для каждого из них ссылки вот так:
# rm /mnt/sda5/dev; ln -s /dev/ /mnt/sda5/dev
Впрочем, это было на старых ядрах а нынче я потребности в таких манипуляциях не заметил. Итак, /mnt/sda5 готов к переселению. За чем же дело?
# chroot /mnt/sda5
Теперь мы находимся в нашей ранее установленной системе. В ней у нас находится правильно настроенный grub, осталось его только установить в mbr:
# grub-install /dev/sda
обратите внимание:
  1. это должен быть тот же диск (sda), с которым мы работали ранее
  2. без номера - потому что ставим не на разделы, а в mbr диска. 
Перезагружаемся, извлекаем LiveDVD (или что там у вас) и наслаждаемся результатом.

Замечания

Я сознательно не рассматривал более простой и приятный подход сохранения и восстановления mbr с помощью dd, потому что с одной стороны, он требует немалой квалификации (можно хоршо наломать дров), а с другой - это мирный безаварийный путь, который не поможет нам в случае, когда "опытные пользователи всё уже переставили без нас, но linux почему-то не хочет грузиться".
Опыты проводились на Windows XP SP3, grub2 (1.98), Debian Sid, но с минимальными переделками предположительно будет работать и в других подобных ситуациях.

2 комментария:

  1. Спасибо за содержательное разъяснение. Хочу отметить, что при выполнении этих рекомендаций возник ряд сложностей. А именно:
    первой проблемой стало как раз-таки отсутствие у меня Live-CD. Damn Small, который у меня был в наличии, категорически отказывался грузиться (останавливался на этапе определения устройств). Как альтернатива решению возникшей проблемы, скачал упомянутую Вами версию Live-CD c Ubuntu 9.10, и успешно с него загрузился. Далее на команду fstab -1 получил исчерпывающий ответ, что такой команды не найдено. Спасло fdisk -l:
    root@vic:/home/victor# fdisk -l

    Disk /dev/sda: 160.0 GB, 160041885696 bytes
    255 heads, 63 sectors/track, 19457 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0xa02da02d

    Device Boot Start End Blocks Id System
    /dev/sda1 * 1 3270 26266243+ 7 HPFS/NTFS
    /dev/sda2 3271 5106 14745601 5 Extended
    /dev/sda3 5106 19457 115276108+ 7 HPFS/NTFS
    /dev/sda5 3271 5106 14745600 83 Linux
    т.е. оказалось, что sda5 - единственный на диске раздел Linux.
    Восстановить grub я, учитывая полное отсутствие у меня опыта работы с Linux, выполняя все рекомендации так и не смог. В итоге я проделал следующее:
    mkdir /mnt/tmp
    mount /dev/sda5 /mnt/tmp
    mount --bind /dev /mnt/tmp/dev
    chroot /mnt/tmp
    grub-install /dev/sda
    ...и загрузчик поднялся.
    Благодарю за оказанную помощь.
    Пользователь В.

    ОтветитьУдалить
  2. Благодарю за замечание, Витя, опечатку с fstab/fdisk исправил.

    ОтветитьУдалить