Làm cách nào để thiết lập chế độ kiosk của người dùng trong Raspbian?


10

Tôi muốn thiết lập Raspberry Pi của mình ở chế độ "kiosk" nơi nó khởi động vào một ứng dụng toàn màn hình. Tôi biết cách của tôi xung quanh dòng lệnh, nhưng là một người mới khi nói đến việc tùy chỉnh hành vi khởi động linux. Tôi đang xây dựng ứng dụng và đang lên kế hoạch bổ sung khả năng tắt Raspberry Pi một cách an toàn. Tôi cần làm gì để định cấu hình Raspberry Pi chỉ chạy ứng dụng này?

Cập nhật: Để rõ ràng, tôi không muốn mở một trang web . Tôi cũng không muốn thay đổi hệ điều hành. Tôi muốn tìm hiểu cách định cấu hình hệ điều hành của mình (Raspbian) để khởi chạy ứng dụng của riêng tôi thay vì X (mặc dù ứng dụng của tôi có thể phụ thuộc vào kết xuất X trong nền).

Câu trả lời:


7

Tôi chưa bao giờ thử điều này, nhưng dường như bạn vẫn đang tìm kiếm và chưa nhận được câu trả lời trong gần một tháng, tôi sẽ cho bạn biết tôi sẽ bắt đầu từ đâu.

Cách làm này là cổ xưa, nhưng phác thảo chung có vẻ âm thanh. Bạn không cần phải làm mọi thứ giống hệt nhau. Nó tập trung vào việc sử dụng trình duyệt web làm trung tâm nhưng điều đó hầu như không liên quan ở đây (ví dụ, thư giãn, nó không phải là một "kiosk web" khác).

Nó đề cập đến /etc/inittab, điều mà hầu hết các distro linux không sử dụng nữa, nhưng điều đó xảy ra là debian wheezy (raspbian). Ý tưởng là bạn sẽ sử dụng runlevel 4 làm kiosk và biến nó thành mặc định. Bạn có thể làm điều đó hoặc chỉ sử dụng bất cứ thứ gì hiện đang là mặc định (2 hoặc 3, tôi nghĩ vậy). Raspbian tôi đang chạy ngay bây giờ đã được sửa đổi bởi tôi, vì vậy tôi không chắc sự khác biệt ban đầu giữa các /etc/rc[N].dthư mục - tương ứng với 7 runlevels. Bạn muốn sử dụng một cái không bắt đầu đăng nhập đồ họa ( lightdm) hoặc loại khác để xóa lightdmkhỏi runlevel đó. Bạn cũng có thể làm điều đó đúng cách (xem man update-rc.d).

Sau đó, làm theo phần hướng dẫn này, bạn muốn tạo tập lệnh dịch vụ khởi động (hay còn gọi là init) của riêng bạn để bắt đầu X và ứng dụng của bạn mà không cần đăng nhập. Đừng làm điều đó hoàn toàn theo cách đó, tuy nhiên; bạn cần phải tuân theo debian, vì vậy hãy xem /etc/init.d/README. Ngoài ra, bạn hoàn toàn không phải sử dụng trình quản lý cửa sổ (mặc dù fvwmvẫn rất tuyệt, methinks đặc biệt cho loại điều này, vì vậy hãy ghi nhớ nếu bạn làm như vậy), bởi vì .xinitrcnhư thế này:

#!/bin/sh

myApp

Sẽ chỉ chạy ứng dụng của bạn ở chế độ X đơn giản - rất đơn giản: không có menu, không có tiêu đề, không có thanh công cụ, v.v. hoặc cách để người dùng khởi động ứng dụng khác hoặc lấy shell. Nó chỉ cung cấp một con trỏ.

Một vấn đề với điều này là nếu bạn đi thẳng vào máy tính để bàn từ khi khởi động, đó sẽ là một máy tính để bàn siêu người dùng. Trên thực tế, các phiên bản X luôn có uid bằng 0, nhưng các ứng dụng chạy từ xinitrc chạy như người dùng đã khởi động X - trong trường hợp này X được khởi động bởi init, vì vậy người dùng sẽ được root (mặc dù về mặt kỹ thuật không được đăng nhập ). Do đó, xinitrc ở trên sẽ tốt hơn với:

su -c myApp pi

Thay vào đó, ứng dụng này sẽ chạy ứng dụng của bạn với tư cách là người dùng pi (người cũng không đăng nhập về mặt kỹ thuật).

Vì về mặt kỹ thuật không có ai đăng nhập, ngay cả khi người dùng kiosk giết X (ví dụ thông qua ctrl-alt-delete), họ sẽ chỉ còn lại tại dấu nhắc đăng nhập. Cách thực hiện vượt xa sao cho tập lệnh init dịch vụ khởi động X (xem LƯU Ý bên dưới) ở phía trước để khi thoát ra, tập lệnh dịch vụ tiếp tục và chạy shutdown -r now.

Hãy nhớ rằng ai đó có quyền truy cập vật lý vào máy (bình thường) luôn có thể phá vỡ mọi bảo mật bạn thực hiện, vì vậy tất cả những gì bạn thực sự cố gắng làm ở đây không phải là quá dễ dàng và để ngăn ngừa tai nạn khó chịu.

Cũng nên nhớ rằng vì dịch vụ khởi động của bạn sẽ thực hiện việc này ở phía trước, nên không có dịch vụ nào khác chạy sau nó , vì vậy hãy chắc chắn rằng đó là dịch vụ cuối cùng tuyệt đối. Rất quan trọng! Thực tế, bạn có thể sử dụng /etc/rc.localthay thế, vì điều đó thường được đảm bảo là cuối cùng;) Điều đó sẽ giúp bạn tiết kiệm thời gian.

LƯU Ý: Trên thực tế, trong phần hướng dẫn của tập lệnh này /root/kiosk, từ phần này . Lưu ý rằng đó chỉ là một dòng tham chiếu đến .xinitrctập lệnh được hiển thị trong phần trên (3.4). Chỉ cần đặt một dòng như thế trong kịch bản khởi động của bạn trực tiếp. Xinitrc (sơ bộ) của bạn, như đã mô tả, sẽ đơn giản hơn nhiều.


Một cách khác để luôn đi trước với ...

Mục đích của việc để lại lời gọi X được tiền cảnh chỉ là để chặn việc thực thi tập lệnh init cho đến khi X thoát, để dòng tiếp theo trong tập lệnh ( shutdown) sẽ chạy:

startx
shutdown -r now

Ở đây tôi đã sử dụng startxthay vì cách làm /usr/X11R6/bin/xinit /root/kiosk.xinitrc ..... Điều này sẽ sử dụng $HOME/.xinitrc, và $ HOME sẽ là /root. Khá chắc chắn startx cũng là một cuộc gọi chặn, vì vậy cho đến khi X thoát, shutdownsẽ không chạy. Nếu thay vào đó bạn đã làm điều này:

startx &
shutdown -r now

X sẽ chạy, nhưng sau đó tắt máy cũng sẽ chạy, ngay lập tức (rõ ràng là vô nghĩa).

Bạn không cần phải sử dụng thủ thuật đó nếu bạn không quan tâm đến việc tắt máy - như đã đề cập, người dùng sẽ kết thúc bằng một dấu nhắc đăng nhập. Nhưng nó có vẻ là một ý tưởng hữu ích, kể từ đó bạn có thể tắt nó đi ctrl-alt-backspace. Một ý tưởng khác, nếu ứng dụng của bạn có thể đóng được, sẽ sử dụng startx &trong tập lệnh init, nó chạy nền và cho phép init tiếp tục bình thường (điều này vẫn ổn; X vẫn sẽ chạy và có quyền kiểm soát màn hình - "nền" là một có thể là một thuật ngữ khó hiểu). Thay vì trong tập lệnh init, hãy đặt shutdownvào xinitrc thay thế:

#!/bin/sh
#/root/.xinitrc

su -c myApp pi
shutdown -r now

Cùng một mánh khóe, địa điểm khác nhau. Bây giờ khi ai đó đóng cửa myApp, tắt máy sẽ xảy ra (nhưng nếu họ giết X, điều đó sẽ không xảy ra). Bạn cũng có thể làm cả hai cách, nhưng tôi thực sự thích cách này tốt hơn bởi vì điều đó có nghĩa là bạn có thể thoát X và đăng nhập, đôi khi có thể hữu ích và bạn cũng có thể dễ dàng tắt hệ thống khỏi GUI.

Không nền ( &) myApp trong .xinitrc ngay cả khi không có tắt máy sau đó, bởi vì khi .xinitrc hoàn thành X thoát;) Cuộc gọi cuối cùng phải tồn tại ở phía trước (thông thường, đó là DE hoặc cửa sổ giám đốc).

Kịch bản ban đầu và .xinitrclà các khái niệm tương tự. Một được chạy bởi init, đó là tiến trình 1 trên linux (đó là quá trình duy nhất được khởi động bởi kernel). Cái khác được điều hành bởi máy chủ X. Lưu ý rằng có các tệp .xinitrc và lệnh xinitrc (chúng có liên quan nhưng không giống nhau).


Nếu Raspbian sử dụng /etc/inittabnhưng hầu hết những người khác không sử dụng nữa, thay vào đó họ sử dụng cái gì?
Andrew

Vì vậy, nếu tôi muốn cho phép truy cập ssh trong khi ứng dụng của tôi đang chạy ở nền trước, tôi cần đảm bảo rằng .xinitrctập lệnh của tôi chạy sau đó, đúng không?
Andrew

Debian sử dụng hệ thống init "sysV" và inittablà một phần của tất cả. Daemon init phổ biến hơn bây giờ là systemdupstart.
goldilocks

WRT ứng dụng của bạn đang chạy ở nền trước, điều này chỉ là vì (sysV) initchờ đợi các scip đó quay trở lại trước khi nó bắt đầu cái tiếp theo. Vì vậy, thông thường trong một tập lệnh init, nếu bạn đang bắt đầu một dịch vụ liên tục, bạn sẽ đặt nền tảng (hay còn gọi là fork) &. Sau đó, tập lệnh tự thoát, nhưng quá trình "nền" vẫn tiếp tục. "Bối cảnh" chỉ đề cập đến một chuỗi thực thi, không phải là thứ gì đó xuất hiện trên màn hình - bạn có thể đặt nền cho lời gọi X của mình ( lightdmphải được làm nền) ... Tôi sẽ chỉnh sửa nội dung này.
goldilocks

WRT ssh, sshdịch vụ (được liên kết trong /etc/rc[N].d) sẽ bắt đầu trước dịch vụ của bạn, do đó dịch vụ sẽ chạy ("trong nền") để trả lời các kết nối. Đây vẫn là một hệ thống đa tác vụ;)
goldilocks

2

Nhìn vào dự án 'Digital Signage' này. Nó khởi động lên GUI sau đó mở trình duyệt hỗ trợ HTML5. Tôi chưa thử nhưng tôi muốn. Có lẽ bạn có thể đặt ứng dụng của mình thay vì trình duyệt để khởi động toàn màn hình.

http://www.binaryemferences.com/raspberry-digital-signage/


Cảm ơn câu trả lời của bạn, nhưng nó trông giống như một sự thay thế cho Raspbian được cấu hình để hiển thị một trình duyệt. Tôi muốn tìm hiểu các bước để định cấu hình Raspbian theo cách tôi muốn.
Andrew

Không có đề cập về Raspbian trong câu hỏi của bạn. Thử đi. pikiosk.tumblr.com/post/38721623944/ Cách
gurcanozturk

0

Signage Raspberry Digital Signage là một hệ điều hành hiển thị chế độ xem toàn màn hình bị giới hạn ở trang web hoặc danh sách phát slideshow / video được chỉ định mà không có cách nào để thoát nhưng khởi động lại máy.

Trên thực tế, nó có thể hiển thị cả chế độ xem web (hiển thị trang HTML / HTML5) và chế độ xem đa phương tiện (trình chiếu hình ảnh và trình phát video). Chế độ xem web có ba chế độ xem phụ khác nhau có thể có: Firefox, Chromium và Midori (có hỗ trợ Gnash).

Trải nghiệm Chrome và Midori là tính năng của phiên bản 2.0.

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.