ວິທີການໃຊ້ຄໍາສັ່ງ Init ໃນ Linux

Init ແມ່ນພໍ່ແມ່ຂອງຂະບວນການທັງຫມົດ. ບົດບາດຕົ້ນຕໍຂອງມັນແມ່ນການສ້າງຂະບວນການຈາກ script ທີ່ເກັບຮັກສາໄວ້ໃນ file / etc / inittab (ເບິ່ງ inittab (5)). ໄຟລ໌ນີ້ມັກຈະມີບັນດາຂໍ້ມູນທີ່ເຮັດໃຫ້ເກີດການ ເລີ່ມຕົ້ນຂອງ getty s ໃນແຕ່ລະເສັ້ນທີ່ຜູ້ໃຊ້ສາມາດເຂົ້າສູ່ລະບົບໄດ້. ມັນຍັງຄວບຄຸມລະບົບຕ່າງໆທີ່ຕ້ອງການໂດຍລະບົບໃດຫນຶ່ງ.

Runlevels

runlevel ແມ່ນການຕັ້ງຄ່າຊອບແວຂອງລະບົບທີ່ອະນຸຍາດໃຫ້ກຸ່ມຂະບວນການທີ່ເລືອກເທົ່ານັ້ນ. ຂະບວນການທີ່ເກີດໂດຍ init ສໍາລັບແຕ່ລະ runlevel ເຫຼົ່ານີ້ຖືກກໍານົດໄວ້ໃນ / etc / inittab file. Init ສາມາດຢູ່ໃນຫນຶ່ງໃນ 8 ລະດັບ runlevels: 0-6 ແລະ S ຫຼື s . ລະດັບ runlevel ແມ່ນມີການປ່ຽນແປງໂດຍມີ telinit runtime user privileged, ເຊິ່ງສົ່ງສັນຍານທີ່ເຫມາະສົມເພື່ອ init , ບອກມັນທີ່ runlevel ຈະປ່ຽນແປງ.

Runlevels 0,1 ແລະ 6 ຖືກຈອງ. Runlevel 0 ແມ່ນໃຊ້ເພື່ອຢຸດລະບົບ, runlevel 6 ໃຊ້ເພື່ອ reboot ລະບົບແລະ runlevel 1 ແມ່ນໃຊ້ເພື່ອໃຫ້ລະບົບລົງໄປໃນໂຫມດຜູ້ໃຊ້ດຽວ. Runlevel S ບໍ່ໄດ້ຫມາຍຄວາມວ່າຈະຖືກນໍາໃຊ້ໂດຍກົງ, ແຕ່ສໍາລັບ scripts ທີ່ຖືກປະຕິບັດໃນເວລາທີ່ເຂົ້າ runlevel 1. ສໍາລັບຂໍ້ມູນເພີ່ມເຕີມກ່ຽວກັບນີ້, ເບິ່ງຄູ່ມືສໍາລັບ shutdown (8) ແລະ inittab (5).

Runlevels 7-9 ຍັງຖືກຕ້ອງ, ເຖິງແມ່ນວ່າບໍ່ໄດ້ຖືກບັນທຶກໄວ້ແທ້ໆ. ນີ້ແມ່ນຍ້ອນວ່າ "ແບບດັ້ງເດີມ" Unix variants ບໍ່ໃຊ້ພວກມັນ. ໃນກໍລະນີທີ່ທ່ານກໍາລັງ curious, runlevels S ແລະ s ແມ່ນໃນຄວາມເປັນຈິງຄືກັນ. ພາຍໃນພວກເຂົາແມ່ນລະຫັດລັບສໍາລັບການ runlevel ດຽວກັນ.

ການເລີ່ມຕົ້ນ

ຫຼັງຈາກ init ຖືກເອີ້ນວ່າຂັ້ນຕອນສຸດທ້າຍຂອງລໍາດັບ boot ຂອງ kernel, ມັນເບິ່ງໄຟລ໌ / etc / inittab ເພື່ອເບິ່ງວ່າມີປະເພດ initdefault (see inittab (5)). ການເຂົ້າລະຫັດ initdefault ກໍານົດໄລຍະເລີ່ມຕົ້ນຂອງລະບົບ. ຖ້າບໍ່ມີການເຂົ້າ (ຫຼືບໍ່ມີ / etc / inittab ຢູ່), ລະດັບ runlevel ຈະຕ້ອງໄດ້ເຂົ້າຢູ່ໃນ console system.

Runlevel S or s ນໍາລະບົບໃຫ້ກັບໂຫມດຜູ້ໃຊ້ດຽວແລະບໍ່ຕ້ອງການໄຟ / etc / inittab . ໃນໂຫມດຜູ້ໃຊ້ດຽວ, ຮາກຮາກແມ່ນເປີດຢູ່ໃນ / dev / console .

ໃນເວລາທີ່ເຂົ້າມາໂຫມດຜູ້ໃຊ້ດຽວ, init ຈະອ່ານສະແດງ ioctl (2) ຂອງ console ຈາກ /etc/ioctl.save . ຖ້າໄຟລ໌ນີ້ບໍ່ມີ, init ເລີ່ມຕົ້ນເສັ້ນຢູ່ທີ່ 9600 baud ແລະກັບ CLOCAL settings. ໃນເວລາທີ່ທໍາອິດປ່ອຍໃຫ້ໂຫມດຜູ້ໃຊ້ແບບດຽວ, ມັນເກັບຮັກສາການຕັ້ງຄ່າ ioctl ຂອງ console ໃນໄຟລ໌ນີ້ເພື່ອໃຫ້ມັນສາມາດນໍາໃຊ້ພວກມັນຄືນໃຫມ່ໄດ້ສໍາລັບກອງປະຊຸມຜູ້ດຽວ.

ເມື່ອເຂົ້າສູ່ໂຫມດຜູ້ໃຊ້ຫລາຍຄັ້ງ, init ປະຕິບັດການ boot ແລະ bootwait entries ເພື່ອອະນຸຍາດໃຫ້ລະບົບໄຟລ໌ທີ່ຖືກຕິດຕັ້ງກ່ອນທີ່ຜູ້ໃຊ້ສາມາດເຂົ້າສູ່ລະບົບ. ຫຼັງຈາກນັ້ນ, ທັງຫມົດທີ່ກົງກັບ runlevel ຈະຖືກປະຕິບັດ.

ເມື່ອເລີ່ມຕົ້ນຂະບວນການໃຫມ່, init ຈະກວດສອບວ່າແຟ້ມ / etc / initscript ຢູ່. ຖ້າມັນເຮັດ, ມັນໃຊ້ script ນີ້ເພື່ອເລີ່ມຕົ້ນຂະບວນການ.

ແຕ່ລະຄັ້ງທີ່ລູກສິ້ນສຸດ, init ຈະ ບັນທຶກຄວາມຈິງແລະເຫດຜົນທີ່ມັນເສຍຊີວິດໃນ / var / run / utmp ແລະ / var / log / wtmp , ຖ້າວ່າໄຟລ໌ເຫຼົ່ານີ້ຢູ່.

ການປ່ຽນແປງ Runlevels

ຫຼັງຈາກມັນໄດ້ເກີດຂື້ນທັງຫມົດຂອງຂະບວນການທີ່ກໍານົດໄວ້, init ລໍຖ້າສໍາລັບຫນຶ່ງໃນຂະບວນການລູກຫລານຂອງມັນທີ່ຈະເສຍຊີວິດ, ສັນຍານໄຟຟ້າຫຼືຈົນກ່ວາມັນໄດ້ຖືກສົ່ງສັນຍານໂດຍ telinit ເພື່ອປ່ຽນລະດັບ runlevel ຂອງລະບົບ. ເມື່ອຫນຶ່ງໃນເງື່ອນໄຂສາມຂ້າງຂ້າງເທິງເກີດຂື້ນ, ມັນຈະກວດເບິ່ງເອກະສານ / etc / inittab ຄືນ ໃຫມ່. ລາຍການໃຫມ່ສາມາດຖືກເພີ່ມເຂົ້າໃນໄຟລ໌ນີ້ໄດ້ທຸກເວລາ. ຢ່າງໃດກໍ່ຕາມ, ຍັງຍັງລໍຖ້າສໍາລັບຫນຶ່ງໃນສາມເງື່ອນໄຂຂ້າງເທິງທີ່ຈະເກີດຂື້ນ. ເພື່ອໃຫ້ສໍາລັບການຕອບສະຫນອງທັນທີ, ຄໍາສັ່ງ q or q telinit ສາມາດ wake ເຖິງ init ເພື່ອກວດສອບໄຟລ໌ / etc / inittab .

ຖ້າ init ບໍ່ຢູ່ໃນໂຫມດຜູ້ໃຊ້ດຽວແລະໄດ້ຮັບສັນຍານ PowerFail (SIGPWR), ມັນຈະອ່ານໄຟ / etc / powerstatus . ຫຼັງຈາກນັ້ນມັນເລີ່ມຄໍາສັ່ງໂດຍອີງໃສ່ເນື້ອຫາຂອງໄຟລ໌ນີ້:

F (AIL)

ພະລັງງານແມ່ນບໍ່, UPS ກໍາລັງສະຫນອງພະລັງງານ. ປະຕິບັດການ powerwait ແລະ powerfail entries.

ຕົກ​ລົງ)

ພະລັງງານໄດ້ຖືກຟື້ນຟູຄືນໃຫມ່, ປະຕິບັດການໃຊ້ ໄຟຟ້າ .

L (OW)

ພະລັງງານແມ່ນບໍ່ແລະ UPS ມີແບດເຕີລີ່ຕ່ໍາ. ປະຕິບັດການປະມູນ powerfailnow .

ຖ້າ / etc / powerstatus ບໍ່ມີຫຼືມີສິ່ງໃດອີກແລ້ວ, ຕົວອັກສອນ F , O ຫຼື L , init ຈະປະຕິບັດຕົວເຊັ່ນວ່າມັນໄດ້ອ່ານຈົດຫມາຍ F.

ການໃຊ້ SIGPWR ແລະ / etc / powerstatus ບໍ່ໄດ້ຖືກທໍ້ຖອຍ. ຄົນທີ່ຕ້ອງການໂຕ້ຕອບກັບ init ຄວນໃຊ້ຊ່ອງຄວບຄຸມ / dev / initctl - ເບິ່ງລະຫັດແຫຼ່ງຂອງຊຸດ sysvinit ສໍາລັບເອກະສານເພີ່ມເຕີມກ່ຽວກັບການນີ້.

ເມື່ອ init ຖືກຮຽກຮ້ອງໃຫ້ປ່ຽນລະດັບ runlevel, ມັນສົ່ງສັນຍານເຕືອນ SIGTERM ກັບຂະບວນການທັງຫມົດທີ່ບໍ່ຖືກກໍານົດໄວ້ໃນລະດັບ runlevel ໃຫມ່. ຫຼັງຈາກນັ້ນມັນລໍຖ້າ 5 ວິນາທີກ່ອນທີ່ຈະສິ້ນສຸດການປະຕິບັດເຫຼົ່ານີ້ໂດຍຜ່ານສັນຍານ SIGKILL . ໃຫ້ສັງເກດວ່າການ ໂຕນ ຄິດວ່າຂະບວນການເຫຼົ່ານີ້ທັງຫມົດ (ແລະລູກຫລານຂອງພວກເຂົາ) ຍັງຢູ່ໃນກຸ່ມຂະບວນການດຽວກັນເຊິ່ງ init ເລີ່ມ ຕົ້ນສໍາລັບພວກເຂົາ. ຖ້າຂະບວນການໃດກໍ່ມີການປ່ຽນແປງການພົວພັນກຸ່ມຂະບວນການຂອງມັນມັນຈະບໍ່ໄດ້ຮັບສັນຍານເຫຼົ່ານີ້. ຂະບວນການດັ່ງກ່າວຈໍາເປັນຕ້ອງຖືກຍົກເລີກແຍກຕ່າງຫາກ.

Telinit

/ sbin / telinit ແມ່ນເຊື່ອມຕໍ່ກັບ / sbin / init . ມັນຕ້ອງໃຊ້ການໂຕ້ຖຽງຫນຶ່ງຕົວອັກສອນແລະສັນຍານ init ເພື່ອປະຕິບັດການປະຕິບັດທີ່ເຫມາະສົມ. ການໂຕ້ຖຽງຕໍ່ໄປນີ້ເປັນຄໍາແນະນໍາໃຫ້ telinit :

0 , 1 , 2 , 3 , 4 , 5 ຫຼື 6

ບອກ init ໃຫ້ສະຫຼັບກັບລະດັບທີ່ກໍານົດໄວ້.

a , b , c

ບອກ init ເພື່ອປຸງແຕ່ງຂໍ້ມູນໄຟລ໌ / etc / inittab ທີ່ມີ runlevel a , b ຫຼື c .

Q or q

ບອກໃຫ້ ເລີ່ມຕົ້ນ ກວດສອບໄຟລ໌ / etc / inittab ໃຫມ່.

S or s

ບອກ init ໃຫ້ປ່ຽນເປັນໂຫມດຜູ້ໃຊ້ດຽວ.

U or u

ບອກຂັ້ນຕອນທີ່ຈະປະຕິບັດຕົວເອງ (ຮັກສາລັດ). ບໍ່ມີການກວດສອບຄືນໃຫມ່ຂອງໄຟລ໌ / etc / inittab . ລະດັບການດໍາເນີນງານຄວນຈະເປັນຫນຶ່ງໃນ Ss12345 , ຖ້າບໍ່ດັ່ງນັ້ນການຮ້ອງຂໍຈະຖືກປະຕິເສດຢ່າງງຽບໆ.

telinit ຍັງສາມາດບອກຂັ້ນຕອນທີ່ຄວນລໍຖ້າລະຫວ່າງການສົ່ງຂັ້ນຕອນ SIGTERM ແລະ SIGKILL ສັນຍານ. ຄ່າເລີ່ມຕົ້ນແມ່ນ 5 ວິນາທີ, ແຕ່ວ່ານີ້ສາມາດປ່ຽນແປງດ້ວຍຕົວເລືອກ -t sec .

telinit ສາມາດເອີ້ນໄດ້ໂດຍຜູ້ໃຊ້ທີ່ມີສິດທິພິເສດທີ່ເຫມາະສົມເທົ່ານັ້ນ.

ການກວດເບິງ ເລີ່ມຕົ້ນ ຖ້າມັນແມ່ນ init ຫຼື telinit ໂດຍການຊອກຫາ id process ຂອງມັນ; id process id init is always 1 ຈາກນີ້ມັນບອກວ່າແທນທີ່ຈະໂທ telinit ຫນຶ່ງກໍ່ສາມາດໃຊ້ init ແທນທີ່ຈະເປັນ shortcut.