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


9

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

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

У меня 4 диска. На всех дисках я сделал следующее, похожее на это howto :

  • создал раздел подкачки 2GB
  • создал 256 ГБ / загрузочный раздел
  • создал 64 ГБ раздел RAID10 (для root)
  • создал большой раздел RAID10, занимающий оставшееся пространство

Я отформатировал загрузку как 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» слева от курсора, но без интерактивного приглашения.

На этом этапе я использовал boot-repair-disk для создания этого отчета: 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

На этом этапе я использовал boot-repair-disk для создания этого отчета: http://paste.ubuntu.com/966561/

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

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

Слишком подробные подробности, если вы хотите следовать:

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

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

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

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

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

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

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

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

Вот несвязанная супер старая виртуальная машина для сравнения (для тех, кто не знаком с boot-repair-disk ): 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 предполагает, что первый раздел является загрузочным, но в моем случае первым является swap, а также он должен быть FAT, а не чем-то не монтируемым ... так как это делает мало / нет смысл, я все еще полностью потерян без понятия. [РЕДАКТИРОВАТЬ: теперь у меня есть подсказка ... пропустить немного для обновления]

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

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 вещью, которая является просто грубым кодом, который в противном случае был бы в секторах 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. Если это хорошая идея и существует стандартный способ ее настройки, я всегда готов изучать новые вещи.

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


Не могли бы вы добавить вывод печати из parted?
Джереми

Вы можете видеть это в 2 ссылках вставки в строке 993, но для каждого запроса я добавлю это к своему вопросу.
Питер

Ответы:


8

Решение состоит в том, чтобы использовать раздел 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.


Спасибо. Это на самом деле очень близко к тому, над чем я сейчас работаю. Посмотрите мое "Я все еще полностью потерян без понятия". раздел выше. Теперь моя теория состоит в том, что загрузка была перезаписана не жирной не-EFI вещью, которая является просто грубым кодом, который в противном случае был бы в секторах 0-63 прежде. Я работаю над экспериментом, а затем дам вам знать, как он идет.
Питер

Вы используете Ubuntu? Есть ли способ, которым установщик Ubuntu может правильно установить с помощью раздела bios_grub?
Питер

@Peter Я использую Ubuntu, и если вы выполняете разделение с помощью руководств, установщик должен правильно его настроить. Я знаю, что он сделал для меня с установщиком 11.10.
Джереми

Большое спасибо. Это ответ. Далее я попробую с более сложными настройками (raid и lvm при загрузке), а затем я отредактирую ваш ответ с деталями.
Питер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.