LINUX.ORG.RU
ФорумAdmin

Тонкая настройка systemd на примере Mageia

 , ,


11

6

Споры init или systemd можно вести бесконечно, однако я подумал, что systemd стоит изучить. Особенно пока на форуме присутствует эксперт по этой системе инициализации intelfx.
Итак, я поставил Mageia, смотрю... Так, /sbin/init присутствует, правда он является симплинком на /lib/systemd/systemd. А вот /etc/inittab естественно нет, потому что это не init. Ладно, читаю руководства... написано что вместо скриптов теперь тут юниты, присутствующие в целых трех каталогах: /lib/systemd, /etc/systemd и /run/systemd, а вот для вывода списка всех юнитов следует использовать команду:

systemctl list-units --type target --all
Но нужный мне юнит я так и не нашёл. Мне нужно сделать так, чтобы отключить запуск GUI в Mageia 4.1. Вот первый вопрос.
Второй вопрос, вместо systemctl вообще непосредственное редактирование файлов можно использовать или это невозможно в принципе?
Третий вопрос: Вне зависимости от того какая система инициализации, Линукс должен остаться Линуксом, то есть любой компонент системы должен быть настраиваемым. Вот сейчас я хочу тонко настроить процесс загрузки. Куда мне нужно залезть, чтобы getty заменить на mingetty, чтобы была возможность прописать текстовый автологин? Остальные вопросы будут потом.

★★★★★

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

  • Да, в целых трёх, но у них разное предназначение.
    • /lib — «стандартные»/дистрибутивные;
    • /etc — твои личные;
    • /run — временные, создаваемые командами вида systemd-run и systemctl --runtime <чего-нибудь>.
  • systemctl list-units (во всех своих вариантах) показывает только «загруженные» юниты, т. е. те, к которым было хотя бы одно обращение.

    Если не нашёл — посмотри systemctl list-unit-files.

    Ну и да, что ты ищещь, собственно?

  • Так или иначе, вопрос отключения запуска GUI решается с помощью systemctl set-default multi-user.target.
  • Залезть нужно в /usr/lib/systemd/system/getty@.service и поправить его согласно требованиям. Только не прямо там поправить, а скопировать в /etc/systemd/system и поправить уже там, чтобы при апдейте не перезаписался.

    А если ты хочешь поправить небольшую часть юнита (в твоём случае — только директиву ExecStart=), то лучше будет сделать вот что:

    • создать директорию /etc/systemd/system/getty@.service.d
    • в ней файл с произвольным названием и расширением .conf
    • в нём указать только заменяемую директиву (так, как будто ты её дописываешь в конец юнит-файла):
      [Service]
      ExecStart= # очищаем список команд для запуска (их может быть больше одной, пустая директива отменяет все предыдущие)
      ExecStart=/bin/mingetty <что-угодно>
      
    «Лучше» этот способ потому, что так твоё изменение будет накладываться на исходный юнит, а не полностью его заменять. Впрочем, в данном случае пофиг — вряд ли в дистрибутиве так часто меняют getty@.service.

Как-то так.

Маны: systemctl(1), systemd.service(5).

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

P. S.: Да, конечно, юниты можно и нужно редактировать руками. Есть и systemctl set-property, но там как раз не все свойства поддерживаются.

Только не забудь после редактирования юнитов или расстановки симлинков сделать systemctl daemon-reload, т. е. перечитать юниты.

intelfx ★★★★★
()

Мне нужно сделать так, чтобы отключить запуск GUI в Mageia 4.1.

Если магея с кедами, то

systemctl disable kdm.service

и/или

GRUB_CMDLINE_LINUX="... text"
Deleted
()
Последнее исправление: Deleted (всего исправлений: 2)
Ответ на: комментарий от intelfx

Ага, понял почему systemctl лучше редактирования руками.
А такой ещё вопрос: каково назначение подкаталогов в /lib/systemd?

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

почему systemctl лучше редактирования руками.

systemctl set-property не лучше редактирования руками.

каково назначение подкаталогов в /lib/systemd?

  • system — юниты для «системного режима» (когда systemd — PID 1)
  • user — юниты для «пользовательского режима (да, такой есть; отдельный systemd запускается для каждого пользователя при его первом логине)
  • {system,user}-generators — генераторы юнитов (программы, которые неявно запускаются при каждом daemon-reload'е и могут динамически создавать юниты в /run/systemd)
  • {system,user}-preset — т. н. „пресеты“ (наборы юнитов, которые нужно включить/отключить по умолчанию; предполагается, что их будут писать дистрибутивы)
  • system-sleep — скрипты-хуки, запускаемые до/после ухода в сон/гибернацию
  • system-shutdown — скрипты-хуки, запускаемые непосредственно перед остановкой системы
  • network — файлы конфигурации systemd-networkd (похожи на юниты, но не юниты)
  • catalog[/inline ] -- "база данных" аннотаций к сообщениям в журнале; особо никем не используется [/list]
intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Я так понял все юниты в которые может пригодиться лезть администратору находятся в /lib/systemd/system
Что стало с udev после слияния с systemd? Как будто файлы правил в /lib/udev/rules.d стали короче. А как вернуть сетевым интерфейсам привычные имена eth0 и wlan0?

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

Я так понял все юниты в которые может пригодиться лезть администратору находятся в /lib/systemd/system

И в /lib/systemd/user, если ты пользуешься «пользовательским режимом» systemd. А в остальных поддиректориях лежат не юниты.

Что стало с udev после слияния с systemd?

Ничего особенного. Одно интегрировали с другим, теперь из udev можно запускать произвольные юниты (так, чтобы они автоматически останавливались при исчезновении тех устройств, в связи с которыми юнит был запущен) и создавать .device-юниты для устройств.

А как вернуть сетевым интерфейсам привычные имена eth0 и wlan0?

net.ifnames=0 в командную строку ядра или пустой файл в /etc/systemd/network/99-default.link.

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

Так, я переключился на уровень запуска multi-user и поменял в настройках загрузчика параметры ядра: убрал splash и добавил net.ifnames=0. Теперь я загружаюсь в чистой консоли и могу читать всё что на неё выводится, начиная от сообщений загрузчика. Вернее мог бы читать, но не успеваю, потому что экран очищается перед приглашением login. В getty@.service прописано:

ExecStart=-/sbin/agetty --noclear %I
Параметр --noclear вроде бы должен запрещать очистку экрана или экран ощищает не agetty, а запускаемый им /bin/login? /etc/login.defs вообще отсутствует. Кстати непонятен синтаксис этой строки, должно же запуститься 6 копий agetty (tty1-tty6), где это прописано?
Также хотелось бы, чтобы велся полный лог консоли, начиная от сообщений загрузчика. Такое возможно реализовать?

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

или экран ощищает не agetty, а запускаемый им /bin/login?
ExecStart=-/sbin/agetty --noclear %I

Над этой строчкой есть комментарий:

# the VT is cleared by TTYVTDisallocate

Соответственно, консоль очищается директивой TTYVTDisallocate=, расположенной ниже по юниту.

Кстати непонятен синтаксис этой строки, должно же запуститься 6 копий agetty (tty1-tty6), где это прописано?

Во-первых, getty@.service — это «шаблон» юнита. Его можно запустить с параметром (напр., systemctl start getty@tty1.service), и этот параметр подставится вместо %I и похожих спецификаторов. Это общий механизм.

Во-вторых, конкретно getty@.service запускается с нужным параметром «по требованию» (при первом переключении на консоль); запуском управляет systemd-logind. По умолчанию это происходит на tty2-tty6; настройка ведётся параметром NAutoVTs= в /etc/systemd/logind.conf (дока).

Также хотелось бы, чтобы велся полный лог консоли

Полный лог консоли (именно консоли) невозможен, т. к. все выводят напрямую в /dev/console, а читать оттуда нельзя. Но запросто можно вести полный лог системы, который будет даже полнее.

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

Какой же я невнимательный! Не заметил комментарий на самом видном месте.

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

В порядке расставленных After=/Before= зависимостей (если запуск юнитов начался одновременно или в том же порядке, что и зависимость между ними). Иначе — не определено (внутри хэш-таблица).

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

В Altlinux у systemctl нет команды set-default и в мане тоже об этом не написано. Как тогда сменить рунлевел? Вручную переопределил симплинк при помощи ln, теперь при загрузке пишет «Welcome to recue mode!»
И ещё. В чем суть префиксов .service, .target, .socket, .wants?

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

Проще всего почитать ман. Я не знаю, какая в альте версия systemd. Так или иначе, ручное создание симлинка должно сработать, потому что внутренняя концепция «включения» юнитов в systemd не менялась никогда.

Напиши, как ты создавал этот самый симлинк. Для справки — надо вот так:

ln -s /usr/lib/systemd/system/<имя-цели>.target /etc/systemd/system/default.target

Что касается .service, .target, .socket, .wants и так далее — во-первых, это суффиксы. Во-вторых, это всё замечательно описано в манах (или, в крайнем случае, у нас в текстовой аннотации ко второму выпуску systemd In Action).

Расскажу вкратце:

  • .service, .target, .socket, .timer, .device, .mount, .automount и .swap — типы юнитов. Они описывают различные сущности, которыми умеет рулить systemd, а именно: демон, группу других юнитов, слушаемый (по типу inetd) сокет, таймер для запуска другого юнита (по типу cron), устройство (в широком смысле — узел в sysfs), точку монтирования, точку автомонтирования и swap-устройство.
  • .requires и .wants — это суффиксы имён специальных per-unit директорий, с помощью которых можно без редактирования юнита дополнить список его Requires- или Wants-зависимостей. Достаточно положить в такую директорию симлинк на нужный юнит.
intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Понял ошибку. Я указал /etc/systemd/system/multi-user.target вместо /usr/lib/systemd/system/multi-user.target

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

On my todo list, как говорится. Есть гораздо более глобальная идея — запилить всеобъемлющий цикл статей (по сути, актуализацию того, что у Леннарта), но времени нет.

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

Я не знаю, какая в альте версия systemd.

201
Всё же я так и не понял как управлять демонами. В init было проще один демон = один скрипт.
Вот я сейчас хочу отключить ненужные мне сервисы mdadm и lvm2. Как это сделать? Есть юниты mdadm.service и mdadm-activation.service. Отключаю. Всё равно запускаются, видимо их зависимости тянут. Решил замаскировать:

# systemctl mask mdadm.service
# systemctl mask mdadm-activation.service
Это правильно?
А что с lvm2 делать вообще не пойму. «systemctl list-units» говорит, что lvm2-activation не запущен, «systemctl --all list-units» что запущен. И просто так его не отключить потому что он запускается в составе группы (target).

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

Это правильно?

Вот в рассылке того же альта, по-моему, очень хорошо по этому поводу сказали:

В systemd включение/отключение сервиса работает только в том случае, если сервис не нужен какому-либо другому сервису.
Если же в системе есть кто-то, кто его хочет — он будет запущен в любом случае.

Т. е., если его (этот юнит) кто-то подтягивает по зависимостям, может, так и надо? Зависимости были не просто так придуманы, в конце концов.

Тем не менее,

  • маскировать можно, только стоит при этом понимать, что делаешь: это тонкая настройка со всеми вытекающими;
  • зависимости можно посмотреть командами systemctl list-dependencies ЮНИТ и systemctl list-dependencies --reverse ЮНИТ.

А что с lvm2 делать вообще не пойму. «systemctl list-units» говорит, что lvm2-activation не запущен, «systemctl --all list-units» что запущен.

Это как? Что ты понимаешь под «запущен»? Запущен — это active.

потому что он запускается в составе группы (target).

Какой?

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

У меня программный RAID не настроен, потому что он мне вообще не нужен. Поэтому при его запуске я получаю только засорение лога сообщениями об ошибках и увеличение времени загрузки и очень хочу его отключить.
В версии 201 опции --reverce походу нет, ошибка.

Это как? Что ты понимаешь под «запущен»?

При загрузке на консоль выводятся сообщения о запуске lvm2.

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

Не срача ради, но почитал тред - ещё больше удивляюсь, почему самые распространённые дистрибутивы поменяли старичка инита на системд. Как-то всё слишком громоздко выглядит.

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

я получаю только засорение лога сообщениями об ошибках и увеличение времени загрузки и очень хочу его отключить.

Тогда, наверное, всё будет в порядке, но не проще ли деинсталлировать? Впрочем, это выглядит как дистробаг, потому что у меня в арче оба установлены и совершенно не мешают при отсутствии в системе томов md/dm/lvm.

Да, ещё насчёт зависимостей. Если какой-то юнит не включен и не является сокет-активируемым, то ещё он может запускаться из правил udev (или откуда-то ещё прямым вызовом systemctl). Но даже если происходит именно это, корректнее деинсталлировать/отключить то, что его вызывает, нежели маскировать юнит.

При загрузке на консоль выводятся сообщения о запуске lvm2.

У lvm более одного юнита. Что говорит list-units (или list-units --all) в столбце ACTIVE напротив проблемных юнитов, и каковы их имена?

P. S.:

В init было проще один демон = один скрипт.

Здесь дело не в ините, а в прикладных программах (в данном случае — в mdadm/lvm2). Если в sysvinit на mdadm и lvm приходилось по одному скрипту, так это только из-за того, что из этого скрипта запускались сразу несколько демонов, а всё остальное (побочные сканирующие процессы, etc) запускалось в обход инита.

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

Если в sysvinit на mdadm и lvm приходилось по одному скрипту, так это только из-за того, что из этого скрипта запускались сразу несколько демонов, а всё остальное (побочные сканирующие процессы, etc) запускалось в обход инита.

Я этого даже не знал. Да и вообще зачем применителю знать что находится во внутреностях скриптов или юнитов.

Тогда, наверное, всё будет в порядке, но не проще ли деинсталлировать?

Деинсталлировать нельзя. В Альте удаление mdadm тянет за собой KDE. Как-нибудь напишу в багзиллу.

Да, ещё насчёт зависимостей. Если какой-то юнит не включен и не является сокет-активируемым, то ещё он может запускаться из правил udev (или откуда-то ещё прямым вызовом systemctl). Но даже если происходит именно это, корректнее деинсталлировать/отключить то, что его вызывает, нежели маскировать юнит.

А если отредактировать зависимости? Каталог /etc/systemd ведь как раз для этого и существует, чтобы вносить откатываемые изменения в юниты.
Собственно теперь вопрос стоит так: как вычислить из какого именно места происходит запуск сервиса? Входные данные задачи такие: 1) версия systemd 201 и команд «systemctl cat service.service» и «systemctl --reverce list-dependencies service.service» тут нет; 2) systemctl list-units говорит, что lvm2 не запущен (все юниты в названии которых упомянается lvm имеют статус inactive) 3)при загрузке на консоль выводится сообщение о загрузке lvm2 «Starting Activation of LVM2 logical volumes»

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

Да и вообще зачем применителю знать что находится во внутреностях скриптов или юнитов.

Незачем. Но мы-то тут пытаемся копаться во внутренностях. «Рядовой применитель systemd» просто делает disable (на том юните, имя которого узнал из мана) и в случае неудачи/недостижения нужного эффекта пишет в багзиллу. But we digress.

А если отредактировать зависимости?

Это настолько же ломовой метод, как и маскировка. Лучше уж тогда замаскировать — изменения будут более локальны.

Собственно теперь вопрос стоит так: как вычислить из какого именно места происходит запуск сервиса?

Ок, поехали.

«systemctl cat service.service»

Не страшно:

cat /{lib,usr/lib,run,etc}/systemd/system/$UNIT{,.d/*.conf}

«systemctl --reverce list-dependencies service.service»

Также не страшно:

systemd-analyze dot $UNIT | dot -Tsvg > tmp.svg && xdg-open tmp.svg
(поставить graphviz, при необходимости заменить xdg-open на предпочитаемый браузер)

при загрузке на консоль выводится сообщение о загрузке lvm2 «Starting Activation of LVM2 logical volumes»

Ага. Плохо, что он не пишет имена юнитов (только описания), но всегда можно погрепать вывод того же list-units.

systemctl list-units говорит, что lvm2 не запущен (все юниты в названии которых упомянается lvm имеют статус inactive)

Значит, тот юнит, который был запущен, имеет Type=oneshot и RemainAfterExit=false.

Так. Значит, сначала грепаем вывод list-units --all:

systemctl list-units --all | grep 'Activation of LVM2'

Дальше делаем systemctl status ЮНИТ. Там заодно будет показана строка «Docs» со ссылками на маны. И заодно запускаем на нём рисователь графа зависимостей (тот самый systemd-analyze dot).

Потом, если явных зависимостей не обнаруживается, а маны не говорят ничего интересного, грепаем /lib/udev/rules.d/* на предмет имени этого юнита.

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

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

Хорошо, как понять это:

[iskatel@lenovo ~]$ sudo systemctl --all --no-pager list-units | grep error
iscsi.service              error  inactive dead      iscsi.service
iscsid.service             error  inactive dead      iscsid.service
lvm2-act...n-early.service error  inactive dead      lvm2-activation-early.servi
lvm2-activation.service    error  inactive dead      lvm2-activation.service
named.service              error  inactive dead      named.service
plymouth-quit-wait.service error  inactive dead      plymouth-quit-wait.service
plymouth-quit.service      error  inactive dead      plymouth-quit.service
plymouth-start.service     error  inactive dead      plymouth-start.service
slapd.service              error  inactive dead      slapd.service
syslog.service             error  inactive dead      syslog.service
update_wms.service         error  inactive dead      update_wms.service
dirsrv.target              error  inactive dead      dirsrv.target
remote-fs-setup.target     error  inactive dead      remote-fs-setup.target
syslog.target              error  inactive dead      syslog.target
[iskatel@lenovo ~]$ sudo systemctl list-dependencies lvm2-activation.service
lvm2-activation.service
[iskatel@lenovo ~]$ sudo systemctl status lvm2-activation.service
lvm2-activation.service
   Loaded: error (Reason: No such file or directory)
   Active: inactive (dead)

мар 28 03:39:11 lenovo lvm[779]: No volume groups found
мар 28 03:39:11 lenovo systemd[1]: Started Activation of LVM2 logical volumes.
мар 28 03:45:29 lenovo systemd[1]: Starting Activation of LVM2 logical volumes...
мар 28 03:45:29 lenovo lvm[773]: No volume groups found
мар 28 03:45:29 lenovo systemd[1]: Started Activation of LVM2 logical volumes.
мар 28 04:19:26 lenovo systemd[1]: Starting Activation of LVM2 logical volumes...
мар 28 04:19:26 lenovo lvm[778]: No volume groups found
мар 28 04:19:26 lenovo systemd[1]: Started Activation of LVM2 logical volumes.
мар 28 21:58:49 lenovo systemd[1]: Starting Activation of LVM2 logical volumes...
мар 28 21:58:49 lenovo lvm[774]: No volume groups found
мар 28 21:58:49 lenovo systemd[1]: Started Activation of LVM2 logical volumes.
[iskatel@lenovo ~]$ sudo find / -name *lvm2-activation.service*
[iskatel@lenovo ~]$ sudo grep -r lvm2 /lib/udev/rules.d
[iskatel@lenovo ~]$
Юнита в системе нет, тем не менее какие-то следы его присутствуют, пока не пойму где они присутствуют.

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

В версии 201 опции --reverce походу нет, ошибка.

Не reverce, а reverse.

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

Это стоит понимать как нечто очень странное.

Я погрепал lvm-activation.service и понял, что эти юниты генерируются на лету средствами lvm2-activation-generator (компонента lvm2) в том случае, если lvmetad не включен (use_lvmetad = 0 в конфиге /etc/lvm/lvm.conf).

Думаю, тут проще всего будет либо включить lvmetad (что в любом случае рекомендуется по ряду причин), в каковом случае lvm-activation.service просто не будет создаваться, а обнаружение LVM-томов будет совершаться динамически, либо (если ты вот совсем не пользуешься LVM) замаскировать-таки lvm-activation.service и lvm-activation-early.service.

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

Ну раз уж здесь идёт раздача пряников,то тоже спрошу:
Я бы хотел чтобы
на tty1 запускалось не getty*bash,а программа htop под рутом(возможно через getty)
На tty2 мс под рутом (возможно через getty)
Остальные как обычные терминалы с автологином под root,
причём желательно чтобы игнорировалась блокировка root в /etc/passwd

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

Весь необходимый бэкграунд (если есть желание разобраться в том, как оно работает) есть здесь (это отдельная тема-мануал о том, как на произвольном VT запустить с автологином иксы) или прямо в этом треде.

Так или иначе, повторюсь ещё раз, уже с упором на практические действия, которые нужно совершить.

  1. Помещаем в /etc/systemd/system/htop@.service следующий файл:
    .include /usr/lib/systemd/system/getty@.service # берём за основу юнит-файл, запускающий getty
    
    [Unit]
    Description=htop on %I
    Documentation= # обнуляем список документации по программе, чтобы он (оставшийся от getty) не вводил администратора в заблуждение
    
    [Service]
    ExecStart=
    ExecStart=/usr/bin/htop
    StandardInput=tty-fail
    StandardOutput=tty
    Environment=
    Environment=TERM=linux HOME=/root # поскольку мы запускаем htop в обход механизмов логина, getty и прочего, нам придётся настроить окружение процесса руками
    KillMode=control-group
    
  2. Просим systemd перечитать юнит-файлы, добавляем созданный юнит в автозапуск (инстанцируя для tty1) и запускаем его (это разные операции!):
    systemctl daemon-reload
    systemctl enable htop@tty1
    systemctl start htop@tty1
    

Полагаю, что не составит труда повторить те же действия для mc. Разумеется, в последнем шаге нужно будет указать уже не tty1, а иной терминал.

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

Тут есть один момент,если терминал брать на прямую,а не через getty или иную программу его получения или логина,то программа оболочка будет работать не совсем корректно,ну там путать символы,не так реагировать на клавиши.

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

Если опция TERM=linux приводит к коректной работе терминала с программой(или на оборот),при этом в конфиге явно указывается tty : TTYPath=/dev/%I ,что как я понимаю позволяет явно указать программе tty для работы,то как ещё понять кроме как попытку сделать getty не нужной?

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

Вы имеете понятие о том, зачем вообще нужна программа getty? Она нужна для работы с реальными аппаратными терминалами, подключенными к последовательным портам. Getty выполняет настройку последовательного порта: чётность, скорость передачи данных, контроль потока и так далее.

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

Это всё можно было сделать и из обычного шелла: TERM=linux some_program <> /dev/ttyN. И systemd здесь ни при чём. Он включает в себя, наверное, один процент функциональности getty. Да и то — не специально «чтобы заменить getty», а просто по той причине, что это общая функциональность, которая много когда бывает нужна.

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

Так то и выходит,для работы с портом человека есть minicom,
для входа по сети ssh,и я не думаю что ему нужна эта утилита.
Так что будет делать getty в systemd дистрибутиве,если systemd может настроить терминал самостоятельно?
Ну может где вместо ssh на компы через COM заходят?
При том что RS232 потихоньку вымирает.
В общем через некоторое время эту программу удалят как не нужную.

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

minicom — это такой getty, у которого вместо /bin/login человек (оператор). Это программа, работающая «с другой стороны» последовательного соединения. Т. е. она совсем для другого.

Так что будет делать getty в systemd дистрибутиве,если systemd может настроить терминал самостоятельно?
Ну может где вместо ssh на компы через COM заходят?

Да, именно так. Она нужна там, где с машинами работают по аппаратным последовательным соединениям. В каком-нибудь embedded-е, например.

В общем через некоторое время эту программу удалят как не нужную.

Вполне вероятно (для типичных «десктопных» дистрибутивов). Но, прошу заметить, не потому что «systemd её заменил», а потому что она вообще не нужна на типичном компьютере. Сейчас задача getty сводится лишь к тому, чтобы спросить имя пользователя. Это стрельба из пушки по воробьям.

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

К стати есть одна проблема,есть у меня догадка,что systemd запускает htop только после первого обращения к терминалу.
Как сделать чтобы он запускался сразу,без ожидания обращения к нему?
А то я об этом htop порой вспоминаю по случаю исчерпания памяти,
и хотя пока в этом варианте такого не случалось,но вообще бывают случаи,когда для загрузки htop памяти просто не хватает.

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

Нет, в описанном случае он запускается при старте компьютера. Это можно проверить: после загрузки, не переключаясь на этот терминал, из какого-либо другого терминала сделайте вот эту команду:

systemctl status htop@ttyN
Где ttyN — тот терминал, на котором htop должен быть запущен. В выводе команды будет указан конкретный PID (идентификатор процесса), присвоенный запущенному htop-у.

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

Во-первых — не сузит, поскольку речь идёт только о стандартной поставке. Никто же не будет выкидывать getty из репозиториев только по той причине, что в большинстве случаев она не нужна.

Во-вторых — это уже вопрос не к systemd, а к разработчикам конкретного дистрибутива (которые примут решение об исключении getty из стандартной поставки).

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

Вероятно, это как-то связано с modesetting'ом (сменой режима работы дисплея, в частности, при переключении из графического режима в консоль и обратно). Так или иначе — дело точно не в systemd.

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

Смысл слова «репозиторий» понятен? Программа может быть штатным способом поставлена, но по умолчанию не поставлена.

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

Я вот на днях самостоятельно без подсказок на форумах освоил ещё один приём systemd с использованием символа @. Запуск openvpn для игры YandexRoot. Все делалось элементарно. Конфиг кладётся сюда:

/etc/openvpn/client/yaroot.conf
Затем делаем:
# mkdir /var/run/openvpn
# systemctl enable openvpn-client@yaroot.service
# systemctl start openvpn-client@yaroot.service
Симплинк /etc/systemd/system/multi-user.target.wants/openvpn-client@yaroot.service при этом создаётся автоматически и демон начинает работать. Только нужно озаботиться как-то о пересоздании директории /var/run/openvpn при перезагрузке компьютера, без неё не работает.
Вроде просто, но init всё равно был лучше, принцип бритвы Оккама всё-таки «Не плоди лишних сущностей без необходимости».

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

Принцип Оккама всё-таки совсем не о том.

Ну а что до шаблонных юнитов — да, именно для таких случаев они и были придуманы. Директорию можно создавать через systemd-tmpfiles (и вообще, это забота мейнтейнеров — положить куда нужно файлики), но нам вроде как и не потребовалось, openvpn стартанул без вмешательств...

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
12 февраля 2016 г.
Ответ на: комментарий от intelfx

Слава, intelfx'у!

Я позавидовал(в хорошем плане), твоему терпению! :))

MaksVal
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.