Bug 11419 - libblkid does not recognize md components
: libblkid does not recognize md components
Status: CLOSED FIXED
: Sisyphus
(All bugs in Sisyphus/libblkid)
: unstable
: all Linux
: P2 normal
Assigned To:
:
:
:
:
:
  Show dependency tree
 
Reported: 2007-04-08 21:01 by
Modified: 2007-04-09 16:42 (History)


Attachments


Note

You need to log in before you can comment on or make changes to this bug.


Description From 2007-04-08 21:01:48
Если raid0 не поднят в initrd, то первая попытка swapon не удастся; это только
косметическая проблема, но вот вторая попытка тоже не пройдёт -- swapon
схватится по UUID за половинку RAID0:

--- /proc/mdstat
Personalities : [raid1] [raid0] 
md1 : active raid1 hdb1[1] hda1[0]
      4192832 blocks [2/2] [UU]

md2 : active raid0 hda2[0] hdb2[1]
      12578688 blocks 32k chunks

unused devices: <none>

--- /etc/fstab
UUID=9ca180d9-1d32-4a1e-9d44-d1aa6e7ba5b1       swap    swap    defaults00

--- blkid
/dev/hda1: UUID="ba18fb57-92b3-4aef-bc67-982e2eee754a" SEC_TYPE="ext2"
TYPE="ext3" 
/dev/hda2: UUID="9ca180d9-1d32-4a1e-9d44-d1aa6e7ba5b1" TYPE="swap" 
/dev/hdb1: UUID="ba18fb57-92b3-4aef-bc67-982e2eee754a" SEC_TYPE="ext2"
TYPE="ext3" 
/dev/md1: UUID="ba18fb57-92b3-4aef-bc67-982e2eee754a" SEC_TYPE="ext2"
TYPE="ext3" 
/dev/md2: UUID="9ca180d9-1d32-4a1e-9d44-d1aa6e7ba5b1" TYPE="swap" 

Чем дальше, тем меньше понимаю -- зачем делать неуникальные уникальные
идентификаторы, тем более для страйпов? :(

См. тж. #11282, #11283
------- Comment #1 From 2007-04-08 22:01:33 -------
В libblkid есть функция check_mdraid(), которая должна определять компоненты
массива, чтобы не пытаться искать на них ФС. Получается, что эта функция не
работает.

И я, кажется, понял, почему она не работает:

lseek(3, 8225161216, SEEK_SET)          = 8225161216
read(3, "\374N+\251\0\0\0\0Z\0\0\0\1\0\0\0\0\0\0\0w%\276\225\330"..., 4096) =
4096

...

        /* Check for magic number */
        if (memcmp("\251+N\374", buf, 4))
                return -BLKID_ERR_PARAM;

Вот как выглядит работающая проверка в libvolume_id:

#define MD_MAGIC            "\xfc\x4e\x2b\xa9"
#define MD_MAGIC_SWAP            "\xa9\x2b\x4e\xfc"
...
    if ((memcmp(mdp->md_magic, MD_MAGIC, 4) != 0) &&
        (memcmp(mdp->md_magic, MD_MAGIC_SWAP, 4) != 0))
        return -1;

К сожалению, суперблоки 0.90 в md host-endian (причём в ядре даже не делается
никаких попыток обеспечить совместимость с чужим порядком байтов). Впрочем, для
libblkid нужны только поля magic и uuid (в котором байты переставлять не
нужно).

Кстати, суперблоки версии 1.x используют тот же magic, но всегда little endian
и
находятся в других местах (1.0 - в конце устройства, но расчёт смещения
отличается от 0.9; 1.1 - в начале устройства; 1.1 - со смещением 4KB от
начала).
Сейчас такие суперблоки не поддерживаются даже в libvolume_id.
------- Comment #2 From 2007-04-08 22:14:48 -------
2vsu: спасибо, жду патч.
------- Comment #3 From 2007-04-08 22:57:05 -------
Да того патча...

http://git.altlinux.org/people/vsu/packages/?p=e2fsprogs.git;a=commitdiff;h=fdfae2006f43cd413541e5867df9b27ccdcd87c1

Теперь для компонентов массива определяется TYPE="mdraid"; правда, UUID
отображается неправильно (впрочем, в mdadm.conf он всё равно записывается в
другой форме - в виде 4 32-разрядных чисел, разделённых ':').
------- Comment #4 From 2007-04-08 23:25:36 -------
Впрочем, UUID я тоже поправил по крайней мере до совпадения с выводом
/lib/udev/vol_id. В принципе можно приблизить вывод и к выводу mdadm, если
переставить байты в 32-разрядных словах в соответствии с порядком байтов во
всём
суперблоке (который можно определить по magic) - тогда разница с mdadm будет в
расположении разделителей в UUID.
------- Comment #5 From 2007-04-08 23:37:35 -------
Если изменить вывод, то сломается обратная совместимость с уже заполненным
fstab'ом?
------- Comment #6 From 2007-04-09 00:39:45 -------
Fixed in 1.39-alt4.
http://git.altlinux.org/people/ldv/packages/?p=e2fsprogs.git;a=commit;h=1.39-alt4
------- Comment #7 From 2007-04-09 12:31:32 -------
(In reply to comment #5)
> Если изменить вывод, то сломается обратная совместимость с уже заполненным
> fstab'ом?

Этот UUID не используется в fstab - только в mdadm.conf. Сломаться может разбор
вывода blkid в каких-то программах, не ожидающих в этом поле вывод в формате
mdadm (хотя с учётом наличия vfat, где формат UUID совершенно другой, это
маловероятно).
------- Comment #8 From 2007-04-09 12:41:11 -------
В alterator-install2 я использую blkid для конвертации device -> UUID. 

/sbin/blkid -o value -s UUID "$devname"

Вывод от этой команды передаётся lilo (root="UUID=...", boot=...).
------- Comment #9 From 2007-04-09 16:42:32 -------
(In reply to comment #8)
> В alterator-install2 я использую blkid для конвертации device -> UUID. 
> 
> /sbin/blkid -o value -s UUID "$devname"
> 
> Вывод от этой команды передаётся lilo (root="UUID=...", boot=...).

Теперь эта команда в случае применения к устройству, содержащему компонент
массива md, будет выдавать UUID массива (раньше в такой ситуации как минимум для
raid1 выдавался UUID файловой системы).

Кстати, "UUID", используемые в md, строго говоря, не являются правильными UUID с
точки зрения libuuid - в md это просто 128-байтовые случайные числа, не
содержащие поля типа, как OSF DCE UUID; поэтому представление этих
идентификаторов в виде UUID не вполне корректно.