ทั้งหมดนี้ขึ้นอยู่กับบริการที่คุณต้องการบนอุปกรณ์ของคุณ
โปรแกรม
คุณสามารถทำให้ boot Linux เป็นเชลล์ได้โดยตรง มันไม่ได้มีประโยชน์มากในการผลิตใครจะแค่อยากให้เชลล์นั่งอยู่ตรงนั้น - แต่มันมีประโยชน์ในฐานะกลไกการแทรกแซงเมื่อคุณมี bootloader แบบโต้ตอบ: ส่งผ่านinit=/bin/shไปยังบรรทัดคำสั่งเคอร์เนล ทุกระบบลินุกซ์ (และระบบยูนิกซ์ทั้งหมด) มีเปลือกบอร์น / POSIX /bin/shสไตล์
คุณจะต้องชุดของสาธารณูปโภคเปลือก BusyBoxเป็นตัวเลือกที่ธรรมดามาก มันมีเปลือกและระบบสาธารณูปโภคที่พบบ่อยสำหรับไฟล์และการจัดการข้อความ ( cp, grep, ... ), การติดตั้งระบบเครือข่าย ( ping, ifconfig, ... ), การจัดการกระบวนการ ( ps, nice... ) และเครื่องมือต่างๆของระบบอื่น ๆ ( fdisk, mount, syslogd, ... ) BusyBox สามารถกำหนดค่าได้อย่างมาก: คุณสามารถเลือกเครื่องมือที่คุณต้องการและแม้กระทั่งคุณสมบัติแต่ละอย่างในเวลารวบรวมเพื่อให้ได้ขนาด / การทำงานที่เหมาะสมสำหรับแอปพลิเคชันของคุณ นอกเหนือจากshที่ต่ำสุดเปลือยที่คุณไม่สามารถจริงๆทำอะไรโดยไม่เป็นmount, umountและhalt, แต่มันจะผิดปกติไปไม่ได้นอกจากนี้ยังcat, cp, mv, rm,mkdir, rmdir, ps, syncและอีกไม่กี่ BusyBox ติดตั้งเป็นไบนารีเดียวที่เรียกว่าbusyboxพร้อมลิงก์สัญลักษณ์สำหรับแต่ละยูทิลิตี้
initขั้นตอนแรกในระบบยูนิกซ์ตามปกติจะเรียกว่า หน้าที่ของมันคือการเริ่มบริการอื่น ๆ BusyBox มีระบบเริ่มต้น นอกเหนือจากinitไบนารี่ (โดยปกติจะอยู่ใน/sbin) คุณจะต้องใช้ไฟล์การกำหนดค่าของมัน (โดยปกติจะเรียกว่า/etc/inittab- การแทนที่ init แบบใหม่บางอย่างจะทำไปกับไฟล์นั้น แต่คุณจะไม่พบมันในระบบฝังตัวขนาดเล็ก) และเมื่อ. สำหรับ BusyBox /etc/inittabเป็นตัวเลือก ถ้ามันหายไปคุณจะได้รูทเชลล์บนคอนโซลและสคริปต์/etc/init.d/rcS(ตำแหน่งเริ่มต้น) จะถูกดำเนินการในเวลาบูต
นั่นคือทั้งหมดที่คุณต้องการนอกเหนือจากโปรแกรมที่ทำให้อุปกรณ์ของคุณทำสิ่งที่มีประโยชน์ ตัวอย่างเช่นในเราเตอร์ที่บ้านของฉันใช้ตัวแปรOpenWrtโปรแกรมเดียวคือ BusyBox nvram(เพื่ออ่านและเปลี่ยนการตั้งค่าใน NVRAM) และระบบเครือข่าย
เว้นแต่ทั้งหมด executables ของคุณมีการเชื่อมโยงแบบคงที่คุณจะต้องโหลดแบบไดนามิก ( ld.soซึ่งอาจจะเรียกชื่อแตกต่างกันไปขึ้นอยู่กับทางเลือกของ libc และสถาปัตยกรรมหน่วยประมวลผล) และทั้งหมดที่ห้องสมุดแบบไดนามิก ( /lib/lib*.soบางทีบางส่วนของเหล่านี้/usr/lib) ที่จำเป็นโดย ไฟล์ปฏิบัติการเหล่านี้
โครงสร้างไดเรกทอรี
ระบบแฟ้มลำดับชั้นมาตรฐานอธิบายถึงโครงสร้างไดเรกทอรีทั่วไปของระบบ Linux มันมุ่งไปสู่การติดตั้งเดสก์ท็อปและเซิร์ฟเวอร์: จำนวนมากสามารถถูกละเว้นในระบบฝังตัว นี่คือขั้นต่ำทั่วไป
/bin: โปรแกรมปฏิบัติการ (บางโปรแกรมอาจใช้/usr/binแทน)
/dev: โหนดอุปกรณ์ (ดูด้านล่าง)
/etc: ไฟล์การกำหนดค่า
/lib: shared library รวมถึง dynamic loader (เว้นแต่ว่า executables ทั้งหมดจะถูกลิงค์แบบสแตติก)
/proc: จุดเมานท์สำหรับระบบไฟล์ proc
/sbin: โปรแกรมปฏิบัติการ ความแตกต่างที่มี/binก็คือว่า/sbinเป็นโปรแกรมที่มีประโยชน์เฉพาะกับผู้ดูแลระบบ แต่ความแตกต่างนี้ไม่ได้มีความหมายเกี่ยวกับอุปกรณ์ฝังตัว คุณสามารถสร้าง/sbinลิงค์สัญลักษณ์/binได้
/mnt: มีประโยชน์ที่จะมีในระบบไฟล์รูทแบบอ่านอย่างเดียวเป็นจุดต่อรอยขีดข่วนระหว่างการบำรุงรักษา
/sys: จุดเมานท์สำหรับระบบไฟล์ sysfs
/tmp: ตำแหน่งสำหรับไฟล์ชั่วคราว (มักจะtmpfsเมานท์)
/usr: มีไดเรกทอรีย่อยbin, และlib มีอยู่สำหรับไฟล์พิเศษที่ไม่ได้อยู่ในระบบไฟล์รูท หากคุณไม่มีสิ่งนั้นคุณสามารถสร้างลิงก์สัญลักษณ์ไปยังไดเร็กทอรีรูทได้sbin/usr/usr
ไฟล์อุปกรณ์
นี่คือรายการทั่วไปในขั้นต่ำ/dev:
console
full (เขียนถึงมันเสมอรายงาน“ ไม่มีพื้นที่เหลือบนอุปกรณ์”)
log(ซ็อกเก็ตที่โปรแกรมใช้เพื่อส่งรายการบันทึก) หากคุณมีsyslogdดีมอน (เช่น BusyBox) อ่านจากมัน
null (ทำหน้าที่เหมือนไฟล์ที่ยังว่างอยู่เสมอ)
ptmxและptsไดเรกทอรีถ้าคุณต้องการใช้เทอร์มินัลหลอก (เช่นเทอร์มินัลอื่นนอกเหนือจากคอนโซล) - เช่นหากอุปกรณ์มีเครือข่ายและคุณต้องการ telnet หรือ ssh ใน
random (ส่งกลับสุ่มไบต์ความเสี่ยงที่ถูกบล็อก)
tty (กำหนดเทอร์มินัลของโปรแกรมเสมอ)
urandom (ส่งกลับสุ่มไบต์ไม่เคยบล็อก แต่อาจไม่สุ่มบนอุปกรณ์ที่บูตใหม่)
zero (มีลำดับที่ไม่มีที่สิ้นสุดของไบต์เป็นโมฆะ)
นอกเหนือจากนั้นคุณจะต้องมีรายการสำหรับฮาร์ดแวร์ของคุณ (ยกเว้นอินเทอร์เฟซเครือข่ายสิ่งเหล่านี้ไม่ได้รับรายการ/dev): พอร์ตอนุกรมที่เก็บข้อมูล ฯลฯ
สำหรับอุปกรณ์ฝังตัวปกติแล้วคุณจะสร้างรายการอุปกรณ์โดยตรงบนระบบไฟล์รูท ระบบระดับสูงมีสคริปต์ที่เรียกว่าMAKEDEVสร้าง/devรายการ แต่ในระบบฝังตัวสคริปต์มักจะไม่รวมอยู่ในภาพ หากฮาร์ดแวร์บางตัวสามารถเสียบปลั๊กได้ (เช่นหากอุปกรณ์มีพอร์ตโฮสต์ USB) ดังนั้น/devควรจัดการโดยudev (คุณยังอาจตั้งค่าขั้นต่ำไว้ที่ระบบไฟล์รูท)
การดำเนินการบูตเวลา
นอกเหนือจากระบบไฟล์รูทแล้วคุณต้องติดตั้งอีกสองสามครั้งเพื่อการทำงานปกติ:
- procfs on
/proc(ที่ขาดไม่ได้เลยทีเดียว)
- sysfs on
/sys(ขาดไม่ได้เลยทีเดียว)
tmpfsระบบไฟล์บน/tmp(เพื่ออนุญาตให้โปรแกรมสร้างไฟล์ชั่วคราวที่จะอยู่ใน RAM แทนที่จะอยู่ในระบบไฟล์รูทซึ่งอาจเป็นแบบแฟลชหรืออ่านอย่างเดียว)
- tmpfs, devfs หรือ devtmpfs เปิด
/devถ้าไดนามิก (ดู udev ใน“ ไฟล์อุปกรณ์” ด้านบน)
- devpts on
/dev/ptsหากคุณต้องการใช้ [หลอกขั้ว (ดูหมายเหตุเกี่ยวกับptsด้านบน)
คุณสามารถสร้าง/etc/fstabไฟล์และโทรmount -aหรือเรียกใช้mountด้วยตนเอง
เริ่มsyslog daemon (เช่นเดียวกับklogdบันทึกเคอร์เนลหากsyslogdโปรแกรมไม่ได้ดูแลมัน) ถ้าคุณมีที่ที่จะเขียนล็อก
หลังจากนี้อุปกรณ์พร้อมที่จะเริ่มบริการเฉพาะแอปพลิเคชัน
วิธีสร้างระบบไฟล์รูท
นี่คือเรื่องราวที่ยาวนานและมีความหลากหลายดังนั้นสิ่งที่ฉันจะทำที่นี่คือให้คำแนะนำไม่กี่
ระบบไฟล์รูทอาจถูกเก็บไว้ใน RAM (โหลดจากภาพ (มักบีบอัด) ใน ROM หรือแฟลช) หรือบนระบบไฟล์ที่ใช้ดิสก์ (เก็บไว้ใน ROM หรือแฟลช) หรือโหลดจากเครือข่าย (มักจะมากกว่าTFTP ) . หากระบบไฟล์รูทอยู่ใน RAM ให้สร้างเป็นinitramfsซึ่งเป็นระบบไฟล์ RAM ที่มีการสร้างเนื้อหาในเวลาบูต
มีเฟรมเวิร์กมากมายสำหรับการรวมอิมเมจรูทสำหรับระบบฝังตัว มีไม่กี่ตัวชี้ในมีBusyBox คำถามที่พบบ่อย Buildrootเป็นรูปแบบที่ได้รับความนิยมทำให้คุณสามารถสร้างอิมเมจรูททั้งหมดด้วยการตั้งค่าคล้ายกับเคอร์เนล Linux และ BusyBox OpenEmbeddedเป็นอีกหนึ่งเฟรมเวิร์กดังกล่าว
วิกิพีเดียมี (สมบูรณ์) รายการที่นิยมลินุกซ์ฝังตัว ตัวอย่างของลินุกซ์ในตัวที่คุณอาจมีอยู่ใกล้ ๆ คุณคือตระกูลของระบบปฏิบัติการOpenWrtสำหรับอุปกรณ์เครือข่าย (เป็นที่นิยมในเราเตอร์ที่บ้านของ tinkerers) หากคุณต้องการเรียนรู้จากประสบการณ์คุณสามารถลองใช้Linux ตั้งแต่เริ่มต้นแต่จะมุ่งสู่ระบบเดสก์ท็อปสำหรับมือสมัครเล่นมากกว่าไปยังอุปกรณ์ฝังตัว
หมายเหตุเกี่ยวกับ Linux vs Linux kernel
พฤติกรรมเดียวที่ถูกนำเข้าสู่ลินุกซ์เคอร์เนลคือโปรแกรมแรกที่เปิดตัวในเวลาบูต (ฉันจะไม่ได้เป็นinitrdและinitramfsรายละเอียดปลีกย่อยที่นี่.) โปรแกรมนี้เรียกว่าประเพณีinitมีกระบวนการ ID ที่ 1 และมีสิทธิพิเศษบางอย่าง (ภูมิคุ้มกันต่อสัญญาณฆ่า ) และความรับผิดชอบ (เก็บเกี่ยวเด็กกำพร้า ) คุณสามารถเรียกใช้ระบบด้วยเคอร์เนล Linux และเริ่มต้นสิ่งที่คุณต้องการเป็นกระบวนการแรก แต่สิ่งที่คุณมีคือระบบปฏิบัติการที่ใช้เคอร์เนล Linux และไม่ใช่สิ่งที่ปกติเรียกว่า“ Linux” - Linuxในแง่สามัญสำนึก คำนี้เป็นระบบปฏิบัติการ Unixที่มีเคอร์เนลเป็นเคอร์เนล Linux. ตัวอย่างเช่น Android เป็นระบบปฏิบัติการที่ไม่เหมือน Unix แต่ใช้ Linux kernel