LINUX.ORG.RU

Ищу специалиста по Dracut

 ,


0

2

В очередной раз я накатываю void на ssd на f2fs и в очередной раз я сталкиваюсь с ошибкой FLUSH_MERGE not compatible with readonly mode.

В этот раз меня это выбесило основательно и я закатал рукава и начал искать, откуда лезет эта дичь. Начинаем по порядку. Если ручками монтировать фс командой вида mount /dev/sda1 /mnt/1, то всё ок. Когда это делает initramfs, то не ок.

В сети нашёл информацию по прописыванию либо rw либо noflush_merge в командную строку ядра. Я решил пойти по пути прописывания rw - не помогло.

Дальше я полез изучать устройство содержимого initramfs. Опции монтирования лежат в /etc/cmdline.d/95root-dev.conf. Вот его содержимое в моём случае

 root=UUID=e10bcf2f-f3de-4bb4-993c-dbb82afa09ad rootfstype=f2fs rootflags=rw,noatime,lazytime,background_gc=on,nogc_merge,discard,discard_unit=block,user_xattr,inline_xattr,acl,inline_data,inline_dentry,flush_merge,barrier,extent_cache,mode=adaptive,active_logs=6,alloc_mode=default,checkpoint_merge,fsync_mode=posix,memory=normal,errors=continue

Как видно, тут есть опция rw, значит всё хорошо. Более того, если руками смонтировать раздел с этими опциями, то всё монтируется без проблем.

Дальше я решил сравнить эти опции с теми, которые используются фактически при монтировании. Оказалось, что в самом конце к ним добавляется ,rw,ro и таким образом фс пытается смонтироваться в режиме только чтения! И это вызывает ошибку.

Я полез искать по скриптам место, где отрабатывает вот это вот всё и нашёл файл /usr/lib/dracut/hooks/mount/99-mount-root.sh. Практически в самом начале есть такой участок кода

    _rflags_ro="$rflags,ro"
    _rflags_ro="${_rflags_ro##,}"

    while ! mount -t "${rootfs}" -o "$_rflags_ro" "${root#block:}" "$NEWROOT"; do
        warn "Failed to mount -t ${rootfs} -o $_rflags_ro ${root#block:} $NEWROOT"
        fsck_ask_err
    done

Из этого куска кода ясно, что к опциям монтирования в хвосте всегда приписывается ro.

Присмотревшись повнимательнее, я заметил, что параметры ro и rw в параметрах ядра всё же передаются и приписываются предпоследним параметром, но погоды это не делает, т.к. в конце всегда дописывается ro.

Теперь вопрос - они там на приколе что ли совсем? Это действительно захардкожено или я чего-то не понимаю? Как передать ему rw?

★★

UUID=e10bcf2f / f2fs defaults,noatime,nodiratime 0 0
UUID=e10bcf2f /boot/efi vfat rw,iocharset=utf8 0 0

Как то так должно быть.
Разметка gpt, первый раздел fat 32 Efi. Второй f2fs.
Это обязательно для всех кроме Ext ФС.

grub-install --target=x86_64-efi --efi-directory=/boot/efi
grub-mkconfig -o /boot/grub/grub.cfg
Если что

tehew10569
()
Последнее исправление: tehew10569 (всего исправлений: 1)

Вот этот файл в апстриме с этой же строчкой: https://github.com/dracutdevs/dracut/blob/master/modules.d/95rootfs-block/mount-root.sh#L25

Это действительно захардкожено

Ну да. Сначала монтируют в ro, потом делают remount на нормальные опции.

annulen ★★★★★
()
Ответ на: комментарий от annulen

Тогда вырисовывается другая проблема. При генерации инитрамфс dracut смотрит с какими опциями смо6тирован корень и использует их. А flush_merge - это нормальная опция и она не совместима с ro. Что ж, придётся серьёзно рассмотреть вариант продолжить разработку своего микроинита.

u5er ★★
() автор топика
Ответ на: комментарий от u5er

Что ж, придётся серьёзно рассмотреть вариант продолжить разработку своего микроинита.

Не обязательно так радикально. Все эти модули сделаны на шелле специально для того, чтобы их можно было легко модифицировать. И наверняка можно скопировать этот скриптик под новым именем и где-то в конфиге задать, чтобы твой «форк» использовался вместо оригинала.

(А у меня лично вообще initramfs нет. Всё, что нужно для начальной стадии загрузки, вкомпилено в ядро)

annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 1)
Ответ на: комментарий от annulen

легко модифицировать

Я просто себя знаю: начну с одного, а в итоге переппишу всё под себя xD Тем более, что я уже однажды так сделал на umpc. Меня не устраивает штатная логика расшифровки корня, поэтому я полностью всё переделал и она одновременно ждёт ввода пароля, ждёт флешку с ключом и может ждать прикладывания пальца к сканеру отпечатков. Правда отпечатки пальцев я не доделал, но факт есть факт.

u5er ★★
() автор топика
Ответ на: комментарий от u5er

Если бы для какой-то маломощной железки, то я бы, наверное, тоже заморочился, чтобы не было ничего лишнего и по-максимуму распараллелить всякие ожидания.

В фирме, где я раньше работал, у нас в устройствах был кастомный инит на sh (busybox), и он делал кучу вещей, в т.ч. поднимал сеть и запускал программу, проверяющую обновления (и обновляющую прошивку, если они найдены). И вот тогда меня парило, что это всё последовательно происходит и загрузка очень долгая. Помню, что изучал всякие иниты, на чём можно было бы это всё организовать, чтобы по-минимуму велосипедить, и заинтересовал меня, вроде бы, finit. Но попробовать так и не дошли руки.

annulen ★★★★★
()
Ответ на: комментарий от annulen

Интересная штука. Только я думаю, что для задачи «просто загрузить несколько модулей и смонтировать корень с нужными опциями» это оверхед. Пара-тройка баш-портянок длиной на 50-100 строк будут сподручнее.

u5er ★★
() автор топика