서비스 정의를 만듭니다.

서비스 정의를 만듭니다.

부팅 후 로그인 없이 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
다시 시작=항상
재시작Sec=1
Utmp식별자=%I
TTY경로=/dev/%I
TTYReset=예
TTYVHangup=예
TTYVTDisallocate=예
SendSIGHUP=예

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

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

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

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

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

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

당신이 선택한다고 가정 해 봅시다 tty5.

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

시스템 부트스트랩에서 서비스가 자동으로 시작되는지, 즉 "활성화"되어 있는지 확인해야 합니다.

systemctl 활성화[이메일 보호됨]

대안

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

템플릿이 아닌 서비스

[email protected]have 대신 my-terminal-ui.service에 장치의 터미널 장치 이름을 %I(말) 로 바꿔서 고정하십시오 tty5.

와 다른 선택을 더 쉽게 할 수 있기 때문에 이것을 템플릿 정의로 제공했습니다 tty5.

중 하나를 사용하여autovt@ttyN자신의 이름 대신

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

이 접근 방식의 장점은 서비스를 활성화하거나 귀찮게 할 필요가 없으며 NAutoVTs사용자가 커널 가상 터미널 #5로 전환할 때마다 서비스를 시작하기 위해 로그인 상태를 유지할 수 있다는 것입니다.

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

편집하다getty@ttyN

사람들은 일을 하는 방법에 푹 빠져 있으며 /etc/ttys수정 을 일을 하는 방법으로 /etc/inittab봅니다 . [email protected]그들은 다음과 같은 명령을 실행합니다.

systemctl 편집[이메일 보호됨]

다음과 같은 재정의를 추가합니다.

[서비스]
# 이 공백 과제는 잘못 인쇄된 것이 아닙니다.
실행시작=
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(만족스럽지 않은 경우) 에서 로 변경하는 것이 간단합니다. on 대신에 tty8인스턴스화하면 됩니다 . 에서 로컬 사용자 정의 세트를 선택 취소한 다음 에서 다시 만드는 것은 다소 어렵습니다 .tty8tty5[email protected][email protected]

앨리어싱autovt@tty5my-terminal-ui@tty5

[email protected]이는 분명히 편집의 논리적 진행 과정입니다 .autovt@ttyN별칭은여기서 무엇을 시작하려고 하든다른 것으로 대체할 수 있는 메커니즘getty@ttyN.

그러나 이름을 직접 사용하는 것과 마찬가지로 앞에서 언급한 단점이 있습니다 [email protected]. 즉, logind의 시도와 관련된다는 점입니다.로그인 서비스를 시작하지 않음당신이 원하는 것이 아닐 수도 있습니다. 실제로는무엇이든 될 예정이야수요-여기서 시작했어요로그인으로.

추가 읽기

답변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은 그 사이에 있습니다. 내 컴퓨터에는 가 있고 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

이것이 최선의 해결책인지는 모르겠지만 작동하고 있으며 부팅 후 설치 프로그램이 표시됩니다.

관련 정보