최소한의 시스템 시작으로 가상 콘솔에서 getty를 시작하려면 무엇이 필요합니까?

최소한의 시스템 시작으로 가상 콘솔에서 getty를 시작하려면 무엇이 필요합니까?

SysV의 경우 getty 항목, 바이너리, 셸 바이너리 및 공유 라이브러리, PAM /security/shadow 콘텐츠 및 일부 장치 파일을 다시 생성 init해야 합니다 ./etc/inittab/sbin/initlogingetty

upstart거의 동일한 요구 사항이 필요하지만 필요하지 않기 때문에 /etc/inittab아래에 몇 가지 *.conf파일이 있습니다. 런레벨 설정을 /etc/init위한 *.conf 및 적절한 런레벨 Reborn tty에서 해당 tty의 각 boot/에 대한 *.conf 입니다.start on startuptelinitgetty

어떤 구성과 바이너리가 필요합니까 systemd init?

내가 찾은 모든 문서는 설치된 시스템을 사용하여 서비스를 시작하고 중지하는 방법에 초점을 맞춘 것 같습니다.

실행에서 복사된 최소 파일 목록(kernel/initrd 제외)아치또는페도라 모자설치는 잘 작동하지만 이에 대한 정보를 찾을 수 없는 것 같습니다 systemd.


내가 알고 싶은 것은 initramfs 에서 호출되기 systemd위해 필요한 파일과 포함해야 하는 파일이 무엇인지입니다 .switch_rootsystemd /sbin/init


upstart바이너리와 두 파일의 예 *.conf:

문서 /etc/init/whatever.conf:

부팅 시 시작
런레벨 발행
스크립트
  원격 초기화 2
최종 스크립트

문서 /etc/init/tty1.conf:

런레벨로 시작 [12345]
갱생
/sbin/agetty -8 --noclear 38400 tty1 linux 실행

sysvinit, 바이너리 및 1개의 conf 파일 이름은 다음과 같습니다 /etc/inittab.

id: 2: 초기화 기본값:
c1:12345:respawn:/sbin/agetty 38400 tty1 리눅스

이제 나는 systemd동등한 것을 찾고 있습니다.

and 가 포함된 항목 중 하나가 있는 곳에 적어도 *.service1개의 파일이 필요하다고 가정합니다 . 그런데 또 무엇이 필요합니까?[Service]ExecStart=-/sbin/agetty --noclear %I linuxRestart=always

답변1

우선, systemd전통적인 Unix가 아닙니다 init. Systemd에는 훨씬 더 많은 기능이 있으므로 두 가지를 비교하는 것은 약간 불공평합니다.

이 질문에 대답하려면 일부 바이너리와 다음 구성 파일이 필요한 것 같습니다.

/usr/lib/systemd/system/default.target
/usr/lib/systemd/system/basic.target
/usr/lib/systemd/system/sysinit.target
/usr/lib/systemd/system/getty.target
/usr/lib/systemd/시스템/[이메일 보호됨]
/usr/lib/systemd/system/console-getty.service

그런 다음 다음 심볼릭 링크를 생성하려면 다음을 실행하십시오.systemctl enable console-getty.service [email protected]

/etc/systemd/system/default.target.wants/[이메일 보호됨]-> /lib/systemd/system/getty@service
/etc/systemd/system/getty.target.wants/console-getty.service -> /lib/systemd/system/console-getty.service

노트systemd: 동적으로 시작하고 +를 누를 때 요청 시 시작하는 특수 기능을 활용하려면 agetty최소한 다음 두 파일도 있어야 하는 것 같습니다.AltF3

/etc/systemd/logind.conf
/lib/systemd/시스템/[이메일 보호됨]

[email protected]심볼릭 링크는 어디에 있습니까 [email protected]?

구성 파일 내용:

플래그 및 (아마도) , 를 제외하고 default.target파일 getty.target은 비어 있을 수 있습니다.sysinit.target[Unit]Description=xxx

basic.target종속성 정보도 포함됩니다.

[단위]
설명=기본 시스템
요구=sysinit.target
원하는=sockets.targettimers.targetpaths.targetslices.target
이후=sysinit.targetsockets.targettimers.targetpaths.targetslices.target

파일로 존재하지 않는 대상에 대한 참조가 필요한지 잘 모르겠습니다. 그들은에 설명되어 있습니다systemd.special(7)맨 페이지.


console-getty.service: (콘솔에서 agetty의 특별한 경우)

[단위]
Description=ConsoleGetty
이후=systemd-user-sessions.service plymouth-quit-wait.service
이전=getty.target

[제공하다]
ExecStart=-/sbin/agetty --noclear --keep-baud 콘솔 115200,38400,9600 $TERM
유형=유휴
재시작=항상
다시 시작 시간 = 0
UtmpIdentifier=단점
TTYPath=/dev/console
TTY 재설정=예
TTYV 끊기=예
KillMode=프로세스
SIGPIPE 무시=아니요
SIGHUP=YES 보내기

[설치하다]
WantedBy=getty.target

[email protected]:(콘솔을 제외한 모든 getty 서비스에 대한 공통 구성)

[단위]
설명=%I의 게티
이후=systemd-user-sessions.service plymouth-quit-wait.service
이전=getty.target
격리 무시 = 예
조건부 경로 존재=/dev/tty0

[제공하다]
ExecStart=-/sbin/agetty --noclear %I $TERM
유형=유휴
재시작=항상
다시 시작 시간 = 0
Utmp식별자=%I
TTY경로=/dev/%I
TTY 재설정=예
TTYV 끊기=예
TTYVT할당 해제=아니요
KillMode=프로세스
SIGPIPE 무시=아니요
SIGHUP=YES 보내기

[설치하다]
WantedBy=getty.target
기본 인스턴스=tty1

마지막으로 몇 가지 특별한 바이너리가 필요할 수 있습니다(어느 것이 중요한지는 시도하지 않았습니다).

/lib/systemd/systemd (/sbin/init는 일반적으로 이것을 가리킵니다)
/lib/systemd/systemd-로그인
/lib/systemd/systemd-cgroups-agent
/lib/systemd/systemd-사용자-세션
/lib/systemd/systemd-vconsole-setup
/lib/systemd/systemd-update-utmp
/lib/systemd/systemd-수면
/lib/systemd/systemd-sysctl
/lib/systemd/systemd-initctl
/lib/systemd/systemd-reply 비밀번호
/lib/systemd/systemd-ac-power
/lib/systemd/systemd-활성화
/lib/systemd/systemd-백라이트
/lib/systemd/systemd-binfmt
/lib/systemd/systemd-bootchart
/lib/systemd/systemd-bus-proxyd
/lib/systemd/systemd-coredump
/lib/systemd/systemd-cryptsetup
/lib/systemd/systemd-fsck
/lib/systemd/systemd-호스트 이름
/lib/systemd/systemd-저널드
/lib/systemd/systemd-journal-gatewayd
/lib/systemd/systemd-journal-remote
/lib/systemd/systemd-localed
/lib/systemd/systemd-machined
/lib/systemd/systemd-모듈-로드
/lib/systemd/systemd-multi-seat-x
/lib/systemd/systemd-networkd
/lib/systemd/systemd-networkd-wait-online
/lib/systemd/systemd-quotacheck
/lib/systemd/systemd-임의 시드
/lib/systemd/systemd-readahead
/lib/systemd/systemd-remount-fs
/lib/systemd/systemd-해결됨
/lib/systemd/systemd-rfkill
/lib/systemd/systemd-종료
/lib/systemd/systemd-shutdownd
/lib/systemd/systemd-소켓-프록시d
/lib/systemd/systemd-timedated
/lib/systemd/systemd-timesyncd
/lib/systemd/systemd-udevd
/lib/systemd/systemd-업데이트-완료

systemd 시작 프로세스를 요약하면 다음과 같이 작동한다고 생각합니다.

  1. basic.targetsystemd는 (또는 모든 *.target파일을?) 찾습니다 .
  2. 종속성은 및 구성 파일 섹션의 WantedBy=, Wants=, Before=, ... 지시문을 기반으로 해결됩니다 .After=[Install]*.service*.target
  3. *.service시작해야 하는 서비스("특수" 서비스 아님)에는 시작할 실행 파일을 나타내는 [Service]지침이 포함된 섹션이 있습니다.ExecStart=

답변2

systemd터미널로 전환하면 특정 최대 개수까지 getty가 자동으로 생성됩니다. 기본값은 6입니다(따라서 alt+f1에서 alt+f6까지 자동으로 getty를 얻습니다). 이 매개변수를 변경하려면 편집하여 /etc/systemd/logind.conf매개변수를 NAutoVTs다른 숫자(최대 12개)로 변경할 수 있습니다.

getty를 생성하려면 수동으로 전환하지 않더라도 이 디렉터리에 심볼릭 링크를 추가할 수 있습니다./usr/lib/systemd/system/[email protected]/etc/systemd/system/getty.target.wants/

ln -sf /usr/lib/systemd/system/[email protected] /etc/systemd/system/getty.target.wants/[email protected]

getty.target이로 인해 서비스가 하나 더 필요 하게 됩니다 getty@. 대상은 종속성을 지원하는 런레벨을 대체하여 생성해야 하는 서비스 모음입니다. 기본 대상은 다음에 따라 다릅니다.getty.target

보다ArchWiki의 systemd FAQ

편집하다: 좀 더 조사해봤는데문서.

시작되면 systemd데몬은 대상의 모든 시스템 default과 해당 종속성을 로드합니다. 목표는 파일로 정의됩니다.

/etc/systemd/system/default.target
/usr/lib/systemd/system/default.target

대상에는 디렉토리의 심볼릭 링크로 지정된 추가 서비스 목록이 있습니다.

/etc/systemd/system/default.target.wants
/usr/lib/systemd/system/default.target.wants

/etc버전에서는 /usr/lib파일 중 하나만 필요하며 .target디렉터리는 필요하지 않습니다 .

gettyinit 스크립트로 실행할 수 있는 서비스 중 하나입니다. 내가 확인한 배포판(fedora, arch)에서는 getty두 가지 다른 방식으로 실행되었습니다.

  1. 각 터미널에 대한 특정 스크립트(다음에 링크된 파일)에 의해 실행됩니다./usr/lib/systemd/system/[email protected]tty 이름은 systemd다음 으로 대체됩니다.)
  2. logind사용자가 가상 ​​터미널로 전환하면 필요에 따라 자동으로 시작됩니다( inetd요청이 도착할 때만 서비스를 시작하는 기존 방식과 유사). logind함께 배포 systemd되고 파일에서 구성을 읽는 다른 데몬입니다 /etc/systemd/logind.conf.

이것이 만족스럽기를 바랍니다.

답변3

몇 가지 실험을 거친 후 한 쌍의 대상 서비스로 시작하기에 충분하다는 것을 알았습니다. 복사한 곳 emergency.service:

[Unit]
DefaultDependencies=no
Description=shell.service: Console and Login

[Service]
Environment=HOME=/root
WorkingDirectory=-/root
ExecStart=-/usr/lib/systemd/systemd-sulogin-shell
ExecStartPost=/usr/bin/openvt -f -c 16 agetty tty16
ExecStartPost=/usr/bin/openvt -f -c 17 -- agetty -p tty17
ExecStartPost=/usr/bin/openvt -f -c 18 -- agetty -p -a USER tty18
Type=idle
StandardInput=tty-force
StandardOutput=inherit
StandardError=inherit
#KillMode=process
KillMode=control-group
IgnoreSIGPIPE=no
SendSIGHUP=yes

테스트용: 배포판의 유닛 디렉터리 이름을 바꾸는 것은 /lib/systemd/systemDEACT유닛/유닛 파일 수를 200에서 10으로 줄이는 간단하지만 철저한 방법입니다. 여전히 가짜 파일이 있습니다.

  UNIT                    LOAD      ACTIVE     SUB       DESCRIPTION
  dev-sda3.device         loaded    activating tentative /dev/sda3
  -.mount                 loaded    active     mounted   Root Mount
  tmp.mount               loaded    active     mounted   /tmp
  init.scope              loaded    active     running   System and Service Manager
  io.service              loaded    inactive   dead      io: usbhid kmod for keyboard
  remount.service         loaded    inactive   dead      remount: rw for / and tmpfs for /tmp
  shell.service           loaded    active     running   shell.service: Console and Login
  -.slice                 loaded    active     active    Root Slice
  system.slice            loaded    active     active    System Slice
* systemd-journald.socket not-found inactive   dead      systemd-journald.socket
* local-fs-pre.target     not-found inactive   dead      local-fs-pre.target
* local-fs.target         not-found inactive   dead      local-fs.target
  mini.target             loaded    active     active    "mini": Minimal Boot and Shell
* swap.target             not-found inactive   dead      swap.target
* umount.target           not-found inactive   dead      umount.target

측면 shell.service(상단 참조) 에는 remount.serviceio.service; 이것은 modprobe usbhid내 (어떤?) USB 키보드에 필수적입니다. 재마운트 서비스는 재마운트를 위해 Arch의 initrd 스크립트에 있는 fsck 및 tmp.mount 와 동기화되어야 합니다 /tmp. 또한 rwKCL에서 올바르게 배치할 위치도 파악해야 합니다 . 또한 [OK]두 가지 모두에서 부팅합니다.일회용의그리고게으른제공하다.

종속성 트리는 다음과 같습니다.

mini.target
* |-io.service
* |-remount.service
* `-shell.service

remount이는 KCL과의 중복/충돌 로 인해 단지 대상/서비스 쌍일 뿐이며 io실행 중입니다 modprobe usbhid( ExecStart...in을 통해 수행 할 수도 있음 shell.service). 커널 CL을 default.target추가하지 않는 경우 링크를 추가하세요.systemd.unit=mini.target

난 쫓아다니면서 몇 시간을 보냈지잠정적인 dev-sdaX.device(단, 루트 파티션) 이제 절반은 정상이라고 생각합니다.

-.mount그리고 본질적 -.slice이고 init.scope의미가 있습니다.

tmp.mount에서 생성된 것 같아요 /run.

Journald not-found, local-fs, swap 및 umount 단위는 systemd에 해를 끼치지 않는 것으로 보입니다 --state loaded. 아마도 첫 번째 추가 유닛으로 생성되어야 할 것입니다. 그러나 local-fsinitrd에서 루트 파티션을 검사하는 시점을 정의하는 방법은 무엇입니까? initrd로 시작할 수 있나요?가장 작은?

systemctl status또한 가장 작습니다. 슬라이스가 있지만 하나만 있습니다(user-X 슬라이스 없음).

* archlinux
    State: running
     Jobs: 0 queued
   Failed: 0 units
    Since: Fri 2021-10-01 15:24:16 UTC; 3min 2s ago
   CGroup: /
           |-init.scope 
           | `-1 /sbin/init arch\x5cvmlinuz-linux
           `-system.slice 
             `-shell.service 
               |-215 /usr/lib/systemd/systemd-sulogin-shell
               |-219 bash
               |-220 agetty tty16
               |-222 agetty -p tty17
               |-225 agetty -p -a USER tty18
               `-238 systemctl status

KillModeshell.service 내의 프로세스에 어떤 일이 발생하는지 제어할 수 있습니다 . 해당하는 내용 ps axf은 다음과 같습니다.

    1 ?        Ss     0:00 /sbin/init arch\vmlinuz-linux
  215 tty1     Ss     0:00 /usr/lib/systemd/systemd-sulogin-shell
  219 tty1     S      0:00  \_ bash
  245 tty1     R+     0:00      \_ ps axf
  246 tty1     S+     0:00      \_ tail -8
  220 tty16    Ss+    0:00 agetty tty16
  222 tty17    Ss+    0:00 agetty -p tty17
  225 tty18    Ss+    0:00 agetty -p -a USER tty18

부모님은 안 계세요 agetty. 고마워요 openvt? - 하지만 PID1/init/systemd는 여전히 pid를 추적합니다. shell.service다른 s로 KillMode재부팅 할 수있었습니다 .

ctrl-DA 또는...을 sulogin-shell과 함께 사용하는 것은 권장되지 않습니다.exit

어떻게 하면 이것을 멈출 수 있나요?

그 후에는 공격적인 디렉터리 이름 바꾸기 reboot명령이 "init 데몬과 통신할 수 없습니다" 등의 작업을 수행합니다. reboot.service작업(다시 시작 없음, 즉시 다시 시작 없음)이 포함된 A(복제본)는 reboot-force가장 직접적인 방법이며 이 테스트 시작(실행 중인 로그 없음 등)에 충분합니다. Sysvinit은 또한 매우 우아하게 또는 매우 빠르게 종료되지 않습니다. systemctl start reboot그런 다음 PID 신호도 전송되고 종료되지만 sync(아마도) 다른 명령은 닫히지 않습니다. 이는 "최종" 또는 "종료" 대상이 되며 거기에서 CPU reboot또는 poweroff. haltshutdown-initramfs 유무에 관계없이.


따라서 systemdJournald, udevd 및 dbus와 모든 유닛 파일 및 --user인스턴스 없이 시작 및 실행(및 중지!)이 가능합니다. 그러나 이러한 200개의 릴리스 단위를 "슈퍼 마스크"(즉, 사라지게)하는 것은 어렵고 내장된 단위와 내장된 논리의 흔적이 여전히 남아 있습니다.

간단히 말해서: emergency.target, DefaultDependencies=no,openvt

관련 정보