- Вопрос или проблема
- Что нужно в Linux?
- Неправильный подход
- Настройка ядра – необходимые инструменты
- Настройка ядра – что убрать
- Ответ или решение
- Как обновить ядро до пользовательского с отключенной поддержкой многопользовательского режима
- 1. Понимание проблемы
- 2. Суть многопользовательского режима
- 3. Что можно сделать?
- 4. Заключение
Вопрос или проблема
Я экспериментирую с настройкой ядра на своем безголовом сервере 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 вещи:
- Аппаратное обеспечение, т.е. компьютер.
- Собрание программного обеспечения GNU.
- Ядро Linux.
Обратите внимание, что 1 и 2 существовали задолго до 3. См. GNU Hurd.
Неправильный подход
Как заметил Маркус в своем ответе, и как вы выяснили, возможность иметь несколько пользователей является основной ценностью в любом дистрибутиве, потому что это была основная ценность в UNIX. См.:
- Какова необходимость нескольких пользователей в linux? [дубль] – Хотя это дубль, прочитайте принятый ответ.
- Люди в 80-х думали, что Unix завоюет мир. Вот почему они были правы.
Я выбрал приведенные выше 2 ссылки, чтобы проиллюстрировать две вещи:
- UNIX был дорогим, но поскольку это были ранние дни сетевых вычислений, пользователям было легче делиться одним основным компьютером, подключенным через телетайп, т.е. TTY. Это должно показаться знакомым.
- Linux задумывался как “бесплатное” решение для UNIX, как описано в статье “захватывание”. Из-за этого концепция многопользовательского режима была воспроизведена.
Таким образом, автору поста не следует пытаться удалить основополагающий принцип дизайна из всех дистрибутивов Linux. Я согласен с тем, что ядро может быть оптимизировано для удаления излишков, но это не должно делаться бездумно.
Настройка ядра – необходимые инструменты
Хотя существует множество сайтов о том, как собрать ядро, я нашел следующие:
- Сборка своего собственного ядра Linux (Debian) – Краткое, но подробное объяснение шагов. См. раздел 4.3 в справочнике ниже, так как автор поста использует безупречный подход.
- Справочник по ядру Linux для Debian – Всегда используйте предпочитаемый вашим дистрибутивом метод сборки ядра.
Настройка ядра – что убрать
Это рекомендации по тому, что я бы убрал. Как пользователь 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. Что можно сделать?
Чтобы вернуть доступ к вашей системе, выполните следующие шаги:
-
Загруитесь в режиме восстановления:
- При загрузке системы выберите опцию для перехода в режим восстановления (Recovery Mode) из меню загрузки GRUB. Это даст вам возможность загрузиться с минимальным набором сервисов и получит базовый shell.
-
Восстановление предыдущего ядра:
- При загрузке в режиме восстановления проверьте наличие других установленных ядер, выполнив команду
ls /boot
. Если есть предыдущее ядро, вы можете выбрать его для загрузки.
- При загрузке в режиме восстановления проверьте наличие других установленных ядер, выполнив команду
-
Ремонт конфигурации ядра:
- Перезагрузившись в режиме восстановления, обновите конфигурацию ядра, чтобы включить поддержку многопользовательского режима. Это можно сделать с помощью следующей команды в режиме восстановления:
sudo apt update sudo apt install --reinstall linux-image-<ваша версия>
- Перезагрузившись в режиме восстановления, обновите конфигурацию ядра, чтобы включить поддержку многопользовательского режима. Это можно сделать с помощью следующей команды в режиме восстановления:
-
Пересборка ядра:
- Если вы хотите продолжать эксперименты с кастомизацией ядра, используйте
make menuconfig
для более детального подхода. Избегайте отключения критических параметров, таких какCONFIG_SETUID
и поддержку многопользовательского режима.
- Если вы хотите продолжать эксперименты с кастомизацией ядра, используйте
-
Постоянный доступ договоритесь:
- После того как вы восстановите систему, можете настроить её так, чтобы упростить процессы, которые требуют повышенных привилегий. Например, используйте
sudo
с конфигурацией, которая позволит выполнять команды без повторного ввода пароля для определённых команд. Это можно сделать, добавив следующие строки в файл/etc/sudoers
с помощьюvisudo
:your_user ALL=(ALL) NOPASSWD: ALL
- После того как вы восстановите систему, можете настроить её так, чтобы упростить процессы, которые требуют повышенных привилегий. Например, используйте
4. Заключение
Кастомизация ядра — это увлекательный, но сложный процесс, требующий внимательного подхода к изменениям, особенно в контексте многопользовательской архитектуры Unix-подобных систем. Обратите внимание на важность интеграции ядра с пользовательским пространством, прежде чем удалять функционал, на который завязаны другие системные компоненты. Запомните, что изменение системного ядра требует не только технических знаний, но и понимания структуры операционной системы в целом.