Bạn có thể khiến mã được thực thi bằng cách làm rối với dòng lệnh kernel. Phương pháp rõ ràng nhất là thay thế init bằng thứ khác. Ứng dụng phổ biến nhất của việc này là khởi chạy shell rất sớm trong quá trình khởi động, thường là do bạn cần sửa một cái gì đó hoặc vì mọi thứ khác bị hỏng rất nặng, ví dụ:
init=/bin/bash
Hãy nhớ rằng tại thời điểm này trong quá trình khởi động, các hệ thống tập tin vẫn được gắn kết chỉ đọc. Ngoài ra, có cả đống thứ không hoạt động chính xác. Bởi vì bạn không có init thực sự đang chạy, tắt máy và khởi động lại sẽ không hoạt động. Bạn phải truy xuất thủ công hệ thống tập tin gốc chỉ đọc và gọi reboot -f
để khởi động lại, ví dụ.
Tôi không biết nếu bạn có thể truyền đối số cho bash theo cách này. Tôi chưa bao giờ thử. Về lý thuyết, nếu bạn có thể chuyển -c
sang bash, bạn có thể nói rằng quá trình bash đó để làm bất cứ điều gì. Nhưng nó có thể biến thành một cuộc tranh luận khá dài và tôi không biết liệu kernel có cho phép những thứ đó không.
Điều thứ hai bạn có thể làm. Bạn có thể sao chép một ramfs ban đầu (initramfs) vào hệ thống tập tin và cấu hình bộ tải khởi động để sử dụng nó config.txt
. Có một số cách để đưa các tập lệnh vào một initramfs để làm những điều đặc biệt. Tuy nhiên, bạn sẽ phải chuẩn bị một initramfs đặc biệt cho mục đích này (xem initramfs-tools (8)), vì vậy tôi không chắc đây có phải là giải pháp tốt hơn hình ảnh tùy chỉnh hay không.
Bạn có thể bao gồm tập lệnh in / boot (Tôi đã cười theo gợi ý của bạn về các máy "thông thường", nhưng đây sẽ là bit bạn có thể truy cập từ các máy đó) và cố gắng khởi chạy bằng cách sử dụng dòng init kernel, nhưng các tệp trên hệ thống tập tin dos Không thể thực thi trừ khi bạn làm như vậy cho toàn bộ hệ thống tập tin.
Nếu là tôi, tôi sẽ tạo một hình ảnh tùy chỉnh sử dụng dhcp để định cấu hình mạng và chứa tập lệnh tùy chỉnh chạy khi khởi động. Kịch bản lệnh này kiểm tra một tệp cụ thể hoạt động như một cờ. Nếu tập tin tồn tại, không làm gì cả. Nếu không, cấu hình mọi thứ, sau đó tạo tệp cờ.
Tập lệnh cấu hình của bạn thậm chí có thể lấy dữ liệu thật từ máy chủ http. Điều này có nghĩa là bạn không phải tạo một hình ảnh mới nếu bạn phải chỉnh sửa một cái gì đó.
Đó nên là giải pháp ít căng thẳng nhất.
Một khả năng cuối cùng, nhưng bạn sẽ phải thực hiện điều này trên máy "không thường xuyên" :-) Bạn có thể gắn hệ thống tệp ext4 vào thiết bị lặp và sao chép tệp vào đó mà không cần ghi vào sdcard trước. Đối với một hình ảnh Jessie Raspbian tiêu chuẩn, nó sẽ giống như thế này:
sudo losetup /dev/loop0 /tmp/gw.img -o 62914560
sudo mount /dev/loop0 /mnt
sudo cp /my/superduper/script.sh /mnt
sudo umount /dev/loop0
sudo fsck -f /dev/loop0 # This is optional
sudo losetup -d /dev/loop0
Tôi thích làm một fsck bắt buộc trên các hệ thống tập tin của tôi trước khi tạo hình ảnh. Đặt số lần gắn kết về 0 trong lần khởi động đầu tiên :-)
EDIT : Sau nhiều tháng và nhiều kinh nghiệm. Bạn muốn nhìn vào u-boot. Thay thế bộ tải khởi động bằng u-boot. Điều này có thể được thực hiện từ một "máy thông thường". Khi bạn đã có u-boot, bạn có thể khởi động mạng một bản phân phối mà từ đó bạn có thể dễ dàng flash thẻ sd, hoặc về lý thuyết bạn có thể flash thẻ trực tiếp, mặc dù tôi không biết điều đó sẽ khó đến mức nào.
Về cơ bản, u-boot mang lại khả năng khởi động mạng cho Raspberry Pi, một thứ mà nó không hỗ trợ.