Если 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
В 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.
2vsu: спасибо, жду патч.
Да того патча... http://git.altlinux.org/people/vsu/packages/?p=e2fsprogs.git;a=commitdiff;h=fdfae2006f43cd413541e5867df9b27ccdcd87c1 Теперь для компонентов массива определяется TYPE="mdraid"; правда, UUID отображается неправильно (впрочем, в mdadm.conf он всё равно записывается в другой форме - в виде 4 32-разрядных чисел, разделённых ':').
Впрочем, UUID я тоже поправил по крайней мере до совпадения с выводом /lib/udev/vol_id. В принципе можно приблизить вывод и к выводу mdadm, если переставить байты в 32-разрядных словах в соответствии с порядком байтов во всём суперблоке (который можно определить по magic) - тогда разница с mdadm будет в расположении разделителей в UUID.
Если изменить вывод, то сломается обратная совместимость с уже заполненным fstab'ом?
Fixed in 1.39-alt4. http://git.altlinux.org/people/ldv/packages/?p=e2fsprogs.git;a=commit;h=1.39-alt4
(In reply to comment #5) > Если изменить вывод, то сломается обратная совместимость с уже заполненным > fstab'ом? Этот UUID не используется в fstab - только в mdadm.conf. Сломаться может разбор вывода blkid в каких-то программах, не ожидающих в этом поле вывод в формате mdadm (хотя с учётом наличия vfat, где формат UUID совершенно другой, это маловероятно).
В alterator-install2 я использую blkid для конвертации device -> UUID. /sbin/blkid -o value -s UUID "$devname" Вывод от этой команды передаётся lilo (root="UUID=...", boot=...).
(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 не вполне корректно.