Điều gì xảy ra khi bạn 'gắn kết' một thư mục hiện có với nội dung?


80

Ngay bây giờ /tmpcó một số tập tin tạm thời trong đó. Khi tôi gắn ổ cứng ( /dev/sdc1) lên trên /tmp, tôi có thể thấy các tệp trên ổ cứng. Điều gì xảy ra với nội dung thực tế /tmpkhi ổ cứng của tôi được gắn? Có thể thực hiện các thao tác r / w trên nội dung thực tế /tmptrong khi ổ cứng được gắn không?

python@lanix / $ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       286G   43G  229G  16% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            3.8G  4.0K  3.8G   1% /dev
tmpfs           766M  1.4M  765M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            3.8G   38M  3.8G   1% /run/shm
none            100M   24K  100M   1% /run/user
/dev/sdb1       7.5G  2.7G  4.9G  35% /mnt
/dev/sdc1       932G  242G  691G  26% /tmp

Câu trả lời:


117

Điều gì xảy ra với nội dung thực tế của / tmp khi ổ cứng của tôi được gắn?

Không có gì nhiều. Chúng chỉ bị ẩn khỏi chế độ xem, không thể truy cập thông qua hệ thống tệp thông thường.

Có thể thực hiện các thao tác r / w trên nội dung thực tế của / tmp trong khi ổ cứng được gắn không?

Đúng. Các quy trình có xử lý tệp mở bên trong "bản gốc" của /tmpbạn sẽ tiếp tục có thể sử dụng chúng. Bạn cũng có thể thực hiện "xuất hiện lại" ở một nơi khác bằng cách gắn kết /ở nơi khác.

# mount -o bind / /somewhere/else
# ls /somewhere/else/tmp  

Đây là một thử nghiệm nhỏ mà bạn có thể chạy để có được cảm giác tốt hơn (tôi hy vọng) cho những gì đang xảy ra.

Lưu ý: Đây không phải là một nỗ lực hoàn toàn chính xác hoặc mô tả đầy đủ về những gì đang thực sự xảy ra. Nên chỉ đủ chính xác để cung cấp cho bạn bức tranh lớn mặc dù.

Tôi đã tạo một người dùng được gọi metrên máy của mình và một thư mục ngẫu nhiên trong nhà của anh ta, với một tệp trong đó:

me@home $ pwd
/home/me/tmp
me@home $ echo hello > some_file
me@home $ ls  
some_file
me@home $ cat some_file 
hello

Tại thời điểm này, không có gì bất thường - đó chỉ là một thư mục đơn giản với một tệp đơn giản. Tôi để phiên đó mở đúng như vậy, với cwdbên trong thư mục kiểm tra đó.

Là root, tôi tạo một hệ thống tập tin nhỏ và gắn kết nó /home/me/tmp.

root@home # dd if=/dev/zero of=./fs bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.00467318 s, 2.2 GB/s

root@home # mkfs -t ext2 ./fs 
mke2fs 1.42.12 (29-Aug-2014)
[... snip ...]
Writing superblocks and filesystem accounting information: done

root@home # mount ./fs /home/me/tmp

Sau đó tôi mở một thiết bị đầu cuối mới mevà nhìn xung quanh:

me@home #2 $ cd tmp
me@home #2 $ ls
lost+found
me@home #2 $ cat some_file
cat: some_file: No such file or directory
me@home #2 $ echo bye bye > some_file
-su: some_file: Permission denied

Vì vậy, tập tin mà chúng tôi tạo ra rõ ràng là không có. Thư mục lost+foundnày là dấu hiệu gốc của hệ thống tập tin ext. Và tôi đã mất quyền viết, vì vậy nó rõ ràng không phải là thư mục gốc.

Quay lại mephiên đầu tiên , chúng ta hãy nhìn vào cách nó nhìn thế giới:

me@home $ echo something else > other_file

Không có vấn đề bằng văn bản.

me@home $ cat some_file other_file 
hello
something else

Tập tin gốc vẫn còn đó, tập tin mới được tạo mà không có vấn đề.

Huh? Chuyện gì đang xảy ra vậy?

Phiên đầu tiên vào thư mục trước khi nó được phủ bằng cách root hệ thống tập tin khác trên đó. Hành động gắn kết đó hoàn toàn không ảnh hưởng đến hệ thống tập tin gốc. Quá trình shell có một xử lý hoàn toàn hợp lệ cho thư mục trong hệ thống tập tin gốc và có thể tiếp tục tương tác với nó. Nó loại chạy xung quanh bên dưới các thảm điểm gắn kết.

Phiên thứ hai vào thư mục sau khi gắn kết được đặt xuống. Vì vậy, nó nhìn thấy hệ thống tập tin mới, trống rỗng. Và sysadmin đã xử lý các quyền, vì vậy nó không thể sử dụng không gian được yêu cầu ... cho phép khắc phục điều đó.

root@home # chown me:users /home/me/tmp
me@home #2 $ echo bye bye > some_file
me@home #2 $ ls 
lost+found  some_file
me@home #2 $ cat some_file 
bye bye

Phiên 1 có thể thoát khỏi dưới tấm thảm không? (Nó đang bị mốc.)

Chắc chắn rồi! Nếu phiên 1 di chuyển ngược lại cây hệ thống tập tin ra khỏi mount, nó sẽ mất tay cầm đó vào bên trong và sẽ đi theo mount như mọi người khác.

me@home $ cd
me@home $ pwd
/home/me
me@home $ cd tmp
me@home $ cat some_file other_file
bye bye
cat: other_file: No such file or directory

Cùng quan điểm với phiên # 2, chúng tôi trở lại bình thường.

Nhưng làm thế nào để bạn biết các tập tin đã không biến mất? Không ai tìm nữa!

Đó là một trong những khoảnh khắc gắn kết gắn kết trở nên tiện dụng. Họ cho phép bạn gắn kết một hệ thống tập tin đã được gắn ở một nơi khác.

me@home $ mkdir ~/bind
root@home # mount -o bind /home/me /home/me/bind

(Có, bạn có thể liên kết gắn kết một hệ thống tập tin "bên trong chính nó". Thủ thuật hay, hả?)

me@home $ ls bind/tmp
other_file  some_file
me@home $ cat bind/tmp/*
something else
hello

Vì vậy, họ thực sự ở đó, sẵn sàng hành động. Đơn giản là chúng không thể nhìn thấy / có thể truy cập tại vị trí ban đầu của chúng, thú cưỡi che giấu chúng khỏi các đường dẫn thư mục bình thường.


Tôi khuyến khích bạn chơi xung quanh với điều này, nó thực sự không phức tạp một khi bạn đã hiểu "mánh khóe" đang được chơi. Và một khi bạn đã có Got It ™, hãy xem xét các hệ thống tập tin liên kết để biết thêm về cách kéo thảm :-)

Mặc dù vậy, một lưu ý: gắn kết /tmphoặc /var(hoặc bất kỳ thư mục hệ điều hành cốt lõi nào) thực sự không phải là ý tưởng hay sau khi quá trình khởi động kết thúc. Rất nhiều ứng dụng rời khỏi trạng thái trong các thư mục đó và có thể bị nhầm lẫn nghiêm trọng nếu bạn chơi các trò chơi gắn kết xung quanh chúng.


4
Đây là một câu trả lời tuyệt vời - bạn đã vượt lên trên và vượt ra ngoài những gì tôi yêu cầu của bạn. Ý tưởng về bind-mount cũng khá tuyệt! Cảm ơn các câu trả lời chi tiết. Chúc mừng.
người dùng

11
Đây là một cách rất phổ biến để mất không gian đĩa một cách bí ẩn. Nếu mount không thành công vì bất kỳ lý do gì trong tập lệnh khởi động, dữ liệu có thể được ghi vào thư mục trên hệ thống tập tin gốc. Nếu sau đó thử khởi động lại, mount có thể thành công và có thể không ai chú ý (ví dụ: nếu hệ thống tệp chứa tệp tmp hoặc nhật ký), ngoại trừ nó sẽ ăn không gian, có thể rất nhiều.
Dan Sheppard

2
@DanSheppard Đó là một lý do khiến tôi thích các điểm gắn kết của mình đặt chmod 000. Ngoài ra, tại sao systemd không khởi động được nếu các mount quan trọng không thành công.
Zan Lynx

Bạn cũng có thể -bind gắn /home/metrên /home/methay vì thư mục "ràng buộc"? Tức là đặt một tấm thảm khác lên trên tấm thảm. Hay bạn sẽ phải ngắt kết nối fsđầu tiên?
jiggunjer

@jiggunjer Có vẻ như uniontùy chọn có thể giúp đỡ.
hliu
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.