Phân vùng phục hồi tùy chỉnh


9

Tôi đang làm việc trong một dự án mà việc nâng cấp lên Raspberry PI sẽ qua HTTP và Raspberry PI sẽ không thể truy cập trực tiếp (không thể trao đổi thẻ).

Tôi muốn có một thiết lập phân vùng như vậy:

  • Phân vùng 1- / boot (chứa hạt nhân cho cả hai phân vùng)
  • Phân vùng 2- / (phân vùng phục hồi)
  • Phân vùng 3- / (phân vùng chính)

Khi quá trình nâng cấp bị lỗi và Raspberry PI rơi vào vòng lặp khởi động lại hoặc bị treo khi khởi động, tôi muốn người dùng có thể nhấn nút, điều này kích hoạt một dòng GPIO, điều này sẽ khiến trình tải khởi động khởi động vào phân vùng phục hồi thay vì phân vùng chính.

Phân vùng phục hồi sẽ không bao giờ được nâng cấp, vì vậy điều này sẽ an toàn.

Tôi thấy một vài lựa chọn:

  1. Luôn khởi động vào phân vùng khôi phục, kiểm tra GPIO, sau đó khởi động vào phân vùng chính không nhấn nút
  2. GPIO được kiểm tra trực tiếp bởi bộ tải khởi động

Về cơ bản, tôi đang cố gắng làm một cái gì đó tương tự như các bộ định tuyến làm gì, nếu bạn giữ lại thiết lập trong khi nó khởi động, bạn có thể TFTP qua một hình ảnh mới hoặc một cái gì đó.

Điều này có thể với Raspberry PI không? Nếu vậy, có tài liệu nào để làm việc này không?

Biên tập:

Tôi tìm thấy câu trả lời cho câu hỏi liên quan này: Có thể khởi động kép từ thẻ SD không?

Một nhận xét về câu hỏi trên đã dẫn tôi đến đây: http://www.berryterminal.com/doku.php/berryboot . Điều này có vẻ đầy hứa hẹn, nhưng tôi sẽ phải nghiên cứu thêm để xem liệu tôi có thể nhận được GPIO từ nó hay không. Nếu bất cứ ai có bất kỳ kinh nghiệm với nó, tôi sẽ rất quan tâm.


Hãy cho chúng tôi biết làm thế nào bạn tiếp tục với điều đó, trông thật thú vị :)
Jivings

1
Tôi nghĩ rằng tôi đã tìm ra cách để thực hiện điều này bằng cách viết một bộ tải khởi động giai đoạn 2 đơn giản, vì vậy tôi sẽ đảm bảo ghi lại nó ở đây nếu tôi tiếp cận nó. Vẫn hy vọng cho một giải pháp đơn giản mặc dù ...
beatgammit

1
Thật không may là không, nhưng tôi đã giảm đáng kể khả năng tham nhũng khi sử dụng hệ thống tệp RO: /boot(RO), /(RO), /var(RW), /home(RW). Vấn đề ban đầu là hỏng hệ thống tập tin khi nguồn bị cắt trong khi khởi động. Tôi vẫn muốn viết / tìm một bộ tải khởi động giai đoạn 2.
beatgammit

1
Bạn có thể xem bộ tải khởi động NOOBS ( raspberrypi.org/archives/4100 ) cho Pi làm gì. Nó thực sự có thể phù hợp với mục đích của bạn chỉ để sử dụng nó, vì nó cung cấp cho các phân vùng phục hồi và cài đặt.
Fred

1
Tôi đang đề xuất 'chống lại' bằng cách sử dụng bộ tải khởi động tùy chỉnh, nhưng sử dụng các bản hack chạy sau khi hệ thống được khởi động. Nó sẽ dễ dàng hơn để thực hiện và an toàn hơn để gỡ lỗi. Một bộ tải khởi động bị lỗi có thể chiên Pi của bạn.
Maxthon Chan

Câu trả lời:


5

Nếu lỗi có thể xảy ra bất cứ lúc nào sau khi hệ thống khởi động, bạn có thể sử dụng bộ đếm thời gian theo dõi và một số tập lệnh khởi động.

Nguyên tắc của phương pháp này là bất cứ khi nào hệ thống khởi động lại mà không tắt đúng cách, nó sẽ chuyển đến phân vùng phục hồi.

Bạn cần viết một kịch bản chạy mỗi khi hệ thống khởi động và tắt đúng cách. Thay đổi /boot/cmdline.txtphân vùng phục hồi khi hệ thống khởi động và thay đổi trở lại trước khi tắt đúng cách.

Sau đó thiết lập bộ đếm thời gian theo dõi. Bạn có thể sử dụng bộ tích hợp trong chip BCM2835 hoặc (nếu sử dụng bảng sửa đổi 2) tự tạo bằng hai chân GPIO, tiêu đề đặt lại P6 và chip 555. Khi chương trình quan trọng được bắt đầu, hãy khởi động đồng hồ bấm giờ và đá con chó định kỳ nếu hệ thống hoạt động tốt. Khi hệ thống bị lỗi, bộ định thời watchdog sẽ bị ngắt và đặt lại bộ xử lý, gửi nó đến phân vùng phục hồi. Điều này cũng không yêu cầu tương tác người dùng và nếu sử dụng bộ hẹn giờ tích hợp, không có GPIO.

Sử dụng phương pháp này, bạn cũng có thể thực hiện nút đặt lại sẽ đảm bảo gửi hệ thống để khôi phục thủ công trên bảng Rev. 2 bằng cách cài đặt nút vào tiêu đề P6.


Câu trả lời đầu tiên của bạn gần hơn một chút với những gì tôi có thể làm, nhưng tôi thích ý tưởng sử dụng GPIO trong không gian người dùng và cơ quan giám sát. Mặc dù tôi có thể sẽ không sử dụng bất kỳ ý tưởng bán buôn nào, nhưng bạn đã cho tôi một số ý tưởng hay. Cảm ơn!
beatgammit

1

Tôi có một cách để làm điều này mà không cần hack kernel, liên quan đến việc bảo vệ hệ thống khỏi khởi động lại kịp thời:

  1. Tải về hình ảnh nâng cấp, kiểm tra nó và mở rộng nó vào không gian đầu.
  2. Thay đổi /boot/cmdline.txt để lần sau hệ thống khởi động, nó sử dụng phân vùng phục hồi làm thiết bị chặn gốc.
  3. Cài đặt bản nâng cấp từ không gian đầu và xác minh rằng nó đang hoạt động.
  4. Nếu nâng cấp đang hoạt động, hãy thay đổi /boot/cmdline.txt trở lại.
  5. Nếu cần, khởi động lại.

Nâng cấp không thành công sẽ khiến hệ thống được tự động khởi động vào recovery. Không cần GPIO.


Vấn đề duy nhất ở đây là (tùy thuộc vào hệ thống), một lỗi có thể được phát hiện hàng giờ sau khi cập nhật hoàn tất, tại thời điểm đó, người dùng không có tùy chọn nào để hoàn nguyên về phân vùng khôi phục.

1
@DanNixon Tôi đang đăng một câu trả lời khác để giải quyết vấn đề mới này.
Maxthon Chan

1

Ngoài ra, có một giải pháp khả thi thứ ba, nhưng nó sẽ yêu cầu bạn phân tích initrdmột số phiên bản phân phối Linux của PC để tìm ra cách thức pivot_init()hoạt động của tòa nhà . Tôi không chắc liệu kernel của Pi có tòa nhà này không. Nếu có, phương pháp này là có thể, không yêu cầu hack kernel và nó sử dụng một GPIO.

Để làm điều đó, bạn sẽ cần phải viết một initchương trình tùy chỉnh trong hệ thống sản xuất. kiểm tra xem GPIO đã bật chưa. Nếu vậy, pivot_root()để phục hồi. Sau đó exec()là bản gốc initđể hệ thống tiếp tục khởi động. Trong hệ thống sản xuất, bạn có thể tìm ra cách để giữ cho chiếc GPIO này được xây dựng initchạy song song (PID = 2) với bản gốc init(PID = 1) và theo dõi GPIO và khởi động lại để khôi phục nếu nút được nhấn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.