Pull to refresh

Перезагружаемся в другую ОС без рукоприкладства

Reading time2 min
Views29K
image
Я постоянно работаю в линуксе. Но бывают случаи, когда нужно перезагрузиться в винду. Просто так это сделать трудно, нужно подождать когда выскочит Grub и выбрать нужный пункт. Поэтому, отдохнуть или сходить куда-нибудь во время ребута вам не получится, сидите перед монитором. Попробуем облегчить страдания и сделать хоть что-нибудь.

Чего делать то?


Ну, первая мысль — менять флаг выбора пункта по умолчанию в самом grub. Однако, grub у нас на разделе с линем, а значит винда не сможет изменить конфиг файл. Ладно, вынесем grub на отдельный раздел с fat32. Я выделил 150 МБ, однако и 100 я думаю хватить должно.

Всё, теперь ставим туда grub. Я делал это из линукса, изобретать велосипед здесь смысла нету.
У меня раздел /dev/sda6, меняйте на свой.

sudo mkdir /mnt/GRUB
sudo mount /dev/sda6 /mnt/GRUB
sudo grub-install --force --no-floppy --root-directory=/mnt/GRUB /dev/sda6 

Итак, grub установили, давайте создадим grub.cfg (я провтыкал, и не запомнил, может он по дефолту уже при установке создается).

sudo grub-mkconfig -o /mnt/GRUB/boot/grub/grub.cfg

Окей, не хватает узнать порядок пунктов в меню. Выполняем и считаем:

grep menuentry /mnt/GRUB/boot/grub/grub.cfg

Отсчет идет с 0, кстати. Я выбрал два пункта, один с linux (0), второй с windows (4)

Linux

Пошли дальше. Разберемся с ребутом линукса. Подойдет такой bash скрипт

#!/bin/bash
# Путь к разделу с grub
disk=/dev/sda6
# Пункт с linux
linmenu=0
# Пункт с windows
winmenu=4

mount $disk /mnt/GRUB
sed "s/set default=\"${linmenu}\"/set default=\"${winmenu}\"/g" -i /mnt/GRUB/boot/grub/grub.cfg
reboot

Изменяйте раздел и пункты с линьвином.

Для перезапуска я создал кнопку gksu sh ./путь-к-скрипту. А то кто это вам разрешит монтировать и ребутить без рут прав.
В данном скрипте просто заменяется set default на нужное.

Уже можно даже попробовать перезагрузится в винду через скрипт.

Windows

В винде, не мудрствуя лукаво, я поставил sed, только перекинул файлы из bin в system32.

Получился такой .bat файл:

:: Путь к grub.cfg
set grubfile=e:\boot\grub\grub.cfg
:: Пункт с linux
set linmenu=0
:: Пункт с windows
set winmenu=4
sed -e "s/set default=\"%winmenu%\"/set default=\"%linmenu%\"/g" %grubfile% > %grubfile%.tmp
del %grubfile%
ren %grubfile%.tmp grub.cfg
shutdown -f -t 0 -r

Меняйте пути и пункты.
(sed с ключем -i мусорил, пришлось в темп кидать. Кто знает другой обход, напишите)

Вместо выводов


Да и всё, вроде. Имеем, кнопку на линуксе, которая перезагружает комп в винду автоматом и наоборот.

Грамотные люди меня поправят, где я не прав и где можно чего изменить. Умею как могу.
Экспериментируйте.

UPD: В комментах подсказали про grub-reboot, а также узнал про grub-set-default, однако менять конфиг файл они у меня не захотели (рут дирректорию тоже указывал). Прочитал, что настройка есть еще в /etc/default/grub, там и меняет, наверное.
Tags:
Hubs:
+6
Comments37

Articles

Change theme settings