SysV의 경우 getty 항목, 바이너리, 셸 바이너리 및 공유 라이브러리, PAM /security/shadow 콘텐츠 및 일부 장치 파일을 다시 생성 init
해야 합니다 ./etc/inittab
/sbin/init
login
getty
upstart
거의 동일한 요구 사항이 필요하지만 필요하지 않기 때문에 /etc/inittab
아래에 몇 가지 *.conf
파일이 있습니다. 런레벨 설정을 /etc/init
위한 *.conf 및 적절한 런레벨 Reborn tty에서 해당 tty의 각 boot/에 대한 *.conf 입니다.start on startup
telinit
getty
어떤 구성과 바이너리가 필요합니까 systemd
init
?
내가 찾은 모든 문서는 설치된 시스템을 사용하여 서비스를 시작하고 중지하는 방법에 초점을 맞춘 것 같습니다.
실행에서 복사된 최소 파일 목록(kernel/initrd 제외)아치또는페도라 모자설치는 잘 작동하지만 이에 대한 정보를 찾을 수 없는 것 같습니다 systemd
.
내가 알고 싶은 것은 initramfs 에서 호출되기 systemd
위해 필요한 파일과 포함해야 하는 파일이 무엇인지입니다 .switch_root
systemd
/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 가 포함된 항목 중 하나가 있는 곳에 적어도 *.service
1개의 파일이 필요하다고 가정합니다 . 그런데 또 무엇이 필요합니까?[Service]
ExecStart=-/sbin/agetty --noclear %I linux
Restart=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 시작 프로세스를 요약하면 다음과 같이 작동한다고 생각합니다.
basic.target
systemd는 (또는 모든*.target
파일을?) 찾습니다 .- 종속성은 및 구성 파일 섹션의
WantedBy=
,Wants=
,Before=
, ... 지시문을 기반으로 해결됩니다 .After=
[Install]
*.service
*.target
*.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
편집하다: 좀 더 조사해봤는데문서.
시작되면 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
디렉터리는 필요하지 않습니다 .
getty
init 스크립트로 실행할 수 있는 서비스 중 하나입니다. 내가 확인한 배포판(fedora, arch)에서는 getty
두 가지 다른 방식으로 실행되었습니다.
- 각 터미널에 대한 특정 스크립트(다음에 링크된 파일)에 의해 실행됩니다.
/usr/lib/systemd/system/[email protected]
tty 이름은systemd
다음 으로 대체됩니다.) 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.service
및 io.service
; 이것은 modprobe usbhid
내 (어떤?) USB 키보드에 필수적입니다. 재마운트 서비스는 재마운트를 위해 Arch의 initrd 스크립트에 있는 fsck 및 tmp.mount 와 동기화되어야 합니다 /tmp
. 또한 rw
KCL에서 올바르게 배치할 위치도 파악해야 합니다 . 또한 [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-fs
initrd에서 루트 파티션을 검사하는 시점을 정의하는 방법은 무엇입니까? 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
KillMode
shell.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-D
A 또는...을 sulogin-shell과 함께 사용하는 것은 권장되지 않습니다.exit
어떻게 하면 이것을 멈출 수 있나요?
그 후에는 공격적인 디렉터리 이름 바꾸기 reboot
명령이 "init 데몬과 통신할 수 없습니다" 등의 작업을 수행합니다. reboot.service
작업(다시 시작 없음, 즉시 다시 시작 없음)이 포함된 A(복제본)는 reboot-force
가장 직접적인 방법이며 이 테스트 시작(실행 중인 로그 없음 등)에 충분합니다. Sysvinit은 또한 매우 우아하게 또는 매우 빠르게 종료되지 않습니다. systemctl start reboot
그런 다음 PID 신호도 전송되고 종료되지만 sync
(아마도) 다른 명령은 닫히지 않습니다. 이는 "최종" 또는 "종료" 대상이 되며 거기에서 CPU reboot
또는 poweroff
. halt
shutdown-initramfs 유무에 관계없이.
따라서 systemd
Journald, udevd 및 dbus와 모든 유닛 파일 및 --user
인스턴스 없이 시작 및 실행(및 중지!)이 가능합니다. 그러나 이러한 200개의 릴리스 단위를 "슈퍼 마스크"(즉, 사라지게)하는 것은 어렵고 내장된 단위와 내장된 논리의 흔적이 여전히 남아 있습니다.
간단히 말해서: emergency.target
, DefaultDependencies=no
,openvt