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

Я також намагався відновити initramfs Ubuntu:

$ 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

Корінний каталог My Arch не містить файлів і посилань.


У мене була така ж проблема з потрійним завантаженням 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. Але в моєму випадку 1. Це була система UEFI 2. Я не зберігав кілька ОС Linux.
Зареєстрований користувач

Під час завантаження ви можете динамічно змінювати ядро ​​та initrd для завантаження в Ubuntu? Якщо ви це зробили, то яка помилка виникла?
SHW

На екрані ви вивісили містить повідомлення про помилку: Root device mounted successfully, but /sbin/init does not exists. Ви це досліджували? Невже initне вистачає? Якщо так, то обов'язково слід встановити його, якщо він замість цього є, будь-яка ідея, чому його не можна знайти?
MariusMatutiae

Відповіді:


5

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

Ось список того, що я зробив:

  • Видалення initramfsфайлів Arch :

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

    sudo rm vmlinuz-linux
    
  • Відформатуйте розділ Arch ( /dev/sda8) за допомогою GParted

  • Оновіть конфігурацію GRUB:

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


Я думаю , що перший кодированная рядок повинен містити initramfs-linuxНЕ...ranfs...
Анвар

1
@Anwar Звичайно, дякую за увагу. Я виправив друкарську помилку.
Байт-командир

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 ядро ​​та ініціафи. Крім того, він шукає їх під /розділом, ідентифікованим за uuid=eee18451-b607-4875-8a88-c9cb6c6544c8яким можуть бути або не розміщуватися призначені файли Ubuntu.

Ви можете виправити це:

sudo blkid

щоб отримати uuid кореневого розділу ubuntu.

Потім замініть останні два рядки на посилання simlink на останнє зображення ядра та initrd (оскільки саме так очікує ubuntu)

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

Якщо це не виправити це відразу, може знадобитися інша корекція. Ви можете дізнатися їх, скопіювавши один із тестованих та працюючих записів, і я рекомендую вам використовувати самий ванільний (наприклад, не передано початковий або інший параметр ядра, такий як нонодесет).

Це має бути хорошим кандидатом:

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 під ubuntu плутається через наявність ядра Arch під / boot. Я б здогадався, що така утиліта, як відновлення завантаження, повинна вміти правильно робити всі ваші дистрибутивні програми, але якщо я правильно пам’ятаю, вона не працювала для вас.

Одне постійне виправлення може полягати у встановленні ядра арки та зображень у іншому каталозі, ніж типовий / завантажувальний. Це чудово, і вам слід ознайомитись із записом про те, як це зробити належним чином у вікі Arch Arch.

СТАРИЙ ВІДПОВІДЬ (рекомендується, якщо ви плануєте перейти на Arch на тривалий термін) Ось що я би зробив, і якось зробив кілька місяців тому.

Перейдіть на сторінку вікі для арки wiki та прочитайте відповідний розділ для вашої таблиці розділів (ви, швидше за все, UEFI, тому читайте про ESP тощо).

Завантаження в Arch вручну

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

Вам потрібно з’ясувати три речі:

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

щойно володіючи цими трьома, ви запустите три команди в grub> підкажіть щось подібне до цього.

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

Зауважте, що грі можна знайти, наприклад

grub> find /sbin/init

(одна груба не може знайти автоматично і викликає паніку з ядром;))

Про все це я дізнався тут , джерело, яке я дуже рекомендую. Якщо вам вдасться керувати, перейдіть до виправлення груба! Інакше ...

Арка завантаження з живого ключа! Отримайте пряме середовище Arch та дотримуючись вікі встановлення chrootна Arch приблизно так само, як ви робили вперше.

Кріплення грязі

Зсередини Arch встановіть відповідні пакети grub, зокрема, os-proberщоб дозволити grub-installвиявити вашу іншу систему. Дотримуйтесь уважно інструкції по встановленню там, і ви зможете (принаймні) завантажувати і арку, і 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 якось, здається, не може визначити, яке ядро ​​чи початковий ramdisk чи що належить до якої системи, на якому розділі.
Байт командир

По суті, застосовуються ті ж дії. grub-install та grub-mkconfig (що створює нові файли grub.cfg) - це команда grub, яка також доступна під ubuntu. Перевірте, чи доступний також os-prober чи схожа річ (це дозволяє mkconfig знаходити інші файлові системи). Це виправляє, припускаючи, що зображення ядра знаходяться в потрібному місці, перечитуючи ваш пост. Я не зовсім впевнений, що це так. Перевірте свій / завантажувальний розділ, щоб переконатися, що всі ядра та .img є там. Можливо, ви перезаписали ваш linux initrd.img з initramfs арки. Натисніть на форуми ubuntu або askubuntu.
Три Діаг

Як я писав, я запустив grub-mkconfig вже безрезультатно, але я перевірю наявні зображення в / boot, коли я повернуся додому. І є кілька сценаріїв ос-пробер.
Байт-командир

Вибачте, пропустив це. Тоді ви, ймовірно, перезаписали ваше ядро ​​ubuntu та initrd арками. Ви можете поставити їх на місце, запустивши послідовність оновлення / оновлення з резервного ядра ubuntu (я думаю)
Three Diag

Ядра Ubuntu повинні бути прекрасними, оскільки я можу завантажувати їх усі з меню "Додаткові параметри для Ubuntu". Якщо там щось не так, це може бути лише символьне посилання на ядро ​​за замовчуванням ... Йду перевірити це сьогодні ввечері.
Байт-командир

0

Моє рішення простіше. Я використовую термінал і виконую наступні дії:

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

Якщо у вас виникли подальші проблеми, просто використовуйте boot-repair, що є безкоштовним завантаженням, досить невеликим, щоб записати на компакт-диск.


ОП вже запущено update-grub. Ремонт завантаження навряд чи допоможе в цьому конкретному питанні.
тердон

grub та деякі процеси відновлення чи оновлення завантаження припускають, що те, що є в /boot/grub/grub.cfg, є ctrrent і правильним. Але внесіть зміни, як-от переформатування розділів, ви отримаєте новий 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.
тердон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.