สำหรับผู้ที่ต้องการวิธีการแก้ปัญหาที่เกี่ยวข้องกับสคริปต์เท่านั้นที่ถูกทิ้งลงในพาร์ติชันสำหรับบู๊ต FAT32 นี่คือวิธีการทำเช่นนั้น [ แก้ไข:ขณะนี้ไฟล์พร้อมใช้งานในโครงการpi-boot-script ]
ดังกล่าวในคำตอบอื่น ๆ มันเกี่ยวข้องกับอาร์กิวเมนต์บรรทัดคำสั่งที่เคอร์เนล Linux เริ่มต้น ข้อโต้แย้งเหล่านั้นอยู่ใน/boot/cmdline.txt
ฉันได้ทดสอบสิ่งนี้กับ Raspbian Buster (v10.1) 2019-09-26 ใช้งานได้กับการ์ด SD ที่เพิ่งแฟลชใหม่หรือบนอิมเมจดิสก์. img ที่ดาวน์โหลดมาซึ่งคุณสามารถแฟลชไปยังการ์ด SD จำนวนเท่าใดก็ได้
1. แก้ไขอาร์กิวเมนต์ของเคอร์เนล
เปิดไฟล์ข้อความ/boot/cmdline.txtลบinit=
ส่วนใดส่วนหนึ่งออกจากนั้นเพิ่มส่วนท้ายบรรทัด:
init=/bin/bash -c "mount -t proc proc /proc; mount -t sysfs sys /sys; mount /boot; source /boot/unattended"
คำสุดท้ายในบรรทัดนี้เป็นชื่อของสคริปต์ที่จะทำงานโดย kernel เป็นกระบวนการแรก (PID = 1) แทน/ sbin / init หน้าวิธีใช้kernel-argumentsบอกว่ามี แต่อาร์กิวเมนต์เท่านั้นโดยไม่.
ถูกส่งไปยัง executable init ดังนั้นคุณไม่สามารถเรียกสคริปต์unattended.shหรือสิ่งอื่น ๆ ได้
2. ใส่สคริปต์บนพาร์ติชันสำหรับเริ่มระบบ
บันทึกสิ่งต่อไปนี้ลงในพาร์ติชันสำหรับบู๊ตเป็น/ ไม่ต้องใส่ (ชื่อที่คุณใส่ในบรรทัดคำสั่ง):
# 1. MAKING THE SYSTEM WORK. DO NOT REMOVE
mount -t tmpfs tmp /run
mkdir -p /run/systemd
mount / -o remount,rw
sed -i 's| init=.*||' /boot/cmdline.txt
# 2. THE USEFUL PART OF THE SCRIPT
# Example:
[[ -d /boot/payload/home/pi ]] && sudo -u pi cp --preserve=timestamps -r\
/boot/payload/home/pi /home/ && rm -rf /boot/payload/home/pi # A
[[ -d /boot/payload ]] && cp --preserve=timestamps -r /boot/payload/* /\
&& rm -rf /boot/payload # B
ln -s /lib/systemd/system/one-time-script.service\
/etc/systemd/system/multi-user.target.wants/ # C
# 3. CLEANING UP AND REBOOTING
sync
umount /boot
mount / -o remount,ro
sync
echo 1 > /proc/sys/kernel/sysrq
echo b > /proc/sysrq-trigger
sleep 5
สคริปต์นี้เตรียมการบางอย่างที่จำเป็น (บทที่ 1) จากนั้นทุกอย่างที่คุณต้องการ (2) จากนั้นล้างข้อมูลและบูตใหม่ (3) แทนที่สิ่งที่อยู่ภายใต้ 2 ด้วยคำสั่งที่คุณต้องการเรียกใช้
สำหรับงานการกำหนดค่าบางอย่างคุณอาจต้องใช้การบูตปกติเพื่อแสดงเครือข่ายและบริการอื่น ๆ ดังนั้นตัวอย่างในรุ่นนี้ (อธิบายด้านล่าง) จะจัดเตรียมเฉพาะสคริปต์ที่เหมาะสมให้ทำงานเมื่อ Pi รีบูต
3. ใส่ไฟล์อื่น ๆ ที่สคริปต์ของคุณต้องการบนพาร์ติชันสำหรับบูต
อย่างเห็นได้ชัด ...
ตัวอย่าง
เมื่อรวมกับสคริปต์ของฉันฉันวางโฟลเดอร์payload /ไว้ในพาร์ติชันสำหรับบูตซึ่งเก็บไฟล์ที่ฉันต้องการย้ายไปยังพาร์ติชัน Linux ในสคริปต์แบบอัตโนมัติด้านบน
- บรรทัด A ย้ายไฟล์ไปยังไดเรกทอรีของผู้ใช้ pi เช่นpayload / home / pi / .bashrcถูกย้ายไปยังระบบไฟล์รูทเป็น/home/pi/.bashrc ;
- ย้ายสาย B ไฟล์รากที่เป็นเจ้าของลงไปในพาร์ทิชันลินุกซ์รวมทั้งน้ำหนักบรรทุก / usr / local / bin / one-time-script.shซึ่งจะกลายเป็น/usr/local/bin/one-time-script.shและคล้ายกันสำหรับน้ำหนักบรรทุก / lib / systemd / system / ครั้งเดียว script.service ;
- บรรทัด C จากนั้นสร้าง symlink ไปยังไฟล์สุดท้ายดังนั้นสคริปต์การกำหนดค่าของฉันone-time-script.shจะถูกเรียกใช้ในการบูตครั้งถัดไป
สคริปต์นั้นทำการปรับแต่งต่าง ๆ ที่ฉันชอบ: มันสร้างและฟอร์แมตพาร์ติชัน FAT32 อีกอันและเพิ่มลงใน/ etc / fstabเพื่อให้ผู้ใช้ pi สามารถเขียนได้ (สำหรับบันทึกแอปพลิเคชัน ฯลฯ ); ปรับขนาดพาร์ติชัน ext4 & ระบบไฟล์เป็นส่วนที่เหลือของการ์ด SD; เปลี่ยนโลแคลเขตเวลาชื่อโฮสต์ (ขึ้นอยู่กับหมายเลขซีเรียลของ CPU) ประเทศ WiFi ตั้งค่าเครือข่าย WiFi และวลีรหัสผ่าน; เปิด SSH แก้ไขปัญหาการตั้งค่าภาษาสำหรับเซสชัน SSH กำหนดค่าการบูทเข้าสู่คอนโซลโดยไม่ต้องล็อกอินอัตโนมัติ เขียนข้อมูลบางอย่างเกี่ยวกับระบบไปยังไฟล์บนพาร์ติชันสำหรับเริ่มระบบ และแน่นอนว่ามันจะลบ symlink นั้นออกไปดังนั้นมันจะไม่ทำงานอีกในตอนบูต
ผู้ใช้ส่วนใหญ่จะพบว่าไม่จำเป็นและต้องการใช้PiBakery , pi-init2หรือรูปภาพ ext4 ที่กำหนดเองซึ่งเป็นโซลูชันที่ยอดเยี่ยม ฉันชอบสิ่งนี้เพราะฉันสามารถเข้าใจได้อย่างเต็มที่และไม่ต้องเรียกใช้ซอฟต์แวร์อื่น และยังใช้งานได้: ด้วยไฟล์. img ที่ฉันใส่ไว้ในสคริปต์การกระพริบการ์ด SD ทั้งหมด + วางไว้ใน Pi + ปล่อยให้มันรันเพื่อกำหนดค่าตัวเองใช้เวลา 6 นาที
ที่มาฉันพบความคิดของสคริปต์เป็นinit=
อาร์กิวเมนต์เคอร์เนลและmount
คำสั่งที่จำเป็นเพื่อให้ทำงานในสคริปต์init_resize.shที่ทำงานตามค่าเริ่มต้นเพื่อปรับขนาดพาร์ติชัน Linux