สิ่งที่จำเป็นสำหรับการเริ่มระบบน้อยที่สุดเพื่อเปิดใช้ getty บนคอนโซลเสมือน


21

สำหรับ SysV initฉันต้อง/etc/inittabrespawning รายการเก็ตตี้ที่/sbin/initไบนารีไบนารีและห้องสมุดที่ใช้ร่วมกันสำหรับเปลือกloginที่gettyที่ PAM / การรักษาความปลอดภัย / สิ่งเงาและอุปกรณ์ไม่กี่ไฟล์

สำหรับupstartฉันต้องการความต้องการเดียวกันค่อนข้างมาก แต่แทนที่จะ/etc/inittabมี*.confไฟล์บางไฟล์ภายใต้/etc/init: หนึ่ง * .conf start on startupที่ตั้ง runlevel ด้วยtelinitและหนึ่ง * .conf สำหรับแต่ละ tty ที่เริ่ม / respawn gettyบน tty นั้นบน runlevels ที่เหมาะสม .

ฉันต้องการการกำหนดค่าและไบนารีsystemd initอะไร

ดูเหมือนว่าเอกสารทั้งหมดที่ฉันจะมุ่งเน้นไปที่วิธีการใช้ระบบที่ติดตั้งแล้วเพื่อเริ่มและหยุดบริการ

รายการไฟล์ที่จะคัดลอก (ยกเว้นเคอร์เนล / initrd) จากการติดตั้งArchหรือfedora ที่ใช้งานจะทำได้ดี แต่ฉันไม่สามารถหาข้อมูลประเภทsystemdนั้นได้


สิ่งที่ผมอยากจะรู้ว่าคือสำหรับsystemdสิ่งที่ไฟล์จะถูกต้องและสิ่งที่พวกเขาจะต้องมีการเริ่มต้นเปลือกเข้าสู่ระบบหลังจาก initramfs ไม่ได้ของการเรียกไปยังswitch_rootsystemd /sbin/init


ตัวอย่างเช่นupstartไบนารีและสอง*.confไฟล์:

ไฟล์/etc/init/whatever.conf:

เริ่มต้นเมื่อเริ่มต้น
ปล่อย runlevel
งาน
ต้นฉบับ
  เทลนิท 2
สคริปต์สิ้นสุด

ไฟล์/etc/init/tty1.conf:

เริ่มที่ runlevel [12345]
respawn
exec / sbin / agetty -8 --noclear 38400 tty1 linux

ตัวอย่างเช่นsysvinitไบนารีและไฟล์ conf 1 ชื่อ/etc/inittab:

ID: 2: initdefault:
c1: 12345: respawn: / sbin / agetty 38400 tty1 linux

ตอนนี้ฉันหลังจากsystemdเทียบเท่า

ฉันคิดว่า*.serviceจำเป็นต้องมีไฟล์อย่างน้อย 1 ไฟล์ด้วย[Service]รายการที่มีExecStart=-/sbin/agetty --noclear %I linuxและRestart=alwaysแต่จำเป็นต้องมีอะไรอีกบ้าง


ขณะนี้มีบทความฐานความรู้ RedHat ล่าสุด (754933) ที่อธิบายการบูตระบบที่ URL นี้: ภาพรวมของ systemd สำหรับ RHEL 7
MattBianco

มันช่างน่าหดหู่เหลือเกินที่เห็นว่าผู้คนระเบิดสายการกำหนดค่าเดียวให้กลายเป็นระเบียบขนาดใหญ่และเรียกมันว่าการปรับปรุง
ceving

คำตอบ:


17

ครั้งแรกของทั้งหมดไม่ได้เป็นแบบดั้งเดิมยูนิกซ์systemd initSystemd มีมากขึ้นดังนั้นจึงค่อนข้างไม่ยุติธรรมที่จะเปรียบเทียบทั้งสอง

ในการตอบคำถามสิ่งที่จำเป็นคือไบนารีและไฟล์กำหนดค่าต่อไปนี้:

/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/system/getty@.service
/usr/lib/systemd/system/console-getty.service

ออกsystemctl enable console-getty.service getty@tty2.serviceแล้วสร้าง symlink เหล่านี้:

/etc/systemd/system/default.target.wants/getty@tty2.service -> / lib / systemd / system / getty @ service
/etc/systemd/system/getty.target.wants/console-getty.service -> /lib/systemd/system/console-getty.service

หมายเหตุ : ในการใช้systemdคุณสมบัติพิเศษสำหรับการเริ่มagettyต้นแบบไดนามิกตามความต้องการเมื่อกดAlt+ F3และต่อไปปรากฏว่าคุณต้องมีไฟล์อย่างน้อยสองไฟล์นี้:

/etc/systemd/logind.conf
/lib/systemd/system/autovt@.service

ที่autovt@.serviceเป็น symlink getty@.serviceไป

เนื้อหาของไฟล์กำหนดค่า:

default.target, getty.target, sysinit.targetไฟล์สามารถเว้นว่างยกเว้นสำหรับ[Unit]แท็กและ Description=xxx(อาจจะ)

basic.target ยังมีข้อมูลการพึ่งพา:

[Unit]
คำอธิบาย = ระบบพื้นฐาน
ต้อง = sysinit.target
ต้องการ = sockets.target timers.target paths.target slices.target
After = sysinit.target sockets.target timers.target path.target slices.target

ฉันไม่แน่ใจว่าการอ้างอิงไปยังเป้าหมายที่ไม่มีอยู่ในไฟล์นั้นเป็นสิ่งจำเป็นหรือไม่ พวกเขาจะอธิบายไว้ในsystemd.special(7)หน้าคน


console-getty.service: (กรณีพิเศษสำหรับ agetty บนคอนโซล)

[Unit]
คำอธิบาย = คอนโซลเก็ตตี้
หลังจาก = systemd-user-session.service plymouth-quit-wait.service
ก่อน = getty.target

[บริการ]
ExecStart = - / sbin / agetty --noclear --keep-baud console 115200,38400,9600 $ TERM
type = ไม่ได้ใช้งาน
เริ่มต้นใหม่ = เสมอ
RestartSec = 0
UtmpIdentifier = ข้อเสีย
TTYPath = / dev / คอนโซล
TTYReset = yes
TTYVHangup = yes
KillMode = กระบวนการ
IgnoreSIGPIPE = ไม่มี
SendSIGHUP = yes

[ติดตั้ง]
WantedBy = getty.target

getty@.service: (กำหนดค่าทั่วไปสำหรับทุกบริการเก็ตตี้ยกเว้นคอนโซล)

[Unit]
คำอธิบาย = Getty ใน% I
หลังจาก = systemd-user-session.service plymouth-quit-wait.service
ก่อน = getty.target
IgnoreOnIsolate = yes
ConditionPathExists = / dev / tty0

[บริการ]
ExecStart = - / sbin / agetty --noclear% I $ TERM
type = ไม่ได้ใช้งาน
เริ่มต้นใหม่ = เสมอ
RestartSec = 0
UtmpIdentifier =% ฉัน
TTYPath = / dev /% ฉัน
TTYReset = yes
TTYVHangup = yes
TTYVTDisallocate = ไม่มี
KillMode = กระบวนการ
IgnoreSIGPIPE = ไม่มี
SendSIGHUP = yes

[ติดตั้ง]
WantedBy = getty.target
DefaultInstance = tty1

ในที่สุดคุณอาจต้องการไบนารีพิเศษเหล่านี้ (ฉันไม่ได้ลองอันไหนที่สำคัญ):

/ lib / systemd / systemd (/ sbin / init มักจะชี้ไปที่นี้)
/ lib / systemd / systemd-logind
/ lib / systemd / systemd-cgroups ตัวแทน
/ lib / systemd / systemd-ใช้การประชุม
/ lib / systemd / systemd-vconsole การติดตั้ง
/ lib / systemd / systemd อัพเดท-utmp
/ lib / systemd / systemd นอนหลับ
/ lib / systemd / systemd-sysctl
/ lib / systemd / systemd-initctl
/ lib / systemd / systemd ตอบกลับรหัสผ่าน
/ lib / systemd / systemd-AC พลังงาน
/ lib / systemd / systemd เปิดใช้งาน
/ lib / systemd / systemd-แสงไฟ
/ lib / systemd / systemd-binfmt
/ lib / systemd / systemd-bootchart
/ lib / systemd / systemd บัส-proxyd
/ lib / systemd / systemd-coredump
/ lib / systemd / systemd-cryptsetup
/ lib / systemd / systemd-fsck
/ lib / systemd / systemd-hostnamed
/ lib / systemd / systemd-journald
/ lib / systemd / systemd วารสาร-gatewayd
/ lib / systemd / systemd วารสารระยะไกล
/ lib / systemd / systemd-localed
/ lib / systemd / systemd กลึง
/ lib / systemd / systemd โมดูลโหลด
/ lib / systemd / systemd หลายที่นั่ง-X
/ lib / systemd / systemd-networkd
/ lib / systemd / systemd-networkd รอออนไลน์
/ 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 ซ็อกเก็ต-proxyd
/ lib / systemd / systemd-timedated
/ lib / systemd / systemd-timesyncd
/ lib / systemd / systemd-udevd
/ lib / systemd / systemd ปรับปรุงทำ

เพื่อสรุปกระบวนการเริ่มต้น systemd ฉันคิดว่ามันทำงานอะไรเช่นนี้:

  1. หาตำแหน่ง systemd basic.target(หรือ*.targetไฟล์ทั้งหมด?)
  2. อ้างอิงได้รับการแก้ไขขึ้นอยู่กับWantedBy=, Wants=, Before=, After=... สั่งใน[Install]ส่วนของ*.serviceและ*.targetการตั้งค่าไฟล์
  3. *.services ที่ควรเริ่มต้น (ที่ไม่ใช่บริการ "พิเศษ") มี[Service]ส่วนที่มีExecStart=คำสั่งที่ชี้ให้เห็นว่าปฏิบัติการเพื่อเริ่มต้น

1
AFAIK [Install]ส่วนจะไม่ได้ใช้โดยลำดับการบูต, systemctl enableโดยเฉพาะ อะไรบูตมีลักษณะที่เป็น symlinks ในซึ่งถูกสร้างขึ้นโดย/etc/systemd/system/basic.target.wants/ systemctl enable
Stefan Majewsky

6

systemdสร้างเก็ตตี้โดยอัตโนมัติเมื่อคุณสลับไปที่เทอร์มินัลจนถึงจำนวนสูงสุดที่กำหนด ค่าเริ่มต้นคือ 6 (เพื่อให้คุณได้รับโดยอัตโนมัติสำหรับ alt + f1 ถึง alt + f6) หากคุณต้องการเปลี่ยนพารามิเตอร์นี้คุณสามารถแก้ไข/etc/systemd/logind.confเพื่อเปลี่ยนNAutoVTsพารามิเตอร์เป็นหมายเลขอื่น (สูงสุด 12)

หากคุณต้องการ getty เพื่อวางไข่แม้ว่าคุณจะไม่เปลี่ยนเองคุณสามารถเพิ่ม symlink ไป/usr/lib/systemd/system/getty@.serviceยัง/etc/systemd/system/getty.target.wants/ไดเรกทอรี:

ln -sf /usr/lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@tty9.service

ซึ่งจะส่งผลgetty.targetให้ต้องมีgetty@บริการเพิ่มอีกหนึ่งรายการ เป้าหมายคือชุดของบริการที่ต้องเกิดใหม่แทนที่ runlevels ซึ่งรองรับการขึ้นต่อกัน เป้าหมายเริ่มต้นขึ้นอยู่กับgetty.target

ดูที่คำถามที่พบบ่อย systemd ใน ArchWiki

แก้ไข: ฉันวิจัยอีกเล็กน้อยในเอกสาร

เมื่อบูตsystemddaemon จะโหลดระบบทั้งหมดในdefaultเป้าหมายและการขึ้นต่อกันของมัน เป้าหมายถูกกำหนดโดยไฟล์

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

เป้าหมายมีรายการของบริการที่แนบที่ระบุโดย symlinks ในไดเรกทอรี

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

รุ่นแทนที่ค่าเริ่มต้นของการกระจายใน/etc /usr/libต้องการหนึ่ง.targetไฟล์เท่านั้นในขณะที่ไม่จำเป็นต้องมีไดเร็กทอรีใด ๆ

gettyเป็นเพียงหนึ่งในบริการอื่น ๆ ที่สามารถเรียกใช้โดยสคริปต์เริ่มต้น ในการแจกแจงที่ฉันตรวจสอบ (fedora, arch) gettyจะทำงานในสองวิธีที่แตกต่างกัน:

  1. เริ่มต้นด้วยสคริปต์เฉพาะสำหรับแต่ละเทอร์มินัล (ลิงก์ไปยัง/usr/lib/systemd/system/getty@.serviceไฟล์ที่ชื่อ tty ถูกแทนที่ด้วยโดยsystemdจากชื่อไฟล์ลิงค์ )
  2. นำขึ้นโดยอัตโนมัติตามความต้องการโดยlogindเมื่อผู้ใช้สลับไปยังเทอร์มินัลเสมือน (คล้ายกับวิธีการinetdให้บริการที่เก่าแก่เมื่อคำขอมาถึง) logindเป็น daemon ที่แตกต่างกันซึ่งกระจายด้วยsystemdและอ่านการกำหนดค่าจาก/etc/systemd/logind.confไฟล์

หวังว่ามันจะน่าพอใจ


ฉันต้องการที่จะรู้ว่าไฟล์ใดที่จำเป็นและสิ่งที่พวกเขาจะมี คุณสามารถสรุปคำตอบของคุณด้วยรายการไฟล์ที่จำเป็นและสิ่งที่ทำให้พวกเขาอ่านในลำดับใด ฉันไม่มีข้อมูลเกี่ยวกับสิ่งที่ต้องพบในไดเรกทอรีนั้น ฉันจะพยายามอธิบายคำถามของฉันเล็กน้อย ขอบคุณ!
MattBianco

@MattBianco systemdคุณมีความจำเป็นปฏิปักษ์ต่อ ฉันกำลังศึกษาเรื่องนี้เล็กน้อยและมันก็ค่อนข้างตรงไปตรงมาเมื่อคุณเข้าใจว่าสิ่งต่าง ๆ ทำงานอย่างไร
pqnet

1
ใช่ฉันเสียเอกสารจากโครงการโอเพ่นซอร์สอื่น ๆ ฉันขอโทษที่ทำตัวเป็นศัตรู มันน่าผิดหวังที่ดูเหมือนว่าไม่มีเอกสารอย่างง่ายอธิบายกระบวนการบูท (ฉันเข้าใจแล้วว่ามันเป็นเพราะ systemd ไม่ใช่เรื่องง่าย) ด้วยวิธีตลก ๆ ฉันอยากจะแสดงความคิดเห็นว่าบางทีมันอาจจะsystemdเป็นศัตรูได้ มันเปลี่ยน GNU / Linux ออกจาก Unix ไม่ได้บอกว่ามันเป็นสิ่งที่ไม่ดี แต่มันแตกต่างจากที่เคยเป็นมา และ googling ประมาณเล็กน้อยแสดงว่าฉันไม่ได้อยู่คนเดียว
MattBianco
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.