Как известно, Linux умеет собирать диски и/или их отдельные разделы в software raid aka mdadm. Столкнулся тут с одной забавной проблемой.
В mdadm есть возможность "прикрутить" к своему RAID-массиву так называемый "write intent bitmap". Грубо говоря, это что-то типа журнала операций на низком уровне. Где-нибудь в укромном местечке отводится несколько мегабайт свободного места под хранение информации о том, в какие области логического носителя недавно производилась запись, но при этом данные ещё не успели физически "лечь" на все диски массива (так называемые "грязные" блоки). В качестве такого "укромного" местечка может выступать либо какой-нибудь файл, либо зарезервированное под метаданные (служебную информацию) место на компонентах (дисках или разделах) самого RAID-а.
Нужно всё это для того, чтобы в случае внезапной перезагрузки, выключения питания либо паники ядра (kernel panic) перестраивать не весь RAID целиком, а только его "грязные" (dirty) участки. Что, в свою очередь, поможет существенно сэкономить время. Особенно актуально это для массивов с контролем чётности (RAID5, RAID6).
Понятно, что класть файл такого bitmap-а на файловую систему поверх самого подопытного RAID-а нет никакого смысла: в случае проблем он (bitmap) первым же и помрёт. В метаданные его класть можно. Но, во-первых, там маловато места. Во вторых, это негативно скажется на производительности. Лучше всего его складировать на независимом устройстве, в идеале - на отдельном SSD. Но тут проявляется один смешной затык.
Mdadm хочет, чтобы битмап хранился не на произвольном блочном устройстве, а именно в файле. При этом данный файл должен быть доступен для записи в момент сборки (assemble) и запуска RAID-а. Следовательно, перед стартом массива файловая система должна быть уже смонтирована, и корень ("/") должен быть read-write. Не закрадываются ли у вас некие нездоровые подозрения? Ага, драйвера от модема на компакт-диске, драйвера от CDROM-а в интернете. Чтобы запустить RAID, нам нужна файловая система в режиме чтения-записи, а чтобы смонтировать файловую систему, нам нужно запустить RAID. Упс!
И даже если мы не хотим размещать на пресловутом RAID-е корневую файловую систему (а хотим подмонтировать RAID попозже куда-нибудь ещё), принципиально это мало чего меняет. Init-скрипты в большинстве популярных дистрибутивов Linux устроены таким образом, что перемонтирование rootfs в чтение-запись и монтирование всех остальных файловых систем происходят одновременно в ходе выполнения процедуры а-ля "mount all". И перед "mount all" собирать RAID ещё рано (корень находится в режиме "только-чтение"), а после - уже поздно: различные службы с нетерпением рвутся поиметь доступ к файловым системам на RAID-массиве и начинают сыпать ошибками, не обнаружив их в указанных точках монтирования.
Отсюда следует, что разорвать описанный порочный круг можно только четырмя способами.
- Не использовать write intent bitmap, как бы грустно и банально это ни звучало.
- Попробовать каким-то образом смонтировать на чтение-запись файловую систему для хранения bitmap-а прямо вовнутрь initrd/initramfs, ещё до момента запуска Init-а. Но для этого нужно иметь очень серьёзный опыт ковыряния в кишках initramfs. На данный момент я знаю только одного парня, который способен на такое. Его зовут simply_a_man.
- Написать собственный init-скрипт для сборки и монтирования RAID-а "ручками". При этом для него нужно как-то очень хитро выставить зависимости так, чтобы он запускался после "mount-all", но перед стартом всех остальных служб. А также предусмотреть корректное размонтирование и остановку RAID-а до того, как rootfs станет read-only. Грыжа и головняк, но тем не менее это самый реальный вариант.
- Допилить mdadm с тем, чтобы научить его хранить write intent bitmap на произвольном блочном устройстве. Но это надо уметь программировать модули ядра, что как бе намекаэ...
Вот такая грусть и печаль. Сказ о том, как хорошая задумка разбилась о чугунную ж..у неудачной реализации. Мне интересно другое, почему за столь долгую историю развития пакетных дистрибутивов никто до сих пор не обратил внимания на этот вопрос? Неужели никому не нужны MD-RAID с write intent bitmap?