LINUX.ORG.RU

Загрузка с root=UUID=... без initrd


1

1

Можно ли так сделать? Думал, что всё просто - заменит root=/dev/sd... на root=UUID=..., но при загрузке получаю segfault с сообщением VFS: unable to mount on unknown-block(0,0).

Я знаю, что это работает в Ubuntu и Gentoo для ядер, собранных с genkernel; и там, и там используется initrd. Так можно ли обойтись без него, или no way?

★★★★★

В initrd для это используется blkid. Так что без него никак. Разве что портировать blkid напрямую в ядро :)

botkin
()

Я спокойно без него обхожусь.. Врубил поддержку своего харда и ФС в ядре и счастлив. root='(hd0,X)' Gentoo/Funtoo

Vekt
()
Ответ на: комментарий от Lindows

нет, это про uuid gpt-разделов речь

anonymous
()
Ответ на: комментарий от Lindows

Опа, а там написано PARTUUID, а не просто UUID. Сейчас попробую.

Kadi, real_root указывается как раз в случае использования initrd.

anonymous, по удачному стечению обстоятельств у меня как раз GPT.

megabaks, 3.1.3

Vekt, а у меня рубашка зелёная, небо серое, а асфальт мокрый и на нём химикаты.

tiandrey ★★★★★
() автор топика
Ответ на: комментарий от Lindows

The function will return the first partition which contains a matching UUID value in its partition_meta_info struct. This does not search

by filesystem UUIDs.

А я так хотел использовать свои uuid... Ну да ладно, если заработает, задача будет решена.

tiandrey ★★★★★
() автор топика
Ответ на: комментарий от Lindows

Да, так всё работает.

Решение: вместо UUID=<uuid-который-у-файловой-системы> писать PARTUUID=<uuid-дискового-раздела>, этот uuid можно узнать, например, с помощью partx:

# partx --show /dev/sda
NR    START        END    SECTORS   SIZE NAME UUID
 1     2048   52430847   52428800    25G      c99d877d-5d48-4e6c-a725-101e2c7dde62
 2 52430848   57673727    5242880   2,5G      df1f012d-175b-4a90-bd0e-5de21c9c189b
 3 57673728   59770879    2097152     1G      d9344a20-0678-4dc0-8e3b-8e3c5834381c
 4 59770880 1250263039 1190492160 567,7G      7e417476-6b25-4c77-8f14-4e324047d8b6

tiandrey ★★★★★
() автор топика
Ответ на: комментарий от tiandrey

P.S. Работает, судя по всему, только с GPT, другая таблица не разделов сойдёт.

Спасибо, Lindows!

tiandrey ★★★★★
() автор топика
Ответ на: комментарий от Kadi

малыш, JFY нет у ядра такого параметра «real_root»
можешь идти дальше делать урокилабать в кантырсрайк

anonymous
()
Ответ на: комментарий от tiandrey

grub 0.97-r2

title Gentoo (2.6.38-r7)
        root (hd0,0)
        kernel /gentoo-x86_64-2.6.38-r7 real_root=UUID=c69637e5-297a-474f-9250-acf5b49d9bf9 nomodeset
grub 1.99-rc1 (генерится grub2-mkconfig и правится real_root)
menuentry 'Gentoo 3.0.7' --class gnu-linux --class gnu --class os {
        load_video
        insmod gzio
        insmod part_msdos
        insmod ext2
        set root='(hd0,msdos3)'
        linux /gentoo-3.0.7 real_root=UUID=6148fb7c-458d-4522-ab11-eccabcfeb1e2
}

Kadi
()
Ответ на: комментарий от tiandrey

ты меня спалил, праативный :3

anonymous
()
Ответ на: комментарий от tiandrey

Нет, если указать просто root=UUID=... тоже не будет. Если что /boot и / на разных разделах.

> упоминаний «real_root» в сырцах не обнаружено.

# grep real_root . -R
./init/do_mounts_initrd.c:unsigned int real_root_dev;   /* do_proc_dointvec cannot handle kdev_t */
./init/do_mounts_initrd.c:      real_root_dev = new_encode_dev(ROOT_DEV);
./init/do_mounts_initrd.c:      if (new_decode_dev(real_root_dev) == Root_RAM0) {
./init/do_mounts_initrd.c:      ROOT_DEV = new_decode_dev(real_root_dev);
./include/linux/initrd.h:extern unsigned int real_root_dev;
./kernel/sysctl.c:              .data           = &real_root_dev,
То что в ./init/ - там инитрд.
# grep real_root ./kernel/ -R -A 3 -B 3
./kernel/sysctl.c-#ifdef CONFIG_BLK_DEV_INITRD
./kernel/sysctl.c-      {
./kernel/sysctl.c-              .procname       = "real-root-dev",
./kernel/sysctl.c:              .data           = &real_root_dev,
./kernel/sysctl.c-              .maxlen         = sizeof(int),
./kernel/sysctl.c-              .mode           = 0644,
./kernel/sysctl.c-              .proc_handler   = proc_dointvec,
# zgrep BLK_DEV_INITRD /proc/config.gz 
CONFIG_BLK_DEV_INITRD=y
может оно? Но самого initrd я даже не собирал...

Kadi
()
Ответ на: комментарий от Kadi

fixed
> Нет, если указать просто root=UUID=... тоже не будет.
Нет. И если указать просто root=UUID=... тоже не будет.

Kadi
()

У меня раньше работало, до ядра системы версии 2.6.37, потом перестало работать. Подозреваю что нужно было обновить genkernel, так как пользуюсь им.

ZenitharChampion ★★★★★
()
Ответ на: комментарий от tiandrey

Да, подразумевает, но раньше он работал именно так, как ты написал, с ядром 2.6.35. А потом я обновился в очередной раз - и перестало. Поменял строчки GRUB на root=/dev/sda[...]

ZenitharChampion ★★★★★
()
Ответ на: комментарий от ZenitharChampion

Ну вопрос-то был как раз о том, можно ли без initrd.

Тебе должна помочь опция genkernel --disklabel.

tiandrey ★★★★★
() автор топика
Ответ на: комментарий от tiandrey

не обязательно, можно собирать только ядро без инитрд

$ genkernel --help | grep -i actions -A 5
Available Actions: 
  all                           Build all steps
  bzImage                       Build only the kernel
  initramfs                     Build only the ramdisk/initramfs
  kernel                        Build only the kernel and modules
  ramdisk                       Build only the ramdisk/initramfs

Kadi
()
Ответ на: комментарий от tiandrey

А при чем тут --disklabel? Ни при сборке вручную, ни при сборке с genkernel ничего, связанного с disklabel я не трогал.

Kadi
()
Ответ на: комментарий от Kadi

Это полностью конфиги груба, или только часть? И работает ли, если убрать из ядра поддержку initrd?

mky ★★★★★
()
Ответ на: комментарий от mky

> Это полностью конфиги груба, или только часть?
Только часть, относящаяся к загрузке конкретного ядра. там еще пара строчек задающих дефолтное ядро, таймаут итп.

> И работает ли, если убрать из ядра поддержку initrd?
Не тестил такой вариант.

Kadi
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.