Cách thư mục được tạo trong / var / run trên mỗi lần khởi động lại


60

Trong ubuntus gần đây (cụ thể, điều tôi quan tâm nhất là 12.04) /var/runlà tmpfs, và do đó tôi cho rằng nó bắt đầu trống với mỗi lần khởi động lại.

Tuy nhiên, tôi thấy có một số thư mục, như /var/run/mysqldvà nhiều thư mục khác. Làm thế nào những thư mục được tạo ra trên mỗi khởi động lại? Có một số thư mục mẫu được sao chép vào /var/run/(và nếu vậy, tập lệnh nào thực hiện điều đó), hoặc mỗi thư mục mkdir'ed riêng biệt, hoặc cái gì?

EDIT:
Xin vui lòng, không trả lời đó /var/runlà liên tục, hoặc đó /runlà liên tục. Bởi vì nó KHÔNG.

Ngay cả khi nó là như vậy trên hệ thống của bạn , nó không phải là như vậy trên 12.04 thông thường.


Hmm, vì vậy tôi sẽ có 50 đại diện. lãng phí cho một trong hai câu trả lời rõ ràng là sai ....
Sandman4

Ai đó, vui lòng trả lời BẤT CỨ điều gì hợp lý và bạn nhận được +50 đại diện :)
Sandman4

Câu trả lời:


82

(Cảm ơn @Zulakis và câu trả lời trên Serverfault vì đã chỉ ra rằng câu trả lời này không theo kịp sự phát triển đang diễn ra của Ubuntu.)

Với việc áp dụng từ systemdngày 15.04 , giờ đây đã có một cơ chế tập trung để tạo các tệp và thư mục tạm thời như thế này. Một dịch vụ có nhu cầu sử dụng phương pháp này có thể loại bỏ mkdircác lệnh trong tập lệnh khởi động riêng của mình và thay vào đó đặt một .conftập tin trong /etc/tmpfiles.d, /run/tmpfiles.dhoặc /usr/lib/tmpfiles.d, với các dịch vụ Ubuntu dường như thích lựa chọn cuối cùng. Ví dụ: hệ thống của tôi hiện có:

$ egrep -r /var/run /usr/lib/tmpfiles.d

/usr/lib/tmpfiles.d/var.conf:L /var/run - - - - ../run
/usr/lib/tmpfiles.d/sudo.conf:d /var/run/sudo 0711 root root
/usr/lib/tmpfiles.d/sudo.conf:D /var/run/sudo/ts 0700 root root
/usr/lib/tmpfiles.d/postgresql.conf:d /var/run/postgresql 2775 postgres postgres - -
/usr/lib/tmpfiles.d/sshd.conf:d /var/run/sshd 0755 root root
/usr/lib/tmpfiles.d/screen-cleanup.conf:d /var/run/screen 0775 root utmp

Các dphương tiện để tạo một thư mục nếu nó không tồn tại, sau đó là đường dẫn và phần còn lại là các quyền, người dùng và nhóm. Các thư mục này sẽ được tạo bất kể dịch vụ tương ứng có được bắt đầu hay không.

Đối với tài liệu đầy đủ, xem man tmpfiles.d.


TRẢ LỜI TRƯỚC HỆ THỐNG TRẢ LỜI:

Có vẻ như chúng được tạo động bởi các dịch vụ riêng lẻ khi chúng bắt đầu:

$ sudo egrep -r 'mkdir.*/var/run' /etc

/etc/init.d/ssh:        mkdir /var/run/sshd
/etc/init.d/bind9:      mkdir -p /var/run/named
/etc/init.d/timidity:    mkdir -p /var/run/timidity
/etc/init.d/bzflag:                mkdir -p /var/run/bzflag
/etc/init.d/dns-clean:mkdir /var/run/pppconfig >/dev/null 2>&1 || true
/etc/init/winbind.conf: mkdir -p /var/run/samba/winbindd_privileged
/etc/init/dbus.conf:    mkdir -p /var/run/dbus
/etc/init/ssh.conf:    mkdir -p -m0755 /var/run/sshd
/etc/init/libvirt-bin.conf:     mkdir -p /var/run/libvirt
/etc/init/cups.conf:    mkdir -p /var/run/cups/certs

Tôi tin rằng đây là một trong những xử lý mysqld:

[ -d /var/run/mysqld ] || install -m 755 -o mysql -g root -d /var/run/mysqld
/lib/init/apparmor-profile-load usr.sbin.mysqld

man install nói rằng biểu mẫu -d sẽ "tạo ra tất cả các thành phần của các thư mục được chỉ định".


1
Điều này dường như không phải luôn luôn như vậy: serverfault.com/questions/824393/
Kẻ

Cảm ơn, @Zulakis. Tôi đã thực hiện một số chỉnh sửa và sẽ đánh giá cao việc biết liệu chúng có đúng hay không dựa trên trải nghiệm của bạn với tính năng này.
Paul

1
Co vẻ tôt vơi tôi! Cảm ơn đã cập nhật câu trả lời của bạn :)
Zulakis

1
Upvote cho lệnh egrep -r. Tìm kiếm trong một tìm kiếm tập tin! :-)
Nick Woodhams

5

/runThư mục được gắn tmpfs mới cho phép các chương trình như udev, lvm và mdadm giữ dữ liệu thời gian chạy từ initrd cho đến khi tắt máy.

/var là một thư mục chuẩn của bất kỳ hệ thống Linux / UNIX nào - nó là viết tắt của "biến" và là nơi chứa rất nhiều nhật ký, cahces, BUT cũng lập trình các tệp cài đặt biến và thậm chí một số cơ sở dữ liệu cấu hình hệ thống cư trú.

Hầu hết mọi thứ trong /varnên được thanh lọc đúng cách và được quy định bởi hệ thống. Các tập tin hoán đổi của bạn cho bộ nhớ ảo cũng tồn tại /varđể không gặp rắc rối với điều đó. /var/runcũng giữ rất nhiều thông tin trạng thái và thông số của daemans quá trình đang hoạt động.

Thư mục này chứa dữ liệu thông tin hệ thống mô tả hệ thống kể từ khi nó được khởi động. Các tệp trong thư mục này phải được xóa (loại bỏ hoặc cắt bớt khi thích hợp) khi bắt đầu quá trình khởi động. Các chương trình có thể có một thư mục con của /var/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.

Kể từ khi /var/runđược gắn kết như tmpfs. Điều đó có nghĩa là nó hoàn toàn trống rỗng khi máy của bạn khởi động và nó có nghĩa là như thế này để ngăn những thứ như daemon không bắt đầu vì tập tin PID còn sót lại.

Các kịch bản khởi động thường tạo các thư mục họ cần trước khi sử dụng chúng. Nếu bạn muốn lưu trữ một tập tin PID, hãy đặt nó /var/runtrực tiếp hoặc tạo một thư mục trước khi tạo tập tin PID. Đây không phải là nơi để lưu trữ dữ liệu cần duy trì ở đó trên các lần khởi động lại.

Nguồn: Hướng dẫn của quản trị viên hệ thống đường dẫn & Linux


5

Đối với bất kỳ ai gặp phải chủ đề này bởi vì bạn đang tìm kiếm một giải pháp cho cách bạn có thể định cấu hình một ứng dụng để nó tạo thư mục /var/runđể nó có thể lưu trữ tệp sock hoặc pid hoặc bất cứ ví dụ nào ở đây. Tôi đã xem qua chủ đề này bởi vì tôi muốn lưu trữ tệp sock MySQL trong /var/run/mysqld. Vì vậy, sau khi tôi bắt gặp chủ đề này, tôi bắt đầu tìm trong các /etc/inittập tin để lấy ví dụ. dbus là một trong những tốt. Và, tôi đã đưa ra cấu hình khởi động mysql này:

start on runlevel [2345] 
stop on runlevel [!2345] 
expect daemon 

pre-start script 
    mkdir -p -m0755 /var/run/mysqld 
    chown mysql:mysql /var/run/mysqld 
end script 

exec /etc/init.d/mysql start 
pre-stop exec /etc/init.d/mysql stop 

Phần kịch bản trước khi bắt đầu đã thực hiện các mẹo.


2

Tuy nhiên, tôi thấy có một số thư mục, như / var / run / mysqld và nhiều thư mục khác. Làm thế nào những thư mục được tạo ra trên mỗi khởi động lại? Có một số thư mục mẫu được sao chép vào / var / run / (và nếu vậy, tập lệnh nào thực hiện điều đó), hoặc mỗi thư mục mkdired riêng biệt, hoặc gì?

Như được định nghĩa trong Tiêu chuẩn phân cấp tệp , /var/runhoặc /runđược sử dụng để lưu trữ dữ liệu thời gian chạy dễ bay hơi.

Tất cả các thư mục và tệp được tạo trong đó được quản lý bởi chương trình tương ứng đã tạo các tệp. Không có thứ gọi là thư mục mẫu được sao chép, mọi chương trình đều có thể sử dụng thư mục đó để lưu trữ thông tin dễ bay hơi. Dữ liệu được lưu trữ bị mất khi hệ thống khởi động lại.

Một điều phổ biến để sử dụng /runthư mục là lưu trữ các pidtrình tiện ích đang chạy, các tệp đánh dấu có chứa số tiến trình của một quy trình. Chúng chủ yếu được sử dụng cho các kịch bản bắt đầu / dừng mà bạn có thể tìm thấy ví dụ như trong/etc/init.d/

Tôi hy vọng điều đó làm cho mọi thứ rõ ràng với bạn!

br


1

Giả định của bạn không hoàn toàn chính xác. Vị trí của /varthư mục có thể thương lượng - nghĩa là, bạn có thể sử dụng một phân vùng hoặc âm lượng thay thế để xác định vị trí /varthư mục. Bất kể /varvị trí của /var/runthư mục, thư mục là một liên kết tượng trưng đến /runthư mục và nội dung của nó vẫn còn sau khi khởi động lại, mặc dù nhiều tệp trong /runđược tạo hoặc sửa đổi khi khởi động bởi các dịch vụ bắt đầu trong khi khởi động. Vì vậy, chính các dịch vụ - chẳng hạn như mysqld- yêu cầu tải tệp vào /var/runthư mục và được thiết lập để tạo thư mục con nếu chúng không tồn tại.


1
Tôi đã tạo một số thư mục trong / var / run và chúng biến mất sau khi khởi động lại. (cụ thể vào ngày 12.04)
Sandman4

Xem thêm ở đây rằng / var / run thực sự là tmpfs askubuntu.com/questions/57297/...
Sandman4

-2

douggro hoàn toàn đúng, / var / run được gắn dưới dạng tmpfs và / var / run là một liên kết tượng trưng đến / chạy liên tục trên các lần khởi động lại, do đó, mọi thứ đi vào / chạy cũng sẽ xuất hiện trong (và ở lại) / var / chạy.

Vì vậy, bất kỳ dịch vụ khởi động nào như mysqld, một trình nền được khởi động vào lúc khởi động, tạo tệp trong / run, cũng sẽ có các tệp hiển thị trong / var / run (symlink to / run memory). Nếu bạn muốn tạo một tệp sẽ tồn tại thông qua khởi động lại trong / var / run, hãy tạo nó trong / run và sau đó khởi động lại.

Hy vọng điều này trả lời câu hỏi của bạn.


3
Cả hai bạn đều nhầm, hoặc sử dụng các thiết lập không chuẩn. Kiểm tra cho chính mình. gắn kết | grep / run .... tmpfs trên / chạy loại tmpfs
Steven K

1
"Nếu bạn muốn tạo một tệp sẽ tồn tại thông qua khởi động lại trong / var / run, hãy tạo nó trong / run và sau đó khởi động lại." Đó là không đúng. tmpfslà không ổn định và thay đổi bị mất.
ortang
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.