GRUB путает ядра / initramfs установки Ubuntu и Arch Linux

9

У меня есть машина, которая использовалась для двойной загрузки Ubuntu (16.04 в настоящее время) и Windows 7 с GRUB Ubuntu в качестве загрузчика.

Теперь я просто добавил Arch Linux в качестве третьей ОС, следуя официальным инструкциям по установке. Я не установил GRUB из Arch, потому что хотел использовать тот, который контролируется Ubuntu. Инструкции содержали команду, mkinitcpio -p linuxкоторая, вероятно, генерировала некоторые загрузочные файлы, которые я запустил, как описано.

Теперь, когда я пытаюсь загрузить Ubuntu из GRUB через запись по умолчанию, я получаю эту неприятную ошибку (извините за фотографию на экране):

сообщение об ошибке

Как uname -aпоказывает вывод , он пытается загрузить ядро ​​Arch, но /dev/sda6это корневой раздел Ubuntu.

Я должен перейти Advanced options for Ubuntuи выбрать одну из Ubuntu, with Linux 4.4.0-*записей, чтобы иметь возможность загрузить Ubuntu, но я не смог найти запись, которая бы правильно загружала Arch.

Запуск sudo update-grubиз Ubuntu ( « update-grubзаглушка для запуска grub-mkconfig -o /boot/grub/grub.cfgдля создания файла конфигурации grub2.» ) Ничего не меняет. grub-customizerИнструмент был также бесполезен в фиксации этого до сих пор.

Что вызывает эту путаницу с GRUB и как я могу это исправить, чтобы каждая версия Linux загружалась с правильным ядром и с правильного раздела?

Похоже, я тупо установил Arch с Ubuntu / boot, поэтому он, вероятно, поместил туда свои загрузочные файлы.

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


Обновления (спасибо @terdon за поддержку в чате Ask Ubuntu):

Вот мой /boot/grub/grub.cfg.

Кажется, что все записи Linux указывают на мой раздел / dev / sda6, который является корнем Ubuntu:

$ grep ' linux /' /boot/grub/grub.cfg
    linux /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro
        linux /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro
        linux /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro
        linux /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro init=/sbin/upstart
        linux /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro recovery nomodeset
        linux /vmlinuz-4.4.0-21-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro
        linux /vmlinuz-4.4.0-21-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro init=/sbin/upstart
        linux /vmlinuz-4.4.0-21-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro recovery nomodeset
        linux /vmlinuz-4.2.0-35-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro
        linux /vmlinuz-4.2.0-35-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro init=/sbin/upstart
        linux /vmlinuz-4.2.0-35-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro recovery nomodeset

Я попытался обновить конфигурацию GRUB из Ubuntu:

$ sudo grub-mkconfig -o /boot/grub/grub.cfg 
Generating grub configuration file ...
dpkg: warning: version 'linux' has bad syntax: version number does not start with a digit
Found linux image: /boot/vmlinuz-linux
Found initrd image: /boot/initramfs-linux.img
Found linux image: /boot/vmlinuz-4.4.0-21-generic
Found initrd image: /boot/initrd.img-4.4.0-21-generic
Found linux image: /boot/vmlinuz-4.2.0-35-generic
Found initrd image: /boot/initrd.img-4.2.0-35-generic
Found memtest86+ image: /memtest86+.elf
Found memtest86+ image: /memtest86+.bin
Found Windows 7 (loader) on /dev/sda1
Found Arch on /dev/sda8
done

Я попытался переустановить GRUB в MBR из Ubuntu:

$ sudo grub-install /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.

$ sudo grub-install --recheck /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.

Кстати, это установленные пакеты ядра Ubuntu, я попробовал dpkg-reconfigureвсе из них, но без какого-либо влияния на проблему:

$ dpkg -l linux-image* | grep ^ii
ii  linux-image-4.2.0-35-generic       4.2.0-35.40  amd64        Linux kernel image for version 4.2.0 on 64 bit x86 SMP
ii  linux-image-4.4.0-21-generic       4.4.0-21.37  amd64        Linux kernel image for version 4.4.0 on 64 bit x86 SMP
ii  linux-image-extra-4.2.0-35-generic 4.2.0-35.40  amd64        Linux kernel extra modules for version 4.2.0 on 64 bit x86 SMP
ii  linux-image-extra-4.4.0-21-generic 4.4.0-21.37  amd64        Linux kernel extra modules for version 4.4.0 on 64 bit x86 SMP

Я также пытался восстановить Ubuntu initramfs:

$ sudo update-initramfs -u -k all
update-initramfs: Generating /boot/initrd.img-4.4.0-21-generic
update-initramfs: Generating /boot/initrd.img-4.2.0-35-generic

Разметка моего раздела:

Проверено из системы Ubuntu. Этикетки должны объясняться.

$ lsblk -f /dev/sda
NAME    FSTYPE LABEL       UUID                                 MOUNTPOINT
sda                                                             
├─sda1  ntfs   win7-boot   90DCF3A5DCF3842E                     /win/boot
├─sda2  ntfs   windows7    482C7A572C7A3FCC                     /win/c
├─sda3  ext4   grub-boot   6dbb8633-dadd-4b5e-8d85-b0895fde9dfb /boot
├─sda5  ext4   images      81dc42c4-a161-4ccd-b704-6e5c09298943 /images
├─sda6  ext4   ubuntu-1604 eee18451-b607-4875-8a88-c9cb6c6544c8 /
├─sda7  ext4   ubuntu-home 485b3ef1-7216-4053-b25c-f656d529e8e6 /home
├─sda8  ext4   arch-root   8d281a0c-969c-44cf-ba6a-1d3c7b4be7ec 
├─sda9  ext4   arch-home   32522902-a53d-44c8-90f2-6bbf14c40f1f 
└─sda10 swap   linux-swap  8b05bd9b-bc42-46f6-8c18-50711a3c48b9 [SWAP]

Моя структура меню GRUB:

GRUB главная страница

Дополнительные параметры для Ubuntu:
GRUB расширенные возможности для Ubuntu

Дополнительные параметры для Arch:
GRUB расширенные опции для Arch


Мой /bootкаталог:

$ ls -la /boot
total 118480
drwxr-xr-x  4 root root     4096 Apr 24 20:50 .
drwxr-xr-x 28 root root     4096 Apr 24 19:44 ..
-rw-r--r--  1 root root  1313029 Mär 16 01:45 abi-4.2.0-35-generic
-rw-r--r--  1 root root  1239577 Apr 19 00:21 abi-4.4.0-21-generic
-rw-r--r--  1 root root   184888 Mär 16 01:45 config-4.2.0-35-generic
-rw-r--r--  1 root root   189412 Apr 19 00:21 config-4.4.0-21-generic
drwxr-xr-x  6 root root     4096 Apr 26 19:58 grub
-rw-r--r--  1 root root 18598360 Apr 24 20:59 initramfs-linux-fallback.img
-rw-r--r--  1 root root  3516429 Apr 24 20:59 initramfs-linux.img
-rw-r--r--  1 root root 33642388 Apr 24 18:31 initrd.img-4.2.0-35-generic
-rw-r--r--  1 root root 36143341 Apr 24 19:51 initrd.img-4.4.0-21-generic
drwx------  2 root root    16384 Okt 28 17:43 lost+found
-rw-r--r--  1 root root   182704 Jan 28 13:44 memtest86+.bin
-rw-r--r--  1 root root   184380 Jan 28 13:44 memtest86+.elf
-rw-r--r--  1 root root   184840 Jan 28 13:44 memtest86+_multiboot.bin
-rw-------  1 root root  3745312 Mär 16 01:45 System.map-4.2.0-35-generic
-rw-------  1 root root  3853719 Apr 19 00:21 System.map-4.4.0-21-generic
-rw-------  1 root root  6829104 Mär 16 01:45 vmlinuz-4.2.0-35-generic
-rw-------  1 root root  7013968 Apr 19 00:21 vmlinuz-4.4.0-21-generic
-rw-r--r--  1 root root  4435552 Apr 14 19:20 vmlinuz-linux

Ядра 4.4.0 и 4.2.0 должны быть Ubuntu, Arch должен иметь ядро ​​4.5.0. А как узнать какой файл без версии ядра в названии к какому принадлежит?


Мой корневой каталог Ubuntu (кроме каталогов):

$ ls -la / | grep ^[^d]
total 124
lrwxrwxrwx   1 root      root         32 Apr 24 19:44 initrd.img -> boot/initrd.img-4.4.0-21-generic
lrwxrwxrwx   1 root      root         32 Apr  5 17:45 initrd.img.old -> boot/initrd.img-4.2.0-35-generic
lrwxrwxrwx   1 root      root         29 Apr 24 19:44 vmlinuz -> boot/vmlinuz-4.4.0-21-generic
lrwxrwxrwx   1 root      root         29 Apr  5 17:45 vmlinuz.old -> boot/vmlinuz-4.2.0-35-generic

Мой корневой каталог Arch не содержит никаких файлов или ссылок.

Byte Commander
источник
У меня была такая же проблема с тройной загрузкой Ubuntu, Windows и Arch Linux. вам нужно исправить grub вручную, при необходимости загрузиться в arch linux, а затем пересобрать grub, возможно, вам придется установить os-prober. затем запустите их sudo mkinitcpio -p linuxпотом, sudo grub-mkconfig -o /boot/grub/grub.cfgнаконец,sudo grub-install /dev/sda
Эдвард Торвальдс
Когда я устанавливал различные дистрибутивы Linux на свой ноутбук (при замене старого, оставляя окна нетронутыми), у меня возникла похожая проблема. Я просто удалил соответствующую папку старой ОС из efi и сделал grub-update. Но в моем случае, 1. Это была система UEFI 2. Я не держал несколько ОС Linux.
Зарегистрированный пользователь
Во время загрузки вы можете динамически изменить ядро ​​и initrd для загрузки в Ubuntu? Если вы сделали это, то в чем ошибка?
ШВ
На экране вы вывесили содержит сообщение об ошибке: Root device mounted successfully, but /sbin/init does not exists. Вы исследовали это? Является ли на initсамом деле не хватает? Если это так, вы должны обязательно установить его, если он присутствует, есть идеи, почему его нельзя найти?
MariusMatutiae

Ответы:

5

В конце концов я решил это, сбросив раздел Arch и загрузочные файлы в каталоге моего Ubuntu /bootс орбиты. Ubuntu снова в порядке, все остальные записи GRUB снова работают.

Вот список того, что я сделал:

  • Удалить initramfsфайлы Arch :

    sudo rm /boot/initramfs-linux*
    
  • Удалить vmlinuzфайл Arch :

    sudo rm vmlinuz-linux
    
  • Отформатируйте раздел Arch ( /dev/sda8) с помощью GParted

  • Обновите конфигурацию GRUB:

    sudo update-grub
    
  • Перезагрузитесь и наслаждайтесь!

Byte Commander
источник
Я думаю , что первый кодированная строка должна содержать initramfs-linuxне...ranfs...
Анвар
1
@Anwar Конечно, спасибо за внимание. Я исправил опечатку.
Byte Commander
1

Исправление grub.cfg вручную (не рекомендуется)

Глядя на ваш grub.cfg

запись в Ubuntu не работает (и некоторые из следующих тоже)

menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-eee18451-b607-4875-8a88-c9cb6c6544c8' {
    recordfail
    load_video
    gfxmode $linux_gfx_mode
    insmod gzio
    if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
    insmod part_msdos
    insmod ext2
    set root='hd0,msdos3'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos3 --hint-efi=hd0,msdos3 --hint-baremetal=ahci0,msdos3  6dbb8633-dadd-4b5e-8d85-b0895fde9dfb
    else
      search --no-floppy --fs-uuid --set=root 6dbb8633-dadd-4b5e-8d85-b0895fde9dfb
    fi
    linux   /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro  
    initrd  /initramfs-linux.img
}

Последние две строки - ваша команда grub для загрузки ядра и initrd, и в настоящее время они ищут ядро ​​ARCH и initiramfs. Кроме того, он ищет их /в разделе, указанном в, uuid=eee18451-b607-4875-8a88-c9cb6c6544c8который может содержать или не содержать нужные файлы Ubuntu.

Вы можете это исправить:

sudo blkid

чтобы получить UUID вашего корневого раздела Ubuntu.

Затем замените последние две строки символьной ссылкой на ваше последнее ядро ​​и образы initrd (так как Ubuntu ожидает от этого)

linux   /vmlinuz root=UUID=<correct-uuid-ubuntu-partition> ro  
initrd  /initrd.img

Если это не исправит это сразу, может потребоваться другое исправление. Вы можете найти их, "скопировав" одну из протестированных и рабочих записей, и я рекомендую вам использовать наиболее ванильную (например, не использовать upstart или другой параметр ядра, такой как передаваемый nomodeset).

Это должен быть хороший кандидат:

menuentry 'Ubuntu, with Linux 4.4.0-21-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-21-generic-advanced-eee18451-b607-4875-8a88-c9cb6c6544c8'

Запись Arch аналогичным образом нарушена, поскольку она, вероятно, ищет Arch-initramfs и ядро ​​в корневом разделе Ubuntu. Расположение по умолчанию находится в / boot. Откорректируйте последние две строки записи Arch, исправив местоположение и проверив, что корневой раздел uuid содержит тот, в котором находится корень Arch.

(Несколько) слово (а) предупреждения:

В общем, пользователям Ubuntu НЕ рекомендуется возиться с grub.cfgруками. Определенно сделайте копию этого и будьте осторожны в его редактировании. Будьте готовы к тому, что ваша система не загрузится (но вы сможете воскресить ее, используя процедуру загрузки, описанную в моем предыдущем ответе).

Кроме того, хотя в этот раз это может решить вашу проблему, в следующий раз вы можете снова укусить вас, когда вам снова придется заполнить меню grub. По какой-то причине проверка ОС grub в Ubuntu смущает присутствие ядра Arch в / boot. Я полагаю, что такая утилита, как boot-repair, сможет правильно сделать все ваши дистрибутивы загрузочными, но если я правильно помню, она не сработала для вас.

Одно постоянное исправление может заключаться в установке ядра архива и образов в другой каталог, чем каталог по умолчанию / boot. Это неудобно, и вы должны проконсультироваться с grub-записью Arch wiki о том, как это сделать правильно.

СТАРЫЙ ОТВЕТ (рекомендуется, если вы планируете переходить на Arch в долгосрочной перспективе). Вот что я бы сделал, и каким-то образом сделал несколько месяцев назад.

Перейдите на страницу arch wiki grub и прочитайте соответствующий раздел для вашей таблицы разделов (вы, вероятно, UEFI, так что читайте о ESP и так далее).

Загрузка в Arch вручную

Это очень полезный опыт, который я рекомендую попробовать. Предполагая, что ваше ядро ​​Arch Linux находится где-то на вашем диске, нажмите cна приглашение grub и введите ls, чтобы увидеть список устройств и разделов, похожих на (hd0,msdos1),(hd1,gpt1),.... Вы можете просмотреть каждое из них.

Вам нужно выяснить три вещи:

  • Где находится ваш /корневой раздел Arch
  • Где твое ядро ​​Arch vmlinuz
  • Где твоя арка intiramfs-linux.img

получив эти три, вы запустите три команды в grub> prompt что-то похожее на это.

grub> set root=(hd0,1)
grub> linux /vmlinuz root=/dev/sda1
grub> initrd /intiramfs-linux.img
grub> boot

Обратите внимание, что личинка может найти, например,

grub> find /sbin/init

(один grub не может найти автоматически и вызывает панику ядра;))

Все это я узнал здесь , источник, который я очень рекомендую. Если вам удастся, перейдите к исправлению grub! В противном случае...

Загрузочная арка с живого ключа! Получите живую среду Arch и следуйте вики-установке chrootпо Arch точно так же, как в первый раз.

Исправление личинки

Внутри Arch установите соответствующие пакеты grub и, в частности, os-proberразрешите grub-installобнаруживать вашу другую систему. Внимательно следуйте инструкции по установке, и вы сможете (как минимум) загрузить как arch, так и ubuntu из меню grub. Установка команд в конечном итоге будет выглядеть следующим образом.

** Предупреждение ** Не запускайте эти команды, они приведены в качестве примера, вам нужно выработать те, которые подходят для вашей системы

# grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub --recheck
# grub-mkconfig -o /boot/grub/grub.cfg

** Если все остальное не удается **

К сожалению, это настолько специфично, насколько это возможно, учитывая ограниченное количество информации, и SE на самом деле не является форумом для таких вопросов, поэтому мой «общий» ответ относится к полезным ресурсам.

Если вы не можете понять это, возможно, загляните на форумы Arch, и, если вы приложили все усилия и прочитали документы заранее, вы можете найти помощь.

Выполнение всего этого через Arch стало для меня фундаментальным опытом обучения.

Три Диаг
источник
1
Спасибо за ваш ответ. Во-первых, это система BIOS с разделенным диском MBR. Во-вторых, я хочу использовать пакет grub и конфигурацию из Ubuntu, переустановка GRUB из Arch - это не то, что я планирую. Я также сомневаюсь, что это внесет какие-либо изменения ... И я могу загрузиться в Ubuntu через запись GRUB где-нибудь в дополнительных параметрах. Проблема в том, что GRUB почему-то не в состоянии определить, какое ядро ​​или начальный виртуальный диск или что-то принадлежит какой системе, в каком разделе.
Byte Commander
По сути, применяются те же шаги. grub-install и grub-mkconfig (что делает вас новыми файлами grub.cfg) - это команда grub, которая также доступна в Ubuntu. Проверьте, доступен ли os-prober или что-то подобное (это позволяет mkconfig находить другие файловые системы). Это исправляет это, предполагая, что образы ядра находятся в правильном месте, перечитывая Ваш пост, я не совсем уверен, что это так. Проверьте ваш / boot раздел, чтобы убедиться, что все ядра и .img есть. Вы могли перезаписать свой linux initrd.img с помощью initramfs в arch. Заходите на форумы по убунту или аскубунту.
Три Diag
Как я уже писал, я запустил grub-mkconfig безрезультатно, но я проверю доступные образы в / boot, когда вернусь домой. И есть несколько скриптов os-prober.
Byte Commander
Извините, пропустил это. Тогда вы, вероятно, переписали свое ядро ​​Ubuntu и initrd на arch. Вы можете вставить их на место, запустив последовательность обновления / обновления из резервного ядра Ubuntu (я думаю)
Three Diag
Ядра Ubuntu должны быть в порядке, так как я могу загрузить их все из меню «Дополнительные параметры для Ubuntu». Если что-то там не так, это может быть только символическая ссылка на ядро ​​по умолчанию ... Собираюсь проверить это сегодня вечером.
Byte Commander
0

Мое решение проще. Я использую терминал и делаю следующее:

sudo rm /boot/grub/grub.cfg
sudo update-grub

Если у вас возникли дополнительные проблемы, просто используйте boot-repairбесплатную загрузку, достаточно маленькую для записи на CD-диск.

BAD-Boop
источник
ОП уже запущен update-grub. Ремонт ботинок вряд ли поможет с этой конкретной проблемой.
Тердон
grub и некоторые процессы восстановления или обновления загрузки предполагают, что содержимое /boot/grub/grub.cfg является правильным и корректным. Но внося изменения, например, переформатируя раздел, вы получаете новый UUID, который помещает вас в grub-rescue> Чтобы справиться с этим, просто сделайте это: sudo rm /boot/grub/grub.cfg; sudo update-grub. Все записи в grub.cfg будут новыми и актуальными.
BAD-Boop
Да, но опять же, ОП уже сделал это, и это не помогло. Я понимаю, что вопрос большой, и его легко пропустить, но sudo grub-mkconfig -o /boot/grub/grub.cfgон прямо здесь. update-grubэто очень простой скрипт , который работает grub-mkconfig -o /boot/grub/grub.cfg . Вы можете увидеть это с cat /usr/sbin/update-grub.
Тердон