Sự khác biệt giữa / tmp và / run là gì?


42

Theo FHS-3.0 , /tmpdành cho các tệp tạm thời và /rundành cho dữ liệu biến thời gian chạy. Dữ liệu trong /runphải được xóa trong lần khởi động tiếp theo, điều này không bắt buộc /tmp, nhưng các chương trình vẫn không được cho rằng dữ liệu trong /tmpsẽ có sẵn khi bắt đầu chương trình tiếp theo. Tất cả điều này có vẻ khá giống với tôi.

Vậy đâu là sự khác biệt giữa cả hai? Theo tiêu chí nào một chương trình sẽ quyết định nên đưa dữ liệu tạm thời vào /tmphoặc vào /run?

Theo FHS:

Các chương trình có thể có một thư mục con của /run; điều này được khuyến khích cho các chương trình sử dụng nhiều hơn một tệp thời gian chạy.

Điều này chỉ ra rằng sự khác biệt giữa "chương trình hệ thống" và "chương trình thông thường" không phải là một tiêu chí, cũng không phải là thời gian tồn tại của chương trình (như, quá trình chạy dài so với quá trình chạy ngắn).

Mặc dù lý do sau đây không được đưa ra trong FHS, nhưng /runđã được đưa ra để khắc phục vấn đề /varđược gắn kết quá muộn để các thủ thuật bẩn là cần thiết để /var/runsớm có sẵn. Tuy nhiên, bây giờ với /runviệc được giới thiệu và đưa ra mô tả của nó trong FHS, dường như không có lý do rõ ràng để có cả hai /run/tmp.


11
/ tmp là vị trí chuẩn * nix cho dữ liệu tạm thời. / run là vị trí chuẩn Poettering cho dữ liệu tạm thời.
Đánh dấu

Đồng hành lạc hậu luôn là một lý do ...
Bakuriu

Câu trả lời:


16

Không có lý do để có cả / chạy và / tmp

Tôi nghĩ bạn đúng. /tmpvề 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.confsystemd-tmpfilestạ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ư /tmpcó 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 /runtrự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.

/tmpsẽ 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 talkdaemon, sử dụng ổ cắm unix.

Thông tin gốc từ Lennart Poettering

Lưu ý, danh sách kiểm tra của Poettering bên dưới tuyên bố rằng /tmpsẽ hữu ích cho "các tệp nhỏ", trong khi /runchỉ 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 /runudev, và tôi khá chắc chắn /run/udevbao gồm các cơ sở dữ liệu nội bộ. Khi bạn có một /runthư 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 /runngà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:

  1. 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.)
  2. 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.
  3. 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.
  4. 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.
  5. 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à.
  6. 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.


8
Câu trả lời này là tất cả các loại sai.
R ..

@R .., quan tâm để mở rộng về điều đó?
tự đại diện

Vâng, tôi đã làm trong một câu trả lời. (Bắt đầu như một bình luận nhưng tôi nhận ra đó là câu trả lời nhiều hơn.)
R ..

Tôi nghĩ rằng điểm yếu chính trong câu trả lời hiện tại của tôi, mà tôi nghĩ rằng bạn đang làm việc, là về mặt kỹ thuật , việc xử lý đúng XDG_RUNTIME_DIR được yêu cầu để có thể di chuyển tới bất kỳ * nix nào ("quay lại thư mục thay thế có khả năng tương tự"), nó rất mơ hồ điều này có nghĩa là gì trong thực tế. Đối với các chương trình tiện ích di động, tốt hơn là sử dụng tiêu chuẩn được xác định rõ ràng cho /tmp("API duy nhất để sử dụng nó phải là mkstemp (), mkdtemp () (và bạn bè) để hoàn toàn an toàn").
nguồn

Câu trả lời cũng bỏ lỡ trường hợp phổ biến: /var/runlà toàn hệ thống (ví dụ: để giao tiếp với cơ sở dữ liệu cục bộ), /tmp/bây giờ được tạo ra cho mỗi người dùng . Trong lịch sử, cũng là hạn ngạch của / tmp được đặt khác nhau. Và câu trả lời bỏ lỡ rằng một sự phân biệt ngữ nghĩa của việc sử dụng cũng rất quan trọng.
Giacomo Catenazzi

23

Các thư mục /tmp/usr/tmp(sau này /var/tmp) từng là bãi rác cho mọi thứ và mọi người. Cơ chế bảo vệ duy nhất cho các tệp trong các thư mục này là bit dính hạn chế xóa hoặc đổi tên tệp ở đó cho chủ sở hữu của chúng. Như marcelm đã chỉ ra trong một bình luận, về nguyên tắc không có gì ngăn cản ai đó tạo các tệp có tên được sử dụng bởi các dịch vụ (chẳng hạn như nginx.pidhoặc sshd.pid). (Tuy nhiên, trên thực tế, các tập lệnh khởi động có thể loại bỏ các tệp không có thật như vậy.)

/runđược thiết lập cho dữ liệu thời gian chạy không liên tục của các dịch vụ tồn tại lâu như khóa, ổ cắm, tệp pid và những thứ tương tự. Vì nó không thể ghi được cho công chúng, nó bảo vệ dữ liệu thời gian chạy dịch vụ khỏi sự lộn xộn /tmpvà các công việc dọn dẹp ở đó. Thật vậy: Hai bản phân phối mà tôi chạy (không có ý định chơi chữ) có quyền 755 /run, trong khi /tmp/var/tmp(và /dev/shmđối với vấn đề đó) có quyền 1777.


3
nó chỉ đơn giản là ở đó để tách dữ liệu thời gian chạy dịch vụ khỏi mớ hỗn độn trong/tmp - Ngoài ra để cung cấp một bến cảng an toàn cho dữ liệu đã nói từ các công việc dọn dẹp khác nhau chà đạp trong suốt /tmp.
Satō Katsura

Cảm ơn thông tin về các quyền. Tuy nhiên, theo FHS "Các chương trình có thể có thư mục con / chạy; điều này được khuyến khích cho các chương trình sử dụng nhiều hơn một tệp thời gian chạy." - điều này dường như mâu thuẫn với cả tiêu chí "dịch vụ tồn tại lâu" cũng như việc các chương trình không thể tạo ra các thư mục con của họ do các quyền hạn chế.
Dirk Herrmann

@DirkHerrmann Không, không. Hãy xem /runvà kiểm tra cấu trúc thư mục (cũng ...) phức tạp gây ra udev, udiskv.v. Tôi không phải là chuyên gia về vấn đề cụ thể này, nhưng tôi đoán các tập lệnh khởi động (được chạy dưới dạng siêu người dùng) thiết lập mọi thứ.
biện pháp đối phó

2
"/ run về mặt kỹ thuật là không cần thiết, nó chỉ đơn giản là ở đó để tách dữ liệu thời gian chạy dịch vụ khỏi mớ hỗn độn trong / tmp." - Điều tốt là quá, vì vậy các quy trình không có đặc quyền không thể squat tên dịch vụ hệ thống muốn sử dụng. Kinda hút nếu nginx muốn sử dụng /tmp/nginx.pidnhưng nó đã tồn tại do một số chương trình hoạt động sai. /run/ngăn chặn điều này bằng cách yêu cầu đặc quyền để viết cho.
marcelm

18

/tmplà vị trí để tạo các tập tin và thư mục tạm thời. Không thể sử dụng để lưu trữ "tên nổi tiếng" (nghĩa là tên mà một quá trình khác có thể nhận biết được mà không cần bạn phải chuyển tên cho nó bằng cách nào đó) bởi vì không ai có quyền sở hữu đối với không gian tên; bất cứ ai cũng có thể tạo tập tin ở đó. Vì vậy, bạn thường sử dụng nó khi bạn có một tiện ích cần một tệp (không phải là đường ống hoặc như vậy) như đầu vào hoặc đầu ra, trong đó bất kỳ tên (được tạo ngẫu nhiên) sẽ hoạt động miễn là bạn chuyển tên vào.

Trong lịch sử, một số điều (như X) đã vi phạm nguyên tắc này và đặt những cái tên nổi tiếng (như .X11-unix) vào /tmp. Điều này tất nhiên là lỗi và cho phép bất kỳ người dùng nào thực hiện dịch vụ cần thực hiện đơn giản bằng cách chạy đua để tạo tệp theo tên mong muốn trước. Những thứ như vậy thuộc về /run(hoặc tương đương /var/runnếu bạn không đăng ký chủ nghĩa xét lại Freedesktop.org). Tất nhiên thậm chí tốt hơn là sửa chúng không sử dụng các tên nổi tiếng trong không gian tên toàn cầu mà thay vào đó chuyển qua một tên đường dẫn.


Cảm ơn cho một số định nghĩa thêm về "tập tin tạm thời". Mặc dù tôi không nghĩ "vượt qua một tên đường dẫn" giải thích cách thiết lập điểm phối hợp. Tức là bạn thường sử dụng một biến môi trường. Có vẻ như có ít ổ cắm và ống dẫn (sử dụng chung) để cho phép nó hoạt động. (Một phần vì rất nhiều thứ sẽ chạy trên cùng một ổ cắm dbus). Có vẻ như sẽ rất khó chịu khi đặt môi trường nếu các chương trình không mặc định là đường dẫn được mã hóa cứng. Bạn có thể thêm khóa mới vào .socketcác tệp systemd ... nhưng điều đó không giúp ích cho toàn bộ thư mục, cũng như cho các dịch vụ mới được cài đặt
sourcejedi

2
/run/bản thân nó đã được FHS thông qua, tôi không thể thấy nó có liên quan gì đến fd.o. Trừ khi những gì chúng tôi thực sự muốn phàn nàn là những nỗ lực phát triển không xác định đã đóng góp cho cả hai.
nguồn

Tôi nghĩ rằng câu trả lời ban đầu ở đây là câu trả lời tốt nhất ở đây cho câu hỏi như được viết. Tôi nghĩ rằng nó sẽ được cải thiện hơn nữa bằng cách xem xét: _Khi phần mềm có quyền truy cập ghi vào một thư mục chuyên dụng, ví dụ như bên dưới /run, nó có thể chọn để tránh làm lộn xộn /tmpthư mục dùng chung với nhiều tệp hơn.
nguồn

"Fd.o" là gì?
TRiG

7

Theo Tiêu chuẩn phân cấp hệ thống tập tin,

  • /run dành cho dữ liệu biến thời gian chạy tức là thông tin về hệ thống đang chạy kể từ khi khởi động lại
  • /tmp là một nơi chung cho các tập tin tạm thời.

Vì vậy, bất cứ điều gì liên quan đến trạng thái daemon, người dùng đã đăng nhập, thiết bị di động được gắn, v.v. sẽ đi vào trong /runkhi các tệp tạm thời được tạo bởi một chương trình sẽ đi vào /tmp.

Chỉnh sửa: như được chỉ ra bởi @JdeBP trong bình luận bên dưới,

FHS cho phép thực hiện những việc như thiết lập thông thường các công việc định kỳ thường xuyên lọc /tmpcác tệp "cũ"; không có cơ chế như vậy dành cho /run. Do đó, giới hạn hà khắc về những chương trình có thể mong đợi trong suốt cuộc đời của bất cứ thứ gì được đưa vào /tmp. Mặc dù các chương trình có thể mong đợi các tệp tồn tại lâu hơn /runtrên một hệ thống liên tục, nhưng chúng cũng được dự kiến ​​sẽ dọn dẹp sau khi chúng ở đó nhiều hơn.


4
Một điều không được chỉ ra trong câu trả lời này hay bất kỳ câu trả lời nào khác, nhưng được lưu ý trong FHS và bạn có thể muốn cải thiện câu trả lời của mình với: FHS cho phép thực hiện những việc như thiết lập thông thường các công việc định kỳ thường lọc /tmpcác tệp "cũ"; không có cơ chế như vậy dành cho /run. Do đó, giới hạn hà khắc về những chương trình có thể mong đợi trong suốt cuộc đời của bất cứ thứ gì được đưa vào /tmp. Mặc dù các chương trình có thể mong đợi các tệp tồn tại lâu hơn /runtrên một hệ thống liên tục, nhưng chúng cũng được dự kiến ​​sẽ dọn dẹp sau khi chúng ở đó nhiều hơn.
JdeBP

1
Sẽ thật tuyệt nếu có một thư mục theo quy trình của những thứ đã biến mất (hoặc được phép xóa bởi một số daemon rác lưu động) ngay khi quá trình chết.
Omnifarious

1
@Omnifarious bây giờ bạn có thể có hành vi đó cho dịch vụ systemd, bằng cách sử dụng RuntimeDirectory = :-).
nguồ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.