(Làm thế nào) tôi có thể tạo một tmpfs như một người dùng thông thường (không phải root)?


39

Bản phân phối là một máy chủ Ubuntu chạy kernel Linux 2.6,35-30.

Tôi muốn có một thư mục nằm hoàn toàn trong bộ nhớ. Điều này có thể mà không có quyền root?

Câu trả lời:


49

Linux cung cấp một thiết bị tmpfs mà bất kỳ người dùng nào cũng có thể sử dụng /dev/shm. Nó không được gắn vào một thư mục cụ thể theo mặc định, nhưng bạn vẫn có thể sử dụng nó như một thư mục.

Đơn giản chỉ cần tạo một thư mục trong /dev/shmvà sau đó symlink nó đến bất cứ nơi nào bạn muốn. Bạn có thể cung cấp cho thư mục đã tạo bất kỳ quyền nào bạn chọn để người dùng khác không thể truy cập.

Đây là một thiết bị được hỗ trợ RAM, vì vậy những gì có trong bộ nhớ theo mặc định. Bạn có thể tạo bất kỳ thư mục bạn cần bên trong/dev/shm

Đương nhiên, các tệp được đặt ở đây sẽ không tồn tại khi khởi động lại và nếu máy của bạn bắt đầu hoán đổi, /dev/shmsẽ không giúp bạn.

Song song Solaris /dev/shm/tmpphân vùng kiểu "hoán đổi" và cũng dựa trên bộ nhớ. Cũng như /dev/shm, người dùng tùy ý có thể tạo các tệp trong /tmpSolaris.

OpenBSD cũng có khả năng sử dụng ngàm dựa trên bộ nhớ, nhưng không có sẵn một mặc định. Lệnh mount_mfs có sẵn cho siêu người dùng.

Tôi không chắc chắn về các BSD * khác.


1
Một symlink có thể giải quyết vấn đề ở đâu .
enzotib

Đừng ... quên những liên kết nhỏ phiền phức đó.
gabe.

@enzotib đã sửa rồi!
gabe.

Dường như không có /dev/tmpfstrên hệ thống (hệ thống của tôi cũng không có kernel 3.0.0). Bạn có chắc chắn đó không phải là thứ được tạo ra bởi bản phân phối của bạn?
bitmask

1
Không chắc chắn nếu điều này cũng áp dụng cho người khác, nhưng trên phiên bản ub Ubuntu hiện tại của tôi, điều này dường như đã thay đổi /runvà có thể /run/shmCần điều tra thêm trước khi cập nhật câu trả lời của tôi.
gabe.

14

/ dev / shm không an toàn

... Trên các hệ thống có trao đổi hoạt động ! Rất có thể là rất cao máy tính của bạn có nó được kích hoạt.

Có một sự thay thế tốt hơn, an toàn , tiêu chuẩn - ramfs. Bạn có thể muốn sử dụng ramfsnếu bạn có kế hoạch sử dụng không gian được hỗ trợ RAM để lưu trữ tạm thời dữ liệu nhạy cảm, chẳng hạn như khóa riêng, ví Bitcoin hoặc Ethereum, v.v.

ramfstốt hơn so với tmpfskhi bảo mật được quan tâm, vì ramfsdữ liệu không bao giờ bị tráo đổi (được lưu vào ổ lưu trữ vật lý), trong khi tmpfs có thể bị tráo đổi. Các bên thứ ba sau đó có thể kiểm tra không gian hoán đổitrích xuất dữ liệu nhạy cảm .

Giải pháp

Bạn có thể chuẩn bị ramfsgắn kết để bất kỳ người dùng không có đặc quyền nào cũng có thể gắn kết / ngắt kết nối theo yêu cầu.

Để làm điều này, bạn sẽ cần đặc quyền root , một lần . Yêu cầu quản trị viên hệ thống của bạn thiết lập điều này cho bạn, nếu bạn thiếu quyền root.

Đầu tiên, bạn cần thêm một dòng vào /etc/fstab. Dòng trong fstab có thể trông như thế này:

none    /mnt/ramfs    ramfs    noauto,user,size=1024M,mode=0770    0    0
  • /mnt/ramfslà một điểm gắn kết, nơi hệ thống tập tin ramfs sẽ được gắn kết. Thư mục nên tồn tại.
  • noauto tùy chọn ngăn không cho điều này được gắn tự động (ví dụ: khi khởi động hệ thống).
  • user làm cho nó có thể gắn kết bởi người dùng thường xuyên.
  • sizeđặt kích thước "ramdisk" này (bạn có thể sử dụng MGtại đây).
  • moderất quan trọng , với mã bát phân 0770chỉ có root và người dùng, người đã gắn hệ thống tập tin này, sẽ có thể đọc và ghi vào nó, chứ không phải những người khác (bạn cũng có thể sử dụng mã khác theo lựa chọn của mình, nhưng hãy chắc chắn về nó! ).

Khi điều này được thực hiện, bất kỳ người dùng sẽ có thể gắn kết này theo yêu cầu.

Khi một số người dùng gắn kết điều này, ramfshệ thống tệp 1024 MB mới được tạo và gắn kết tại /mnt/ramfs/. Nó sẽ được sở hữu bởi root:user. Khi anh ấy / cô ấy ngắt kết nối hoặc hệ thống được khởi động lại, hệ thống tập tin dựa trên RAM này sẽ biến mất với tất cả dữ liệu của nó. Cái nào cũng ngầu.

Ngoài ra, hệ thống tệp này có thể được gắn kết bởi một số người dùng một cách độc lập, nhưng không phải cùng một lúc , tức là để sẵn sàng để gắn kết bởi người dùng tiếp theo, người dùng trước nên ngắt kết nối hệ thống tệp này.

tăng:

mount /mnt/ramfs/

để ngắt kết nối:

umount /mnt/ramfs/

PS Nếu bạn đang cố gắng rsynctập tin vào thư mục gốc của ramfs mới được gắn / tạo như một người dùng không root, bạn có thể gặp phải một rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1183) [sender=3.1.1]lỗi. Điều này là hoàn toàn tốt và được mong đợi, bởi vì người dùng của bạn không sở hữu gốc của hệ thống tập tin ram. Giải pháp rất đơn giản, chỉ cần tạo một số thư mục ở đó, /mnt/ramfs/copied/ví dụ, và rsyncvào đó.

PPS đã thử nghiệm trên Debian 9. Khá chắc chắn rằng nó cũng sẽ hoạt động trên Ubuntu.


10

Hệ thống của bạn có thể đã có sẵn một cái; các hệ thống Linux gần đây dựa trên Glibc luôn có một tmpfs được gắn vào/dev/shm .

Nếu hệ thống của bạn không có một cái hoặc nó quá nhỏ, thì một hệ thống tập tin không được root bởi root khá nhiều có nghĩa là FUSE . Trên Ubuntu, bạn cần phải ở trong fusenhóm để sử dụng FUSE. Nhìn qua các hệ thống tập tin FUSE có sẵn , tôi chỉ thấy Ramfuse , không may bị bỏ rơi ngược dòng.


5

Nói chung, không, hệ thống tập tin chỉ có thể được gắn kết bằng root. Nếu bạn cho phép người dùng đặt các hệ thống tập tin một cách tùy tiện, điều đó về cơ bản là cho họ root. (Cách dễ dàng: gắn kết một lần / etc, đặt mật khẩu của riêng bạn và đổ bóng ở đó, su với mật khẩu gốc mới bạn vừa tạo, ngắt kết nối)

Nếu bạn muốn một tmpfs tại một vị trí cụ thể, bạn có thể thêm nó vào /etc/fstab, với các cờ noauto,uservà sau đó người dùng sẽ có thể gắn nó (nhưng không rõ tại sao bạn không chỉ tự động gắn nó)

Nếu người dùng cần các tmpfs tùy ý, thì bạn có một vài tùy chọn:

  • sử dụng các thư mục con của một tmpfs. Có lẽ là cách tiếp cận tốt nhất. Bạn thực sự có thể không cần nhiều hơn một tmpfs.
  • tạo một tập lệnh sẽ tạo một thư mục và gắn một tmpfs lên trên nó, và sau đó in ra nơi nó đặt nó. Sử dụng sudođể cho phép người dùng chạy nó. Đảm bảo rằng bạn không cho phép người dùng chọn các đường dẫn tùy ý.
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.