Привет, Хабр! Сегодня мы рассмотрим ситуацию, когда при двойной установке Linux & Windows загрузчик GRUB не стартует, давая возможность выбрать ОС, а автоматически загружается Windows. Немного теории:

GRUB (GRand Unified Bootloader) — программа-загрузчик операционных систем.
GRUB может загрузить любую совместимую с ней операционную систему. Среди них: Linux, FreeBSD, Solaris и многие другие. Кроме того, GRUB умеет по цепочке передавать управление другому загрузчику, что позволяет ему загружать Windows (через загрузчик NTLDR), MS-DOS, OS/2 и другие системы.

Значит с теорией мы немного разобрались (думаю этого будет достаточно), теперь же рассмотрим, какие бывают подводные камни, при установке Dual Boot Windows и Linux на одном компьютере.

image


Эксперимент производился на рабочей станции со следующими характеристиками:

Base Board Information

  • Manufacturer: Acer
  • Product Name: Aspire XC600

Memory Device

  • Size: 4096 MB
  • Type: DDR3
  • Speed: 1333 MHz
  • Manufacturer: Kingston
  • Rank: 2

HDD

  • product: ST500DM002-1BD14
  • vendor: Seagate
  • physical id: 0.0.0
  • bus info: scsi@0:0.0.0
  • logical name: /dev/sda
  • size: 465GiB (500GB)
  • capabilities: gpt-1.00 partitioned partitioned:gpt

Доказано, что проблем с установкой Debian 8.6 Jessie совместно с Windows 10 не обнаружено. Debian корректно прописывается в автозагрузке, GRUB запускается без ошибок и две ОС также работают нормально.

Но, как показала практика, не со всеми дистрибутивами такое происходит. При установке Ubuntu 16.04.1 вместо Debian на ту же рабочую станцию вылез первый подводный камень — GRUB не стартовал, и Windows 10 автоматом шла на загрузку.

Решение проблемы было найдено спустя недели три-четыре (тогда уже надоело считать, сколько времени убито на решение проблемы). Оно оказалось неожиданным, но в тоже время вся система заработала. Значит, если вы столкнулись с такой же проблемой, приведенная ниже инструкция может вам пригодится и сэкономить кучу времени.

Важно! До начала выполнения инструкции нужно подготовить LiveCD с дистрибутивом Linux Mint — все операции мы будем выполнять на нем (я выбрал этот дистрибутив из-за того, что на него спокойно можно установить Midnight Commander, что сложно сделать на LiveCD с Ubuntu, так мы получаем больше пространства для маневров). Также стоит заметить, что команда из под консоли update-grub вам не поможет, так как она рассчитана на случай, когда GRUB запускается, но не видит другие ОС кроме Линукса. Также рекомендую создавать резервные копии файлов/каталогов, над которыми вы осуществляете хоть малейшие изменения.

  1. Через терминал, с правами root смонтировать раздел с EFI в папку /mnt. В моем случае, это была команда mount /dev/sda2 /mnt.

  2. Введите команду sudo -s и подтвердите пароль (он пустой по умолчанию) для последующих операций (многие советуют не делать этого, а вводить sudo и команду для выполнения — я поддерживаю это мнение, но инструкция рассчитана на опытных пользователей системы Linux, которые понимаю, что делают все на свой страх и риск).

  3. Запустить Midnight Commander командой mc.

  4. Найти в файловой системе следующий каталог: EFI в папке /mnt.

  5. Переименовать каталог Microsoft во что-нибудь другое, например в Microsoft2.

  6. Создаем новый каталог с именем Microsoft.

  7. Заходим в только что созданный каталог Microsoft и частично создаем внутри его иерархию папок аналогичную старому Microsoft (тому, что переименовали). В моем случае он имел такую структуру папок: /boot/, затем куча папок и файл bootmgfw.efi рядом с ними. Нужно воссоздать структуру папок ровно до этого файла. Т.е. всё, что лежит рядом с ним — не нужно, а всё, что идет до него (т.е. родительские папки, соседние с ними тоже не нужны) воссоздаем в нашей новой папке Microsoft. В моем случае понадобилось создать только папку /boot, итоговый путь до нового каталога вышел таким: /EFI/Microsoft/boot. Можно просто скопировать все папки и файлы — проверено, это работает и можно не создавать все вручную.

  8. Находим в каталоге из шага 6 папку с именем нашего дистрибутива Линукса, в нашем случае это Ubuntu. Копируем (оригиналы файлов и папку ubuntu на всякий случай оставляем, не помешают) все файлы из данной в папки в итоговый каталог, созданный на предыдущем шаге: /EFI/Microsoft/boot.

  9. В получившейся файловой системе находим файл grubx.efi или grubx64.efi (будет только один из них: в зависимости от разрядности установленного Линукса). Переименовываем его в bootmgfw.efi.

  10. Находим файл /boot/grub/grub.cfg в файловой системе установленного Линукса. Открываем его для редактирования. Внутри него находим слово «Microsoft» в контексте строки, начинающейся с «chainloader» и заменяем это слово (должно быть только одно вхождение и именно в строке с «chainloader», так что не ошибетесь) на название каталога, в который мы переименовали Microsoft (т.е. на Microsoft2 в нашем примере). Сохраняем изменения в файле.

Также, в этом файле вы можете поменять названия в списке, который выводит GRUB. Например, вместо openSUSE Leap 42.2 27.01 в части кода:

menuentry 'openSUSE Leap 42.2 27.01'  --class opensuse --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-996b3ed5-150f-4de3-a40c-6d385e27d6de' {
	load_video
	set gfxpayload=keep
	insmod gzio
	insmod part_gpt
	insmod ext2
	set root='hd0,gpt6'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt6 --hint-efi=hd0,gpt6 --hint-baremetal=ahci0,gpt6  996b3ed5-150f-4de3-a40c-6d385e27d6de
	else
	  search --no-floppy --fs-uuid --set=root 996b3ed5-150f-4de3-a40c-6d385e27d6de
	fi
	echo	'Загружается Linux 4.4.36-8-default …'
	linuxefi /boot/vmlinuz-4.4.36-8-default root=UUID=996b3ed5-150f-4de3-a40c-6d385e27d6de ro  resume=/dev/sda7 splash=silent quiet showopts
	echo	'Загружается начальный виртуальный диск …'
	initrdefi /boot/initrd-4.4.36-8-default
}

Написать openSUSE The best choice!:):

menuentry 'openSUSE The best choice!:)'  --class opensuse --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-996b3ed5-150f-4de3-a40c-6d385e27d6de' {
	load_video
	set gfxpayload=keep
	insmod gzio
	insmod part_gpt
	insmod ext2
	set root='hd0,gpt6'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt6 --hint-efi=hd0,gpt6 --hint-baremetal=ahci0,gpt6  996b3ed5-150f-4de3-a40c-6d385e27d6de
	else
	  search --no-floppy --fs-uuid --set=root 996b3ed5-150f-4de3-a40c-6d385e27d6de
	fi
	echo	'Загружается Linux 4.4.36-8-default …'
	linuxefi /boot/vmlinuz-4.4.36-8-default root=UUID=996b3ed5-150f-4de3-a40c-6d385e27d6de ro  resume=/dev/sda7 splash=silent quiet showopts
	echo	'Загружается начальный виртуальный диск …'
	initrdefi /boot/initrd-4.4.36-8-default
}

Хоть мелочь, а приятно! Остальное в коде советую не трогать.

Если трудно разобраться с управлением Midnight Commander (в этом нет ничего страшного, у меня тоже в первый раз были проблемы с этой программой), все операции можно выполнить в файловом менеджере Nautilus (или в другом, не суть важно), но изначально запустив его под правами пользователя root.

После этого идем на перезагрузку и радуемся результату. Но, как оказывается, такая проблема есть и у дистрибутива OpenSUSE Leap 42.2. Как показала практика, если на компьютере установлен дистрибутив OpenSUSE с Windows 10, то приведенная выше инструкция не поможет. Точнее, она поможет, но только ее нужно дополнить. После выполнения основной части выполняем следующие шаги:

  1. После выполнения всех операций заходим в папку /EFI/opensuse/x86_64-efi/ (название итоговой папки x86_64-efi может быть другим в зависимости от архитектуры ПК)
  2. Копируем файл grub.efi (если у вас включена опция Secure Boot, там будет еще файл shim.efi, тогда советую скопировать их вместе)
  3. Заходим в папку /EFI/Boot и удаляем все файлы, которые там есть (при обновлении загрузчика они снова появятся, но в этом нет ничего страшного)
  4. Вставляем файл (или файлы), которые мы скопировали и спокойно идем на перезагрузку.
    Вот и вся инструкция. Думаю, кому-то пригодится…

P.S. Если же у вас все хорошо, GRUB с OpenSUSE запускается, но не видит Windows, радуйтесь — проблема решается всего одной командной: grub2-mkconfig -o /boot/grub2/grub.cfg, а если у вас стоит Ubuntu, нужно выполнить просто update-grub.

Для тех же, кого заинтересовала данная тема, рекомендую прочитать статью: «Начальный загрузчик GRUB 2 — полное руководство».
Поделиться с друзьями
-->

Комментарии (23)


  1. barker
    07.02.2017 21:00
    +4

    Оно оказалось неожиданным
    Что тут неожиданного? Система грузилась с uefi, в сетапе стоял дефолтный виндовый лоадер, груб ваш просто сбоку стоял. Вы просто на то же место подсунули грубовский лоадер, хотя можно было в efivars/boot settings прописать просто другой какой-то. Или я чего-то не понял?

    Ну и да, груб для конфигурации «просто дуалбут» в 2017 году явно лишний.
    Если трудно разобраться с управлением Midnight Commander (в этом нет ничего страшного, у меня тоже в первый раз были проблемы с этой программой),
    Лол да и только.


    1. maniacscientist
      07.02.2017 21:26

      >«просто дуалбут» в 2017 году явно лишний.

      ага. для запуска игрульки достаточно флешки с windows to go


    1. Meklon
      07.02.2017 22:54
      +1

      Все мы начинали когда-то)


      1. defaultvoice
        08.02.2017 02:47

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


    1. S_E_R_I_K_K_K
      08.02.2017 08:46

      Почему же лол? У меня, когда я впервые сел за Линукс было очень много вопросов к утилите MC, и мне, после Windows было привычней работать с окнами. Но я изучил весь функционал программы и теперь понимаю какой это отличный инструмент. В статье я имел ввиду, что некоторым удобней будет через файловый менеджер, другим MC — все-равно выходим на один и тот же результат.
      Про дуал бут — он не лишний. У нас в конторе переход на OpenSource уже начался, но есть 99% вероятности, что пользователь забудет перенести файлы с Windows на облако/диск D/сервер и потеряются важные документы. Некоторое время будет двойная загрузка, а после миграции всех доков, Windows полностью уйдет из компов. Ну, а на новые компы в конторе — да, сразу ставлю OpenSUSE как единственную систему.


      1. DaemonGloom
        08.02.2017 10:31

        Груб здесь лишний. Дуалбут прекрасно реализуется кнопкой F12/F8/Esc (смотрите инструкцию к компьютеру и на подсказки при загрузки bios), которая вызывает список операционных систем для загрузки.


        1. S_E_R_I_K_K_K
          08.02.2017 12:23
          -1

          Ни разу не видел в биосе выбор из установленных ОС. Биос работает с железом, при чем тут установленные ОС?


          1. LexS007
            08.02.2017 12:29

            Вы про UEFI слышали? Путь к загрузчику записываются в nvram и в BIOS можно выбирать сразу OS в приоритетах загрузки и BootMenu.


            1. LexS007
              08.02.2017 12:36

              А начиная с версии linux 3.3, UEFI может сразу загружать ядро без дополнительных бутлоадеров.


              1. S_E_R_I_K_K_K
                08.02.2017 12:49

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


      1. barker
        08.02.2017 11:01

        Лол — это лишь к ремарке про сложность «утилиты mc» в статье про линукс и в статье от человека, в профиле которого написано, что он сисадмин. Но это к теме не относится.

        Я не сказал, что дуалбут лишний, я сказал, что груб лишний. Совершенно лишний в вашей задаче «сделать дуалбут».

        А главная критика в том, что статья содержит странную последовательность monkey-действий без малейшего объяснения. При этом объяснение на самом деле элементарное. Три недели над ней биться можно если ну уж СОВСЕМ не понимать как работает загрузка компьютера.


        1. S_E_R_I_K_K_K
          08.02.2017 12:26

          К сожалению, это самое «элементарное» решение и не нашел за три недели гугления. Если бы мне помогли советы из Wiki Ubuntu/OpenSUSE/Arch, то я не писал бы эту статью. Последовательность действий может быть и нелогична, я это не отрицаю — как никак первый опыт работы с загрузчиками и их работой. Но в то же время, данная инструкция имеет право быть, так как она рабочая, и подтверждена практикой. А чем же пользоваться, если груб лишний? Если речь идет о других загрузчиках, так это дело вкуса…


  1. TrueBers
    07.02.2017 22:51
    +3

    Как это попадает на хабр? Что, совсем всё грустно с контентом, да?..


    1. zelenin
      07.02.2017 23:37

      А что, кто-то модерирует статьи перед публикацией?


      1. Suvitruf
        07.02.2017 23:39
        +2

        Статья из песочницы, кто-то за эту статью дал инвайт.


    1. S_E_R_I_K_K_K
      08.02.2017 08:51
      -1

      Увы, мне подобная инструкция сэкономила бы около 3-х недель упорной работы. Также, это отличный опыт, для меня как новичка, понимания работы загрузчика.


  1. LexS007
    08.02.2017 02:46
    +1

    Информативность/полезность статьи где-то недалеко от нуля. В ArchWiki давно все подробно расписано про grub и dualboot.


  1. mikkisse
    08.02.2017 08:36
    +1

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


  1. Fraybyl
    08.02.2017 08:41

    Как раз искал такое, но понял, что граб совершено не для gpt.
    Уж лучше поискать другие загрузчики.Например rEFInd.


    1. S_E_R_I_K_K_K
      08.02.2017 08:52
      -1

      Возможно, но это дело принципа — заставить работать GRUB там, где он должен работать.


  1. AVX
    08.02.2017 13:53

    product: ST500DM002-1BD14

    Надеюсь, Вы делаете бэкапы. Но всё равно, мой совет — смените диск, пока не поздно.
    ST500DM002, WD3200AAKX, WD2500BPVD — это только то, что вспомнилось из популярных моделей, которые мрут как мухи.


    1. S_E_R_I_K_K_K
      08.02.2017 14:38

      Бекапы — это святое. Этот винт у админа сайта, а он хранит файлы только в облаке — так что ничего страшного нет… А вот объяснить начальству замену работающего диска — ой как не просто.


  1. Vovan32
    08.02.2017 19:05

    Хорошая статья. И в удачном, на мой взгляд, месте. Я здесь как раз искал такую несколько месяцев назад и не нашел.
    Именно этот способ (подмены в папке Micosoft), возможно, единственный вариант запуска Linux по умолчанию для тех, у кого в UEFI Windows после первого запуска оказывается опять первой по умолчанию (предполагаю что первым в некоторых BIOS'ах просто оказывается последняя запущенная система, но на просторах читал что в этом обвиняют то производителей буков, то NTLDR).
    У меня же на буке от Асус уже была 10ка и GPT, а в Linux Mint еще и драйвера под встроенное видео не поднимались до обновления ядра. Поэтому параметры загрузки захотелось подправить. В GRUB'е это запросто, поэтому уцепился именно за него. Удалось запустить GRUB через виндовый загрузчик, но его менюшка выбора операционки появляется ой как не быстро и каждый раз это терпеть не охота. В итоге GRUB занес в UEFI, и установил по умолчанию его. И все стало привычно, как и во времена до GPT и UEFI. Но на это ушло около недели по пару часов по вечерам.
    До этого не сталкивался с UEFI и Secure Boot и всегда их отключал и до сих пор интересно возможно ли передать ядру параметры как-то через UEFI напрямую без GRUB?