การเชื่อมต่อระหว่างไดเร็กทอรี“ /etc/init.d” และ“ /etc/rcX.d” ใน Linux คืออะไร


25

ฉันกำลังเรียนรู้บรรทัดคำสั่งจากหนังสือที่ชื่อว่า " Linux Command Line และ Shell Scripting Bible, Second Edition " หนังสือเล่มนี้ระบุว่า:

การใช้งานลินุกซ์บางตัวจะมีตารางของกระบวนการที่จะเริ่มต้นโดยอัตโนมัติเมื่อบูต บนระบบ Linux ตารางนี้มักจะอยู่ในไฟล์พิเศษ / etc / inittabs

ระบบอื่น ๆ (เช่นการกระจาย Ubuntu Linux ยอดนิยม) ใช้โฟลเดอร์ /etc/init.d ซึ่งมีสคริปต์สำหรับการเริ่มต้นและหยุดแอปพลิเคชันแต่ละรายการในเวลาบูต สคริปต์เริ่มทำงานผ่านรายการภายใต้โฟลเดอร์ /etc/rcX.d โดยที่ X คือระดับการรัน

อาจเป็นเพราะฉันใหม่สำหรับ linux ฉันไม่เข้าใจความหมายของย่อหน้าที่สองที่ยกมา บางคนสามารถอธิบายสิ่งเดียวกันด้วยภาษาที่ชัดเจนกว่าได้หรือไม่?


สิ่งนี้ถูกถามหลายครั้งก่อน
bsd

@ การลดลงของคนนี้ที่แตกต่างกัน ฉันมีบริบท คำถามที่ฉันเห็นในหน้าเว็บที่คุณเชื่อมโยงถึงนั้นแตกต่างจาก IMO
its_me

@ การปิดตัวลง แต่ตั้งค่าสถานะซ้ำซ้อนจะมีข้อมูลมากขึ้นถ้าคุณรู้สึก
n611x007

คำตอบ:


30

เรามาลืมinit.dหรือทำrcx.dสิ่งต่าง ๆ ให้เรียบง่ายกันเถอะ ลองนึกภาพคุณกำลังเขียนโปรแกรมที่มีความรับผิดชอบ แต่เพียงผู้เดียวในการเรียกใช้หรือฆ่าสคริปต์อื่นทีละตัว

อย่างไรก็ตามปัญหาต่อไปของคุณคือเพื่อให้แน่ใจว่าพวกเขาทำงานตามลำดับ คุณจะทำสิ่งนั้นอย่างไร

และลองจินตนาการว่าโปรแกรมนี้ดูภายในscriptsโฟลเดอร์สำหรับเรียกใช้สคริปต์ เพื่อจัดลำดับความสำคัญของสคริปต์คุณจะตั้งชื่อพวกเขาในช่วยให้พูดลำดับตัวเลข คำสั่งนี้เป็นสิ่งที่กำหนดความสัมพันธ์ระหว่างinit.dและrc

กล่าวอีกนัยหนึ่งก็init.dคือสคริปต์ที่จะเรียกใช้และrcX.dประกอบด้วยคำสั่งที่จะเรียกใช้

Xค่าในrcX.d ระดับการทำงาน นี่อาจแปลเป็นสถานะปัจจุบันของ OS อย่างหลวม ๆ

หากคุณขุดในrcX.dสคริปต์คุณจะพบการจัดรูปแบบนี้:

Xxxabcd
  • Xถูกแทนที่ด้วยKหรือSซึ่งย่อมาจากสคริปต์ควรkilledหรือstartedในระดับการทำงานปัจจุบัน
  • xx คือหมายเลขคำสั่งซื้อ
  • abcd เป็นชื่อสคริปต์ (ชื่อไม่เกี่ยวข้อง แต่เป็นจุดที่สคริปต์จะทำงาน)

2
คำอธิบายที่ยอดเยี่ยมชัดเจนมาก @whoami ขอบคุณ
its_me

9

มีระบบเริ่มต้นที่แตกต่างกันสำหรับ Linux สิ่งที่สำคัญคือSysVinit (ดั้งเดิม), พุ่งพรวด (ทดแทน Ubuntu), และSystemD (ผลักโดย Fedora และ Gnome) ไดเร็กทอรี/etc/init.dและ/etc/rc?.dถูกใช้โดย SysVinit หนังสือเล่มนี้อาจกล่าวถึงพวกเขาเกี่ยวกับ Ubuntu เพราะข้อมูลนั้นค่อนข้างเก่า (Ubuntu เคยใช้ SysVinit เหมือนคนอื่น ๆ ) หรือเพราะไดเรกทอรีเหล่านั้นยังคงมีอยู่เพื่อความเข้ากันได้

/etc/init.dมีสคริปต์จำนวนมากแต่ละคำสั่งจะมีบริการเริ่มและหยุดบริการ บริการเหล่านี้บางอย่างจำเป็นต้องเริ่มต้นในเวลาบูต คนอื่น ๆ จะต้องเริ่มต้นในโหมดผู้ใช้หลายคน แต่ไม่ได้อยู่ในโหมดการบำรุงรักษาผู้ใช้คนเดียว; และเป็นไปได้ที่จะกำหนดโหมดที่แตกต่างด้วยชุดบริการที่ต้องการที่แตกต่างกัน sysvinit จัดการนี้ผ่านrunlevels ไดเรกทอรี/etc/rc$N.dประกอบด้วยสคริปต์ที่จะทำงานเมื่อป้อน runlevel N ( /etc/rc$N.d/S*) และสคริปต์ที่จะทำงานเมื่อออกจาก runlevel N ( /etc/rc$N.d/K*) เนื่องจาก runlevels หลายแห่งมีสคริปต์เหมือนกันแทนที่จะเก็บสำเนาของสคริปต์สำหรับ runlevel แต่ละสคริปต์สคริปต์ทั้งหมดจะถูกเก็บไว้ในที่เดียว/etc/init.dและไดเรกทอรีเฉพาะ runlevel/etc/rc?.dมีลิงก์สัญลักษณ์ นอกจากนี้ชื่อของลิงก์สัญลักษณ์จะระบุว่าจะให้บริการเริ่มต้น ( S*) หรือหยุดทำงาน (ถูกฆ่าตายK*) ใน runlevel นั้นและใช้คำนำหน้าเป็นตัวเลขเพื่อควบคุมลำดับที่สคริปต์ถูกเรียกใช้งาน

สคริปต์ที่รับผิดชอบการสำรวจเส้นทาง/etc/rc$N.dคือ/etc/init.d/rc(ในช่วงก่อนเริ่มต้นงาน Ubuntu และบน Debian; ตำแหน่งอาจแตกต่างกันไปตามการกระจาย Linux อื่น ๆ )


ดังนั้นอูบุนตูไม่ได้ใช้/etc/init.dและ/etc/rc?.dอีกต่อไปและมีพุ่งพรวดแทน?
its_me

1
@ KrishD'Souza ไม่มาก Ubuntu ใช้ Upstart แทน SysVinit แต่แพ็คเกจจำนวนมากยังคงจัดส่งสคริปต์ใน/etc/init.d(แทนที่จะเป็น.confไฟล์Upstart ใน/etc/init) ดังนั้น Upstart จึงรองรับ/etc/init.dและ/etc/rc?.dเข้ากันได้
Gilles 'หยุดความชั่วร้าย'

Ubuntu เปลี่ยนจาก Upstart เป็น systemd ตั้งแต่ 15.04 ดังนั้นในขณะนี้ (16.04) Ubuntu มีสามระบบเริ่มต้น: SysVinit, พุ่งพรวดและ systemd ตัวแรกและตัวที่สองจะถูกทิ้งไว้เพื่อความเข้ากันได้แบบย้อนหลัง
PetroCliff

4

/etc/init.d เป็นไดเรกทอรีที่มีสคริปต์เริ่มต้นอยู่

เป็นที่ที่เชื่อมโยงการควบคุมการบริการที่ถูกฆ่าหรือเริ่มต้นเมื่อเข้าสู่ระดับการทำงานetc/rcX.d Xไฟล์ในrcX.dเริ่มต้นด้วย K จะดำเนินการกับพารามิเตอร์stopและไฟล์ที่เริ่มต้นด้วยจะดำเนินการกับพารามิเตอร์S startมันเป็นเรื่องปกติที่จะเริ่มต้นลำดับและการสั่งซื้อหยุดใช้หมายเลขสองหลักหลังหรือK Sเพื่อให้แน่ใจว่าการเริ่มต้นและหยุดการสั่งซื้อที่ถูกต้องเป็นเรื่องปกติสำหรับสองลำดับที่จะเพิ่มได้ถึง 100

โปรแกรมสามารถใช้งานในระดับการทำงานโดยการเอาการเชื่อมโยงหรือเปลี่ยนกรณีของKหรือSไปหรือks

แก้ไข: ผู้ดูแลระบบมักจะเรียกใช้สคริปต์/etc/init.dซึ่งอาจจะเป็นลิงค์สัญลักษณ์ไปยังไดเรกทอรีอื่นขึ้นอยู่กับการกระจาย (การแจกแจงที่แตกต่างกันมีมาตรฐานที่แตกต่างกัน)

rcX.dจะถูกใช้โดยรหัสการเริ่มต้นในการเปลี่ยนแปลงระดับการทำงาน


ในระบบส่วนใหญ่/etc/init.dเป็น symlink ไปยังไดเรกทอรีภายใต้/etc/rc.d/init.d
Nikhil Mulley

1
ดังนั้นโดยทั่วไป/etc/init.dจะไร้ประโยชน์โดยไม่มี/etc/rcX.d? และเนื่องจาก/etc/rcX.dคอนโทรลเลอร์ของโปรแกรมที่เปิดตัวเมื่อเริ่มต้นฟังก์ชั่นมันคล้ายกับของ/etc/init.dถูกต้องหรือไม่
its_me

ขึ้นอยู่กับระบบ ตัวอย่างเช่น Gentoo ใช้เฉพาะ /etc/init.d สำหรับไฟล์ init เท่านั้น มันไม่มีไดเร็กทอรี /etc/rc*.d Arch Linux เช่นเดียวกันมี /etc/rc.d แทนที่จะเป็น /etc/init.d
laebshade

1

แม้ว่า @BillThor ได้ทำการตอบรับเป็นอย่างดี แต่นี่เป็นความเข้าใจของฉัน/etc/rcX.dและ/etc/init.d:

  • /etc/init.d มีสคริปต์สำหรับการเริ่มต้นและหยุดแอปพลิเคชันแต่ละรายการในเวลาบูต
  • /etc/rc?.dไดเรกทอรีแสดงระดับการทำงานที่หลากหลายและสคริปต์ที่อยู่ในนั้นไม่มีอะไรนอกจากการเชื่อมโยงสัญลักษณ์ไปยังสคริปต์จริงใน/etc/init.dไดเรกทอรี การเปลี่ยนระดับการรันจะเปลี่ยนโหมดของระบบเช่นโหมดผู้ใช้ขั้นพื้นฐานขั้นพื้นฐานไปเป็นโหมดคอนโซลอย่างเดียวไปเป็นส่วนต่อประสานกราฟิกขั้นสูง

ดังนั้นจึงไม่มีการใช้/etc/rc?.dไดเรกทอรีโดยไม่มี/etc/init.dตัวเอง (และแน่นอนในทางกลับกัน)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.