
เริ่มต้นอย่างรวดเร็วสำหรับระบบ Linux ย้อนกลับออกแบบมาจาก EEEPC fastinit โดย Claudio Matsuoka - "ช่องว่างที่เต็มไปด้วย DNA กบ ... "

รูปที่ 1: ภาพหน้าจอของ FINIT BOOTING ALPINE LINUX (HOWTO)
คุณสมบัติรวมถึง:
/etc/rc.local/etc/network/interfacesinitctl topsulogin แบบรวมสำหรับเปลือกการบำรุงรักษาที่ได้รับการป้องกันsyslogd จะเริ่มขึ้นดูโครงการ Sysklogd ที่แนะนำสำหรับการรวมเข้าสู่ระบบที่สมบูรณ์และวิธีการบันทึกไปยังบัฟเฟอร์แหวนเคอร์เนลจากสคริปต์โดยใช้ loggerโฟกัสอยู่ในระบบขนาดเล็กและฝังตัวแม้ว่า FINIT จะใช้งานได้อย่างสมบูรณ์บนระบบเซิร์ฟเวอร์และเดสก์ท็อปเช่นกัน สำหรับตัวอย่างการทำงานให้ดูที่ contrib/ ส่วนที่มีแบบฝึกหัดสำหรับการแจกแจง Linux ต่อไปนี้:
หมายเหตุ: การสนับสนุนสำหรับการแจกแจง Linux ต่างๆไม่ได้หมายถึงการติดตั้ง FINIT ได้อย่างง่ายดายในสถาปัตยกรรมทั้งหมด สคริปต์การติดตั้งแบบรวมเป็นตัวอย่างสำหรับการติดตั้งมาตรฐานทดสอบบนระบบ AMD64 (x86_64) การตั้งค่าที่กำหนดเองเช่นสำหรับระบบฝังตัวสามารถพบได้ในตัวอย่างที่ใช้ BuildRoot ใด ๆ ต่อไปนี้: Mylinux, Infix หรือ BR2-Finit-Demo ธรรมดา
ตัวอย่างนี้ /etc/finit.conf นี้ยังสามารถแยกได้ในไฟล์ .conf หลายไฟล์ใน /etc/finit.d สามารถใช้งานได้ แต่ยังไม่ได้เปิดใช้งานบริการใน /etc/finit.d/available และเปิดใช้งานโดยผู้ประกอบการโดยใช้เครื่องมือ initctl ดูการแจกแจง Linux ดังกล่าวข้างต้นหรือ MyLinux
หมายเหตุ: ในฐานะของ FINIT v4.4, .conf สามารถแยกสายได้โดยใช้อักขระ Unix Continuation Standard (
) ซึ่งรองรับความคิดเห็นต่อท้าย หลังหมายความว่าคุณต้องหลบหนีแฮชใด ๆ ที่ใช้ในคำสั่งและคำอธิบาย (#) สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้และตัวอย่างดูที่คู่มือ finit.conf (5) หรือ doc/config.md
# Fallback if /etc/hostname is missing
host default
# Runlevel to start after bootstrap, 'S', default: 2
# runlevel 2
# Support for setting global environment variables, using foo=bar syntax
# be careful though with variables like PATH, SHELL, LOGNAME, etc.
# PATH=/usr/bin:/bin:/usr/sbin:/sbin
# Max file size for each log file: 100 kiB, rotate max 4 copies:
# log => log.1 => log.2.gz => log.3.gz => log.4.gz
log size=100k count=4
# Services to be monitored and respawned as needed
service [S12345] env:-/etc/conf.d/watchdog watchdog $WATCHDOG_OPTS $WATCHDOG_DEV -- System watchdog daemon
service [S12345] env:-/etc/conf.d/syslog syslogd -n $SYSLOGD_OPTS -- System log daemon
service [S12345] < pid /syslogd> env:-/etc/conf.d/klogd klogd -n $KLOGD_OPTS -- Kernel log daemon
service [2345] env:-/etc/conf.d/lldpd lldpd -d $LLDPD_OPTS -- LLDP daemon (IEEE 802.1ab)
# The BusyBox ntpd does not use syslog when running in the foreground
# So we use this trick to redirect stdout/stderr to a log file. The
# log file is rotated with the above settings. The condition declares
# a dependency on a system default route (gateway) to be set. A single
# <!> at the beginning means ntpd does not respect SIGHUP for restart.
service [2345] log:/var/log/ntpd.log <!net/route/default> ntpd -n -l -I eth0 -- NTP daemon
# For multiple instances of the same service, add :ID somewhere between
# the service/run/task keyword and the command.
service :80 [2345] merecat -n -p 80 /var/www -- Web server
service :8080 [2345] merecat -n -p 8080 /var/www -- Old web server
# Alternative method instead of below runparts, can also use /etc/rc.local
# sysv [S] /etc/init.d/keyboard-setup -- Setting up preliminary keymap
# sysv [S] /etc/init.d/acpid -- Starting ACPI Daemon
# task [S] /etc/init.d/kbd -- Preparing console
# Hidden from boot progress, using empty `--` description
# sysv [S] /etc/init.d/keyboard-setup --
# sysv [S] /etc/init.d/acpid --
# task [S] /etc/init.d/kbd --
# Run start scripts from this directory
# runparts /etc/start.d
# Virtual consoles run BusyBox getty, keep kernel default speed
tty [12345] /sbin/getty -L 0 /dev/tty1 linux nowait noclear
tty [2345] /sbin/getty -L 0 /dev/tty2 linux nowait noclear
tty [2345] /sbin/getty -L 0 /dev/tty3 linux nowait noclear
# Use built-in getty for serial port and USB serial
# tty [12345] /dev/ttyAMA0 noclear nowait
# tty [12345] /dev/ttyUSB0 noclear
# Just give me a shell, I need to debug this embedded system!
# tty [12345] console noclear nologin service stanza รวมถึง task run และอื่น ๆ มีการอธิบายอย่างเต็มรูปแบบใน doc/config.md นี่คือภาพรวมอย่างรวดเร็วขององค์ประกอบที่พบบ่อยที่สุดที่จำเป็นในการเริ่มต้น Unix daemon:
service [LVLS] <COND> log env:[-]/etc/default/daemon daemon ARGS -- Daemon daemon
^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | `---------- Optional description
| | | | | | `------------------ Daemon arguments
| | | | | `------------------------- Path to daemon
| | | | `---------------------------------------------------- Optional env. file
| | | `-------------------------------------------------------- Redirect output to log
| | `--------------------------------------------------------------- Optional conditions
| `---------------------------------------------------------------------- Optional Runlevels
`------------------------------------------------------------------------------ Monitored application
ส่วนประกอบบางอย่างเป็นทางเลือก: runlevel (s) เงื่อนไขและคำอธิบายทำให้ง่ายต่อการสร้างสคริปต์เริ่มต้นง่าย ๆ และยังคงเป็นไปได้สำหรับการใช้งานขั้นสูงมากขึ้นเช่นกัน:
service /usr/sbin/sshd -D
การพึ่งพาได้รับการจัดการโดยใช้เงื่อนไข หนึ่งในเงื่อนไขที่พบบ่อยที่สุดคือการรอให้เครือข่ายพื้นฐานมีให้บริการ:
service <net/route/default> nginx -- High performance HTTP server
นี่เป็นอีกตัวอย่างหนึ่งที่เราสั่งให้ FINIT ไม่เริ่ม BusyBox ntpd จนกว่า syslogd จะเริ่มต้นอย่างถูกต้อง FINIT WAITS syslogd เพื่อสร้างไฟล์ PID โดยค่าเริ่มต้น /var/run/syslogd.pid
service [2345] log <!pid/syslogd> ntpd -n -N -p pool.ntp.org
service [S12345] syslogd -n -- Syslog daemon
สังเกตคำหลัก log , BusyBox ntpd ใช้ stderr สำหรับการเข้าสู่ระบบเมื่อทำงานในเบื้องหน้า ด้วยการบันทึกการบันทึก log Finit redirects stdout + stderr ไปยังระบบ log daemon โดยใช้เครื่องมือ logger(1)
บริการหรืองานสามารถมีการอ้างอิงหลายรายการ ที่นี่เรารอให้ ทั้งสอง syslogd เริ่มต้นและเครือข่ายขั้นพื้นฐานที่จะขึ้น:
service [2345] log <pid/syslogd,net/route/default> ntpd -n -N -p pool.ntp.org
หากเงื่อนไขทั้งสองล้มเหลวเช่นการสูญเสียเครือข่าย ntpd จะหยุดและทันทีที่มันกลับมาอีกครั้ง ntpd จะรีสตาร์ทโดยอัตโนมัติ
หมายเหตุ: ตรวจสอบให้แน่ใจว่า Daemons ไม่ได้ แยกและแยกตัวออกจากการควบคุม TTY โดยปกติแล้วจะเป็นธง -n หรือ -f หรือ -D เช่นเดียวกับในกรณีของ Openssh ด้านบน หากมันแยกตัวเอง FINIT ไม่สามารถตรวจสอบได้และจะพยายามรีสตาร์ทแทน
การกำกับดูแลกระบวนการ
เริ่มตรวจสอบและรีสตาร์ทบริการหากพวกเขาล้มเหลว
เกตตี้
FINIT รองรับ External Getty แต่ยังมาพร้อมกับ Getty ในตัวที่ จำกัด ซึ่งมีประโยชน์สำหรับระบบขนาดเล็กจริงๆ Getty ตั้งค่า TTY และรอการป้อนข้อมูลของผู้ใช้ก่อนส่งมอบ /bin/login ซึ่งรับผิดชอบในการจัดการการรับรองความถูกต้องจริง
tty [12345] /dev/tty1 nowait linux
tty [12345] /dev/ttyAMA0 noclear vt100
tty [12345] /sbin/getty -L /dev/ttyAMA0 vt100
ผู้ใช้ระบบฝังตัวอาจต้องการเปิดใช้งานคอนโซลอนุกรมอัตโนมัติด้วยอุปกรณ์ @console พิเศษ สิ่งนี้ใช้งานได้โดยไม่คำนึงถึงสภาพอากาศระบบใช้ ttyS0 , ttyAMA0 , ttyMXC0 หรืออะไรก็ตาม FINIT ตัวเลขออกมาโดยการสอบถาม SYSFS: /sys/class/tty/console/active
tty [12345] @console linux noclear
สังเกตเห็นว่า noclear , nowait และ nologin เป็นตัวเลือก หลังใช้สำหรับการข้ามกระบวนการเข้าสู่ระบบทั้งหมด สำหรับข้อมูลเพิ่มเติมดู doc/config.md
Runlevels
รองรับ Runlevels สไตล์ SYSV เริ่มต้นในสไตล์ที่น้อยที่สุดเช่นเดียวกับทุกสิ่งทุกอย่างใน FINIT ไวยากรณ์ [2345] สามารถนำไปใช้กับบริการงานรันและ TTY stanzas
Runlevels ที่สงวนไว้คือ 0 และ 6, หยุดและรีบูตตามลำดับเช่นเดียวกับ SYSV Init Runlevel 1 สามารถกำหนดค่าได้อย่างอิสระ แต่แนะนำให้เก็บไว้เป็นระบบ Runlevel ผู้ใช้เดี่ยวเนื่องจาก FINIT จะไม่เริ่มต้นเครือข่ายที่นี่ runlevel NUM ที่กำหนดค่าจาก /etc/finit.conf คือสิ่งที่ FINIT เปลี่ยนไปหลังจาก bootstrap เว้นแต่จะได้รับ 'เดี่ยว' (หรือ 'S') ในเคอร์เนล cmdline ซึ่งในกรณีนี้ Runlevel 1 จะเริ่มต้นขึ้น
บริการทั้งหมดใน Runlevel S) เริ่มต้นก่อนตามด้วย Runlevel ที่ต้องการ รันงานใน Runlevel S สามารถเริ่มต้นได้ตามลำดับโดยใช้ run [S] cmd การเปลี่ยน Runlevels at Runtime จะทำเหมือน init อื่น ๆ เช่น init 4 แต่ยังใช้เครื่องมือ intictl ขั้นสูงมากขึ้น
เงื่อนไข
ดังที่ได้กล่าวไว้ก่อนหน้านี้ FINIT มีระบบการพึ่งพาขั้นสูงเพื่อจัดการการซิงโครไนซ์เรียกว่าเงื่อนไข สามารถใช้งานได้หลายวิธี ขึ้นอยู่กับบริการอื่นความพร้อมใช้งานเครือข่าย ฯลฯ
ตัวอย่าง ที่ยอดเยี่ยม อย่างหนึ่งที่มีประโยชน์สำหรับระบบฝังตัวคือการเรียกใช้สคริปต์บางอย่างหากบอร์ดมีคุณสมบัติบางอย่างที่เข้ารหัสในแผนผังอุปกรณ์ ที่ Bootstrap เราเรียกใช้สคริปต์ ident ต่อไปนี้:
#! /bin/sh
conddir=/var/run/finit/cond/hw/model
dtmodel=/sys/firmware/devicetree/base/model
if ! test -e $dtmodel ; then
exit 0
fi
model= $( cat $dtmodel | tr " [A-Z] " " [a-z]- " )
mkdir -p $conddir && ln -s ../../reconf $conddir / $model หากมีโหนดทรีอุปกรณ์อยู่และเป็นสตริงเราสามารถใช้เงื่อนไข <hw/model/foo> เมื่อเริ่มต้นสคริปต์อื่น ๆ นี่คือตัวอย่าง:
run [S] /path/to/ident --
task [2] <hw/model/foo> /path/to/foo-init -- Initializing Foo board
สังเกตเคล็ดลับด้วยคำอธิบายที่ว่างเปล่าเพื่อซ่อนการโทรเพื่อ
identในเอาต์พุตความคืบหน้าของ FINIT
ปลั๊กอิน
ปลั๊กอินสามารถ ขยาย ฟังก์ชันการทำงานของ FINIT และ HOOK ใน ขั้นตอนต่าง ๆ ของกระบวนการบูตและที่รันไทม์ ปลั๊กอินถูกเขียนเป็น C และรวบรวมไว้ในไลบรารีแบบไดนามิกที่โหลดโดยอัตโนมัติโดย FINIT เมื่อบูต ชุดปลั๊กอินพื้นฐานถูกรวมอยู่ใน plugins/ ไดเรกทอรี
ความสามารถ:
ส่วนขยายและฟังก์ชั่นไม่เกี่ยวข้องกับสิ่งที่ AN /sbin/init ต้องการเริ่มระบบที่มีอยู่เป็นชุดของปลั๊กอินที่เชื่อมต่อกับกระบวนการบูตหรือตอบสนองต่อ I/O ต่างๆ
สำหรับข้อมูลเพิ่มเติมดู doc/plugins.md
โหลดอัตโนมัติ
โดยค่าเริ่มต้น FINIT MONITORS /etc/finit.d/ และ /etc/finit.d/enabled/ ลงทะเบียนการเปลี่ยนแปลงใด ๆ ไปยังไฟล์. .conf ในการเปิดใช้งานการเปลี่ยนแปลงผู้ใช้จะต้องเรียก initctl reload ซึ่งโหลดไฟล์ที่แก้ไขทั้งหมดหยุดบริการที่ถูกลบใด ๆ เริ่มต้นใหม่และรีสตาร์ทไฟล์ที่แก้ไขใด ๆ หากอาร์กิวเมนต์บรรทัดคำสั่งของบริการมีการเปลี่ยนแปลงกระบวนการจะถูกยกเลิกและเริ่มต้นอีกครั้งด้วยอาร์กิวเมนต์ที่อัปเดต หากอาร์กิวเมนต์ยังไม่ได้รับการแก้ไขและกระบวนการสนับสนุนการส่งผ่านกระบวนการจะได้รับการส่งออกแทนที่จะถูกยกเลิกและเริ่มต้น
สำหรับบางกรณีการใช้งานขั้นตอนพิเศษของการเรียกใช้ initctl reload สร้างค่าใช้จ่ายที่ไม่จำเป็นซึ่งสามารถลบออกได้ในเวลาที่สร้างโดยใช้:
configure --enable-auto-reload
กลุ่ม
FINIT รองรับ cgroups v2 และมาพร้อมกับกลุ่มเริ่มต้นต่อไปนี้ซึ่งบริการและเซสชันของผู้ใช้ถูกวางไว้ใน:
/sys/fs/cgroup
|-- init/ # cpu.weight:100
|-- system/ # cpu.weight:9800
`-- user/ # cpu.weight:100
FINIT ตัวเองและสคริปต์และบริการของผู้ช่วยถูกวางไว้ในกลุ่ม Leaf-Node ระดับบนสุด init/ ซึ่ง สงวนไว้
กระบวนการรัน/งาน/บริการ/SYSV ทั้งหมดจะถูกวางไว้ในกลุ่มย่อยของตนเองใน system/ ชื่อของแต่ละกลุ่มย่อยนำมาจากไฟล์ .conf ที่เกี่ยวข้องจาก /etc/finit.d
กระบวนการ getty/ tty ทั้งหมดจะถูกวางไว้ในกลุ่มย่อยของตนเองใน user/ ชื่อของแต่ละกลุ่มย่อยนำมาจากชื่อผู้ใช้
กลุ่มที่สี่ยังมีอยู่กลุ่ม root นอกจากนี้ยัง สงวนไว้ และมีไว้สำหรับงาน RT เป็นหลัก หากคุณมีงาน RT พวกเขาจำเป็นต้องประกาศเช่นนี้ในบทกวีของพวกเขาเช่นนี้:
service [...] <...> cgroup.root /path/to/foo args -- description
หรือ
cgroup.root
service [...] <...> /path/to/foo args -- description
service [...] <...> /path/to/bar args -- description
ดู doc/config.md สำหรับข้อมูลเพิ่มเติมเช่นวิธีกำหนดค่าต่อกลุ่มต่อกลุ่ม
เครื่องมือ initctl มีสามคำสั่งเพื่อช่วยแก้ไขข้อบกพร่องและเพิ่มประสิทธิภาพการตั้งค่าและการตรวจสอบ cgroups ดูคำสั่ง ps , top และ cgroup สำหรับรายละเอียด
หมายเหตุ: ระบบที่ไม่รองรับ cgroups โดยเฉพาะเวอร์ชัน 2 จะถูกตรวจพบโดยอัตโนมัติ ในระบบดังกล่าวฟังก์ชั่นข้างต้นจะถูกปิดใช้งานในช่วงต้นของการบูต
ในตอนท้ายของการบูตเมื่องานและบริการบูตทั้งหมดเริ่มต้นขึ้น แต่ไม่ใช่เครือข่าย FINIT เรียกคำสั่ง Run-Parts (8) ใน S บนไดเรกทอรี runparts <DIR> ที่กำหนดค่าใด ๆ สิ่งนี้เกิดขึ้นก่อนที่จะเปลี่ยนเป็น Runlevel ที่กำหนดค่า (ค่าเริ่มต้น 2) (เปิดใช้งานเครือข่ายก่อนที่จะเปลี่ยนจากโหมดผู้ใช้เดียว)
runparts /etc/rc.d/ หลังจากการเปลี่ยนแปลงของ runlevel เมื่อบริการทั้งหมดเริ่มต้นอย่างถูกต้อง /etc/rc.local เรียกว่า
ไม่จำเป็นต้องมีการกำหนดค่า stanza ใน /etc/finit.conf สำหรับ rc.local หากมีอยู่และเป็น FINIT SHELL SCRIPT ที่เรียกใช้งานได้ที่จุดสิ้นสุดของการบูตก่อนที่จะเรียก HOOK_SYSTEM_UP ดูเพิ่มเติมเกี่ยวกับ hooks ใน doc/plugins.md
ไม่สามารถเรียก FINIT ผ่านสัญญาณหรือใช้ initctl ในสคริปต์ runparts หรือ /etc/rc.local นี่เป็นเพราะ FINIT เป็นเกลียวเดี่ยวและเรียกสคริปต์เหล่านี้ในแฟชั่นการปิดกั้นในตอนท้ายของ Runlevel S ณ จุดที่ Event Loop ยังไม่ได้เริ่มต้น
Event Loop เป็นสิ่งทั้งหมดที่ FINIT ถูกสร้างขึ้นรอบ ๆ ยกเว้น Runlevel S ซึ่งยังคงเป็นขบวนที่ช้าผ่านการตั้งค่าจำนวนมากโดยมีตะขอเล็กน้อยและปิดกั้นการโทรไปยังสคริปต์ภายนอก
อย่างไรก็ตามไม่ห้ามคำสั่ง initctl ทั้งหมด คำสั่งที่รองรับ:
inictl cond : ใช้งานเฉพาะไฟล์ใน /run/finit/condinitctl enable/disable : เปิดใช้งานการรัน/งาน/บริการเปิดใช้งานในการเปลี่ยนแปลง runlevel จาก S เป็น 2initctl touch/show/create/delete/list : create หากใช้โหมดที่ไม่โต้ตอบการเปลี่ยนแปลงอีกครั้งจะมีผลในการเปลี่ยนแปลง runlevel โดยตรงหลังจาก bootstrapinitctl -f reboot/poweroff/halt : หากมีการใช้ธง -f flag เพื่อบังคับคำสั่งเคอร์เนลโดยตรง ตัวอย่าง: คุณสามารถตั้งค่า usr/ เงื่อนไขใน /etc/rc.local และมีบริการ/งานใน Runlevel 2 ขึ้นอยู่กับการดำเนินการ
การสนับสนุนขั้นพื้นฐานสำหรับ Runlevels รวมอยู่ใน FINIT จาก v1.8 โดยค่าเริ่มต้นบริการทั้งหมดงานรันคำสั่งและ ttys ที่แสดงรายการโดยไม่มีชุดของ runlevels จะได้รับชุดเริ่มต้น [234] ที่กำหนด Runlevel เริ่มต้นหลังจากบูตคือ 2
FINIT รองรับ Runlevels 0-9 และ S โดยมี 0 สงวนไว้สำหรับ Halt, 6 Reboot และ S สำหรับบริการที่จะทำงานที่ Bootstrap เท่านั้น Runlevel 1 เป็นระดับผู้ใช้เดียวซึ่งมักจะไม่มีการเปิดใช้งานเครือข่าย ใน FINIT นี่เป็นนโยบายที่ผู้ใช้กำหนด โดยปกติจะใช้เฉพาะ runlevels 1-6 และโดยทั่วไปจะใช้เฉพาะ runlevel เริ่มต้นเท่านั้น
ในการระบุชุดที่อนุญาตของ runlevels สำหรับ service , คำสั่ง run , task หรือ tty เพิ่ม [NNN] ลงใน /etc/finit.conf ของคุณเช่นนี้:
service [S12345] syslogd -n -x -- System log daemon
run [S] /etc/init.d/acpid start -- Starting ACPI Daemon
task [S] /etc/init.d/kbd start -- Preparing console
service [S12345] <pid/syslogd> klogd -n -x -- Kernel log daemon
tty [12345] /dev/tty1
tty [2] /dev/tty2
tty [2] /dev/tty3
tty [2] /dev/tty4
tty [2] /dev/tty5
tty [2] /dev/tty6
ในตัวอย่างนี้ syslogd เริ่มต้นเป็นครั้งแรกในแบบขนานและจากนั้น ACPID จะถูกเรียกโดยใช้สคริปต์ SYSV init ทั่วไป มันถูกเรียกด้วยคำสั่ง RUN ซึ่งหมายถึงคำสั่งงานต่อไปนี้เพื่อเริ่มต้นสคริปต์ KBD จะไม่ถูกเรียกจนกว่าสคริปต์ ACPID Init เสร็จสมบูรณ์อย่างสมบูรณ์ จากนั้นสคริปต์การตั้งค่าแป้นพิมพ์จะถูกเรียกควบคู่ไปกับ Klogd เป็นบริการที่ตรวจสอบ
อีกครั้งงานและบริการจะเริ่มต้นแบบขนานในขณะที่คำสั่งเรียกใช้จะถูกเรียกในคำสั่งซื้อที่แสดงรายการและคำสั่งที่ตามมาจะไม่เริ่มต้นจนกว่าคำสั่ง RUN จะเสร็จสมบูรณ์ นอกจากนี้คำสั่งงานและรันจะทำงานในเชลล์ดังนั้นสามารถใช้ท่อและเปลี่ยนเส้นทางได้
ตัวอย่างต่อไปนี้แสดงสิ่งนี้ งาน Bootstrap และคำสั่งเรียกใช้จะถูกลบออกเมื่อเสร็จสิ้น initctl show จะไม่แสดงรายการ
task [S] echo "foo" | cat >/tmp/bar
run [S] echo "$HOME" >/tmp/secret
การสลับระหว่าง runlevels สามารถทำได้โดยการเรียก init ด้วยอาร์กิวเมนต์เดียวเช่น init 5 หรือใช้ initctl runlevel 5 ทั้งสองสลับเป็น runlevel 5. เมื่อเปลี่ยน runlevels finit ยังโหลดไฟล์ .conf ทั้งหมดในไดเรกทอรี /etc/finit.d/ ดังนั้นหากคุณต้องการตั้งค่าการกำหนดค่าระบบใหม่ให้เปลี่ยนเป็น Runlevel 1 ให้เปลี่ยนไฟล์กำหนดค่าทั้งหมดในระบบและแตะไฟล์ .conf ทั้งหมดใน /etc/finit.d ก่อนที่จะเปลี่ยนกลับไปใช้ Runlevel ก่อนหน้านี้อีกครั้ง
ตามเนื้อผ้าการรีบูตและหยุดระบบ UNIX ทำได้โดยการเปลี่ยน Runlevel FINIT มาพร้อมกับเครื่องมือของตัวเองที่ให้บริการ: shutdown reboot poweroff และ suspend แต่ยังเป็นเครื่องมือ initctl ซึ่งมีรายละเอียดในส่วนถัดไป
ด้วยเหตุผลที่เข้ากันได้ FINIT รับฟังชุดสัญญาณเดียวกับ BusyBox Init สิ่งนี้ไม่สามารถใช้งานร่วมกันได้กับ SYSV Init แต่เห็นได้ชัดว่าเป็นการผสมผสานที่พบบ่อยกว่าสำหรับ FINIT สำหรับรายละเอียดเพิ่มเติมดู doc/signals.md
FINIT ยังใช้สถานะ API ที่ทันสมัยกับสถานะการสืบค้นและบริการเริ่มต้น/หยุดที่เรียกว่า initctl ซึ่งแตกต่างจาก telinit เครื่องมือ initctl จะไม่กลับมาจนกว่าคำสั่งที่กำหนดจะเสร็จสมบูรณ์อย่างสมบูรณ์
Usage: initctl [OPTIONS] [COMMAND]
Options:
-b, --batch Batch mode, no screen size probing
-c, --create Create missing paths (and files) as needed
-f, --force Ignore missing files and arguments, never prompt
-h, --help This help text
-j, --json JSON output in 'status' and 'cond' commands
-1, --once Only one lap in commands like 'top'
-p, --plain Use plain table headings, no ctrl chars
-q, --quiet Silent, only return status of command
-t, --no-heading Skip table headings
-v, --verbose Verbose output
-V, --version Show program version
Commands:
debug Toggle Finit (daemon) debug
help This help text
version Show program version
ls | list List all .conf in /etc/finit.d
create <CONF> Create .conf in /etc/finit.d/available
delete <CONF> Delete .conf in /etc/finit.d/available
show <CONF> Show .conf in /etc/finit.d/available
edit <CONF> Edit .conf in /etc/finit.d/available
touch <CONF> Change .conf in /etc/finit.d/available
enable <CONF> Enable .conf in /etc/finit.d/available
disable <CONF> Disable .conf in /etc/finit.d/enabled
reload Reload *.conf in /etc/finit.d (activate changes)
cond set <COND> Set (assert) user-defined conditions +usr/COND
cond get <COND> Get status of user-defined condition, see $? and -v
cond clear <COND> Clear (deassert) user-defined conditions -usr/COND
cond status Show condition status, default cond command
cond dump [TYPE] Dump all, or a type of, conditions and their status
log [NAME] Show ten last Finit, or NAME, messages from syslog
start <NAME>[:ID] Start service by name, with optional ID
stop <NAME>[:ID] Stop/Pause a running service by name
reload <NAME>[:ID] Reload service as if .conf changed (SIGHUP or restart)
This allows restart of run/tasks that have already run
Note: Finit .conf file(s) are *not* reloaded!
restart <NAME>[:ID] Restart (stop/start) service by name
signal <NAME>[:ID] <S> Send signal S to service by name, with optional ID
ident [NAME] Show matching identities for NAME, or all
status <NAME>[:ID] Show service status, by name
status Show status of services, default command
cgroup List cgroup config overview
ps List processes based on cgroups
top Show top-like listing based on cgroups
plugins List installed plugins
runlevel [0-9] Show or set runlevel: 0 halt, 6 reboot
reboot Reboot system
halt Halt system
poweroff Halt and power off system
suspend Suspend system
utmp show Raw dump of UTMP/WTMP db
สำหรับบริการ ที่ไม่ สนับสนุน SIGHUP <!> ในไฟล์. conf ต้องใช้เพื่อบอกให้ FINIT หยุดและเริ่มต้นในการเปลี่ยนแปลง reload และ runlevel หาก <> มีเงื่อนไขมากขึ้นสิ่งเหล่านี้จะส่งผลต่อวิธีการดูแลบริการ
หมายเหตุ: แม้ว่าจะเป็นไปได้ที่จะเริ่มบริการที่ไม่ได้อยู่ใน Runlevel ปัจจุบันบริการเหล่านี้จะไม่ได้รับการตอบกลับโดยอัตโนมัติโดย FINIT หากพวกเขาออกจาก (Crash) ดังนั้นหาก Runlevel เป็น 2 บริการ Dropbear SSH ด้านล่างจะไม่ถูกรีสตาร์ทหากถูกฆ่าหรือออก
คำสั่ง status เป็นค่าเริ่มต้นจะแสดงภาพรวมอย่างรวดเร็วของงาน/งาน/บริการที่ตรวจสอบทั้งหมด ที่นี่เราเรียก initctl -p เหมาะสำหรับการเขียนสคริปต์และเอกสาร:
alpine:~# initctl -p
PID IDENT STATUS RUNLEVELS DESCRIPTION
======================================================================
1506 acpid running [---2345----] ACPI daemon
1509 crond running [---2345----] Cron daemon
1489 dropbear running [---2345----] Dropbear SSH daemon
1511 klogd running [S-12345----] Kernel log daemon
1512 ntpd running [---2345----] NTP daemon
1473 syslogd running [S-12345----] Syslog daemon
alpine:~# initctl -pv
PID IDENT STATUS RUNLEVELS COMMAND
======================================================================
1506 acpid running [---2345----] acpid -f
1509 crond running [---2345----] crond -f -S $CRON_OPTS
1489 dropbear running [---2345----] dropbear -R -F $DROPBEAR_OPTS
1511 klogd running [S-12345----] klogd -n $KLOGD_OPTS
1512 ntpd running [---2345----] ntpd -n $NTPD_OPTS
1473 syslogd running [S-12345----] syslogd -n
ตัวแปรสภาพแวดล้อมสำหรับแต่ละบริการข้างต้นจะถูกอ่านจากในกรณีของอัลไพน์ linux, /etc/conf.d/ การแจกแจงอื่น ๆ อาจมีไดเรกทอรีอื่น ๆ เช่นการใช้ /etc/default/
คำสั่ง status ใช้ NAME:ID ที่นี่เราตรวจสอบสถานะของ dropbear ซึ่งมีเพียงอินสแตนซ์เดียวในระบบนี้:
alpine:~# initctl -p status dropbear
Status : running
Identity : dropbear
Description : Dropbear SSH daemon
Origin : /etc/finit.d/enabled/dropbear.conf
Environment : -/etc/conf.d/dropbear
Condition(s):
Command : dropbear -R -F $DROPBEAR_OPTS
PID file : !/run/dropbear.pid
PID : 1485
User : root
Group : root
Uptime : 2 hour 46 min 56 sec
Runlevels : [---2345----]
Memory : 1.2M
CGroup : /system/dropbear cpu 0 [100, max] mem [--.--, max]
|- 1485 dropbear -R -F
|- 2634 dropbear -R -F
|- 2635 ash
`- 2652 initctl -p status dropbear
Apr 8 12:19:49 alpine authpriv.info dropbear[1485]: Not backgrounding
Apr 8 12:37:45 alpine authpriv.info dropbear[2300]: Child connection from 192.168.121.1:47834
Apr 8 12:37:46 alpine authpriv.notice dropbear[2300]: Password auth succeeded for 'root' from 192.168.121.1:47834
Apr 8 12:37:46 alpine authpriv.info dropbear[2300]: Exit (root) from <192.168.121.1:47834>: Disconnect received
Apr 8 15:02:11 alpine authpriv.info dropbear[2634]: Child connection from 192.168.121.1:48576
Apr 8 15:02:12 alpine authpriv.notice dropbear[2634]: Password auth succeeded for 'root' from 192.168.121.1:48576
FINIT มีความสามารถในการทำงานบนทั้งระบบเดสก์ท็อป/เซิร์ฟเวอร์ด้วยระบบ UDEV และระบบฝังตัวที่มักจะมาพร้อมกับ BusyBox MDEV บางระบบมี SystemD-UDEV หรือ EUDEV วันนี้แทนที่จะเป็น UDEV ดั้งเดิม, FINIT POBES สำหรับพวกเขาทั้งหมดในรันไทม์และคาดว่า /dev/ จะเป็นระบบไฟล์ที่เขียนได้โดยใช้ devtmpfs นอกจากนี้ยังเป็นไปได้ที่จะทำงานบนการตั้งค่าแบบคงที่ /dev หากจำเป็น อย่างไรก็ตามไม่ใช่ความคิดที่ดีที่จะติดตั้งทั้ง UDEV และ MDEV ในเวลาเดียวกันซึ่งจะนำไปสู่ผลลัพธ์ที่คาดเดาไม่ได้
ที่ Boot Finit เรียกทั้ง mdev หรือ udevd เพื่อเติม /dev สิ่งนี้จะทำแตกต่างกันเล็กน้อยและบนระบบกับ UDEV คุณอาจต้องการเพิ่มงานหนึ่งนัดต่อไปนี้ในช่วงต้นของคุณ /etc/finit.conf :
run [S] udevadm settle --timeout=120 -- Waiting for udev
FINIT มี getty ในตัวสำหรับ ttys แต่ต้องใช้การทำงาน /bin/login หรือ /bin/sh หากไม่มีการกำหนดค่า ttys ใน /etc/finit.conf
สำหรับระบบที่ใช้งานได้อย่างสมบูรณ์ /var , /run และ /tmp จะต้องตั้งค่าอย่างถูกต้องใน /etc/fstab - ซึ่งซ้ำแล้วซ้ำอีกในการบูต
โครงการนี้ขึ้นอยู่กับ FINIT ดั้งเดิมโดย Claudio Matsuoka ซึ่งได้รับการออกแบบทางวิศวกรรมจาก syscalls ของ eeepc fastinit - "ช่องว่างที่เต็มไปด้วย DNA กบ ... "
FINIT ได้รับการพัฒนาและดูแลโดย Joachim Wiberg ที่ GitHub โปรดยื่นรายงานข้อผิดพลาดโคลนหรือส่งคำขอดึงสำหรับการแก้ไขข้อผิดพลาดและส่วนขยายที่เสนอ