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].d
thư 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 lightdm
khỏ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ù fvwm
vẫ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ì .xinitrc
như 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.local
thay 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 .xinitrc
tậ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 startx
thay 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, shutdown
sẽ 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 shutdown
và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à .xinitrc
là 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).
/etc/inittab
như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ì?