Обновите до пользовательского ядра без поддержки нескольких пользователей.

Вопрос или проблема

Я экспериментирую с настройкой ядра на своем безголовом сервере Ubuntu. В данный момент у меня ядро 6.8.0-48-generic. Моя цель – удалить ненужные функции ядра. Я решил начать с удаления поддержки нескольких пользователей, оставив только пользователя root (в основном, чтобы не вводить sudo для каждой команды). Я собрал ядро, используя мой файл /boot/config-6.8.0-48-generic в качестве основы, отключив параметр CONFIG_MULTIUSER. Отключение этой опции также удаляет системный вызов setuid, и оказывается, что многие из моих существующих приложений зависят от него. Во время загрузки я вижу множество сообщений типа “setuid: Функция не реализована”. Проблема в том, что после загрузки я даже не получаю оболочку (ни через последовательный порт, ни на мониторе, ssh также не работает). Какие шаги я могу предпринять дальше? Как я могу “сообщить” приложениям, что теперь система однопользовательская? Или хотя бы, как я могу получить оболочку?

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

Я решил начать с удаления поддержки нескольких пользователей

В ядре для этого очень мало кода, так как “пользователь” для ядра – это всего лишь номер пользователя, который процесс наследует от своего родительского процесса, или если процесс уже выполняется как UID 0, номер, к которому он изменяется с помощью setuid; также эти номера снова появляются как владельцы файлов.

Итак, мне кажется, что это что-то, что не имеет смысла удалять?

Отключение этой опции также удаляет системный вызов setuid, и оказывается, что многие из моих существующих приложений зависят от него

Что ж, пока все ожидаемо. Это именно то, что вы попросили сделать: удалить части ядра, которые имеют дело с пользователями.

Итак, если ваше программное обеспечение зависит от этого, вы не можете это удалить. Конец истории.

Вы также не снижаете сложность: ядро все еще должно хранить все структуры данных для процессов, оно все еще должно понимать право собственности на файлы (даже если на практике оно “ничего с этим не делает”).

Если вы хотите сделать такие низкоуровневые изменения в ядре, делать это под полноценным дистрибутивом Linux, который ожидает работающего и совместимого ядра, также является неправильным выбором – особенно используя Ubuntu, который в значительной степени зависит от функций многопользовательского режима, даже для загрузки. Так что, боюсь, не переписывая systemd, большинство аспектов вашей оболочки и полного пользовательского окружения, вы не сможете это сделать. Если вы думаете, что можете это сделать, я думаю, вам не хватает экспертизы.

Что нужно в Linux?

Цитируя Ричарда Столлмана:

Существует действительно Linux, и эти люди его используют, но это лишь часть системы, которую они используют. Linux – это ядро: программа в системе, которая распределяет ресурсы машины между другими запущенными вами программами. Ядро является важной частью операционной системы, но бесполезно само по себе; оно может функционировать только в контексте полноценной операционной системы. Linux обычно используется в комбинации с операционной системой GNU: вся система по сути является GNU с добавленным ядром Linux, или GNU/Linux. Все так называемые дистрибутивы “Linux” на самом деле являются дистрибутивами GNU/Linux.

Многие пользователи не понимают разницы между ядром, которое есть Linux, и всей системой, которую они также называют “Linux”. Неоднозначное использование названия не помогает людям понять. Эти пользователи часто думают, что Линус Торвальдс разработал всю операционную систему в 1991 году, с немного помощью.

Давайте немного упростим это. Для запуска Linux нужны всего 3 вещи:

  1. Аппаратное обеспечение, т.е. компьютер.
  2. Собрание программного обеспечения GNU.
  3. Ядро Linux.

Обратите внимание, что 1 и 2 существовали задолго до 3. См. GNU Hurd.

Неправильный подход

Как заметил Маркус в своем ответе, и как вы выяснили, возможность иметь несколько пользователей является основной ценностью в любом дистрибутиве, потому что это была основная ценность в UNIX. См.:

Я выбрал приведенные выше 2 ссылки, чтобы проиллюстрировать две вещи:

  1. UNIX был дорогим, но поскольку это были ранние дни сетевых вычислений, пользователям было легче делиться одним основным компьютером, подключенным через телетайп, т.е. TTY. Это должно показаться знакомым.
  2. Linux задумывался как “бесплатное” решение для UNIX, как описано в статье “захватывание”. Из-за этого концепция многопользовательского режима была воспроизведена.

Таким образом, автору поста не следует пытаться удалить основополагающий принцип дизайна из всех дистрибутивов Linux. Я согласен с тем, что ядро может быть оптимизировано для удаления излишков, но это не должно делаться бездумно.

Настройка ядра – необходимые инструменты

Хотя существует множество сайтов о том, как собрать ядро, я нашел следующие:

Настройка ядра – что убрать

Это рекомендации по тому, что я бы убрал. Как пользователь Gentoo почти 20 лет, я собрал множество ядер из исходников. Существует только один основной раздел в menuconfig, на который следует сосредоточиться в начале, и это Device Drivers. Вы можете безопасно отключить все драйверы, которые не установлены или отсутствуют на ПК. Некоторые распространенные инструменты для определения аппаратного обеспечения на ПК:

  • lspci
  • lsusb
  • lsblk
  • inxi

Сборка и реконструкция ядра таким образом – это итеративный процесс, но в кратце не следует удалять основные части базовой поддержки, т.е. доступ нескольких пользователей. Одна заметка здесь: на системе с обычным ядром можно загружаться в Режим восстановления, т.е. Экстренный режим. См.: Описания режима восстановления (rescue.target) и экстренного режима (emergency.target). Ссылка в принятом ответе действительна, даже несмотря на то, что версия 18.04, потому что поведение SystemD не изменилось.

Ответ или решение

Как обновить ядро до пользовательского с отключенной поддержкой многопользовательского режима

Вы находитесь на грань интересного эксперимента с кастомизацией ядра Linux на вашем бездисплейном сервере Ubuntu. Однако убирание функционала многопользовательской поддержки, как вы уже столкнулись, может привести к серьезным последствиям. Ваша цель – лишь оставить единственного пользователя, но ваши действия вызывают множество проблем. Давайте разберем ситуацию и предложим шаги по ее разрешению.

1. Понимание проблемы

Вы начали с конфигурации ядра 6.8.0-48-generic и отключили CONFIG_MULTIUSER. Это решение оказалось не самым удачным, так как отключение поддержки многопользовательского режима также вывело из строя вызов системного вызова setuid, который необходим для работы многих приложений на основе привилегий пользователей. Поскольку ваш сервер не предоставляет возможности взаимодействовать через SSH или прямой доступ, вы сталкиваетесь с необходимостью в дополнительных действиях для получения оболочки.

2. Суть многопользовательского режима

Удаление поддержки многопользовательской системы нарушает базовые принципы работы операционной системы, разве что вы строите систему с совершенно новой архитектурой. Полное удаление таких структур, как идентификаторы пользователей и системные вызовы для смены UID, не только нарушает работу существующих программ, но и может сделать систему неработоспособной. Это связано с тем, что многие компоненты ОС ожидают наличие многопользовательской среды для своего функционирования.

3. Что можно сделать?

Чтобы вернуть доступ к вашей системе, выполните следующие шаги:

  1. Загруитесь в режиме восстановления:

    • При загрузке системы выберите опцию для перехода в режим восстановления (Recovery Mode) из меню загрузки GRUB. Это даст вам возможность загрузиться с минимальным набором сервисов и получит базовый shell.
  2. Восстановление предыдущего ядра:

    • При загрузке в режиме восстановления проверьте наличие других установленных ядер, выполнив команду ls /boot. Если есть предыдущее ядро, вы можете выбрать его для загрузки.
  3. Ремонт конфигурации ядра:

    • Перезагрузившись в режиме восстановления, обновите конфигурацию ядра, чтобы включить поддержку многопользовательского режима. Это можно сделать с помощью следующей команды в режиме восстановления:
      sudo apt update
      sudo apt install --reinstall linux-image-<ваша версия>
  4. Пересборка ядра:

    • Если вы хотите продолжать эксперименты с кастомизацией ядра, используйте make menuconfig для более детального подхода. Избегайте отключения критических параметров, таких как CONFIG_SETUID и поддержку многопользовательского режима.
  5. Постоянный доступ договоритесь:

    • После того как вы восстановите систему, можете настроить её так, чтобы упростить процессы, которые требуют повышенных привилегий. Например, используйте sudo с конфигурацией, которая позволит выполнять команды без повторного ввода пароля для определённых команд. Это можно сделать, добавив следующие строки в файл /etc/sudoers с помощью visudo:
      your_user ALL=(ALL) NOPASSWD: ALL

4. Заключение

Кастомизация ядра — это увлекательный, но сложный процесс, требующий внимательного подхода к изменениям, особенно в контексте многопользовательской архитектуры Unix-подобных систем. Обратите внимание на важность интеграции ядра с пользовательским пространством, прежде чем удалять функционал, на который завязаны другие системные компоненты. Запомните, что изменение системного ядра требует не только технических знаний, но и понимания структуры операционной системы в целом.

Оцените материал
Добавить комментарий

Капча загружается...