Gắn thư mục vào root


7

Tôi có một thư mục chứa các tập tin nhất định. Có cách nào để gắn nó lên /, để nội dung của một thư mục nhất định xuất hiện ở các vị trí tương ứng trong /không?

Trong trường hợp của tôi, các thư mục chứa các tệp liên quan đến một ứng dụng - nó không có các thư mục như /dev/proc.

Tôi đã thử tạo ra một liên kết gắn kết theo cách sau:

mount --bind ~/applications/firefox /

Tuy nhiên, điều này không làm gì cả. Không giống như những gì đã được suy đoán trong các bình luận, nó cũng không có bất kỳ tác dụng phụ nào.


Động lực cho việc này là tôi có một số ứng dụng tùy chỉnh mà tôi muốn cài đặt sạch trên các hệ thống quan trọng. Hiểu rõ, tôi muốn giữ cho quản lý liên quan ở mức tối thiểu. Tôi có được cách bố trí hệ thống tệp của cài đặt ứng dụng bằng phương thức unionfs-fuse + chroot , nhưng sau đó tôi vẫn phải xử lý vấn đề về các tệp của ứng dụng trộn lẫn với các tệp của hệ thống. Gắn một số thư mục nhất định /sẽ giúp tôi giữ cho hệ thống tập tin sạch sẽ.

Mặc dù phương pháp cài đặt phần mềm này có vẻ sai lệch, nhưng có một bản phân phối có tên "Porteus" cài đặt phần mềm theo cách chính xác này (và vì những lý do tương tự), tuy nhiên, chúng được biết là sử dụng hạt nhân được vá cùng với aufs. Tuy nhiên, tôi không thể sử dụng kernel tùy chỉnh trên các hệ thống.


1
Trừ khi ~ / ứng dụng có một hệ điều hành hoàn chỉnh (bao gồm / dev và tất cả), loại gắn kết này có khả năng bị sập / treo hệ thống của bạn. Tôi giả sử bạn đã thử gắn kết này là root?
Archemar 30/05/2015

1
Hãy cho chúng tôi những gì bạn đang thực sự cố gắng để đạt được - có thể có những cách khác.
guntbert

@guntbert, tôi đã thêm một lời giải thích theo yêu cầu của bạn.
dùng2064000

Tìm kiếm cho overlay filezystem.
ott--

Câu trả lời:


3

Những gì bạn yêu cầu làm được thực hiện ít nhất một lần trên mọi hệ thống Linux được cấu hình phổ biến ngoài kia. Hầu hết sử dụng công cụ có sẵn bằng cách busyboxgọi switch_root:

Điều gì switch_rootlàm là xóa tất cả các tệp ra khỏi rootfs (để giải phóng bộ nhớ) và sau đó chrootvào một hệ thống tệp mới và thực hiện một quá trình init mới ra khỏi hệ thống tệp mới.

Điều này xảy ra trong quá trình khởi tạo hệ thống. Khi một hệ thống linux được khởi động, kernel sẽ đưa hệ thống lên theo từng giai đoạn. Lúc đầu, hạt nhân được thực thi trong bộ nhớ bởi một số hệ thống khác - chẳng hạn như bộ tải khởi động hoặc phần sụn - và tại thời điểm này, hạt nhân chỉ còn lại để tự bảo vệ - không có tham chiếu khung thực cho hệ thống mà trên đó nó vừa được thực hiện.

Đây là những gì initramfshình ảnh thường được thêm vào không gian bộ nhớ của nó (nhưng cũng có thể được biên dịch trực tiếp vào kernel) được thiết kế để xử lý. Các initramfs là một hình ảnh hệ thống tập tin gốc thực sự (hoàn thành w / /dev/procwhat-have-you) - đó là hệ thống tập tin gốc đầu tiên được gắn bởi một nhân linux. Nó bao gồm một kho lưu trữ hệ thống tập tin gốc có chứa bất kỳ / tất cả các mô-đun / tệp cấu hình dành riêng cho hệ thống cần thiết để lấy kernel trên chân của nó - để khởi động nó.

Dù sao, kernel gắn kết lưu trữ dưới dạng rootfs (về cơ bản là một tmpfs ) và sau đó làm bất cứ điều gì cần thiết để tìm một số khác/ và gắn cái đó lên trên nó. Nó làm điều này mỗi khi bạn khởi động hệ thống của bạn. Nó có thể làm điều đó một lần nữa và không cần dùng đến các hack không cần thiết như unionfs hay aufs - cả hai đều có khả năng gây ra tất cả các loại biến chứng cụ thể và chi tiết cấu hình cụ thể (không đề cập đến sự không ổn định) .

Trong phần switch_rootmô tả được trích dẫn ở trên, có lẽ bạn sẽ nhận thấy cụm từ xóa tất cả các tệp khỏi rootfs . Rõ ràng đây không phải là một hành vi mong muốn khi chuyển ra khỏi rootfs dựa trên đĩa. Nhưng nó chỉ xảy ra theo cách đó switch_rootđể giải phóng bộ nhớ cho hệ thống tập tin dựa trên ram - và hoàn toàn không cần thiết. Đây là một số chi tiết từ bài viết được trích dẫn trước đó:

Đoạn mã shell sau đây trình bày cách sử dụng switch_root:

   # First, find and mount the new filesystem.

   mkdir /newroot
   mount /dev/whatever /newroot

   # Unmount everything else you've attached to rootfs.  (Moving the filesystems
   # into newroot is something useful to do with them.)

   mount --move /sys /newroot/sys
   mount --move /proc /newroot/proc
   mount --move /dev /newroot/dev

   # Now switch to the new filesystem, and run /sbin/init out of it.  Don't
   # forget the "exec" here, because you want the new init program to inherit
   # PID 1.

   exec switch_root /newroot /sbin/init

Như bạn thấy ở trên, xử lý /dev, /proc/syscác vấn đề liên quan có thể được rất đơn giản thực hiện. Nhân tiện, nếu bạn định lớp bất kỳ thú mount --movecưỡi nào, bạn sẽ phải đối phó không chỉ với mtabmountbất kỳ biến chứng nào khác được giới thiệu bởi hệ thống phân lớp của bạn. Nó đơn giản hơn để làm giống như bạn mô tả trong câu hỏi - mount root từ một nơi khác.

Bạn sẽ cần phải làm về cơ bản tất cả những thứ đó xảy ra trong một cấu hình initramfs điển hình và rất ít khác - (mà không nhằm mục đích bao gồm Debian hoặc Redhat initramfs hình ảnh 's - cả hai đều được cách qua chế) . Vấn đề thực sự duy nhất bạn có thể gặp phải là làm thế nào để khiến cho PID1 tuân theo - nếu bạn để init hệ thống của mình bị mắc kẹt trên một số rootfs mồ côi, những thứ rất kỳ lạ có thể sớm bắt đầu xảy ra trên hệ thống của bạn. Cách rõ ràng để xử lý việc này là chuẩn bị từ initramfs trên. Chỉ cần đảm bảo rằng initquy trình của đĩa cứng của bạn được chuẩn bị cho execmột quá trình khác sau này khi bạn muốn chuyển đổi rễ. Nếu bạn đang sử dụng systemd initthì biến chứng này đã được xử lý cho bạn:

systemctl --help
...
switch-root ROOT [INIT]         Change to a different root file system
...

Nếu bạn đang sử dụng systemddựa trên cơ sở, initbạn nên nghiên cứu các tệp đơn vị /usr/lib/systemd/system/initrd*để có ý tưởng về systemdtình huống chuyển đổi gốc theo kiểu kịch bản thường xảy ra như thế nào.

Một cách khác để đi về nó có thể là để bắt chước busybox's switch_roottrong initramfs - nhưng để bỏ qua những phần mà bạn xóa tất cả các tập tin gốc ban đầu của. Arch Linux hệ thống được cấu hình với systemdtrong initramfs làm điều này. Trên những trang, gắn kết initramfs gốc mình thành /newroot's /run/initramfstrước khi thực hiện chuyển đổi sở và là những gì hệ thống rơi trở lại lúc tắt máy để xử lý sạch ngủ / đình chỉ và tương tự. Đó có thể là cách tốt nhất để xử lý trường hợp của bạn, thực sự - chỉ là một hệ thống gốc nhỏ bé, bền bỉ mà bạn sử dụng cho các ứng dụng đã được root riêng lẻ.


2

Đừng cố gắn kết /, hãy biến mình thành một cái "mới" (giả, chỉ đọc):

Tôi đã làm một cái gì đó tương tự. Tại thời điểm tôi đã sử dụng AUFS, nhưng điều này cũng sẽ hoạt động với lớp phủ và / hoặc unionfs-fuse:

  • tạo một thư mục (ví dụ) ~/apps/_App1_FakeRoot
  • Gắn kết Unionfs /(root) chỉ ~/apps/_App1đọc dưới đọc-ghi trên mountpoint ~ / apps / _App1_FakeRoot.
  • chroot vào FakeRoot, chạy ứng dụng của bạn.

Trong trường hợp cụ thể của tôi, tôi đã sử dụng một cái gì đó giống như ở trên để thống nhất một số lớp, bao gồm cả đĩa (ram) để ghi (tạm thời).

Cú pháp cụ thể sẽ phụ thuộc vào bất kỳ triển khai nào của một FS kết hợp mà bạn (có thể) sử dụng. Bạn cũng có thể phải tự gắn kết một / Proc / sys / dev / pts khác trong chroot, tùy thuộc vào ứng dụng của bạn cần gì. Cũng có thể, một số loại chương trình sẽ không chạy trong một chroot như vậy, có lẽ nếu bạn muốn làm những việc ở cấp độ phần cứng

.


0

mount --bind ~/applications/firefox /sẽ phủ bóng lên toàn bộ cây thư mục, bao gồm /dev,/proc v.v. Nó sẽ làm cho mọi thứ bị che khuất không thể truy cập được. Nó không hoạt động vì bạn không thể gắn kết một thư mục nơi nó sẽ tự phủ bóng.

Bạn muốn trộn những gì đã có trong cây thư mục của bạn và cây thư mục khác. Điều này được gọi là gắn kết công đoàn . Có một số hệ thống tập tin liên minh có sẵn cho Linux; aufs có mặt trong hạt nhân không cổ đại; unionfs-fuse có sẵn ở bất cứ nơi nào có FUSE. Aufs hỗ trợ thư mục gốc làm điểm gắn kết, nhưng Unionfs-fuse. Đối với trường hợp sử dụng của bạn, gắn kết công đoàn /usrlà đủ.


1
aufskhông hỗ trợ /như điểm gắn kết. Có fsprotect thực hiện điều đó và tôi nghĩ rằng nhiều bản phân phối Linux trực tiếp sử dụng nó để phủ dữ liệu liên tục trên một hệ thống tệp gốc bất biến trên phương tiện chỉ đọc. Các môn thể dục dụng cụ bạn phải trải qua để có được một aufshệ thống tập tin gốc được thực hiện tốt nhất trong các kịch bản khởi động sớm, thường là trong initramfs.
Celada

"Nó không hoạt động vì bạn không thể gắn kết một thư mục nơi nó sẽ tự phủ bóng" - sai. unshare -rm, mount --bind /tmp /thành công. Cũng như unshare -rm, mount --bind /usr/lib /usr.
nguồnjedi
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.