GRUB (GRand Unified Bootloader) — программа-загрузчик операционных систем.
GRUB может загрузить любую совместимую с ней операционную систему. Среди них: Linux, FreeBSD, Solaris и многие другие. Кроме того, GRUB умеет по цепочке передавать управление другому загрузчику, что позволяет ему загружать Windows (через загрузчик NTLDR), MS-DOS, OS/2 и другие системы.
Значит с теорией мы немного разобрались (думаю этого будет достаточно), теперь же рассмотрим, какие бывают подводные камни, при установке Dual Boot Windows и Linux на одном компьютере.
Эксперимент производился на рабочей станции со следующими характеристиками:
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 запускается, но не видит другие ОС кроме Линукса. Также рекомендую создавать резервные копии файлов/каталогов, над которыми вы осуществляете хоть малейшие изменения.
- Через терминал, с правами root смонтировать раздел с EFI в папку /mnt. В моем случае, это была команда mount /dev/sda2 /mnt.
- Введите команду sudo -s и подтвердите пароль (он пустой по умолчанию) для последующих операций (многие советуют не делать этого, а вводить sudo и команду для выполнения — я поддерживаю это мнение, но инструкция рассчитана на опытных пользователей системы Linux, которые понимаю, что делают все на свой страх и риск).
- Запустить Midnight Commander командой mc.
- Найти в файловой системе следующий каталог: EFI в папке /mnt.
- Переименовать каталог Microsoft во что-нибудь другое, например в Microsoft2.
- Создаем новый каталог с именем Microsoft.
- Заходим в только что созданный каталог Microsoft и частично создаем внутри его иерархию папок аналогичную старому Microsoft (тому, что переименовали). В моем случае он имел такую структуру папок: /boot/, затем куча папок и файл bootmgfw.efi рядом с ними. Нужно воссоздать структуру папок ровно до этого файла. Т.е. всё, что лежит рядом с ним — не нужно, а всё, что идет до него (т.е. родительские папки, соседние с ними тоже не нужны) воссоздаем в нашей новой папке Microsoft. В моем случае понадобилось создать только папку /boot, итоговый путь до нового каталога вышел таким: /EFI/Microsoft/boot. Можно просто скопировать все папки и файлы — проверено, это работает и можно не создавать все вручную.
- Находим в каталоге из шага 6 папку с именем нашего дистрибутива Линукса, в нашем случае это Ubuntu. Копируем (оригиналы файлов и папку ubuntu на всякий случай оставляем, не помешают) все файлы из данной в папки в итоговый каталог, созданный на предыдущем шаге: /EFI/Microsoft/boot.
- В получившейся файловой системе находим файл grubx.efi или grubx64.efi (будет только один из них: в зависимости от разрядности установленного Линукса). Переименовываем его в bootmgfw.efi.
- Находим файл /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, то приведенная выше инструкция не поможет. Точнее, она поможет, но только ее нужно дополнить. После выполнения основной части выполняем следующие шаги:
- После выполнения всех операций заходим в папку /EFI/opensuse/x86_64-efi/ (название итоговой папки x86_64-efi может быть другим в зависимости от архитектуры ПК)
- Копируем файл grub.efi (если у вас включена опция Secure Boot, там будет еще файл shim.efi, тогда советую скопировать их вместе)
- Заходим в папку /EFI/Boot и удаляем все файлы, которые там есть (при обновлении загрузчика они снова появятся, но в этом нет ничего страшного)
- Вставляем файл (или файлы), которые мы скопировали и спокойно идем на перезагрузку.
Вот и вся инструкция. Думаю, кому-то пригодится…
P.S. Если же у вас все хорошо, GRUB с OpenSUSE запускается, но не видит Windows, радуйтесь — проблема решается всего одной командной: grub2-mkconfig -o /boot/grub2/grub.cfg, а если у вас стоит Ubuntu, нужно выполнить просто update-grub.
Для тех же, кого заинтересовала данная тема, рекомендую прочитать статью: «Начальный загрузчик GRUB 2 — полное руководство».
Комментарии (23)
TrueBers
07.02.2017 22:51+3Как это попадает на хабр? Что, совсем всё грустно с контентом, да?..
S_E_R_I_K_K_K
08.02.2017 08:51-1Увы, мне подобная инструкция сэкономила бы около 3-х недель упорной работы. Также, это отличный опыт, для меня как новичка, понимания работы загрузчика.
LexS007
08.02.2017 02:46+1Информативность/полезность статьи где-то недалеко от нуля. В ArchWiki давно все подробно расписано про grub и dualboot.
mikkisse
08.02.2017 08:36+1Вот так комментаторы отбивают желание писать у людей в дальнейшем. В принципе все, что есть на Хабре написано где-то в других местах\документациях и если это не пригодилось одним, еще не значит, что будет бесполезно для других.
Может статья и уровня новичка, тогда получается, что новичкам не место на хабре?
Fraybyl
08.02.2017 08:41Как раз искал такое, но понял, что граб совершено не для gpt.
Уж лучше поискать другие загрузчики.Например rEFInd.S_E_R_I_K_K_K
08.02.2017 08:52-1Возможно, но это дело принципа — заставить работать GRUB там, где он должен работать.
AVX
08.02.2017 13:53product: ST500DM002-1BD14
Надеюсь, Вы делаете бэкапы. Но всё равно, мой совет — смените диск, пока не поздно.
ST500DM002, WD3200AAKX, WD2500BPVD — это только то, что вспомнилось из популярных моделей, которые мрут как мухи.S_E_R_I_K_K_K
08.02.2017 14:38Бекапы — это святое. Этот винт у админа сайта, а он хранит файлы только в облаке — так что ничего страшного нет… А вот объяснить начальству замену работающего диска — ой как не просто.
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?
barker
Ну и да, груб для конфигурации «просто дуалбут» в 2017 году явно лишний.
Лол да и только.
maniacscientist
>«просто дуалбут» в 2017 году явно лишний.
ага. для запуска игрульки достаточно флешки с windows to go
Meklon
Все мы начинали когда-то)
defaultvoice
Но не фиксировали каждое своё «открытие» в виде статей на хабре.
Я уже достаточно давно хочу написать что-то на хабр, но каждый раз, когда подворачивается тема, натыкаюсь на аналогичный опыт других людей, гуглящийся за полминуты и передумываю, потому что на мой взгляд незачем плодить контент, когда другие это уже сделали и сделали лучше. А тем временем одни люди получают инвайты за такие статьи, а другие люди потом гадают, почему хабр уже не торт.
S_E_R_I_K_K_K
Почему же лол? У меня, когда я впервые сел за Линукс было очень много вопросов к утилите MC, и мне, после Windows было привычней работать с окнами. Но я изучил весь функционал программы и теперь понимаю какой это отличный инструмент. В статье я имел ввиду, что некоторым удобней будет через файловый менеджер, другим MC — все-равно выходим на один и тот же результат.
Про дуал бут — он не лишний. У нас в конторе переход на OpenSource уже начался, но есть 99% вероятности, что пользователь забудет перенести файлы с Windows на облако/диск D/сервер и потеряются важные документы. Некоторое время будет двойная загрузка, а после миграции всех доков, Windows полностью уйдет из компов. Ну, а на новые компы в конторе — да, сразу ставлю OpenSUSE как единственную систему.
DaemonGloom
Груб здесь лишний. Дуалбут прекрасно реализуется кнопкой F12/F8/Esc (смотрите инструкцию к компьютеру и на подсказки при загрузки bios), которая вызывает список операционных систем для загрузки.
S_E_R_I_K_K_K
Ни разу не видел в биосе выбор из установленных ОС. Биос работает с железом, при чем тут установленные ОС?
LexS007
Вы про UEFI слышали? Путь к загрузчику записываются в nvram и в BIOS можно выбирать сразу OS в приоритетах загрузки и BootMenu.
LexS007
А начиная с версии linux 3.3, UEFI может сразу загружать ядро без дополнительных бутлоадеров.
S_E_R_I_K_K_K
Как я писал в других комментариях, это пока первый опыт работы с загрузчиками. Я прекрасно понимаю, что инфы, которую надо изучить, еще множество, это только начало. Да и в качестве эксперимента я считаю довольно неплохо.
barker
Лол — это лишь к ремарке про сложность «утилиты mc» в статье про линукс и в статье от человека, в профиле которого написано, что он сисадмин. Но это к теме не относится.
Я не сказал, что дуалбут лишний, я сказал, что груб лишний. Совершенно лишний в вашей задаче «сделать дуалбут».
А главная критика в том, что статья содержит странную последовательность monkey-действий без малейшего объяснения. При этом объяснение на самом деле элементарное. Три недели над ней биться можно если ну уж СОВСЕМ не понимать как работает загрузка компьютера.
S_E_R_I_K_K_K
К сожалению, это самое «элементарное» решение и не нашел за три недели гугления. Если бы мне помогли советы из Wiki Ubuntu/OpenSUSE/Arch, то я не писал бы эту статью. Последовательность действий может быть и нелогична, я это не отрицаю — как никак первый опыт работы с загрузчиками и их работой. Но в то же время, данная инструкция имеет право быть, так как она рабочая, и подтверждена практикой. А чем же пользоваться, если груб лишний? Если речь идет о других загрузчиках, так это дело вкуса…