Không có lý do để có cả / chạy và / tmp
Tôi nghĩ bạn đúng. /tmp
về cơ bản là không dùng nữa /run
. Nếu chương trình của bạn ở một vị trí để làm như vậy (yêu cầu nó được cài đặt như một hoạt động đặc quyền), thì ngày nay bạn sẽ sử dụng một thư mục con của /run
. Điều này là vì lý do bảo mật.
Ví dụ, trình nền in CUPS không chạy dưới quyền root, nhưng thường được cài đặt từ gói OS. Gói cài đặt /usr/lib/tmpfiles.d/cups.conf
và systemd-tmpfiles
tạo một thư mục mà nó có thể truy cập. Vì thư mục nằm dưới /run
, tên không thể bị khiếu nại độc hại bởi người dùng không có đặc quyền, không giống như /tmp
có thể ghi trên thế giới.
"Các chương trình không có đặc quyền" không thể sử dụng /run
trực tiếp
Sự khác biệt thực sự là nếu chương trình của bạn đang được điều hành bởi một người dùng không có đặc quyền tùy ý, dưới ID người dùng của riêng họ. Nhưng bạn vẫn thường không muốn sử dụng /tmp
, bởi vì những người dùng không có quyền này có thể truy cập được. Bạn muốn sử dụng $XDG_RUNTIME_DIR
. Thông thường, điều này được thực hiện như /run/user/$(id -u)
- vì vậy nó cũng là một thư mục con /run
. Vị trí không được đảm bảo mặc dù; các chương trình nên luôn luôn sử dụng biến môi trường.
/tmp
sẽ chỉ hữu ích cho việc hợp tác đặc biệt giữa những người dùng không có đặc quyền khác nhau trên hệ thống. Các hệ thống đặc biệt như vậy dễ bị người dùng độc hại từ chối hợp tác và làm hỏng mọi thứ cho mọi người :). Một ví dụ sẽ là người dùng không có quyền quyết định chạy phiên bản talk
daemon, sử dụng ổ cắm unix.
Lưu ý, danh sách kiểm tra của Poettering bên dưới tuyên bố rằng /tmp
sẽ hữu ích cho "các tệp nhỏ", trong khi /run
chỉ nên được sử dụng cho "nguyên thủy giao tiếp". Tôi cũng không nghĩ sự khác biệt này là đúng. Các poster-boy /run
là udev
, và tôi khá chắc chắn /run/udev
bao gồm các cơ sở dữ liệu nội bộ. Khi bạn có một /run
thư mục, tôi không nghĩ có ai muốn làm theo sự khác biệt được yêu cầu và tạo một thư mục khác , để lộn xộn /tmp
. Vì vậy, trong thực tế chúng ta chỉ sử dụng /run
ngày nay.
Việc sử dụng các không gian tên được chia sẻ có thể ghi trên thế giới [như / tmp] cho mục đích giao tiếp luôn luôn có vấn đề, vì để thiết lập liên lạc, bạn cần tên ổn định, nhưng tên ổn định sẽ mở ra các cuộc tấn công DoS. Điều này có thể được sửa một phần, bằng cách thiết lập các thư mục trên mỗi ứng dụng được bảo vệ cho một số dịch vụ nhất định trong quá trình khởi động sớm (như chúng tôi làm cho X11), nhưng điều này chỉ khắc phục được một phần vấn đề, vì điều này chỉ hoạt động chính xác nếu mọi cài đặt gói được theo sau khi khởi động lại.
...
Một tính năng khác của Fedora (đối với Fedora 17) đã thay đổi ngữ nghĩa của / tmp cho nhiều dịch vụ hệ thống để làm cho chúng an toàn hơn, bằng cách cách ly không gian tên / tmp của các dịch vụ khác nhau
...
Bởi vì / tmp không còn nhất thiết là một không gian tên được chia sẻ, nó thường không phù hợp làm vị trí cho các nguyên thủy giao tiếp.
...
[/ run] được đảm bảo là một tmpfs và do đó sẽ tự động bị xóa khi khởi động. Không có dọn dẹp tự động được thực hiện ngoài đó.
...
Dưới đây là hướng dẫn sơ bộ về cách chúng tôi đề nghị bạn (nhà phát triển ứng dụng Linux) chọn thư mục phù hợp để sử dụng:
- Bạn cần một nơi để đặt ổ cắm của bạn (hoặc nguyên thủy giao tiếp khác) và mã của bạn chạy đặc quyền: sử dụng thư mục con bên dưới / chạy. (Hoặc bên dưới / var / run để tương thích thêm.)
- Bạn cần một nơi để đặt ổ cắm của bạn (hoặc nguyên thủy giao tiếp khác) và mã của bạn chạy không có đặc quyền: sử dụng thư mục con bên dưới $ XDG_RUNTIME_DIR.
- Bạn cần một nơi để tiến hành tải xuống và tải xuống lớn hơn và chạy không được ưu tiên: sử dụng $ XDG_DOWNLOAD_DIR.
- Bạn cần một nơi để đặt các tệp bộ đệm cần liên tục và chạy không được ưu tiên: sử dụng $ XDG_CACHE_HOME.
- Không có gì ở trên áp dụng và bạn cần đặt một tệp nhỏ không cần kiên trì: sử dụng $ TMPDIR với dự phòng / tmp. Và sử dụng mkstemp (), và mkdtemp () và không có gì ở nhà.
- Nếu không, hãy sử dụng $ TMPDIR với dự phòng / var / tmp. Cũng sử dụng mkstemp () / mkdtemp ().
Lưu ý rằng các quy tắc trên chỉ được đề xuất bởi chúng tôi. Các quy tắc này có tính đến mọi thứ chúng ta biết về chủ đề này và tránh các vấn đề với các bản phân phối hiện tại và tương lai, theo như chúng ta có thể thấy chúng. Vui lòng xem xét cập nhật các dự án của bạn để tuân theo các quy tắc này và ghi nhớ chúng nếu bạn viết mã mới.
Một điều chúng tôi muốn nhấn mạnh là / tmp và / var / tmp thường xuyên hơn không thực sự không phải là lựa chọn phù hợp cho usecase của bạn. Có những cách sử dụng hợp lệ của các thư mục này, nhưng thường thì thư mục khác thực sự có thể là nơi tốt hơn. Vì vậy, hãy cẩn thận, xem xét các tùy chọn khác, nhưng nếu bạn chọn / tmp hoặc / var / tmp thì ít nhất hãy đảm bảo sử dụng mkstemp () / mkdtemp ().
Chúng tôi loại bỏ /tmp
ổ cắm kế thừa được sử dụng bởi hệ thống cửa sổ X, như được mô tả ở trên. Tôi đọc sai tmpfiles.d/x11.conf
. Có vẻ như nó dựa vào hợp tác :). Tôi cho rằng mã đã được kiểm toán, như vậy việc từ chối dịch vụ là điều tồi tệ nhất có thể xảy ra.