Tại sao một người cần một thiết bị vòng lặp ở tất cả?


15

Trước đây tôi đã sử dụng để tạo các tệp hình ảnh bằng cách sử dụng dd, thiết lập một hệ thống tệp trên chúng bằng cách sử dụng mkfsmountchúng để truy cập chúng dưới dạng các phân vùng được gắn kết. Sau này, tôi đã thấy trên internet rằng nhiều ví dụ sử dụng losetuptrước để thực hiện một mục thiết bị vòng lặp bên dưới /dev, và sau đó gắn kết nó. Tôi không thể biết tại sao thực tế người ta cần một tệp hình ảnh để hoạt động như một thiết bị lặp và có /devmục riêng trong khi hành vi tương tự có thể có được mà không gặp rắc rối.

Tóm tắt: Trong một kịch bản thực tế, tại sao chúng ta cần một /dev/loopXmục để hiện diện, khi chúng ta chỉ có thể gắn hình ảnh fs mà không có nó? Việc sử dụng một thiết bị vòng lặp là gì?


9
"... trong khi hành vi tương tự có thể có được mà không gặp rắc rối." - Bạn đã sai ở đó;) - trên Linux, một tệp không thể được gắn mà không có "rắc rối" của thiết bị lặp. Chỉ là ngày nay mountđủ thông minh để gây rắc rối cho bạn. (như Stephen Harris thể hiện trong câu trả lời của mình)
marcelm 17/10/18

Câu trả lời:


22

Gắn kết, thường, phải được thực hiện trên các thiết bị khối. Trình điều khiển vòng lặp đặt một thiết bị đầu cuối khối vào tệp dữ liệu của bạn.

Nếu bạn thực hiện gắn kết vòng lặp mà không có losetupthì hệ điều hành sẽ thực hiện một nền tảng.

ví dụ

$ dd if=/dev/zero of=/tmp/foo bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.0798775 s, 1.3 GB/s
$ mke2fs /tmp/foo
mke2fs 1.42.9 (28-Dec-2013)
....


$ losetup    
$ mount -o loop /tmp/foo /mnt1    
$ losetup
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         1  0 /tmp/foo
$ umount /mnt1
$ losetup
$ 

Bạn có thể cần gọi losetuptrực tiếp nếu hình ảnh tệp của bạn có các phân vùng được nhúng trong đó.

ví dụ: nếu tôi có hình ảnh này:

$ fdisk -l /tmp/foo2      

Disk /tmp/foo2: 104 MB, 104857600 bytes, 204800 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x1f25ff39

     Device Boot      Start         End      Blocks   Id  System
/tmp/foo2p1            2048      204799      101376   83  Linux

Tôi không thể gắn kết trực tiếp

$ mount -o loop /tmp/foo2 /mnt1
mount: /dev/loop0 is write-protected, mounting read-only
mount: wrong fs type, bad option, bad superblock on /dev/loop0,
       missing codepage or helper program, or other error

Nhưng nếu tôi sử dụng losetupkpartxsau đó tôi có thể truy cập vào các phân vùng:

$ losetup -f /tmp/foo2
$ losetup
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         0  0 /tmp/foo2
$ kpartx -a /dev/loop0
$ mount /dev/mapper/loop0p1 /mnt1
$

Bạn không cần rõ ràng losetup, chỉ cần sử dụng mount -o loop,offset=$((512*2048)), 512kích thước của khu vực ở đâu và 2048là những gì được fdiskđưa ra Starttừ phân vùng.
Ruslan

Vâng, đây chỉ là một ví dụ về việc sử dụng. Trong ví dụ cụ thể này, việc tính toán bù có thể dễ dàng hơn nhưng có thể có các trường hợp sử dụng (ví dụ: nhiều phân vùng bạn muốn gắn cùng một lúc) trong đó có thể dễ dàng hơn để chỉ losetupkpartx. Hãy để các công cụ làm việc chăm chỉ :-)
Stephen Harris

18

Các hệ thống tệp mong muốn đọc và ghi vào các thiết bị chặn, nhưng các tệp hình ảnh không chặn các thiết bị. Thiết bị lặp cung cấp một thiết bị khối trên đầu tệp (hoặc thiết bị khối khác, tùy chọn có ánh xạ lại).

Không cần phải xem xét các thiết bị lặp khi gắn hình ảnh trong nhiều trường hợp vì mount chăm sóc mọi thứ cho bạn; nhưng các thiết bị lặp vẫn tham gia.losetup -l -asẽ chỉ cho họ

Xem thêm Sự khác biệt giữa vòng lặp mount và mount -o .


Vì vậy, khối ization thiết bị được xử lý ngầm bởi mount?
corsel

2
Vâng, mountchăm sóc losetup, thêm -o loopvv
Stephen Kitt

@corsel, Trong hầu hết các trường hợp có lệnh gọi losetup cho bạn hoạt động tốt, nhưng vẫn có trường hợp ngoại lệ như gắn nhiều phân vùng từ ảnh đĩa.
hildred

11

Bạn dường như trên Linux và Linux sử dụng tên sai cho tính năng đó.

Tôi đã phát minh ra tính năng đó vào năm 1988 trên SunOS-4.0 và tôi gọi đó là tính năng đó fbk - Tệp mô phỏng thiết bị BlocK.

Nền tảng là trình điều khiển thiết bị mô phỏng một thiết bị khối trên đầu một tệp đơn giản. Bạn cần điều này vì một hệ thống tệp không thể sử dụng tệp đơn giản làm bộ lưu trữ nền cho hệ thống tệp. Nó khá cần một thiết bị khối và đây là những gìfbk giả lập.

Vì một số người đã làm cho chương trình mounttrở nên thông minh hơn một chút và có các triển khai mount tự động tạo một fbkthể hiện cho một tệp trong trường hợp mountchương trình phát hiện ra rằng đối số được dự kiến ​​là một thiết bị khối thay vào đó là một tệp kế hoạch.


3
CV rất ấn tượng bạn có trong hồ sơ của bạn. Tôn trọng ...
corsel 17/10/18

11
Bài viết của bạn đi ra như một phần ưu tú. Bạn có thể đã viết bản triển khai đầu tiên, nhưng Linux sử dụng một cách triển khai khác, do đó, nó không sử dụng tên 'sai', chỉ khác với cách bạn chọn để triển khai.
Austin Hemmelgarn

4
Tôi chưa bao giờ nói họ sử dụng đúng tên, tôi chỉ nói rằng việc tuyên bố đó là sai khiến bạn nghe có vẻ như là một người ưu tú.
Austin Hemmelgarn

9
Tên 'loop' là viết tắt của "loopback" 'và đề cập đến cách các hoạt động trên thiết bị khối được "lặp lại" cho VFS. Solaris 8 đã giới thiệu một lofithiết bị ("loopback file") hoạt động tương tự; BSD đã giới thiệu chúng dưới tên vnd("đĩa vnode") vì vậy khái niệm này đã có rất nhiều tên khác nhau trong những năm qua.
phê

2
Hai vấn đề khó khăn nhất trong CS: lỗi kết hợp bộ đệm, đặt tên định danh và lỗi do một.
Jens

1

Ngay cả khi không cần thiết trong nền để gắn hệ thống tệp từ tệp, bạn vẫn sẽ cần nó cho bất kỳ thiết lập nào sử dụng trình điều khiển hoặc chương trình hoàn toàn mong đợi một thiết bị khối. Hãy nghĩ máy chủ nbd (thiết bị khối mạng), trình điều khiển thiết bị khối tổng hợp như mdared, lvm vv ....

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.