Задать вопрос
CityCat4
@CityCat4
//COPY01 EXEC PGM=IEBGENER

Почему я не могу попасть в single-user mode [решено]?

Сервер на ядре
Linux www 4.19.43-calculate #1 SMP PREEMPT Mon May 27 15:58:10 +07 2019 x86_64 Intel(R) Xeon(R) CPU E5-2667 v4 @ 3.20GHz GenuineIntel GNU/Linux

При редактировании командной строки добавлением слова single в хвост - реагирует как положено.

Сервер на ядре
Linux msrv-001 5.15.82-calculate #1 SMP PREEMPT Tue Apr 25 13:07:11 +07 2023 x86_64 Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz GenuineIntel GNU/Linux

При точно таком же редактировании почти такой же строки тупо игнорирует параметр и грузит мультиюзер.

WTF? Это у меня кривые руки или в ядре при переходе от 4.х к 5.х опять что-то втихушку поправили "из соображений безопасности" и никому не сказали?

У кого есть машины на ядре 5.х - проверьте, работает ли single user у вас.

UPD: Похоже на дистрибозависимый прикол. Потому что:
ROSA Fresh 12.4 (kernel 6.1.20) - отрабатывает нормально, правда там systemd
Simply Linux 10.1 (kernel 5.10.123) - отрабатывает нормально (тоже systemd)
  • Вопрос задан
  • 618 просмотров
Подписаться 2 Средний 7 комментариев
Решения вопроса 1
CityCat4
@CityCat4 Автор вопроса
//COPY01 EXEC PGM=IEBGENER
М-да, я его все-таки одолел. И хотел бы посмотреть на того Криворучко, кто такой патч вносил. Дело было разумеется в скрипте init из initrd/initramfs. Там есть код, который разбирает cmdline на параметры и проверяет, нет ли там single, emergency и прочих вариантов указания, что нужен однопользовательский режим:
else
    debug_off # Turn off debugging for this section
    set -- "$CLINE"
    for x in "$@"; do
        echo "In second x is [$x]"
        case "$x" in
            [0-9] | s | S | single | emergency | auto)
                initargs="$initargs $x"
                echo "initargs is [$initargs]"
                ;;
        esac
    done
    echo "initargs is [$initargs]"
fi

(отладочная печать имени меня). Этот код делает понятно что - формирует командную строку для init. И вот неведомый Криворучко написал вот эту вот строку:
set -- "$CLINE"
(в CLINE - считанная командная строка запуска ядра из /proc/cmdline) и ничуть не усомнился в том, что правильно. И что происходит - set получает на вход разбора строку как единое целое, естественно именно так и отдает ее в цикл проверки, понятное дело, что ничего ничему не совпадает.
Для исправления ошибки я просто вернул все, как было раньше:
set -- $CLINE
Теперь set получает на вход строку как строку и ессно парсит ее на элементы, single находит, список аргументов для init формирует нормально.

Осталось решить, какой морде козлячьей это зарепортить - в Gentoo или же в Calculate

UPD: Все уже зарепорчено без меня :) Этот файл входит в пакет dracut и соответствующий патч был принят еще в конце марта, но почему-то так до сих пор и не зарелизен (патч )
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
WTF? Это у меня кривые руки или в ядре при переходе от 4.х к 5.х опять что-то втихушку поправили

single -- это не параметр ядра вообще. Это параметр init. Сравнивай системы инициализации.
С systemd для этого эффекта можно использовать параметр systemd.unit=rescue, см.

Ну и имеет смысл проверить, что grep -w single /proc/cmdline подтверждает, что параметр в неизменном виде добрался до юзерспейса.
Ответ написан
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
А канонический telinit 1 в уже загруженной системе - не помогает?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы