Форум программистов, компьютерный форум, киберфорум
SlackWare Linux, ZenWalk
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
nbd
9 / 9 / 0
Регистрация: 17.07.2014
Сообщений: 152
1

Как настроить загрузку из под имеющегося GRUB2?

25.06.2016, 16:06. Просмотров 2408. Ответов 10
Метки нет (Все метки)

Здравствуйте,

установил Slackware 14.1 на диск с уже установленной Arch.

В Arch, при помощи команды

Bash
1
grub-mkconfig -o /boot/grub/grub.cfg
добавил Slackware в меню загрузчика. Пункт grub меню получился следующий:

Код
root = 'hd0, 3'
linux /boot/vmlinuz root=UUID=[the-partition-uuid]
затем chrooted в раздел Slackware и сгенерировал initrd.gz командой

Bash
1
mkinitrd -c -k 3.10.17 -m ext4
После этого при загрузке Slackware через меню загрузчика Arch выдаются следующие сообщения об ошибках:

/boot/initrd.gz: Loading kernel modules from initrd.image
insmode /lib/modules/3.10.17/kernel/fs/mbcache.ko
mbcache: exports duplicate symbol mb_cache_create (owned by kernel)
modeprobe: ERROR: could not insert 'mbcache': Exec format error
insmode /lib/modules/3.10.17/kernel/fs/jbd2/jbd2.ko
mbcache: exports duplicate symbol jbd2__journal_restart (owned by kernel)
modeprobe: ERROR: could not insert 'jbd2': Exec format error
insmode /lib/modules/3.10.17/kernel/fs/jbd2/jbd2.ko
mbcache: exports duplicate symbol jbd2__journal_restart (owned by kernel)
modeprobe: ERROR: could not insert 'ext4': Exec format error
mount: can't find /mnt in /etc/fstab
ERROR: no /sbin/init found on rootdev (or not mounted)
Посоветуйте, пожалуйста, как правильно настроить загрузочную конфигурацию Slackware из под Arch.
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2016, 16:06
Ответы с готовыми решениями:

Как настроить Grub2
Установил ubuntu gnome и windows. Были проблемы с Acronis Os Selectorom, я переустановил граб и...

Как настроить загрузку двух ос
Доброго времени суток! Купил все-таки к своему ноуту Samsung RC530 ssd и переходник espada 12....

Как настроить grub на загрузку двух систем?
На ноутбуке стоит OEM-версия Windows 8, Поставил рядом Ubuntu. После перезагрузки запускается grub2...

Как настроить загрузку с CD (в boot) в ноутбуке aspire 5532?
как настроит загрузку из сидирома(в boot) в ноутбуке aspire 5532

10
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
5308 / 3164 / 2342
Регистрация: 22.11.2013
Сообщений: 8,941
25.06.2016, 19:49 2
Пара слов про то, что произошло.

В Slackware поставляются 2 типа ядер: generic -- общего назначения для повседневного использования, huge -- установочно-ремонтное, не запрещено использовать и повседневно.
Разница между ними следующая.
В huge включено большинство драйверов для возможности загрузки с как можно большего количества железа, а также драйверы ФС.
В generic все, что можно, собрано модулями, в том числе драйверы всех ФС, поэтому для загрузки с этим ядром initrd обязателен.
Пакет ядра при установки устанавливает на файл ядра симлинк /boot/vmlinuz. Начиная с 14.1 generic ядро пишет также ссылку /boot/vmlinuz-generic, ядро huge -- ссылку /boot/vmlinuz/generic. Если не выбирали при установке индивидуально пакеты в наборе A, то устанавливаются оба ядра в алфавитном порядке имен пакетов, то есть, сначала generic, затем huge. В результате этого ссылка /boot/vmlinuz по умолчанию указывает на ядро huge -- это причина сообщений "exports duplicate symbol XXX (owned by kernel)" и "ERROR: could not insert 'xxx': Exec format error".

В этой части выход прост: прописать в /boot/grub/grub.cfg вместо /boot/vmlinuz /boot/vmlinuz-generic. Либо поменять ссылку /boot/vmlinuz на generic ядро. В загруженной Slackware проще всего это сделать так:
Bash
1
# (cd / ; /var/log/scripts/kernel-generic-* )
В 32-битной Slackware основные ядра и их версии имеют суффикс -smp в имени и версии, ядра без суффикса предназначены для однопроцессорных машин.

Причину ошибки
mount: can't find /mnt in /etc/fstab
ERROR: no /sbin/init found on rootdev (or not mounted)
с ходу предположить не могу, но это, пожалуй, пока не важно.


1) Поменяйте в /boot/grub/grub.cfg строку "/boot/vmlinuz" на "/boot/vmlinuz-generic". Проверьте, что initrd указан как /boot/initrd.gz (в вашем фрагменте grub.cfg этой строки не видно!):
Bash
1
  initrd /boot/initrd.gz
2) Загрузитесь с установочного диска Slackware в установленную систему, для чего воспользуйтесь инструкцией на первом экране ISOLINUX (там, где про boot. В вашем случае, нужно ответить на приглашение boot:
Bash
1
boot: huge.s root=/dev/sda3 ro rdinit=
3) Залогиньтесь root-ом, пересоздайте initrd:
Bash
1
# /usr/share/mkinitrd/mkinitrd_command_generator.sh -r | sh
4) Перезагрузите машину и попробуйте загрузить Slackware.


Рассказывайте, что из этого получилось, и получилось ли...

Другой вариант: поставить на раздел со Slackware LILO в загрузочную запись раздела, в GRUB прописать загрузку с раздела по цепочке (chainload). Необходимости такой нет, но вдруг такой вариант вам покажется чем-то проще.

Добавлено через 17 минут
PS. Обращаю внимание, в Slackware grub2 запатчен, чтобы правильно подхватывать initrd.gz в Slackware, см. http://slackware.osuosl.org/slackwar...aming.patch.gz
Если хотите, чтобы в Арче
Bash
1
# grub-mkconfig -o /boot/grub/grub.cfg
правильно подхватывал раздел со Slackware, накатите по крайней мере указанный патч (бинарники GRUB2 не потребуют пересборки) на сценарий grub.d/10_linux, можно поправить эту пару строк руками по образу и подобию:
Код
diff -Naur grub-2.00.orig/util/grub.d/10_linux.in grub-2.00/util/grub.d/10_linux.in
--- grub-2.00.orig/util/grub.d/10_linux.in	2012-04-18 23:24:38.000000000 +0200
+++ grub-2.00/util/grub.d/10_linux.in	2012-06-30 07:53:03.765625589 +0200
@@ -198,7 +198,8 @@
 	   "initramfs-genkernel-${version}" \
 	   "initramfs-genkernel-${alt_version}" \
 	   "initramfs-genkernel-${GENKERNEL_ARCH}-${version}" \
-	   "initramfs-genkernel-${GENKERNEL_ARCH}-${alt_version}"; do
+	   "initramfs-genkernel-${GENKERNEL_ARCH}-${alt_version}" \
+	   "initrd.gz"; do
     if test -e "${dirname}/${i}" ; then
       initrd="$i"
       break
Без этой правки правильного пункта меню для Slackware на автомате не получится.

Добавлено через 4 минуты
Если хотите вместо generic использовать ядро huge (не требует initrd), то в /boot/grub/grub.cfg нужно вместо UUID для root= указывать root=/dev/sda3 (без initrd нотация UUID здесь не работает).
0
nbd
9 / 9 / 0
Регистрация: 17.07.2014
Сообщений: 152
25.06.2016, 21:16  [ТС] 3
Большое спасибо за подробную информацию. Но кажется, ошибка

mount: can't find /mnt in /etc/fstab
как-то указывает на причину сбоя. После того как разобрался с ядрами, ошибки экспорта символов исчезли, но "can't find /mnt in /etc/fstab" осталась. Т.к. диск - внешний USB, подумал, что нужно добавить модулей для usb, и initrd генерировал так (mkinitrd_command_generator.sh порекомендовал примерно то же, только добавил еще модулей для всех файловых систем, которые нашел):

Bash
1
mkinitrd -c -k 3.10.17 -f ext4 -m jbd2:mbcahe:ext4:usbcore:ehci-hcd:uhci:usb-storage -o /boot/initrd.gz
При загрузке все модули загрузились успешно, но та же ошибка с /mnt так и осталась. Не совсем понятно зачем /mnt в /etc/fstab при загрузке. Может быть это как то связано с тем, initrd генерировался после монтирования раздела с Slackware в /mnt/tmp и последующего chroot'а туда:

Bash
1
2
3
mount /dev/sdf3 /mnt/tmp
chroot /mnt/tmp
mkinitrd...
Раздел с ядром Slackware и initrd в конфигурации GRUB указывается через UUID.

Может, нужно как-то по-другому генерировать initrd?
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
5308 / 3164 / 2342
Регистрация: 22.11.2013
Сообщений: 8,941
25.06.2016, 22:07 4
Цитата Сообщение от nbd Посмотреть сообщение
диск - внешний USB
Про это в стартовом сообщении ничего не было.
Согласно "man mkinitrd" можно добавить дополнительную задержку (в секундах) в ожидании готовности USB. Попробуйте для начала добавить "-w 20", если это поможет, потом можно будет подобрать минимальное значение, которого достаточно для устойчивого подъема USB.

Цитата Сообщение от nbd Посмотреть сообщение
добавил еще модулей для всех файловых систем, которые нашел
Это лишнее, initrd необходим только для монтирования корня, остальное ядро возьмет с корневой ФС в /lib/modules/$(uname-r).

Итого, меня смущает:

1) отсутствие в вашей команде mkinitrd ключа "-r корень". Например,
Bash
1
... -r /dev/sdf3 ...
или
Bash
1
... -r "UUID=xxx" ...
2) отсутствие в вашей команде mkinitrd ключа "-w время". Например,
Bash
1
... -w 20
3) в показанном вами фрагменте /boot/grub/grub.cfg указано
root = 'hd0, 3', а в примере с chroot -- /dev/sdf3
То есть, в первом случае, диск нулевой (hd0), а во втором -- пятый (f)
Поэтому резонный вопрос: у вас в Slackware /boot свой и лежит на корне, или в /boot монтируется отдельный раздел, общий с Arch-ем?

Цитата Сообщение от nbd Посмотреть сообщение
Не совсем понятно зачем /mnt в /etc/fstab при загрузке.
Поскольку при вызове mkinitrd не указали явно корневой раздел ключом -r, то mkinitrd попытался вычислить корневое устройство по выхлопу mount или содержимому /proc/mounts.
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
5308 / 3164 / 2342
Регистрация: 22.11.2013
Сообщений: 8,941
25.06.2016, 22:52 5
PS. /init из построенного initrd обрабатывает и командную строку ядра (то, что в grub задано после имени файла ядра в строке kernel), умеет брать из нее следующие параметры (поскольку дерево по умолчанию строится в /boot/initrd-tree, можно подсмотреть в /boot/initrd-tree/init):
1,2,3,4,5,6,S,s,single -- уровень исполнения (runlevel)
init=
luksdev=
lukskey=
rescue
resume=
root=
root=UUID=
root=LABEL=
rootfs=
rootfstype=
waitforroot=
rootdelay=

Если они заданы в комстроке ядра, они перекроют указанное при создании initrd.
0
nbd
9 / 9 / 0
Регистрация: 17.07.2014
Сообщений: 152
25.06.2016, 22:52  [ТС] 6
Про это в стартовом сообщении ничего не было.
Я даже и не знал, что это важно. Только после поисков в интернете стало известно, что драйверы USB могут быть не загружены (с другими дистрибутивами такой вопрос не вставал).

Добавил в команду генерации указанные опции:

mkinitrd -c -k 3.10.17 -f ext4 -m jbd2:mbcahe:ext4:usbcore:ehci-hcd:uhci:usb-storage -o /boot/initrd.gz -w 20 -r UUID=111222...

Но ошибка та же (после 20-секундной задержки).

На загруженной Arch - Arch находится на /dev/sdf1, а Slackware на /dev/sdf3. Поэтому chroot производится на /dev/sdf3.

В оригинальном сообщении указан hd0 потому что в коммандной строке загрузчика этот диск указывается как hd0 и я пробовал разные номера. Но сейчас используется hd5 (то что прописывает grub-mkconfig) и полная запись меню выглядит так:

Код
menuentry 'Slackware Linux (Slackware 14.1) (on /dev/sdf3)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-simple-2842470f-c0a8-49a0-af08-f7738be93a85' {
	insmod part_msdos 
	insmod ext2
	set root='hd5,msdos3'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd5,msdos3 --hint-efi=hd5,msdos3 --hint-baremetal=ahci5,msdos3  2842470f-c0a8-49a0-af08-f7738be93a85
	else
	  search --no-floppy --fs-uuid --set=root 2842470f-c0a8-49a0-af08-f7738be93a85
	fi
	linux /boot/vmlinuz-generic-3.10.17 root=UUID=2842470f-c0a8-49a0-af08-f7738be93a85
	initrd /boot/initrd.gz
}
/boot у каждой ОС свой и располагается/монтируется вместе с корнем (не на отдельном разделе). Ошибка с /mnt выдается после сообщений о загрузке initrd и модулей: сначала сообщения о том, что модули загружены и интерфейс USB подключен, потом 20 сек. ожидание, и потом ошибка.
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
5308 / 3164 / 2342
Регистрация: 22.11.2013
Сообщений: 8,941
25.06.2016, 23:43 7
Хм, заинтриговали...
Ошибка происходит при попытке /init (bash-сценарий внутри initrd) смонтировать корень:
Bash
299
300
301
302
303
304
305
306
307
308
309
  # Switch to real root partition:
  /sbin/udevadm settle --timeout=10
  echo 0x0100 > /proc/sys/kernel/real-root-dev
  mount -o ro -t $ROOTFS $ROOTDEV /mnt
  
  if [ ! -r /mnt/sbin/init ]; then
    echo "ERROR:  No /sbin/init found on rootdev (or not mounted).  Trouble ahead."
    echo "        You can try to fix it. Type 'exit' when things are done." 
    echo
    /bin/sh
  fi
Ошибка "mount: can't find /mnt in /etc/fstab" выдается mount, когда ему передан только один параметр-путь, например,
Bash
1
mount /mnt
только тогда он попытается найти в /etc/fstab пару что и куда.
Отсюда напрашивается вывод, что ROOTDEV выше по какой-то причине оказался равен пустой строке.

Переменная ROOTDEV может задаваться по ходу /init в нескольких местах:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ROOTDEV=$(cat /rootdev)
...
# Parse command line
for ARG in $(cat /proc/cmdline); do
  case $ARG in
...
    root=/dev/*)
      ROOTDEV=$(echo $ARG | cut -f2 -d=)
    ;;
    root=LABEL=*)
      ROOTDEV=$(echo $ARG | cut -f2- -d=)
    ;;
    root=UUID=*)
      ROOTDEV=$(echo $ARG | cut -f2- -d=)
    ;;
...
  # Find root device if a label or UUID was given:
  if echo $ROOTDEV | grep -q "LABEL=" || \
     echo $ROOTDEV | grep -q "UUID=" ; then
    ROOTDEV=$(findfs $ROOTDEV)
  fi
...
Предлагаю посмотреть, что происходит.
Вставьте в /boot/initrd-tree/init перед монтированием корня отладочный вывод, посмотрим что там:
Bash
1
2
3
  cat /proc/cmdline
  echo -e "ROOTDEV='$ROOTDEV'"
  mount -o ro -t $ROOTFS $ROOTDEV /mnt
и выполните
Bash
1
# mkinitrd
без параметров, чтобы запаковать в initrd текущее содержимое /boot/initrd-tree, теперь попробуйте загрузиться и приложить фотку вывода с ошибкой.

Добавлено через 14 минут
Неплохо бы глянуть на вывод
Bash
1
# lsblk -o +PARTUUID,UUID
при загрузке в установленную Slackware при помощи загрузочного диска.
0
nbd
9 / 9 / 0
Регистрация: 17.07.2014
Сообщений: 152
26.06.2016, 00:53  [ТС] 8
Я попробовал в параметрах ядра в загрузчике указать не UUID, а /dev/sdf3. И на это выдалась ошибка:

mount: Mounting /dev/sdf3 on /mnt failed: No such file or directory.
И второй момент: попробовал загрузить huge ядро без initrd и на это выдается ошибка

Kernel Panic - Not Syncing: VFS: unable to mount root fs on unknown-block(0,0)
И сall stack примерно такой:

Код
dump_stack
panic
mount_block_root
mount_root
prepare_namespace
...
Может, по каким-то причинам диск не опознается? Это кстати может объяснять куда пропадал ROOTDEV в случае с initrd: по UUID в init раздел ищется командой findfs, и если UUID не найден то вероятно возвращалась пустая строка.

Что может быть не так с диском - даже не знаю. Фирма 3Q, новый (меньше месяца), Arch работает без проблем.
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
5308 / 3164 / 2342
Регистрация: 22.11.2013
Сообщений: 8,941
26.06.2016, 07:52 9
Лучший ответ Сообщение было отмечено nbd как решение

Решение

Предложение про findfs скорее всего верное. По крайней мере это легко проверить, вставив вывод содержимого ROOTDEV до и после, а также добавив вывод известных на тот момент устройств.

У меня есть два подозрения.
Вы ведь наверняка все манипуляции проводите из Arch-а, chroot-ясь в раздел со Slackware?
Это может быть проблемой, поскольку собранные с разными параметрами разные версии ядер могут а) видеть устройства по разному, б) список драйверов (модулей) для USB может быть определен неверно (например, у вас диск в порту USB 3, а драйвера usb-xhci в списке не вижу).

Поэтому настоятельно советую загрузиться с установочного диска Slackware в установленную систему, как описывал выше. (Если не помните, как назывался корневой раздел при установке, можно предварительно подсмотреть на смонтированном разделе в /etc/fstab из арча или из установщика.)
Посмотреть вывод lsmod на предмет загруженных драйверов, обеспечивающих доступ к диску. Если вывод mkinitrd_script_generator.sh не будет отличаться, дописать недостающие драйвера вручную.

Добавлено через 7 минут
Кстати, после ошибки запускается оболочка /bin/sh, можно прямо там проверить все предположения (набор средств для проверки ограничен содержимым initrd). Если из нее диск окажется виден (хотя по описанию -- вряд ли), то где-то элементарно не хватило тайм-аута.
0
nbd
9 / 9 / 0
Регистрация: 17.07.2014
Сообщений: 152
26.06.2016, 14:19  [ТС] 10
Большое спасибо за подробную помощь. Создание initrd на загрузочном диске (а не на Арч), добавление модулей из lsmod и указание корня через UUID решили проблему.
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
5308 / 3164 / 2342
Регистрация: 22.11.2013
Сообщений: 8,941
26.06.2016, 22:41 11
Вот и отлично, был рад помочь.
Если что, обращайтесь.
0
26.06.2016, 22:41
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2016, 22:41

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

Как создать внешнюю печатную форму на основе имеющегося макета под обычное приложение?
Платформа: 1С:Предприятие 8.3. Конфигурация: Бухгалтерия предприятия 3.0.33.20 Как создать...

Не грузится виндовая флешка из-под GRUB2 от Manjaro
Был начисто на винте установлен сабж, но хочу вернуться на венду7. Сделал загрузочную флешку, но...

Настроить загрузку с флэш-карты
Есть флешка формат Compact Flash С помощью специально программы (от оборудования) создается 4...

Не могу настроить загрузку в биосе
Помогите третий день уже мучаюсь ,не могу поставить биос назагрзку версия биоса v1.11 .... на ноуте...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.