Partisi pemulihan khusus

9

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:

  1. Selalu boot ke partisi pemulihan, periksa GPIO, lalu boot ke partisi primer tanpa tombol yang ditekan
  2. 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.

hajar
sumber
Biarkan kami tahu bagaimana Anda melanjutkan itu, terlihat menarik :)
Jivings
1
Saya rasa saya menemukan cara untuk mencapai ini dengan menulis bootloader tahap 2 yang sederhana, jadi saya akan pastikan untuk mendokumentasikannya di sini jika saya bisa melakukannya. Masih berharap untuk solusi sederhana ...
beatgammit
1
Sayangnya tidak, tapi saya secara signifikan mengurangi kemungkinan korupsi menggunakan sistem file RO: /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.
beatgammit
1
Anda dapat melihat apa yang dilakukan bootloader NOOBS ( raspberrypi.org/archives/4100 ) untuk Pi. Ini mungkin benar-benar sesuai dengan tujuan Anda hanya untuk menggunakannya, karena menyediakan partisi pemulihan dan instalasi.
Fred
1
Saya menyarankan 'menentang' menggunakan bootloader khusus, tetapi gunakan peretasan yang berjalan setelah sistem dimulai. Ini akan lebih mudah diimplementasikan dan lebih aman untuk di-debug. Bootloader yang salah dapat menggoreng Pi Anda.
Maxthon Chan

Jawaban:

5

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.txtke 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.

Maxthon Chan
sumber
Jawaban pertama Anda sedikit lebih dekat dengan apa yang mungkin saya lakukan, tapi saya suka gagasan menggunakan GPIO di userspace dan pengawas. Meskipun saya mungkin tidak akan menggunakan salah satu ide grosir, Anda telah memberi saya beberapa ide bagus. Terima kasih!
beatgammit
1

Saya memiliki cara untuk melakukan ini tanpa meretas kernel, yang melibatkan melindungi sistem dari reboot sebelum waktunya:

  1. Unduh gambar pemutakhiran, checksum, dan rentangkan ke ruang awal.
  2. Ubah / boot / cmdline.txt sehingga saat berikutnya sistem melakukan boot menggunakan partisi pemulihan sebagai perangkat blok root.
  3. Instal peningkatan dari ruang awal dan verifikasi bahwa itu berfungsi.
  4. Jika pemutakhiran bekerja, ubah /boot/cmdline.txt kembali.
  5. Jika perlu, reboot.

Pembaruan yang gagal akan menyebabkan sistem di-boot ke pemulihan secara otomatis. Tidak perlu GPIO.

Maxthon Chan
sumber
Satu-satunya masalah di sini adalah (tergantung pada sistem) kesalahan dapat dideteksi beberapa jam setelah pembaruan selesai, di mana pengguna tidak memiliki opsi untuk kembali ke partisi pemulihan.
1
@DanNixon Saya memposting jawaban lain untuk menyelesaikan masalah baru ini.
Maxthon Chan
1

Juga, ada solusi ketiga yang mungkin, tetapi Anda akan diminta untuk membedah initrdbeberapa versi Linux dari distribusi Linux untuk mengetahui bagaimana syscall pivot_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 initprogram khusus di sistem produksi. periksa apakah GPIO aktif. Jika demikian, pivot_root()untuk pemulihan. Kemudian exec()yang asli initagar sistem terus booting. Anda dapat, dalam sistem produksi, mencari cara untuk menjaga pemantau GPIO yang dibangun ini initberjalan berdampingan (PID = 2) dengan yang asli init(PID = 1) dan mengawasi GPIO dan memulai kembali untuk pemulihan jika tombol ditekan.

Maxthon Chan
sumber