서비스 정의를 만듭니다.

서비스 정의를 만듭니다.

Centos가 시작 후 로그인 없이 tui(ncurses 프로그램)를 표시하도록 하고 싶습니다. 로그인 프롬프트를 표시하고 싶지 않습니다.

프로그램 기능: 네트워크 구성, 다시 시작, 종료

이것을 달성할 수 있는 방법이 있나요?

답변1

M. Dickey의 체계적인 답변은 약간 모호합니다. 다음은 시스템 운영 체제의 세부 정보입니다.

로그인 프롬프트를 표시하는 서비스는 로그인 서비스 [email protected]와 같은 템플릿의 인스턴스 입니다. 이러한 최종 장치에서 자체 서비스로 교체하려면 두 가지 작업을 수행해야 합니다.[email protected]tty6

서비스 정의를 만듭니다.

이는 매우 간단합니다.

# /etc/systemd/system/[이메일 보호됨]

[단위]
설명=%I의 사용자 정의 사용자 인터페이스
문서=https://unix.stackexchange.com/a/318336/5132
충돌=getty@%I.service
이전=getty.target

[제공하다]
ExecStart=/usr/local/sbin/my-custom-user-interface
표준입력=tty
표준출력=tty
재시작=항상
다시 시작 초=1
Utmp식별자=%I
TTY경로=/dev/%I
TTY 재설정=예
TTYV 끊기=예
TTYVT할당 해제=예
SIGHUP=YES 보내기

[설치하다]
WantedBy=다중 사용자.대상

이것은주형커널 가상 터미널 장치의 이름을 템플릿 매개변수로 사용하여 인스턴스화되는 서비스 단위입니다.

부팅 시 서비스가 자동으로 시작되는지 확인하세요.

이것이 더 복잡한 부분이다.

우선, 결정해야 합니다.어느실행될 커널 가상 터미널 장치입니다. 여기에는 몇 가지 정보가 적용됩니다.

  • Fedora 세계에서는 2008년부터 GUI가 최초의 커널 가상 터미널 장치를 사용합니다 tty1. 해당 가상 터미널 장치를 사용하지 않고 GUI를 사용하지 않도록(또는 수동으로 조정) 선택해야 합니다.
  • NAutoVTssystemd의 logind는 구성 파일 에 설정된 최대값 까지 커널 가상 터미널에서 로그인 서비스 시작을 요청하려고 시도합니다 logind.conf. 이것이 tty1기본값 입니다 tty6.
  • 이는 tty7Fedora의 세계를 무료로 만듭니다. 그러나 데비안 세계에서는 데비안이 이제 시스템 운영 체제이지만 그래픽 사용자 인터페이스가 사용됩니다 tty7. 데비안으로의 포팅을 고려할 수도 있습니다.
  • 시스템 세계에서는 커널 가상 터미널 #6을 "항상 존재하는" 로그인 프롬프트로 만들려고 노력하고 있으며 머슬 메모리를 사용하면 +를 눌러 해당 프롬프트를 얻을 수 있습니다 Control.AltF6

당신이 선택한다고 가정합니다 tty5.

사용자가 커널 가상 터미널 #5 로 전환할 때마다 주문형 시작( [email protected]다른 이름임) 에서 로그인을 중지해야 합니다. 설정을 6에서 4로 낮추면 [email protected]됩니다 .NAutoVTslogind.conf

시스템 부팅 시 서비스가 자동으로 시작되는지 확인해야 합니다(예: "활성화").

시스템 제어 활성화[이메일 보호됨]

대안

이를 수행하는 다른 방법이 있습니다.

템플릿이 아닌 서비스

(예를 들어)로 교체하여 최종 장치 이름을 장치에 [email protected]직접 배선하는 대신 .my-terminal-ui.service%Itty5

.tty5

다음 중 하나를 사용하세요.autovt@tty질소자신의 이름 대신

서비스 정의로 사용할 이름을 결정합니다. 이는 템플릿의 인스턴스화를 재정의합니다./etc/systemd/system/[email protected][email protected]

이 접근 방식의 장점은 서비스를 활성화하는 데 전혀 신경 쓸 필요가 없으며 NAutoVTs사용자가 커널 가상 터미널 #5로 전환하는 한 로그인 상태를 유지하여 요청 시 서비스를 시작할 수 있다는 것입니다.

단점은 주문형 시작 메커니즘이 설계되었다는 것입니다.로그인 프로세스를 실행하지 않음사용되지 않는 커널 가상 터미널에서. 따라서 시스템이 부팅될 때 서비스가 실행되지 않고 처음으로 커널 가상 터미널 #5를 활성화할 때만 실행됩니다. 이런 종류의 주문형 스타트업은 당신이 원하는 것이 아닐 수도 있습니다. 사용자 정의 시스템의 다른 부분에서는 서비스를 기대할 수 있습니다.이미 실행 중예를 들어 부트로더로 시작합니다.

편집하다getty@tty질소

사람들은 일이 수행되는 방식에 집착하게 되고 /etc/ttys일 이 수행되는 방식에 따라 /etc/inittab변화를 보게 됩니다. [email protected]그들은 다음과 같은 명령을 실행합니다

시스템 제어 편집기[이메일 보호됨]

재정의 문을 추가하십시오.

[제공하다]
# 이 공백 작업은 인쇄 오류가 아닙니다.
실행 시작 =
ExecStart=/usr/local/sbin/my-custom-user-interface

여기에는 몇 가지 문제가 있습니다.

서비스를 제공하다그게 게티야{ a, min, f} getty프로그램을 실행하지 않는 것은 유지 관리하기 쉬운 아이디어가 아닙니다. 몇 년 후, 여기서 수행한 작업을 잊어버리거나 다른 사람이 그러한 시스템의 관리를 맡게 되면 getty"getty" 서비스가 항상 유틸리티를 실행하는 것은 아니라는 사실이 분명하지 않을 것입니다.

[email protected]공간 이라고 생각하지 마세요이 터미널에서 실행되는 모든 것, 필요에 따라 수정합니다. 이것은 실제로 시스템적인 사고방식이 아닙니다. [email protected]"getty" 프로그램을 실행합니다. 완전히 다른 프로그램을 실행하고 "getty" 서비스 같은 것을 실행하지 않는 서비스는 별도의 서비스 정의 자체여야 합니다.

추가적으로: 별도의 서비스 정의를 통해 서비스를 "getty" 서비스와 같은 것으로 정의하지 않을 수 있습니다. 위의 서비스 정의는 다음을 포함하여 "getty" 서비스의 동작 대부분을 복제합니다.화면을 청소하기 위해 노력하세요(세상이 당신이 원하는 대로). 그러나 실제로 "로그인" 서비스가 아닌 서비스를 TTYReset=yes계속 사용 하고 싶지 않을 수도 있고 화면을 너무 적극적으로 지우고 싶지 않을 수도 있습니다.utmpx

또한 개별 서비스 정의는 나중에 변경하기가 더 쉽습니다. 위의 템플릿을 사용하면 tty5(만족스럽지 않은 경우) 변경하는 것이 tty8간단합니다. tty8on 대신에 인스턴스화하면 됩니다 tty5. 로컬 사용자 정의 세트를 실행 취소 [email protected]한 다음 다시 만드는 것은 다소 어려울 수 있습니다 [email protected].

autovt@tty5별칭my-terminal-ui@tty5

[email protected]이것은 분명히 편집의 논리적 진행입니다 .autovt@tty질소별칭은 다음과 같습니다.여기서부터 어디서 시작하든 상관없어다른 것으로 대체할 수 있는 메커니즘getty@tty질소.

하지만 이름을 직접 사용하는 것과 마찬가지로 위에서 언급한 것과 동일한 단점도 있습니다 [email protected]. 로그인을 시도해야 하기 때문입니다.로그인 서비스를 시작하지 마십시오이것은 당신이 원하는 것이 아닐 수도 있습니다. 실제로는그게 무슨 뜻이든 간에필요하다-여기서부터 시작해다음을 통해 로그인하세요..

추가 읽기

답변2

getty사용하는 로그인 프로그램을 자신의 프로그램으로 바꾸면 됩니다. 예를 들어 내 Debian 시스템에서 getty통화는 다음 위치에 있습니다 /etc/inittab.

# /sbin/getty invocations for the runlevels.
#
# The "id" field MUST be the same as the last
# characters of the device (after "tty").
#
# Format:
#  <id>:<runlevels>:<action>:<process>
#
# Note that on most Debian systems tty7 is used by the X Window System,
# so if you want to add more getty's go ahead but skip tty7 if you run X.
#
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6

# Example how to put a getty on a serial line (for a terminal)
#
#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100

# Example how to put a getty on a modem line.
#
#T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3

그리고 데비안은 실제로 다음을 사용합니다 agetty:

NAME   
       agetty - alternative Linux getty


SYNOPSIS
       agetty  [-8chiLmnsUw]  [-a  user]  [-f  issue_file] [-H login_host] [-I
       init] [-l login_program] [-t timeout] port baud_rate,...  [term]

그리고 다음을 사용하여 다양한 프로그램을 호출할 수 있습니다.-l옵션:

   -l, --login-program login_program
          Invoke the specified login_program instead of /bin/login.   This
          allows the use of a non-standard login program (for example, one
          that asks for a dial-up password or that uses a different  pass‐
          word file).

전용 프로그램은 각 "tty"에서 실행될 수 있습니다. 이렇게 하는 경우 유지 관리를 위해 시스템에 직접 로그인할 수 있는지 확인해야 합니다. 이는 단일 사용자 모드일 수도 있고 SSH를 통해 이루어질 수도 있습니다. 이러한 getty정의는 ssh에는 적용되지 않습니다.

CentOS7에서는 systemd를 사용하면 상황이 다르게 구성되지만 최종 결과는 동일합니다. 이용시 systemctl list-unit-files관련 서비스는 입니다 [email protected]. 다른 서비스와 마찬가지로 이 서비스도 사용자 정의할 수 있습니다. locate단서를 얻으려면 다음을 사용하십시오 .

/etc/selinux/targeted/modules/active/modules/getty.pp
/etc/systemd/system/getty.target.wants
/etc/systemd/system/getty.target.wants/[email protected]
/usr/lib/systemd/system/console-getty.service
/usr/lib/systemd/system/[email protected]
/usr/lib/systemd/system/getty.target
/usr/lib/systemd/system/[email protected]
/usr/lib/systemd/system/[email protected]
/usr/lib/systemd/system/multi-user.target.wants/getty.target
/usr/lib/systemd/system-generators/systemd-getty-generator

의 파일에는 /usr/lib/systemd/system/호출이 포함되어 있습니다 agetty(CentOS의 매뉴얼 페이지도 있습니다). 다음을 수정할 수 있습니다.

ExecStart=-/sbin/agetty --noclear --keep-baud pts/%I 115200,38400,9600 $TERM

기호 링크 /usr/lib/systemd/system/multi-user.target.wants/getty.target와 해당 대상에는 getty.target에 대한 호출이 포함되어 있지 않습니다 agetty.

CentOS6은 그 사이 어딘가에 있습니다. 내 컴퓨터에는 CentOS6이 있고 mingetty없습니다 systemd. 매뉴얼 페이지에서:

MINGETTY(8)                Linux Programmer's Manual               MINGETTY(8)


NAME   
       mingetty - minimal getty for consoles

SYNOPSIS
       mingetty  [--noclear] [--nonewline] [--noissue] [--nohangup] [--nohost-
       name]    [--long-hostname]     [--loginprog=/bin/login]     [--nice=10]
       [--delay=5]  [--chdir=/home]  [--chroot=/chroot] [--autologin username]
       [--loginpause] tty


DESCRIPTION
       mingetty is a minimal  getty  for  use  on  virtual  consoles.   Unlike
       agetty(8),  mingetty  is  not  suitable  for serial lines.  I recommend
       using mgetty(8) for this purpose.

예를 들어 다음과 같이 agetty사용자 정의할 수 있습니다.

   --loginprog /bin/login
          Change the login app.

구성 파일로 시작합니다.

# tty - getty
#
# This service maintains a getty on the specified device.
#
# Do not edit this file directly. If you want to change the behaviour,
# please create a file tty.override and put your changes there.

stop on runlevel [S016]

respawn
instance $TTY
exec /sbin/mingetty $TTY
usage 'tty TTY=/dev/ttyX  - where X is console id'

tty.override이에 따라 에 대한 정보를 찾게 됩니다.

은 귀하가 제공한 스크립트입니다 /etc/init/tty.override(tty1의 자동 로그인 예를 보여 주며 스크립트가 수행할 수 있는 작업에 대한 대략적인 아이디어를 제공합니다). $TTY그런데 변수가 설정됩니다( /etc/init/start-ttys.conf이 변수가 속한 initscripts패키지 에는 자세한 문서가 없습니다).

답변3

그래서 인터넷 검색 끝에 두 가지 해결책을 찾았습니다.

https://serverfault.com/questions/323289/replacing-tty-with-a-script-in-centos-6

그리고

https://www.centos.org/forums/viewtopic.php?t=2414

마지막으로 나는 다음과 같은 점을 지적합니다.

1) 다음 내용으로 "/etc/init/launch.conf"를 생성합니다.

start on stopped rc RUNLEVEL=[2345]
stop on runlevel [S016]
respawn
console owner
exec /usr/bin/openvt -c 1 -w -f -- /usr/sbin/setup

이 예에서는 텍스트 모드 설정 도구를 실행합니다.

2) '/etc/init/start-ttys.conf'를 편집하고 tty를 launch로 바꿉니다.

start on stopped rc RUNLEVEL=[2345]

env ACTIVE_CONSOLES=/dev/tty[1-6]
env X_TTY=/dev/tty1
task
script
    . /etc/sysconfig/init
    for tty in $(echo $ACTIVE_CONSOLES) ; do
        [ "$RUNLEVEL" = "5" -a "$tty" = "$X_TTY" ] && continue
        #initctl start tty TTY=$tty
        initctl start launch TTY=$tty
    done
end script

이것이 최선의 해결책인지는 모르겠지만 작동 중이며 부팅 후 설치 프로그램이 나타납니다.

관련 정보