XDG_RUNTIME_DIR là gì?


13

Trong khi tôi đang cố mở Evince từ dòng lệnh, nó đã gây ra lỗi cho tôi

neo@Muhammad:~$ sudo evince

No protocol specified

** (evince:4164): WARNING **: Could not open X display
No protocol specified
error: XDG_RUNTIME_DIR not set in the environment.
Cannot parse arguments: Cannot open display:

Làm thế nào để khắc phục sự cố này?


1
Hãy cho chúng tôi biết thêm về hệ điều hành của bạn.
DK Bose

Câu trả lời:


27

Điều đầu tiên trước tiên: XDG_RUNTIME_DIR

Để trả lời câu hỏi đầu tiên của bạn, "XDG_RUNTIME_DIR là gì?" , nó là một biến môi trường được đặt tự động khi bạn đăng nhập. Nó cho bất kỳ chương trình nào bạn chạy ở đâu để tìm thư mục dành riêng cho người dùng trong đó nó có thể lưu trữ các tệp tạm thời nhỏ. Lưu ý rằng XDG_RUNTIME_DIRđược đặt theo pam_systemd(8) , vì vậy nó không thực sự liên quan đến X (chạy chương trình đồ họa), đây là vấn đề bạn dường như đang gặp phải.

Cách khắc phục sự cố

Câu hỏi thứ hai của bạn, "Làm thế nào để khắc phục sự cố này?" là một trong những rất tốt. Điều đó có nghĩa bạn đang quan tâm đến không chỉ những gì sửa chữa, nhưng cũng cách để con nó ra một mình. Để bắt đầu, hãy xem các thông báo lỗi đầu tiên trước. Cụ thể, tìm kiếm No protocol specifiedhoặc WARNING **: Could not open X display, sẽ cho bạn thấy rằng vấn đề xảy ra với X (còn được gọi là Hệ thống cửa sổ X ), đó là cách các chương trình đồ họa được hiển thị trên màn hình của bạn. Biết rằng sẽ đưa ra nhiều câu hỏi xử lý sự cố trong tâm trí của bạn.

X HIỂN THỊ

Câu hỏi tiếp theo của bạn có thể là, "màn hình X" này chứng tỏ điều gì không thể mở? "Màn hình" là địa chỉ cho màn hình của bạn. [*] Bất kỳ chương trình nào muốn ghi vào màn hình của bạn đều phải biết địa chỉ. Bạn có thể xem màn hình X của mình là gì bằng cách kiểm tra biến môi trường HIỂN THỊ:

echo $DISPLAY

Và bạn có thể kiểm tra những gì sudonghĩ rằng HIỂN THỊ của bạn bằng cách gõ:

sudo -s
echo $DISPLAY
exit

Nếu nó không hiển thị bất cứ điều gì, thì đó là vấn đề. (Xem sửa chữa dưới đây).

XÁC NHẬN

Nhưng, nếu đó không phải là vấn đề và DISPLAYđược đặt chính xác sudothì sao? Sau đó, bạn có thể tự hỏi, X có một số loại quyền ngăn người dùng khác viết trên màn hình của tôi không? Nếu bạn nghĩ rằng, bạn đã đúng, X có hai phương thức ủy quyền chính: xauthxhost. Cái được sử dụng phổ biến nhất hiện nay là xauth(1) sử dụng XAUTHORITYbiến môi trường. Một lần nữa, hãy kiểm tra xem nó có được đặt đúng không sudo:

echo $XAUTHORITY
sudo -s
echo $XAUTHORITY
exit

Nếu XAUTHORITYchỉ vào một tệp trong thư mục chính của bạn cho bạn, nhưng nó trống khi bạn chạy sudo, thì đó là vấn đề.

CỐ ĐỊNH: Lưu các biến môi trường

Vì vậy, những gì sửa chữa? Nếu một trong hai người DISPLAYhoặc XAUTHORITYbiến môi trường không nhận được lưu trên sudo, bạn có thể nói sudo(8) để bảo vệ môi trường bằng cách sử dụng các -Etùy chọn, như sau:

sudo -E evince

Một cách tốt hơn: env_keep

Bạn cũng có thể hỏi, Đợi đã, nếu -Elàm cho mọi thứ hoạt động kỳ diệu, thì tại sao nó không được mặc định sudo? Câu trả lời là nó là một mối nguy hiểm an ninh tiềm tàng. Các biến môi trường ảnh hưởng đến cách các chương trình hoạt động và bạn không muốn tất cả chúng được xuất từ ​​tài khoản người dùng đến thư mục gốc. Cách "chính xác" để làm điều đó là thêm dòng Defaults env_keep += "DISPLAY XAUTHORITY"vào tệp sudoers(5) bằng cách sử dụng visudo(8) . Bạn có thể kiểm tra biến môi trường nào sudo bảo tồn bằng cách chạy:

sudo sudo -V

(Có, bạn gõ sudohai lần). Tôi khuyên bạn nên đặt dòng không nằm trong tệp sudoers mặc định ( /etc/sudoers), nhưng trong tệp cục bộ sẽ không bị ghi đè khi bạn nâng cấp hệ thống. Bạn có thể làm như vậy:

sudo visudo -f /etc/sudoers.d/local 

Nhưng chờ đã, nếu không có cái nào ở trên hoạt động thì sao?

Tôi nghĩ rằng đây là một câu trả lời khá kỹ lưỡng, nhưng nếu bạn vẫn gặp rắc rối, có một điều khác tôi muốn đề xuất. Bạn có thể sử dụng xhost(1) để cấp quyền truy cập cho một người dùng cụ thể trên máy chủ cục bộ (máy của bạn) như vậy,

xhost si:localuser:root

Trong trường hợp này, chúng tôi chỉ định rootlà tên người dùng, vì đó là tài khoản sudochạy các chương trình như.


[*] : Q: Tôi chỉ có một màn hình, vậy tại sao màn hình X cần có "địa chỉ"? Trả lời: Đó là vì X có thể hoạt động không chỉ trên máy của bạn mà còn qua internet. Với X , thật dễ dàng để chạy các chương trình trên máy của bạn hiển thị trên các máy chủ và chương trình internet khác trên các máy chủ khác xuất hiện trên màn hình của bạn (giả sử bạn cho phép chúng).


Cảm ơn bạn đã trả lời công phu. Tôi chắc chắn có ít nhất một cái gì đó mới trong câu trả lời của bạn cho mọi người dùng. (Đối với tôi: cách cấp quyền truy cập X cho một người dùng cụ thể, tốt hơn là cấp quyền xhost +để cho phép truy cập toàn cầu.)
tiếng trống

3

XDG_RUNTIME_DIRlà một biến môi trường được đặt trong ngữ cảnh X Windows của bạn, để các chương trình có thể tìm thấy mọi thứ. Bạn ( neo) đã thiết lập bối cảnh đồ họa.

Bằng cách cố gắng để chạy evincenhư root, bạn đã bước vào tình trạng mà một người sử dụng ( root) đang cố gắng truy cập (của người dùng khác neo) hiển thị. Điều này được coi là một điều xấu.

Nếu bạn quyết định bạn PHẢI chạy trình soạn thảo đồ họa như root, hãy đọc man gksudo và sử dụng gksudo.


bình luận thú vị. Bạn có tình cờ biết sau đó làm thế nào tôi có thể làm một cái gì đó như thế này? journalctl -b -p err | wl-copynó báo cáo Failed to connect to a Wayland servercó ý nghĩa, nhưng âm thanh câm từ Người dùng POV.
mh-cbon
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.