Как я могу узнать, с какого раздела я загрузился?

12

У меня есть машина с несколькими загрузочными разделами. У меня Ubuntu 14.04 на одном разделе, Ubuntu 15.04 на втором и Ubuntu 16.04 на третьем. Есть ли способ узнать из командной строки, с какого раздела я загрузился, чтобы узнать, на каком разделе используется тот, /boot/grub/grub.cfgкоторый использовался для процесса загрузки? У меня есть /boot/grub/grub.cfg на каждом из трех разделов.

Кевин Уилсон
источник
3
Вы не можете сделать это с абсолютной общностью и надежностью. Как вы знаете, /boot/grub/grub.cfgфайл, использованный для загрузки, мог быть удален, этот раздел мог быть удален из таблицы разделов, а этот диск физически удален из системы.
Федерико Полони

Ответы:

10

После того, как GRUB передал загрузку ядру, ядро ​​понятия не имеет, с чего оно началось, и /bootможет не быть тем, которое использовал GRUB. Вы можете проверить время доступа boot/grub/grub.cfgв каждом из разделов, чтобы увидеть, к какому из них последний раз обращались. Это может сказать вам, какой конфигурационный файл раздела GRUB использовал.

stat -c %x /boot/grub/grub.cfg

Если время доступа не обновляется, вам придется искать различия в параметрах ядра, используемых различными файлами конфигурации GRUB. Если вы можете изменить их, например, добавить foo=1, foo=2и т.д. , чтобы GRUB_CMDLINE_LINUXв каждом из них, запускать sudo update-grub2и перезагрузки, то вы можете проверить , /proc/cmdlineчтобы увидеть , какие из этих значений были использованы.

Мур
источник
интересный! Означает ли это, что мое решение также имеет лучшую точность, чем у Равексины и Кату?
Tatsu
@tatsu IMO все остальные ответы неверны - Ravexina определяет местонахождение раздела, где /bootон находится, но это может быть не то, что использовал grub, а вы и Кату обнаруживает, что раздел, на котором смонтирован раздел /, смонтирован, но, как заметил Ravexina, это, вероятно, имеет еще меньше связи
Muru
1
да, но как размонтирование может сделать что-то кроме сбоя в разделе, на котором вы смонтированы: диски предоставляют такую ​​информацию, как устройство, смонтированный адрес, любую информацию идентификатора, которая вам может понадобиться, относительно того, который вы только что пытались размонтировать. Я первый, кто признал, что мое решение безобразно, но оно имело 100% успех, верно?
Tatsu
1
успех @tatsu для чего? Нахождение раздела смонтировано /, наверняка. Нахождение конфигурации GRUB какого раздела использовалось при загрузке? Я не понимаю, как это связано.
Муру
4
Действительно ли grub устанавливает эту временную метку доступа, учитывая, что она является собственной DOS и не связана соглашениями о драйверах файловой системы linux?
rackandboneman
4

Как вы знаете, файл, который вы ищете, находится в /bootкаталоге вашей работающей системы. либо /bootэто отдельный раздел, либо это не так; Если у вас /bootотдельный раздел, вы должны искать это:

$ lsblk -r | grep '/boot'
sda2 8:1 0 400M 0 part /boot

Означает, grub.cfgчто использованный находится в sda2.

В противном случае вы должны искать root:

$ lsblk -r | grep '/$'
sda1 8:1 0 121.2G 0 part /

на этот раз он находится в sda1.

Или даже для удовольствия мы можем проверить параметры времени загрузки:

$ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-3.16.0-4-686-pae root=UUID=938495-1fe2-3302 ro quiet

затем используйте, UUIDчтобы узнать, какой раздел является вашим корнем.

$ sudo blkid | grep 938495-1fe2-3302
/dev/sda1: UUID="938495-1fe2-3302"

Что значит от sda1.

Вы также можете проверить эти параметры загрузки, чтобы увидеть, какой из ваших grub.cfgфайлов содержит их, это работает только тогда, когда ваши параметры загрузки grub.cfgотличаются друг от друга.

Ravexina
источник
2
Был бы более простой способ (не требующий прав суперпользователя) найти узел устройства за UUID файловой системы readlink -f /dev/disk/by-uuid/<UUID>.
Дэвид Фёрстер
3

Чтобы отобразить устройство, содержащее текущую смонтированную корневую файловую систему:

awk '$2=="/"{print $1}' /proc/mounts

Чтобы отобразить текущую версию релиза Ubuntu:

lsb_release -rs
Дэвид Фёрстер
источник
это действительно имеет большой смысл в отношении вопроса и кажется наиболее подходящим ответом на данный момент. Бьюсь об заклад, учитывая, что на его установке нет двух дистрибутивов с тем же номером версии, который он будет использовать lsb_release -rsкаждый раз ПОЦЕЛУЙ
Tatsu
К сожалению, это не работает. Я проверил вашу команду на моей машине с несколькими ОС, только в моей «master`-OS» установлен grub в MBR, в других ОС Grub установлен в PBR, команда, похоже, показывает местоположение, где в ОС установлен Grub, но не показывает покажите из какой ОС Grub загружает конфигурационный файл
mook765
@ mook765: Мой ответ не имеет абсолютно никакого отношения к Grub или MBR (или к любому типу загрузчика или таблицы разделов). Я не уверен, что именно ты пытался и что ты ожидал увидеть.
Дэвид Фёрстер
Тогда этот ответ не имеет ничего общего с вопросом ...
mook765
@ mook765: Если вы воспринимаете это буквально, то да. Однако мне кажется, что OP хочет знать, какая из его множественных установок Ubuntu в настоящее время загружена, и для этого мой ответ должен быть в порядке.
Дэвид Фёрстер
2

Мы могли бы добавить простой пользовательский пункт меню в каждой ОС, и мы увидели бы в меню Grub, из которого ОС Grub загружал свой файл конфигурации.

Пример:

Мы загружаемся в 16.04 и редактируем файл, /etc/grub.d/40_customчтобы добавить пункт меню.

#! / Bin / ш
exec tail -n +3 $ 0
# Этот файл предоставляет простой способ добавления пользовательских пунктов меню. Просто введите
# пунктов меню, которые вы хотите добавить после этого комментария. Будьте осторожны, чтобы не изменить
# строка 'exec tail' выше.
#

menuentry 'grub.conf загружен с 16.04' {        
            перезагрузка  
    }

Мы уверены, что файл является исполняемым и запускается sudo update-grub.

Затем мы делаем те же изменения в других ОС, мы просто используем разные имена для входа в меню, например, мы меняем 16.04на 15.04и так далее.

Если мы выберем этот пункт меню в меню Grub во время загрузки, машина просто перезагрузится, мы создали их не для загрузки какой-либо ОС, а для того, чтобы увидеть, какая ОС фактически используется для загрузки grub.conf.

Дополнительная информация

Такая путаница возникает, когда мы устанавливаем несколько ОС, которые все используют Grub, и во время установки ОС мы выбираем одно и то же расположение загрузчика. Нам действительно нужна только одна ОС, которая устанавливает Grub, Grub может загружаться в любой дистрибутив Linux, поэтому, если у нас установлен один дистрибутив (включая Grub), мы можем установить дополнительные ОС без установки Grub.

В устаревших установках довольно легко обрабатывать расположение для установки загрузчика, так как мы можем выбрать в качестве расположения раздел-загрузочная запись, но мы должны позаботиться о том, чтобы выбрать правильный раздел. Таким образом, одна ОС устанавливает загрузчик в MBR, а дополнительные ОС устанавливают загрузчик в PBR раздела ОС. Эта возможность у нас есть только тогда, когда мы используем Something elseопцию -option во время установки.

В UEFI-установках это немного более странно, загрузчик будет установлен в папку в системном разделе EFI (ESP), и несколько загрузчиков могут легко сосуществовать. Проблема в том, что все версии Ubuntu, а также некоторые другие дистрибутивы linux будут устанавливать Grub в ту же папку в ESP, и у нас нет выбора. Поэтому установка дополнительного Linux-дистрибутива перезапишет наш уже существующий загрузчик. Единственный способ избежать этого - загрузить сеанс live и запустить установщик sudo ubiquity -b.

Еще одно простое решение

Давайте предположим, что у нас есть три дистрибутива Linux, установленных на разделах sda1, sda2и sda3. Теперь посмотрим на пункты меню загрузки Grub. Во время загрузки мы увидим что-то вроде этого:

1 Ubuntu
2 Расширенные опции для Ubuntu
3 Тест памяти (memtest86 +)
4 Тест памяти (memtest86 +, последовательная консоль 115200)
5 Ubuntu (в / dev / sda2)
6 Расширенные опции для Ubuntu (на / dev / sda2)
7 Ubuntu 17.04 (on / dev / sda3)
8 Расширенные опции для Ubuntu (на / dev / sda3)

Первые две записи - это записи для ОС, которая сгенерировала grub.conf-файл, который мы фактически используем. Записи № 3 и № 4 на данный момент не интересны. Записи № 5, № 6, № 7 и № 8 - это записи, которые были сгенерированы с помощью OS-prober, и мы видим, на каких разделах находятся ОС для этих записей. Таким образом, в случае этого небольшого примера мы можем заключить, что grub.config-файл, который мы на самом деле используем, не относится ни к ОС, sda2ни sda3к ОС sda1. В случае, если одна или несколько ОС установлены с отдельным /bootразделом, нам нужно проверить, какой /bootраздел принадлежит какой ОС, но это легко сделать, запустив команду findmnt-команду в каждой ОС.

mook765
источник
+1 Несмотря на длительность, этот ответ на самом деле включает в себя соответствующие пункты. Для систем BIOS пользователи, которые выполняют мультизагрузку, должны предпочесть «Что-то еще» в установщике, чтобы иметь больше контроля; Не нужно заставлять «не устанавливать загрузчик GRUB» (см. Мой старый ответ ). Для систем UEFI настройка мультизагрузки, кажется, очень необъяснена или не проверена.
clearkimura
1
lsblk

И проверьте, на каком диске он установлен /. Пожалуйста, прочитайте комментарии ниже или ответ Ravexina, если у вас есть /bootв установленных точках.

Если вы не уверены, проверьте UUID

lsblk -o UUID,NAME,SIZE,MOUNTPOINT
Кату
источник
2
Это не правда, что если мой /bootотдельный раздел? тогда /boot/grub/grub.cfgне находится в /разделе.
Равексина
@Ravexina Получить технический, это может быть правдой. Тем не менее, для целей этого пользователя, не /считается ли раздел?
@MarkYisri Полагаю, я должен сказать, что это не всегда так, однако ОП сообщает нам, что он получил файл на трех разных разделах, поэтому я думаю, что лучше /bootсначала проверить отдельное .
Равексина
1
Спасибо за указание, что @Ravexina я обновил ответ.
Кату
0

Чтобы узнать, с какого раздела пользователь загрузился, посмотрите меню загрузчика перед загрузкой любой из установленных систем. Трудно сказать, не видя меню загрузчика.

Где посмотреть

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

Мультизагрузочное меню с использованием версии GNU GRUB для ПК / BIOS с аннотацией

Метка (1): пункты меню GNU GRUB ниже первой записи

Метка (2): версия GNU GRUB в верхней части меню загрузчика

Метка (3): фоновое изображение GNU GRUB (требуется ручная настройка)

Наиболее очевидный совет - метка (3), которая изменяет фоновое изображение GNU GRUB в системе, управляющей меню загрузчика. Проще всего сказать, если пользователь настроил его заранее.

Ярлык (1) объяснил

Найдите раздел, который не указан в пунктах меню под первой записью. На снимке экрана показаны только две устанавливаемые операционные системы: «Ubuntu» и «Ubuntu 14.04.5 LTS».

Ubuntu
Advanced options for Ubuntu
Memory test (memtest86+)
Memory test (memtest86+, serial console 115200)
Ubuntu 14.04.5 LTS (14.04) (on /dev/sda3)
Advanced options for Ubuntu 14.04.5 LTS (14.04) (on /dev/sda3)

Последний упомянул (on /dev/sda3), что означает, что первый может быть расположен на /dev/sda2или /dev/sda1. Чтобы быть уверенным, после загрузки системы, то есть «Ubuntu», запустите соответствующую команду lsblk, чтобы вывести список доступных разделов ( кажется, наиболее простым).

$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0    13G  0 disk 
├─sda1   8:1    0   976M  0 part [SWAP]
├─sda2   8:2    0     6G  0 part /
└─sda3   8:3    0     6G  0 part 
sr0     11:0    1  55.7M  0 rom 

Только после сравнения с выводом lsblk, мы знаем, что система, то есть «Ubuntu» находится в /dev/sda2(который не был указан в пунктах меню), из которого осуществляется управление меню загрузчика.

Ярлык (2) объяснил

Ищите версию GRUB, которая напечатана в верхней части меню загрузчика. Обратите внимание на эту версию и сравните ее с версией GRUB, которая находится в загруженной системе, то есть «Ubuntu».

На скриншоте (нижняя половина): GNU GRUB version 2.02~beta2-9

После загрузки системы, т. Е. «Ubuntu», выполните соответствующую команду, чтобы проверить версию пакета GRUB ( grub-install --versionэто актуально и наиболее просто).

$ grub-install --version
grub-install (GRUB) 2.02~beta2-9

Насколько это актуально? Потому что grub-installи update-grubкоманды предоставляются одним и тем же пакетом grub2-common. Учитывая, что меню загрузчика создается и обновляется с использованием инструментов из того же пакета, печатная версия в верхней части меню загрузчика будет одинаковой.

Ярлык (3) объяснил

Эту подсказку необходимо настроить вручную, поскольку фоновое изображение по умолчанию в меню загрузчика отсутствует (просто черный). Фоновое изображение должно иметь глубину 8 бит.

Если desktop-baseпакет установлен в вашей системе, такие фоновые изображения, созданные специально для GRUB, легко найти с суффиксом имени файла *grub.pngв целевом каталоге.

$ ls /usr/share/images/desktop-base/*grub.png
/usr/share/images/desktop-base/desktop-grub.png
/usr/share/images/desktop-base/joy-grub.png
/usr/share/images/desktop-base/moreblue-orbit-grub.png
/usr/share/images/desktop-base/spacefun-grub.png

Чтобы установить фоновое изображение:

  1. Откройте /etc/default/grubфайл как суперпользователь, затем добавьте строку GRUB_BACKGROUND=с полным путем к выбранному изображению и укажите его в кавычках.

    $ sudo nano /etc/default/grub 
    ...
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
    GRUB_CMDLINE_LINUX=""
    
    # Show background in GRUB boot menu
    GRUB_BACKGROUND="/usr/share/images/desktop-base/spacefun-grub.png"
    ...
    
  2. Затем запустите sudo update-grubдля обновления, /boot/grub/grub.cfgкоторое включает в себя меню загрузчика. Пользователь увидит вывод, аналогичный следующему.

    $ sudo update-grub
    Generating grub configuration file ...
    Found background: /usr/share/images/desktop-base/spacefun-grub.png
    Found background image: /usr/share/images/desktop-base/spacefun-grub.png
    Found linux image: /boot/vmlinuz-3.13.0-24-generic
    Found initrd image: /boot/initrd.img-3.13.0-24-generic
    Found memtest86+ image: /boot/memtest86+.elf
    Found memtest86+ image: /boot/memtest86+.bin
    Found Ubuntu 14.04.5 LTS (14.04) on /dev/sda3
    done
    
  3. Перезагрузите компьютер и посмотрите, не было ли в меню загрузчика видимых изменений, внесенных командой update из системы.

Иначе, повторите шаги для других систем, по одной за раз. Повторные шаги были бы ненужными, если бы пользователь знал, какая система контролировала меню загрузчика (опять же, это зависит от того, как была произведена установка).

отказ

Этот ответ объясняет проверенные и хорошо проверенные критерии для системы BIOS с настройкой мультизагрузки с использованием версии GNU GRUB для ПК / BIOS. Будут применяться следующие исключения.

  • Для аналога системы UEFI, использующего версию GNU GRUB EFI, не гарантируется или не известно, будут ли критерии соответствовать описанным выше.

  • Особое внимание уделяется внешнему виду меню загрузчика (как оно может выглядеть иначе, т.е. верхняя половина снимка экрана), а не демонстрации того, как работает цепная загрузка. Таким образом, относительно того, «как была настроена мультизагрузка, как показано на скриншоте», в этом ответе не будет объяснено.

  • Если мультизагрузочная настройка когда-либо сделана из точно таких же копий аналогичной операционной системы, то есть Ubuntu 14.04, Kubuntu 14.04, Xubuntu 14.04 и т. Д., То единственный надежный способ узнать, с какого раздела пользователь загрузился, это метка (3).

  • Метка (3) может работать лучше, если использовать пользовательское фоновое изображение, которое явно пишет, из которого оно загружается, т.е. «Это меню загрузки управляется из / dev / sda1». Точно так же, относительно того, «как создать пользовательское фоновое изображение для GRUB», не будет объяснено в этом ответе

TL; DR Посмотрите меню загрузчика перед загрузкой любой из установленных систем. Самый простой и надежный способ узнать это - label (3), который заключается в ручной настройке фонового изображения GRUB.

clearkimura
источник