Bug 18127

Summary: Не добавляются новые ядра в menu.lst при использовании LABEL/UUID
Product: Sisyphus Reporter: Evgenii Terechkov <evg>
Component: bootloader-utilsAssignee: placeholder <placeholder>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: normal    
Priority: P2 CC: at, boyarsh, glebfm, ldv, placeholder, sem, slazav, vitty, vt
Version: unstable   
Hardware: all   
OS: Linux   
Attachments:
Description Flags
Патч на bootloader-utils-0.4.2-alt1 none

Description Evgenii Terechkov 2008-12-07 09:49:33 MSK
Сейчас /sbin/installkernel ставит при установке новых ядер в конфиг grub/lilo указание корневого раздела в виде /dev/[hs]d[a-z][0-9]+.

Насколько я понимаю, в свете последних же ядер (> 2.6.27) стОйт добавлять вместо этого UUID/LABEL.
Comment 1 Andrey Rahmatullin 2008-12-07 13:13:01 MSK
(In reply to comment #0)
> Насколько я понимаю, в свете последних же ядер (> 2.6.27)
Ты тоже перепутал баг udev с ожидаемым поведением новых ядер или у тебя другие соображения?
Comment 2 Evgenii Terechkov 2008-12-07 14:33:54 MSK
Надоело редактором menu.lst править под каждое новоя ядро.
Comment 3 Andrey Rahmatullin 2008-12-07 15:24:25 MSK
(In reply to comment #2)
> Надоело редактором menu.lst править под каждое новоя ядро.
Это надо было сделать один раз после переезда IDE на libata.
Comment 4 Evgenii Terechkov 2008-12-07 16:18:12 MSK
Я и сделал давно для ядра по умолчанию. Да и новые с root=/dev/ работают какбы и так, но как-то неаккуратно. Это даже скорее не [FR], а Proposal.
Comment 5 Repository Robot 2009-09-16 18:13:54 MSD
bootloader-utils-0.4.1-alt1 -> sisyphus:

* Wed Sep 16 2009 Vladislav Zavjalov <slazav@altlinux> 0.4.1-alt1

- installkernel:
  - change lilo restarting logic (closes #1014, #1015, #20695):
    old behaviour: restart lilo if first bootloader found in
      devices from /proc/partitions is lilo
    new one: restart lilo when lilo bootloader is found in
      device from boot= setting in lilo.conf
  - when detectliloboot.sh fails to find device, there are no
    need to run detectloader.sh (thx Dmitry V. Levin)
      (closes: #21106)
  - suppress unwanted output from cd -
- detectloader: replace by two shell scripts:
    detectliloboot.sh -- to get boot device from lilo.conf
    detectloader.sh -- to get bootloader type on the given device or file
- bootloader_utils.pm:
  - (getroot): recognize UUID and LABEL
      (thx Dmitry V. Levin) (closes: #2194, #18127)
  - remove unused functions (partitions, typeOfMBR) used in
      removed detectloader program
- rebootin
  - remove GRUB support
  - fix working with quoted labels in lilo.conf (closes: #11446).
  - cleanup code, improve error and help messages
  - add long options, add -l option for listing available labels.
  - update manpage
- remove URL and Packager tags (thx Dmitry V. Levin).
Comment 6 Evgenii Terechkov 2009-09-18 16:48:11 MSD
Спасибо.
Comment 7 Evgenii Terechkov 2009-10-02 16:03:05 MSD
Хорошо, только не работает. Столкнулся при обновлении ядра вот с такими синдромами: http://lists.altlinux.org/pipermail/sisyphus/2005-July/283571.html (только уже std-def и без ругани от modprobe). Также создались симлинки, "Can't convert grub partition" два раза подряд и ничего не добавилось в menu.lst.

bootloader-utils уже 0.4.2-alt1. Конфигурация такая:

evg@evg ~ $cat /proc/cmdline 
root=LABEL=NEWROOT vga=788 quiet
evg@evg ~ $GR LABEL=NEWROOT /etc/fstab 
LABEL=NEWROOT   /       ext3    defaults        1       1
evg@evg ~ $df -h /boot
Файловая система      Разм  Исп  Дост  Исп% смонтирована на
/dev/hda2             3,0G  2,5G  342M  89% /
Comment 8 Evgenii Terechkov 2009-10-02 16:12:50 MSD
Created attachment 3954 [details]
Патч на bootloader-utils-0.4.2-alt1

Мне помог приложенный патч.

Дело в том, что mnt2dev забыли обучить возвращать dev (/dev/foo) если mnt (аргумент) имеет вид LABEL/UUID=XXX, что происходит при наличии этого самого LABEL/UUID=XXX в cmdline (и таким образом getroot возвращает LABEL/UUID=XXX). Соответственно dev2grub не знал, как преобразовать LABEL/UUID=XXX в (hdY, Z). Патч же "восстанавливает историческую справедливость" :-)
Comment 9 Vladislav Zavjalov 2009-10-02 16:37:02 MSD
mnt2dev() вообще-то совсем не для того - это поиск устройства по точке монтирования.
Применять ее же еще и для поиска устройства по UUID/LABEL, как в этом патче - весьма странно.

Я попробую тут разобраться.
Comment 10 Vladislav Zavjalov 2009-10-02 16:44:44 MSD
Но, вообще-то и без патча устройства и точки монтирования кажутся перемешанными в этом кусочке:

my $bootdev = mnt2dev("/boot");
my $boot = $bootdev ? "" : "/boot";
my $root = getroot;
my $grub_part = dev2grub($bootdev ? $bootdev : $root);
die "Can't convert grub partition\n" unless $grub_part;

Это при том, что dev2grub хочет только аргументы вида /dev/sda3
Comment 11 Evgenii Terechkov 2009-10-02 16:51:04 MSD
(В ответ на комментарий №10)

у меня отладка этого куска под perl-debugger-ом дала следующее:

my $bootdev = mnt2dev("/boot"); -> undef/nil
my $boot = $bootdev ? "" : "/boot"; -> "/boot"
my $root = getroot; -> "LABEL=NEWROOT"
my $grub_part = dev2grub($bootdev ? $bootdev : $root); -> undef/nil
die "Can't convert grub partition\n" unless $grub_part;

> Это при том, что dev2grub хочет только аргументы вида /dev/sda3

Поэтому и обучил его принимать uuid/label.
Comment 12 Evgenii Terechkov 2009-10-02 16:52:10 MSD
(В ответ на комментарий №9)
> mnt2dev() вообще-то совсем не для того - это поиск устройства по точке
> монтирования.
> Применять ее же еще и для поиска устройства по UUID/LABEL, как в этом патче -
> весьма странно.

Согласен, странно, но я старался минимизировать патч и максимально использовать существующий код.
Comment 13 Evgenii Terechkov 2009-10-02 17:01:43 MSD
Ну т.е. до "обучения" getroot-а UUID/LABEL цепочка вызовов(результатов) была такая:

getroot(/dev/hda2)->dev2grub(hd0,1)

а после стала такой:

getroot(LABEL=NEWROOT)->dev2grub(nil)

т.к. getroot возвращающий LABEL/UUID=XXXX судя по коду используется в /u/s/loader/lilo, то ломать его я не стал, а стал править dev2grub. Для того чтобы минимумом движений преобразовать LABEL в /dev/hda2 мне проще всего показалось использовать код mnt2dev.
Comment 14 Vladislav Zavjalov 2009-10-02 17:02:38 MSD
> Но, вообще-то и без патча устройства и точки монтирования кажутся 
> перемешанными в этом кусочке:

прошу прощения, тут все хорошо.

> Согласен, странно, но я старался минимизировать патч и максимально 
> использовать существующий код.

Но mnt2dev совсем уж не для того. В ней действительно есть (странный на мой
взгляд) финт: если в fstab UUID/LABEL - взять устройство из mtab.

Но это, наверное, не повод наделять ее неочевидным двойным назначением (искать
аргумент и среди точек монтирования и среди устройств вида UUID/LABEL)

Надо бы, наверное, придумать отдельную функцию либо на эту тему, либо на тему
blkid. И прогонять через нее все, что отдается в dev2grub.
Тогда, кстати, и от финта в mnt2dev можно будет избавиться.
Comment 15 Evgenii Terechkov 2009-10-02 17:21:41 MSD
> Но mnt2dev совсем уж не для того. В ней действительно есть (странный на мой
> взгляд) финт: если в fstab UUID/LABEL - взять устройство из mtab.

Мне кажется, финт правильный: если для /mnt в fstab устройство указано путём UUID/LABEL, попытаться определить /dev/blah из mtab.
 
> Но это, наверное, не повод наделять ее неочевидным двойным назначением (искать
> аргумент и среди точек монтирования и среди устройств вида UUID/LABEL)

Вообще, если нет четко определённого интерфейса (определения, кто что делает и кто кому что возвращает), то и нарушение то это небольшое. Чисто на уровне интуиции.

Можно просто переименовать mnt2dev в any2dev :-)
 
> Надо бы, наверное, придумать отдельную функцию либо на эту тему, либо на тему
> blkid. И прогонять через нее все, что отдается в dev2grub.
> Тогда, кстати, и от финта в mnt2dev можно будет избавиться.

"Мне всё равно, кого пытать, лишь бы работало хорошо"(с) :-)
Comment 16 Vladislav Zavjalov 2009-10-02 17:23:54 MSD
этот код используется и в detectliloboot.sh и в alterator-lilo. Не вынести ли его в отдельнй скрипт?
http://git.altlinux.org/people/slazav/packages/?p=bootloader-utils.git;a=commit;h=8682de9c104292286d80f331481e8249da829b9f
Comment 17 Sir Raorn 2009-10-02 18:39:25 MSD
Я бы рекомендовал использовать фичу wildcard (info grub wildcard) и сказать installkernel'у никогда-никогда не обновлять menu.lst.
Comment 18 Evgenii Terechkov 2009-10-02 18:47:55 MSD
Интересная идея.

P.S.: на что только не идут люди, чтобы не читать документацию. Это я про себя :-)
Comment 19 Sir Raorn 2009-10-02 19:15:21 MSD
Идея эта оказывается единственно рабочей, поскольку у grub нет глобального "append".  Если какой-то нестандарт в опциях появляется, сразу либо только дефолтное ядро, либо после каждого обновления с болью и страданиями копипастить эти опции на все ядра.

Поскольку grub у нас официально не поддерживается (или не поддерживается официально), лучше всю его недоподдержку убрать совсем.
Comment 20 Evgenii Terechkov 2009-10-02 19:32:49 MSD
Этого то я и боялся. :-)

Однако, тоже вариант, и вполне себе нормальный.
Comment 21 Repository Robot 2009-10-06 16:40:04 MSD
bootloader-utils-0.4.3-alt1 -> sisyphus:

* Mon Oct 05 2009 Vladislav Zavjalov <slazav@altlinux> 0.4.3-alt1

- add convertdev.sh script co convert UUID=.. or LABEL=.. to device names
  use it in detectliloboot.sh and grub scripts (closes #18127)
- bootloader_utils.pm: mnt2dev(): don't use mtab to convert device names
Comment 22 Evgenii Terechkov 2010-04-03 14:23:56 MSD
Столкнулся с тем, что не установилось в /b/g/menu.lst ядро 2.6.32-std-def-alt10 с руганью Can't convert grup partition.

Оказалось, это связано с тем что в /b/g/menu.lst прописан диск /dev/hda, который после одного обновления ядра виден как /dev/sda. Возможно, стОйт ослабить требование на полное совпадение строк (например, для тех кто будет обновлять старый дистрибутив до нового)?

2raorn: wilcard работает, работает.
Comment 23 Sir Raorn 2010-04-03 14:48:27 MSD
Первый grub был выпилен из сизифа поганой метлой и ссаными тряпками.
Comment 24 Evgenii Terechkov 2010-04-03 15:26:05 MSD
Ах, как я мог забыть. Ну, мир его праху.