ทั้งหมดนี้ขึ้นอยู่กับบริการที่คุณต้องการบนอุปกรณ์ของคุณ
โปรแกรม
คุณสามารถทำให้ 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