Điều đó hoàn toàn phụ thuộc vào những dịch vụ bạn muốn có trên thiết bị của bạn.
Chương trình
Bạn có thể làm cho Linux khởi động trực tiếp vào một vỏ . Nó không hữu ích trong sản xuất - ai chỉ muốn có một cái vỏ ngồi ở đó - nhưng nó hữu ích như một cơ chế can thiệp khi bạn có bộ tải khởi động tương tác: chuyển init=/bin/sh
đến dòng lệnh kernel. Tất cả các hệ thống Linux (và tất cả các hệ thống unix) đều có vỏ kiểu Bourne / POSIX /bin/sh
.
Bạn sẽ cần một bộ tiện ích vỏ . BusyBox là một lựa chọn rất phổ biến; nó chứa một vỏ và tiện ích chung cho tập tin và thao tác văn bản ( cp
, grep
, ...), thiết lập mạng ( ping
, ifconfig
, ...), quá trình thao tác ( ps
, nice
, ...), và các công cụ khác nhau hệ thống khác ( fdisk
, mount
, syslogd
, ...). BusyBox có khả năng cấu hình cực cao: bạn có thể chọn công cụ nào bạn muốn và thậm chí các tính năng riêng lẻ tại thời điểm biên dịch, để có được thỏa hiệp kích thước / chức năng phù hợp cho ứng dụng của bạn. Ngoài sh
, mức tối thiểu mà bạn có thể không thực sự làm bất cứ điều gì mà không là mount
, umount
và halt
, nhưng nó sẽ là không điển hình không có cũng cat
, cp
, mv
, rm
,mkdir
, rmdir
, ps
, sync
Và một vài chi tiết. BusyBox cài đặt dưới dạng nhị phân đơn được gọi busybox
, với một liên kết tượng trưng cho mỗi tiện ích.
Quá trình đầu tiên trên một hệ thống unix bình thường được gọi init
. Công việc của nó là bắt đầu các dịch vụ khác. BusyBox chứa một hệ thống init. Ngoài init
tệp nhị phân (thường nằm trong /sbin
), bạn sẽ cần các tệp cấu hình của nó (thường được gọi là /etc/inittab
- một số thay thế init hiện đại loại bỏ tệp đó nhưng bạn sẽ không tìm thấy chúng trên một hệ thống nhúng nhỏ) cho biết dịch vụ nào sẽ bắt đầu và khi. Đối với BusyBox, /etc/inittab
là tùy chọn; nếu nó bị thiếu, bạn sẽ có một vỏ gốc trên bàn điều khiển và tập lệnh /etc/init.d/rcS
(vị trí mặc định) được thực thi khi khởi động.
Đó là tất cả những gì bạn cần, ngoài các chương trình giúp thiết bị của bạn làm điều gì đó hữu ích. Ví dụ: trên bộ định tuyến gia đình của tôi chạy biến thể OpenWrt , các chương trình duy nhất là BusyBox, nvram
(để đọc và thay đổi cài đặt trong NVRAM) và các tiện ích mạng.
Trừ khi tất cả các tệp thực thi của bạn được liên kết tĩnh, bạn sẽ cần trình tải động ( ld.so
có thể được gọi bằng các tên khác nhau tùy thuộc vào lựa chọn libc và trên các kiến trúc bộ xử lý) và tất cả các thư viện động ( /lib/lib*.so
có lẽ một số trong số này trong /usr/lib
) những thực thi này.
Cấu trúc thư mục
Các hệ thống tập tin tiêu chuẩn cấp bậc mô tả cấu trúc thư mục chung của các hệ thống Linux. Nó hướng đến việc cài đặt máy tính để bàn và máy chủ: rất nhiều trong số đó có thể được bỏ qua trên một hệ thống nhúng. Đây là một mức tối thiểu điển hình.
/bin
: chương trình thực thi (một số có thể /usr/bin
thay thế).
/dev
: các nút thiết bị (xem bên dưới)
/etc
: tập tin cấu hình
/lib
: các thư viện dùng chung, bao gồm trình tải động (trừ khi tất cả các tệp thực thi được liên kết tĩnh)
/proc
: điểm gắn kết cho hệ thống tập tin Proc
/sbin
: chương trình thực thi. Sự khác biệt với /bin
là /sbin
là cho các chương trình mà chỉ là hữu ích cho các quản trị hệ thống, nhưng sự khác biệt này không có ý nghĩa trên các thiết bị nhúng. Bạn có thể tạo /sbin
một liên kết tượng trưng đến /bin
.
/mnt
: tiện dụng để có trên các hệ thống tập tin gốc chỉ đọc làm điểm gắn kết trong quá trình bảo trì
/sys
: điểm gắn kết cho hệ thống tập tin sysfs
/tmp
: vị trí cho các tệp tạm thời (thường là một tmpfs
mount)
/usr
: Chứa các thư mục con bin
, lib
và sbin
. /usr
tồn tại cho các tệp bổ sung không có trên hệ thống tệp gốc. Nếu bạn không có điều đó, bạn có thể tạo /usr
một liên kết tượng trưng đến thư mục gốc.
Tập tin thiết bị
Dưới đây là một số mục tiêu biểu trong tối thiểu /dev
:
console
full
(viết cho nó luôn báo cáo không còn chỗ trống trên thiết bị)
log
(một ổ cắm mà các chương trình sử dụng để gửi các mục nhật ký), nếu bạn có một syslogd
daemon (chẳng hạn như BusyBox) đọc từ nó
null
(hoạt động như một tập tin luôn trống)
ptmx
và một pts
thư mục , nếu bạn muốn sử dụng thiết bị đầu cuối giả (tức là bất kỳ thiết bị đầu cuối nào ngoài bảng điều khiển) - ví dụ: nếu thiết bị được nối mạng và bạn muốn telnet hoặc ssh trong
random
(trả về byte ngẫu nhiên, chặn rủi ro)
tty
(luôn chỉ định thiết bị đầu cuối của chương trình)
urandom
(trả về byte ngẫu nhiên, không bao giờ chặn nhưng có thể không ngẫu nhiên trên thiết bị mới khởi động)
zero
(chứa một chuỗi vô hạn các byte rỗng)
Ngoài ra, bạn sẽ cần các mục cho phần cứng của mình (ngoại trừ giao diện mạng, những mục này không nhận được mục /dev
): cổng nối tiếp, lưu trữ, v.v.
Đối với các thiết bị nhúng, thông thường bạn sẽ tạo các mục thiết bị trực tiếp trên hệ thống tập tin gốc. Các hệ thống cao cấp có một tập lệnh được gọi MAKEDEV
để tạo /dev
các mục, nhưng trên một hệ thống nhúng, tập lệnh thường không được đưa vào hình ảnh. Nếu một số phần cứng có thể được cắm nóng (ví dụ: nếu thiết bị có cổng máy chủ USB), thì /dev
nên được quản lý bởi udev (bạn vẫn có thể có một bộ tối thiểu trên hệ thống tệp gốc).
Hành động thời gian khởi động
Ngoài hệ thống tập tin gốc, bạn cần gắn thêm một vài hoạt động bình thường:
- Procfs trên
/proc
(khá nhiều không thể thiếu)
- sysfs trên
/sys
(khá nhiều không thể thiếu)
tmpfs
bật hệ thống tệp /tmp
(để cho phép các chương trình tạo tệp tạm thời sẽ có trong RAM, thay vì trên hệ thống tệp gốc có thể ở dạng flash hoặc chỉ đọc)
- tmpfs, devfs hoặc devtmpfs trên
/dev
nếu động (xem udev trong các tập tin thiết bị ở trên)
- devpts trên
/dev/pts
nếu bạn muốn sử dụng [pseudo-thiết bị đầu cuối (xem nhận xét về pts
ở trên)
Bạn có thể tạo một /etc/fstab
tập tin và gọi điện mount -a
, hoặc chạy mount
thủ công.
Bắt đầu một trình nền syslog (cũng như klogd
cho các bản ghi kernel, nếu syslogd
chương trình không quan tâm đến nó), nếu bạn có bất kỳ nơi nào để ghi nhật ký.
Sau này, thiết bị đã sẵn sàng để bắt đầu các dịch vụ dành riêng cho ứng dụng.
Làm thế nào để tạo một hệ thống tập tin gốc
Đây là một câu chuyện dài và đa dạng, vì vậy tất cả những gì tôi sẽ làm ở đây là đưa ra một vài gợi ý.
Hệ thống tệp gốc có thể được giữ trong RAM (được tải từ hình ảnh (thường được nén) trong ROM hoặc flash) hoặc trên hệ thống tệp dựa trên đĩa (được lưu trữ trong ROM hoặc flash) hoặc được tải từ mạng (thường qua TFTP ) . Nếu hệ thống tập tin gốc nằm trong RAM, hãy biến nó thành initramfs - hệ thống tập tin RAM có nội dung được tạo khi khởi động.
Nhiều khung tồn tại để lắp ráp hình ảnh gốc cho các hệ thống nhúng. Có một vài gợi ý trong Câu hỏi thường gặp về BusyBox . Buildroot là một hình ảnh phổ biến, cho phép bạn xây dựng toàn bộ hình ảnh gốc với thiết lập tương tự như nhân Linux và BusyBox. OpenEmbedded là một khung như vậy.
Wikipedia có một danh sách (chưa đầy đủ) các bản phân phối Linux nhúng phổ biến . Một ví dụ về Linux nhúng mà bạn có thể có gần bạn là nhóm hệ điều hành OpenWrt dành cho các thiết bị mạng (phổ biến trên các bộ định tuyến gia đình của tinkerer). Nếu bạn muốn học hỏi bằng kinh nghiệm, bạn có thể dùng thử Linux từ Scratch , nhưng nó hướng đến các hệ thống máy tính để bàn dành cho người có sở thích hơn là hướng tới các thiết bị nhúng.
Một lưu ý về nhân Linux và Linux
Hành vi duy nhất được đưa vào nhân Linux là chương trình đầu tiên được khởi chạy khi khởi động. (Tôi sẽ không nhận được sự tinh tế của initrd và initramfs ở đây.) Chương trình này, theo truyền thống được gọi là init , có ID ID 1 và có các đặc quyền nhất định (miễn nhiễm với tín hiệu KILL ) và trách nhiệm (gặt hái trẻ mồ côi ). Bạn có thể chạy một hệ thống với một hạt nhân Linux và bắt đầu bất cứ điều gì bạn muốn là quá trình đầu tiên, nhưng sau đó những gì bạn có là một hệ điều hành dựa trên Linux kernel, và không phải những gì thường được gọi là “Linux” - Linux , theo nghĩa thông thường của thuật ngữ này, là một hệ điều hành giống Unix có kernel là kernel Linux. Ví dụ, Android là một hệ điều hành không giống Unix mà dựa trên nhân Linux.