вторник, 1 июня 2010 г.

Grub 2 (part 2)

IV. Advanced
даунгрейд до grub-legacy (возврат старой версии).
в случае, если ваша дружба с grub2 так и не состоялась, вы можете заменить его на старый grub (ныне известный как grub-legacy), который на текущий момент более стабилен. и привычен для многих.
для начала, конечно же, сделаем бэкап важных файлов. создайте резервную копию файлов конфигурации как описано конце I-ой главы. также желательно забэкапить папку "/boot/grub". для этого выполните
Код:
sudo cp -R /boot/grub{,.bak}
теперь мы можем приступить к удалению grub2. для этого удаляем пакеты "grub-pc" и "grub2" (последний может быть не установлен):
Код:
sudo apt-get purge grub2 grub-pc
заметьте: удаление пакетов не приведет к полной очистке папки "boot/grub".
теперь установим grub версии 0.97:
Код:
sudo apt-get install grub
но после установки нам необходимо создать файл menu.lst и другие файлы загрузчика. для этого нужно выполнить еще две команды:
Код:
sudo update-grub
эта команда создаст файл меню загрузки. на заданные ей вопросы отвечайте "yes".
Код:
sudo grub-install /dev/sda
создаст остальные файлы загрузчика и запишет информацию в загрузочный раздел диска (MBR). вместо "/dev/sda" в конце укажите тот жесткий диск, который используется в качестве загрузочного (установлен загрузочным в bios)
если установка прошла успешно - перезагружаемся и видим старый добрый grub с его menu.lst и без лишних хитростей
(Кликните, чтобы показать/скрыть)

создание аварийно-спасательного GRUB2-liveUSB
здесь мы рассмотрим, как создать загрузочную флэшку с установленным на нее grub2, через который можно будет загрузиться в случае, если grub2 на жестком диске безнадежно испорчен. есть, конечно, возможность восстановления с liveCD, но никогда не помешает дополнительная страховка на случай, если это не спасет. тем более, что потребуется для этого не так уж много.
итак, имеем флэшку. на этой самой флэшке нужно будет создать небольшой раздел для установки туда grub2. здесь подразумевается, что вы уметее создавать и форматировать разделы. если нет установите gparted, почитайте его справку и другую доступную информацию.
итак, откусим кусок свободного места и создадим небольшой раздел. 100 мб будет более чем достаточно (впрочем, хватит и 50). в качестве файловой системы выберите ext4/ext3. причина проста; reiserfs займет на 100-мегабайтном разделе 32 мб, а ext4 - всего 8. закончив с разделом, загрузитесь с liveCD.
примонтируйте свежесозданный раздел как папку "/boot/grub" запущенной live-системы. (здесь и далее будем считать, что раздел именуется "/dev/sdb1". подставляйте свое значение, если это не так)
Код:
sudo mount /dev/sdb1 /boot/grub
теперь выполним собственно процедуру установки grub2. для этого запустите
Код:
sudo grub-install /dev/sdb
не забывайте, что при установке мы указываем диск (/dev/sdb в нашем примере), а не раздел! мы по сути скомандовали системе установить grub2 на саму себя, прописав grub2 в MBR указанного диска, но вместо "/boot/grub" файлы загрузчика попадут на флэшку, "что и требовалось доказать".
отмонтируем флэшку
Код:
sudo umount /boot/grub
перезагружаемся.
в принципе, вышеописанных операций достаточно для того, чтобы загрузиться с флэшки в работающий grub2. однако, меню загрузки вы не увидете, а попадете сразу в консоль. если у вас нет опыта работы с консолью grub2, или вы просто хотите сделать процесс более удобным, придется совершить еще несколько действий, чтобы получить полноценный grub2 с менюшкой.
грузимся с жесткого диска, запускаем обычную систему.
монтируем раздел с grub2. по умолчанию он смонтируется автоматом в "/media", причем в качестве точки монтирования будет использован uuid раздела. отмонтируйте его через апплет или значок на рабочем столе и примонтируйте в "/mnt":
Код:
sudo mount /dev/sdb1 /mnt
создадим папки, в которых будут храниться настройки:
Код:
sudo mkdir -p /mnt/config/{default,grub.d}
скопируем туда файлы настроек
Код:
sudo cp -p /etc/grub.d/* /mnt/config/grub.d/
и
Код:
sudo cp -p /etc/default/grub /mnt/config/default
теперь настроим наш новый grub2. если в вашем обычном grub2 вы используете фоновое изображение - отредактируйте "/mnt/config/grub.d/05_debian_theme", указав в качестве картинки имя несуществующего файла, тем самым отключив картинку на фоне. также можете поправить "/mnt/config/default/grub" - например, отключить секундомер, выставив параметр "GRUB_TIMEOUT" в "-1".
после внесения необходимых правок мы можем приступить к созданию "grub.cfg" на нашем разделе. для этого потребуется еще несколько манипуляций. нижеприведенные команды вы можете выполнить по отдельности, но я рекомендую для дальнейшего удобства сохранить эти строки в виде скрипта, поместив файл, например, в "/mnt/config/grub-usb-update" и установив ему права 755.
Код:
sudo mount --bind /mnt/config/default/grub /etc/default/grub
sudo mount --bind /mnt/config/grub.d /etc/grub.d
sudo grub-mkconfig -o /mnt/grub.cfg
sudo umount /etc/default/grub
sudo umount /etc/grub.d
что мы только что сделали? примонтировали файлы конфигурации grub2 в качестве "родных" настроек основной системы. и исходя из них создали grub.cfg, поместив его на флэшку. команда "grub-mkconfig" идентична привычному "update-grub" (на самом деле, "update-grub" лишь запускает "grub-mkconfig", указав, куда сохранить файл), с помощью ключа "-o" мы указали, куда поместить результат трудов команды. после чего мы отмонтируем наши файлы с настройками, возвращая родные файлы на законное место.
если вы последовали совету выше и сохранили скрипт, достаточно будет его запустить одной командой:
Код:
/mnt/config/grub-usb-update
теперь когда вы решите обновить grub2 на флэшке (например, после обновления ядра), достаточно будет примонтровать раздел в "/mnt", выполнить скрипт и отмонтировать флэшку обратно.
ну а сейчас отмонтируем флэшку
Код:
sudo umount /mnt
и перезагружаемся. грузимся с флэшки и видим меню загрузки со всеми нашими системами. радуемся.

загрузка другого grub2 из текущего.
как выяснилось в ходе экспериментов, все весьма просто. загружаемся в grub2, переходим в консоль нажатием "c". загрузка другого grub2 происходит по методу "set root - chainloader - boot". для начала определимся с диском, в MBR которого прописан grub2, который мы собираемся загрузить. выполните команду
Код:
ls
чтобы увидеть список текущих дисков и разделов. диск, с которого производился загрузка будет именоваться (hd0). в нашем примере мы загрузим с флэшки основной grub2 на жестком диске. если флэшка - (hd0), то жесткий диск будет (hd1). выолняем
Код:
set root=(hd1)
или же
Код:
root (hd1)
во втором случае видим сообщение, что файловая система незивестна. это нормально.
передаем управление по цепочке
Код:
chainloader +1
и даем команду на запуск
Код:
boot
и попадаем в искомый загрузчик.

консоль grub2 - команды и хитрости.
здесь мы рассмотрим некоторые команды консоли grub2. все мы разбирать не будем, а изучим лишь самые необходимые и полезные. напомню, чтобы попасть в консоль, нужно нажать "c" во время отображения меню загрузки. итак, начнем!
ls
довольно универсальная команда. при использовании в чистом виде выдает список жестких дисков и разделов.
также она может быть использована как одноименная команда в linux - для вывода содержимого папки. например,
Код:
ls /boot/grub
выведет содержимое папки "/boot/grub" на разделе, который сейчас указан в качестве корневого (об этом чуть ниже).
еще одно полезное свойство комадны "ls" - она позволят получить информацию о любом разделе:
Код:
ls (hd0,5)
сообщит нам тип файловой системы на разделе, метку раздела (если таковая имеется), UUID и дату последнего изменения данных на разделе (в формате UTC).
cat
данная команда аналогична своей тезке в linux - она выводит содержимое заданного файла. используется в формате
Код:
cat /путь/имя_файла
linux
загружает указанное linux-ядро. аналог команды "kernel" в grub-legacy. используется в формате
Код:
linux файл_ядра опция1=значение опция2 опция3
например, так:
Код:
linux /boot/vmlinuz-2.6.32-020632-generic root=/dev/sda5 single
initrd
загружает указанный initrd-образ. используется так:
Код:
initrd /boot/initrd.img-2.6.32-020632-generic
обратите внимание: версия initrd должна соответствовать версии загружаемого ядра!
chainloader
передает управление загрузкой по цепочке другому загрузчику (загрузчик ищется на заданном в качестве root разделе). в общем случае требует указания файла для загрузки:
Код:
chainloader /путь/имя_файла
однако, для NTLDR (загрузчика Windows) можно использовать
Код:
chainloader +1
boot
производит загрузку указанного ядра (заданного с "linux" и "initrd") или же другого загрузчика (заданного через "chainloader"). используется без параметров
root
при использовании без параметров сообщает, какой раздел сейчас используется в качестве корневого (по умолчанию - корневой раздел системы, на которую установлен текущий grub2) и тип файловой системы на этом разделе (для ext3/4 тип будет указан как ext2, это нормально)
также команда может быть использована для задания другого root-раздела. раздел задается в "grub device" формате, то есть "(hd*,*)". например:
Код:
root (hd0,5)
после задания раздела команда сообщит новый root-раздел и тип файловой системы.
примечание: "root hd(*,*)" не всегда корректно срабатывает. более предпочтительным вариантом является "set root" (см. ниже)
set
весьма универсальная команда для изменения различных параметров. служит для задания значений переменных и используется в формате
Код:
set переменная=значение
наиболее необходимое ее применение - для задания root-раздела. для этого изменяется переменная "root", в качестве значения задается необходимый раздел, например:
Код:
set root=(hd0,5)
(именно такая технология используется в "grub.cfg")
также с ее помощью можно, например, "на лету" изменить цвет текста в меню и консоли, что позволяет опробовать цветовую схему перед установкой ее в качестве основной. для этого изменяем переменные "color_normal" и "color_highlight" для обычного пункта (и текста в консоли) и выделенного пункта соответсвенно. например, попробуем такой вариант:
Код:
set color_normal=magenta/green
set color_highlight=light-blue/black
(подробнее о цветах читайте в главе II, раздел "настройка цвета пунктов меню")
search
пожалуй, одна из самых полезных команд. потомок "find" и "uuid" из grub-legacy. служит для поиска раздела по UUID, метке или заданному файлу.
имеет следующие ключи:
-u (или --fs-uuid) - поиск раздела по UUID
-l (или --label) - поиск по метке раздела
-f (или --file) - поиск по указанному файлу
-n (или --no-floppy) - не проверять флоппи-дисковод (чтоб не трещал)
-s (или --set) - установить найденный раздел в качестве значения заданной переменной.
зачем это нужно? дело в том, что при подключении/отключении жестких дисков (и в некоторых других случаях) нумерацию дисков и разделов может "поехать", и тогда наша команда "set root=(hd0,5)" в "grub.cfg" будет вести или в никуда или на раздел не того диска. поэтому в "grub.cfg" вы найдете строчку с "search".
для поиска раздела с известным нам uuid запустим "search" с ключом -"u":
Код:
search -u uuid_нужного_раздела
команда сообщит нам, какой раздел соответствует заданному UUID.
однако, UUID длинный, и хотя его и можно узнать, вводить вручную такое количество символов проблематично, и существует большой шанс сделать ошибку. вместо этого мы воспользуемя поиском по файлу, который точно имеется на нужном разделе. допустим, мы ищем раздел boot-раздел нашей системы. найдем его по файлу "grub.cfg":
Код:
search -f /grub/grub.cfg
обратите внимание, что при использовании такого способа указанный файл должен иметься только на одном разделе!
получив искомое, можно вручную задать нужный раздел в качестве root-раздела, но гораздо проще воспользоваться ключом "-s". если после него не указана переменная, будет использована "root", то есть найденный раздел как раз и будет задан в качестве корневого. допустим, раздел с Windows имеет метку "C_drive". установим его в качестве корневого для загрузки с него:
Код:
search -l C_drive -s
(Кликните, чтобы показать/скрыть)
lsfonts
эта команда отобразит список загруженных в настоящий момент шрифтов (полезно для тех, кто все-таки решил поразвлекаться с настройкой шрифтов в grub2, конвертацией их в .pf-формат и прочим)
help
при использовании в чистом виде выведет список доступных команд. в формате
Код:
help r
выведет справку по всем командам, начинающимся на "r".
Код:
help search
отобразит справку по команде "search"
halt
выключит компьютер (в теории) или введет его в ступор (у меня ).
reboot
перезагрузит компьютер
background_image
позволяет "на лету" изменить фоновое изображение. используется в формате
Код:
background_image /путь/имя_файла
дает замечательную возможность посмотреть на выбранную картинку в действии, избегая лишних перезагрузок. в сочетнии с заменой цветов через "set" позволит довольно быстро подобрать подходящий вариант оформления.
при использовании без параметров сбросит текущее фоновое изображение. однако, заданные цвета останутся, так что если у вас черный цвет текста - на черном фоне вы его не увидите.
примечание: данная команда не заменит ваши настройки оформления, фон будет изменен лишь на текущий сеанс
vbeinfo
выедет список поддерживаемых видеорежимов. этой командой полезно будет воспользоваться перед настройкой разрешения в "/etc/default/grub"
configfile
потомок одноименной команды в grub-legacy. позвоялет загрузить другой файл конфигурации с другим меню вместо текущего "grub.cfg". создав новый файл, вы можете сделать другое меню с другими настройками, оформлением и пунктами, не захламаляя основное меню. используется так:
Код:
configfile /путь/другой_файл_меню
создание и использование новых меню позже будет рассмотрено отдельно.
terminal_output.console
позволяет переключиться на обычную черно-белую цветовую гамму. весьма полезно при работе с консолью в том случае, если у вас установлено фоновое изображение. картинка на фоне - это, конечно, красиво, но на некоторых участках фона может быть не виден текст (если картинка не везде однородная). выполнив эту команду, вы получите контрастную схему (белый текст на черном фоне) и хороший крупный шрифт.
если вы часто используете консоль grub2, имеет смысл добавить в 40_custom пункт с этой командой, например:
Код:
menuentry "black&white mode"{
terminal_output.console
}

ну и для полного счастья ниже я приведу небольшой список премудростей, которые помогут вам облегчить работу в консоли:
уже упомянутое автодополнение команд (как в bash) по нажатию tab. tab в пустой строке выведет полный список доступных команд
это самое автодополнение имеет нетривиальный способ изспользования. если вы не помните, какой раздел вам нужен, напишите "root (hd0," (или "root (hd1." и далее по списку) и нажмите tab. будет выведен список разделов заданного диска с указанием файловых систем, UUID и времени последнего изменения.
имя раздела вида "(hd*,*)" можно использовать в начале пути к файлу, например, вот так:
Код:
cat (hd0,6)/home/username/папка/файл
еще один полезный пример
Код:
ls (hd0,3)/
позволяет просмотреть содержимое заданного раздела без переключения root.

создание дополнительных меню загрузки.
в этом разделе мы рассмотрим создание своих собственных загрузочных меню со своей конфигурацией. суть в том, что вместо уже знакомого нам "grub.cfg" можно загрузить другой файл конфигурации. это позволяет создать дополнительное меню, совершенно другое - с другими пунктами, настройками. оформлением. те, кто имел дело с установкой ArchLinux, могли заметить несколько подменю в grub установочного диска. примерно такой метод мы и будем использовать.
итак, создадим наш новый файл конфигурации. писать с нуля мы его, конечно же, не будем, а сотворим на основе имеющегося "grub.cfg". для чего скопируем последний, дав новое имя, например:
Код:
sudo cp /boot/grub/{grub,custom}.cfg
поскольку файл скопируется с правами 444, выставим ему права на запись:
Код:
sudo chmod 744 /boot/grub/custom.cfg
теперь открываем его в любимом текстовом редакторе и начинаем ковырять. если вы в достаточной мере знаете структуру "grub.cfg" и понимаете, какие строки что делают, можно значительно сократить свой файл, вырезав лишнее, и привести его к более удобочитаемому виду. однако же, можно и не трогать руками все подряд, а изменить лишь интересующие параметры, что мы и проделаем.
для начала найдем строку "set default=...." (у меня это 13-я строка). здесь можно задать пункт меню по умолчанию, указав или его номер или точное название. далее отыщем строку "set gfxmode...." (24-я в моем случае). здесь задается разрешение экрана в привычном формате WxH. можно также указать глубину цвета, например "1024x768x32". можно указать несколько вариантов, при этом если первый не сможет быть установлен, будет загружен второй, если и он не сработает - третий и т.д. варианты перечисляются через запятую и без пробелов:
Код:
set gfxmode=1024x768x32,1024x768x24,1024x768
теперь зададим время отображения меню. для этого ищем строку "set timeout", но именно ту, которая идет после "else" (36). здесь и задается задержка в секундах. установите -1 для отключения таймера.
настроим оформление нашего меню. для задания фонового изображения найдем строку с "if background_image....." (45). (здесь подразумевается, что в вашем grub.cfg используется фоновое изображение. если нет - смотрите пример файла в конце этого раздела). после команды background_image прописан путь к файлу картинки. поменяйте его на нужный файл. (обратите внимание, что разрешение картинки должно соответствовать заданному выше разрешению экрана!).
строкой ниже мы можем задать цвета текста. правятся они точно так же, как и в "/etc/grub.d/05_debian_theme" (подробнее о цветах читайте в главе II, раздел "настройка цвета пунктов меню"). еще можно проделать один интересный трюк: уберите строки с "set color_highlight" и "else". теперь настройка будет такой:
color_normal задает цвет/фон текста сверху и снизу (версия grub и комментарии) и текста в консоли
menu_color_normal отвечает за цвет пунктов меню и фон прямоугольника, в котором они находятся
menu_color_higlight задает цвет/фон выделенного пункта меню.
закончив с настройкой, перейдем собственно к пунктам. ниже идут пункты из вашего "grub.cfg". измените их, удалите ненужные и добавьте новые, пересортируйте на свой вкус. ниже будет приведен пример с немного отредактированными тремя пунктами загрузки.
настроив свой файл, сохраните его. теперь нам нужно добавить возможность загрузить его вместо "grub.cfg". для этого в последний нужно будет добавить еще один пункт, что мы сделаем через "/etc/default/40_custom". для смены файла конфигурации в grub2 используется команда "configfile". ей мы и воспользуемся, добавив в "40_custom" запись такого вида:
Код:
menuentry "my very custom menu"{
configfile /boot/grub/custom.cfg
}
если ваш путь к файлу отличается - исправьте его. если вы используете отдельный boot-раздел, путь будет таким: "/grub/custom.cfg". также учтите, что "40_custom" должен заканчиваться пустой строкой!
если вы хотите, чтобы ваше новое меню загружалось вместо стандартного "grub.cfg", установите новый пункт в качестве пункта по умолчанию. также можете установить таймаут для "grub.cfg" в 0 (в "/etc/default/grub"), но перед этим рекомендую протестировать свежеиспеченное меню на работоспособность.
обновите свой "grub.cfg" выполнив
Код:
sudo update-grub
теперь пункт перехода в новое меню появится в обычном. для того чтобы выйти обратно в первое меню, достаточно нажать escape.
вот, в принципе, и вся премудрость. таких файлов можете насоздавать себе хоть десять штук, тут уж зависит от потребностей. ниже я приведу в качестве образца то, что получилось у меня (файл сильно урезан до необходимого минимума):
(Кликните, чтобы показать/скрыть)

MBR - бэкап, восстановление и загрузка через образ.
для тех, кто не знает, поясню: MBR - фрагмент первого сектора жесктого диска, в котором прописан код, запускающий загрузчик. при загрузке с диска оттуда считывается информация о том, как запустить загрузчик. grub2 прописывает свой код в MBR при установке (и это же мы делаем, выполняя "grub-install ... /dev/sda").
на случай повреждения MBR (причины бывают разными) и для возможности быстрого восстановления работоспособности grub2 полезно будет иметь резервную копию MBR жесткого диска. чтобы создать ее, сначала нужно определиться, с какого из жестких дисков производится загрузка (можно посмотреть с помощью "sudo fdisk -l"). после этого скопируем первый сектор (первые 512 байт) диска в файл с помощью команды dd:
Код:
sudo dd if=/dev/sda of=mbr.bin bs=512 count=1
если ваш загрузочный диск - не sda, поменяйте значение на свое. (на самом деле, код загрузчика занимает первые 446 байт, а дальше записана таблица разделов, но для загрузки нашего образа он должен быть не меньше 512 байт).
наш образ готов! данные сохранена в файл "mbr.bin" в вашей домашней директории.
используя полученный образ можно загрузить основной grub2 из-под другого при поврежденном MBR диска. если у вас есть другая установленная linux-система с grub2 на другом жестком диске или загрузочная флэшка с grub2 (создание таковой описано выше) - можете попробовать на практике нижеприведенный совет.
итак, в моем примере я загружаюсь со своей спасительной флэшки с grub2, на которую я предварительно закинул образ MBR своего жесткого диска.
загрузившись в gurb2, выходим в консоль (нажав "c"). указываем в качестве корневого раздела тот жесткий диск, на котором по сценарию попорчен MBR, и с которого мы хотим запустить grub2. можно указать сам диск или любой из его разделов, например так:
Код:
set root=(hd1)
проверим результат командой
Код:
root
если все верно - загружаем наш образ с помощью chainloader. здесь нужно указать полный путь, начиная с раздела, на котором лежит наш файл. флэшка, с которой я загружен именуется (hd0), так что команда будет выглядеть так:
Код:
chainloader (hd0,1)/mbr.bin
если все тихо - даем команду на запуск:
Код:
boot
и наслаждаемся родным grub2.
примечание: в MBR (и, соответственно, в полученном образе) нет четкого указания жесткого диска, поэтому через наш образ загрузится grub2 с того раздела, который был указан в качестве корневого (root) в консоли grub2.
загрузив родную систему, мы можем восстановить ид-под нее MBR диска. но если лишнего grub2 у вас под рукой нет, действовать мы будем с livecd.
грузимся с livecd любой linux-системы (в данном случае поддержка grub2 роли не играет). для восстановления MBR нам нужно будет "раскатать" ранее созданный образ обратно в первый сектор диска. но для начала проверим таблицу разделов, ведь вполне возможно, что grub2 не грузился и из-за нее. для этого выполните
Код:
sudo fdisk -l
если fdisk видит разделы - таблицу разделов трогать не будем, а восстановим только код загрузчика. в этом случае нам нужно перезаписать лишь первые 446 байт. если же "убита" и таблица разделов - все 512. определившись, что именно мы делаем, копируем нужное количество байт из образа в первый сектор диска. в примере ниже таблица разделов в порядке, восстанавливаем только grub2:
Код:
sudo dd if=/mnt/mbr.bin of=/dev/sda bs=446 count=1
если нужно восстановить и таблицу разделов - укажите 512 вместо 446. в качестве значения if пропишите путь к файлу образа, в of - тот диск, загрузочный сектор которого мы восстанавливаем. если все прошло успешно - перезагружаемся, грузимся с починенного диска и радуемся.
еще одна полезная возможность - полученный образ можно использовать для загрузки grub2 через NTLDR (в случае, если grub2 не загружает нормально Windows, и вы хотите сделать NTLDR основным загрузчиком). но об этом как-нибудь позже.

Комментариев нет: