Bug 13235

Summary: invalid active partition set after install
Product: Branch 4.0 Reporter: Sergey Vlasov <vsu>
Component: alterator-install3-desktopAssignee: Nobody's working on this, feel free to take it <nobody>
Status: CLOSED WONTFIX QA Contact: Q.A. 4.0 <qa-4.0>
Severity: critical    
Priority: P2 CC: icesik, inger, legion, mike
Version: 4.0   
Hardware: all   
OS: Linux   
Bug Depends on:    
Bug Blocks: 12100, 14168    

Description Sergey Vlasov 2007-10-28 13:09:55 MSK
В результате установки lite-cd-20071025.iso была получена незагружающаяся
система; работоспособность пришлось восстанавливать через rescue.

Таблица разделов перед установкой выглядела следующим образом:

Disk /dev/sda: 250.0 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1           9       72261   83  Linux
/dev/sda2              10        6089    48837600    7  HPFS/NTFS
/dev/sda3            6090       30401   195286140    5  Extended
/dev/sda5            6090        6239     1204843+  83  Linux
/dev/sda6            6240        7439     9638968+  83  Linux
/dev/sda7            7440        7939     4016218+  82  Linux swap / Solaris
/dev/sda8            7940        8339     3212968+  83  Linux
/dev/sda9            8340        9839    12048718+  83  Linux
/dev/sda10           9840       25839   128519968+  83  Linux
/dev/sda11          25840       29339    28113718+  83  Linux
/dev/sda12          29340       30401     8530483+  83  Linux

При этом в MBR был стандартный код для загрузки из активного раздела (без
поддержки загрузки из расширенных разделов, как в MBR от syslinux), в sda1 -
grub (ext2), в sda2 - XP SP2 (ntfs), остальные разделы, кроме sda7 (swap) и
sda12, содержали ext3; sda12 перед запуском установки был не отформатирован. 
При установке для sda12 было выполнено создание файловой системы ext3, задана
точка монтирования / с параметрами по умолчанию; далее на этапе установки
загрузчика был выбран раздел sda12 - предполагалось использование установленного
в другой раздел grub и chainloader (hd0,11)+1 для загрузки этой системы.  Однако
после установки оказалось, что не загружается ни старый grub, ни что-либо ещё -
активный раздел оказался переставленным на sda11.  Пришлось загружать rescue и
возвращать флаг активного раздела на место.
Comment 1 Sergey Vlasov 2007-10-28 13:23:40 MSK
Посмотрел код /usr/lib/alterator/backend3/lilo в
alterator-install3-desktop-0.11-alt1:

bootable_flag() {
        local bootdev="$1"

        # Check raid
        [ -z "$raidtypes" ] || set_bootable_raid

        # Don't set bootable flag if some partitions already marked as bootable.
        partitions_list |grep "^$bootdev" |cut -d\  -f1,2 |grep -qs
'[[:space:]]\*$' &&
                return 0

Насколько я понял, последняя проверка должна была отключать установку флага
bootable в случае, если загрузчик устанавливается в MBR, а на диске уже есть
активный раздел (на самом деле в подобной конфигурации активный раздел нужен
только для обхода особо умных BIOS, проверяющих наличие активного раздела перед
попыткой загрузки). Однако в случае, если $bootdev - это раздел, а не диск, эта
проверка ничего не найдёт, и далее в любом случае будет вызвана функция
set_bootable, устанавливающая флаг bootable для раздела, в который
устанавливается загрузчик. Возможно, для случая, когда установка идёт в primary
раздел, такое поведение имеет смысл, но для расширенного раздела так делать в
любом случае нельзя.

Кстати, код в set_bootable() в любом случае работает неправильно для расширенных
разделов (в данном случае попал в sda11 вместо sda12) и, вероятно, будет
работать неправильно для таблицы разделов с "дырами" (например, при наличии sda1
и sda3, но отсутствии sda2).
Comment 2 Dmitry V. Levin 2007-11-27 18:21:20 MSK
В Сизифе это пакет alterator-lilo.
Comment 3 Alexey Gladkov 2007-11-28 09:05:49 MSK
Тут бы очень помог лог от сборки.
Comment 4 Alexey Gladkov 2007-11-28 09:16:28 MSK
(In reply to comment #1)
>         # Don't set bootable flag if some partitions already marked as bootable.
>         partitions_list |grep "^$bootdev" |cut -d\  -f1,2 |grep -qs
> '[[:space:]]\*$' &&
>                 return 0
> 
> Насколько я понял, последняя проверка должна была отключать установку флага
> bootable в случае, если загрузчик устанавливается в MBR, а на диске уже есть
> активный раздел (на самом деле в подобной конфигурации активный раздел нужен
> только для обхода особо умных BIOS, проверяющих наличие активного раздела перед
> попыткой загрузки). 

Нет. Это проверка на уже установленый bootable флаг. Если эта проварка не
сработала, то либо partitions_list биный, либо $bootdev не из списка разделов.

> Однако в случае, если $bootdev - это раздел, а не диск, эта
> проверка ничего не найдёт, и далее в любом случае будет вызвана функция
> set_bootable, устанавливающая флаг bootable для раздела, в который
> устанавливается загрузчик. Возможно, для случая, когда установка идёт в primary
> раздел, такое поведение имеет смысл, но для расширенного раздела так делать в
> любом случае нельзя.
> 
> Кстати, код в set_bootable() в любом случае работает неправильно для расширенных
> разделов (в данном случае попал в sda11 вместо sda12) и, вероятно, будет
> работать неправильно для таблицы разделов с "дырами" (например, при наличии sda1
> и sda3, но отсутствии sda2).

set_bootable, как ты видел, тупо отсчитыват раздел для sfdisk. У меня опять же
подозрение на partitions_list.

Версию sfdisk в студию.
Comment 5 Michael Shigorin 2014-11-05 20:14:52 MSK
В 4.0/branch исправления не будут вноситься уже технически (заглушена очередь на сборку), поэтому прошу ошибки, актуальные для sisyphus/p7/t7, перевесить на текущие ветки или сизиф.