Назад | Перейти на главную страницу

Сервер Ubuntu, таблица разделов gpt, mdadm, сбой загрузки grub

Основные сведения о рабочей системе:

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

Имею 4 диска. На всех дисках проделал следующее, аналогично это как :

Форматировал бут как ext3. Я установил RAID10 на корень и большие разделы. Форматировал корень ext4. Я создал логический том на большом и отформатировал его в ext4.

В результате система работает нормально и нормально загружается.

Подробности проблемы:

Тогда я решил задокументировать процедуру отказа. В качестве первого шага я решил переустановить grub.

# grub-install /dev/sda
warn: This GPT partition label has no BIOS Boot Partition; embedding won't be possible!.
error: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and their use is discouraged..
# grub-install /dev/sdb
warn: This GPT partition label has no BIOS Boot Partition; embedding won't be possible!.
error: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and their use is discouraged..

Таким образом, похоже, что он потерпел неудачу, но также кажется, что он сдался и не внес изменений. Я перезагрузился. Загрузка не удалась. Просто виснет черный экран с мигающим курсором примерно на 4 строчки вниз. Если я загружаюсь, удерживая «Shift», я получаю слово «GRUB» слева от курсора, но не интерактивное приглашение.

На этом этапе я использовал загрузочный ремонтный диск для создания этого отчета: http://paste.ubuntu.com/966531/

Обратите внимание, что в отчете выше говорится, что загрузчик не указывает на правильный сектор для core.img. (sda - это виртуальный компакт-диск; sdb - это загрузочный диск; sdc - зеркало sdb, но загрузка не зеркалируется, есть только отдельный несвязанный раздел, отформатированный в ext3; sdd и sde имеют место для загрузки, но не отформатированы)

Затем я загрузился с компакт-диска сервера Ubuntu, запустил систему восстановления и выполнил следующие команды, которые завершились без ошибок (где sda - виртуальный компакт-диск, а b, c, d, e - диски, которые были a, b, c , d в предыдущих командах grub):

# parted /dev/sdb set 2 bios_grub on
# parted /dev/sdc set 2 bios_grub on
# grub-install /dev/sdb
# grub-install /dev/sdc

На этом этапе я использовал загрузочный ремонтный диск для создания этого отчета: http://paste.ubuntu.com/966561/

Обратите внимание, что в отчете выше проблема с core.img исчезла. Кажется, указывает на правильный сектор.

Теперь, если я попытаюсь загрузиться, я получаю подсказку grub. Если я запускаю "set", я вижу, что корень найден и установлен. Если я запускаю "ls /", я вижу свой корневой каталог из тома raid, включая файл ядра vmlinuz. Если я наберу «ls / vmlinuz», появится сообщение «ошибка: файл не найден». Та же ошибка появляется, если я использую команду "linux", чтобы попытаться загрузить ядро. Если я использую "ls -l /", файл vmlinuz не отображается.

Чрезмерно подробные сведения, если вы хотите подписаться:

Я заметил, что также нет /boot/grub/grub.cfg, поэтому я запустил

# grub-mkconfig -o /boot/grub/grub.cfg

Но проблема остается.

Если я использую инструмент "gptsync", это поведение не меняется.

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

Я также читал эта страница, но в Ubuntu нет команды grub, поэтому я не могу ее точно усвоить. Я мог бы просто установить эту команду, но мне более любопытно узнать, как установщик Ubuntu смог установить ее, а не использовать другую настройку. Использовались ли черные списки?

Вот результат работы parted при загрузке на загрузочный ремонтный диск (где здесь sdb - это первый жесткий диск, sda при загрузке с диска, а «boot» меняется на «bios_grub» во второй ссылке для вставки):

Model: ATA Hitachi HUA72303 (scsi)
Disk /dev/sdb: 3001GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system     Name   Flags
1      17.4kB  2000MB  2000MB  linux-swap(v1)  swap1
2      2000MB  2256MB  256MB   ext3            boot1  boot (this says bios_grub in 2nd link)
3      2256MB  66.3GB  64.0GB                  root1  raid
4      66.3GB  3001GB  2934GB                  data1  raid

Вот несвязанная супер старая виртуальная машина для сравнения (для тех, кто не знаком с загрузочный ремонтный диск): http://paste.ubuntu.com/966799/

Вот последняя паста из проблемной системы после запуска вышеуказанного grub-mkconfig, а также установки «bios_grub» обратно в «boot». http://paste.ubuntu.com/966808/

Сравнивая эти два, это выглядит интересно:

sdb2: __________________________________________________________________________

File system:       
Boot sector type:  Grub2's core.img
Boot sector info: 
Mounting failed:   mount: unknown filesystem type ''

md/bcserver8:0: ________________________________________________________________

File system:       ext4
Boot sector type:  -
Boot sector info: 
Operating System:  Ubuntu 12.04 LTS
Boot files:        /boot/grub/grub.cfg /etc/fstab /boot/grub/core.img

Похоже, у рейда есть загрузочные файлы, а sdb2 не отформатирован. (несмотря на это, система загрузилась до запуска grub-install). С аварийного компакт-диска команда "mount -t ext3 / dev / sdb2 / boot" не работает. Но есть смысл, что это сбивает с толку, поскольку grub явно использует раздел 2 (2 в команде parted, которая устанавливает bios_grub).

Я сделал что-то вроде этого:

# mkfs.ext3 -L boot1 /dev/sdb2
# mv boot boot_on_root
# mkdir boot
# mount /dev/sdb2 boot
# rsync -avHP boot_on_root/ boot/
# parted /dev/sdb set 2 bios_grub on
# parted /dev/sdc set 2 bios_grub on
# grub-install /dev/sdb
# grub-install /dev/sdc

Затем перезагрузился, и у меня снова черный экран, без подсказки. http://paste.ubuntu.com/966848/

Итак, на данный момент я предполагаю, что когда установлен bios_grub, grub устанавливается не в MBR, а не в файловую систему ext3 на ext3, а на сам раздел, как если бы это был EFI ... что, очевидно, испортит вверх по файловой системе ext3. И из моего краткого чтения об EFI, это звучало так, как будто EFI предполагает, что первый раздел является загрузочным, но в моем случае первый - это подкачка, а также он должен быть FAT, а не чем-то несмонтируемым ... так что, поскольку это мало / нет смысл, я все еще полностью потерялся без подсказки. [РЕДАКТИРОВАТЬ: теперь у меня есть подсказка ... пропустите немного для обновления]

И теперь, когда я нажимаю на ремонт в загрузочный ремонтный диск, он спрашивает о другом. В прошлый раз ошибка была скрыта под окном, и мне пришлось перетащить другую, чтобы увидеть ее. На этот раз главное окно исчезло, а в новом окне написано:

GPT detected.       You may want to retry after creating a
BIOS-Boot partition (>1Mo, flag). Do you want to continue?

Я нажал кнопку «Да», и он сказал, что исправлен успешно, и создал еще одну пасту: http://paste.ubuntu.com/966862/

Но у меня все еще черный экран с мигающим курсором.

Теперь моя теория заключается в том, что загрузка была перезаписана нежирным не-EFI, а это просто код grub, который в противном случае раньше находился бы в секторах 0-63. К счастью, я наткнулся на очень четкое заявление на этой странице, которое, вероятно, завершило мое понимание того, что все это означает. А затем, когда я это обнаружил, Джереми опубликовал ответ, который, если он верен, подтверждает, что это отсутствующая ключевая концепция. http://blog.psych0tik.net/2011/08/grub-embedding-blocklists-and-bios_grub-partitions/

Вопросы:

Что происходит? Почему grub не загружается? Почему написано «файл не найден»?

Почему grub не хочет устанавливать без этого параметра, который я установил с помощью parted (который не был установлен установщиком Ubuntu)? Я думал, что все, что мне нужно для установки, это отдельный / boot, которого нет ни в LVM, ни в программном RAID, так как мой корень находится в RAID, а таблица разделов - GPT.

Как установщик компакт-диска Ubuntu устанавливает его без этой проблемы и без настройки bios_grub?

Я бы также подумал об использовании EFI. Если это хорошая идея и есть стандартный способ ее реализации, я всегда готов учиться новому.

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

Решение - использовать раздел bios_grub, который не совпадает с разделом / boot.

По умолчанию раздел bios_grub имеет размер 1 МБ, и он должен быть помечен как bios_grub. Мой - это первый раздел на моем диске. Если ваш раздел 2 на самом деле / ​​boot, как предполагает parted, это было бы неправильно, и вам следует создать еще один раздел размером 1 МБ.

С GPT и GRUB2 минимальная файловая система имеет три раздела: bios_grub, root, swap. (не совсем уверен, что требуется своп)

Почему grub не загружается после простого запуска "grub-install"?

Неизвестно ... Можно подумать, что он ничего не изменит, если четко скажет, что не может встраивать, поэтому он не может работать.

Почему написано «файл не найден»?

/ vmlinuz - это символическая ссылка, которая использует загрузочный раздел, а загрузочный раздел поврежден. Код bios_grub был написан поверх его структуры ext3. Это, вероятно, означало, что / boot не был смонтирован, а файлы grub, которые были там, действительно находились в корневой системе, которая не содержала ядро.

Почему grub не хочет устанавливать без этого параметра, который я установил с помощью parted

В таблице разделов GPT нет места для загрузчика, в отличие от MBR. Поэтому необходимо создать специальный раздел для хранения загрузочного кода. Перед запуском «grub-install» укажите этот раздел с помощью команды:

    parted /dev/sda set 1 bios_grub on

Я думал, что все, что мне нужно, это отдельный / boot. Как установщик компакт-диска Ubuntu устанавливает его без настройки bios_grub?

Это требование, кажется, все, что нужно для установщика Ubuntu, но оно создает нестандартную систему, которую легко сломать.

Когда GRUB сообщает: "Эта метка раздела GPT не имеет Загрузочный раздел BIOS", это означает раздел bios_grub, а не / boot.