Saya sedang mengerjakan proyek di mana peningkatan ke Raspberry PI akan melalui HTTP, dan Raspberry PI tidak akan dapat diakses secara langsung (tidak bisa hanya bertukar kartu).
Saya ingin memiliki pengaturan partisi seperti ini:
- Partisi 1- / boot (berisi kernel untuk kedua partisi)
- Partisi 2- / (partisi pemulihan)
- Partisi 3- / (partisi primer)
Ketika pemutakhiran menjadi buruk dan Raspberry PI masuk ke loop reboot, atau hang saat boot, saya ingin pengguna dapat menekan tombol, yang memicu garis GPIO, yang akan menyebabkan boot loader untuk boot ke dalam partisi pemulihan, bukan partisi primer.
Partisi pemulihan tidak akan pernah ditingkatkan, jadi ini akan aman.
Saya melihat beberapa opsi:
- Selalu boot ke partisi pemulihan, periksa GPIO, lalu boot ke partisi primer tanpa tombol yang ditekan
- GPIO diperiksa oleh boot loader secara langsung
Saya pada dasarnya mencoba untuk melakukan sesuatu yang mirip dengan apa yang dilakukan router, di mana jika Anda menahan reset saat boot Anda dapat TFTP lebih dari gambar baru atau sesuatu.
Apakah ini mungkin dengan PI Raspberry? Jika demikian, apakah ada dokumentasi untuk melakukan hal semacam ini?
Edit:
Saya menemukan jawaban ini untuk pertanyaan terkait ini: Apakah mungkin melakukan dual boot dari kartu SD?
Sebuah komentar pada pertanyaan di atas membawa saya ke sini: http://www.berryterminal.com/doku.php/berryboot . Ini terlihat menjanjikan, tetapi saya harus melakukan penelitian lebih lanjut untuk melihat apakah saya dapat memperoleh GPIO dari situ. Jika ada yang punya pengalaman dengan itu, saya akan sangat tertarik.
/boot
(RO),/
(RO),/var
(RW),/home
(RW). Masalah awal adalah korupsi sistem file ketika listrik terputus saat boot. Saya masih ingin menulis / menemukan bootloader tahap 2.Jawaban:
Jika kesalahan dapat terjadi kapan saja setelah sistem dimulai, Anda dapat menggunakan pengawas waktu dan beberapa skrip boot.
Prinsip dari metode ini adalah bahwa setiap kali sistem reboot tanpa mematikan dengan benar, ia pergi ke partisi pemulihan.
Anda perlu menulis skrip yang berjalan setiap kali sistem dimulai dan dimatikan dengan benar. Ubah
/boot/cmdline.txt
ke partisi pemulihan saat sistem dimulai, dan ubah kembali sebelum dimatikan dengan benar.Kemudian siapkan pengawas waktu. Anda dapat menggunakan yang terpasang di dalam chip BCM2835, atau (jika menggunakan papan revisi 2) buat sendiri menggunakan dua pin GPIO, header reset P6 dan chip 555. Ketika program kritis dimulai, mulai pengawas waktu, dan menendang anjing secara berkala jika sistem bekerja dengan benar. Ketika sistem gagal, pengawas waktu akan tersandung dan me-reset prosesor, mengirimkannya ke partisi pemulihan. Ini tidak memerlukan interaksi pengguna juga dan jika menggunakan timer bawaan, tidak ada GPIO.
Dengan menggunakan metode ini, Anda juga dapat menerapkan tombol reset yang akan menjamin untuk mengirim sistem ke pemulihan secara manual di papan Rev 2 dengan memasang tombol ke header P6.
sumber
Saya memiliki cara untuk melakukan ini tanpa meretas kernel, yang melibatkan melindungi sistem dari reboot sebelum waktunya:
Pembaruan yang gagal akan menyebabkan sistem di-boot ke pemulihan secara otomatis. Tidak perlu GPIO.
sumber
Juga, ada solusi ketiga yang mungkin, tetapi Anda akan diminta untuk membedah
initrd
beberapa versi Linux dari distribusi Linux untuk mengetahui bagaimana syscallpivot_init()
bekerja. Saya tidak yakin apakah kernel dari Pi memiliki syscall ini. Jika ya, metode ini mungkin, hack kernel tidak diperlukan juga, dan menggunakan satu GPIO.Untuk melakukan itu, Anda harus menulis
init
program khusus di sistem produksi. periksa apakah GPIO aktif. Jika demikian,pivot_root()
untuk pemulihan. Kemudianexec()
yang asliinit
agar sistem terus booting. Anda dapat, dalam sistem produksi, mencari cara untuk menjaga pemantau GPIO yang dibangun iniinit
berjalan berdampingan (PID = 2) dengan yang asliinit
(PID = 1) dan mengawasi GPIO dan memulai kembali untuk pemulihan jika tombol ditekan.sumber