web-dev-qa-db-ja.com

なぜループデバイスがまったく必要なのですか?

以前はddを使用してイメージファイルを作成し、mkfsおよびmountを使用してファイルシステムをセットアップし、マウントされたパーティションとしてそれらにアクセスしていました。後で、インターネットで多くの例がlosetupを使用して/devの下にループデバイスエントリを作成し、それをマウントすることを確認しました。ループデバイスとして動作し、独自の/devエントリを持つイメージファイルが実際に必要な理由はわかりませんが、手間をかけずに同じ動作を実現できます。

概要:実際のシナリオで、fsイメージをマウントせずにマウントできるのに、なぜ/dev/loopXentryが必要なのですか?ループデバイスの使用は何ですか?

15
corsel

通常、マウントはブロックデバイスで行う必要があります。ループドライバーは、ブロックデバイスフロントエンドをデータファイルに配置します。

losetupなしでループマウントを実行すると、OSはバックグラウンドで実行します。

例えば

$ 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
$ 

ファイルイメージにパーティションが埋め込まれている場合は、losetupを直接呼び出す必要がある場合があります。

たとえば、この画像がある場合:

$ 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

直接マウントできない

$ 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

しかし、losetupkpartxを使用すると、パーティションにアクセスできます。

$ 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
$
22
Stephen Harris

ファイルシステムはブロックデバイスからの読み取りとブロックデバイスへの書き込みを想定していますが、イメージファイルはブロックデバイスではありません。ループデバイスは、ファイル(またはオプションで再マッピングを伴う別のブロックデバイス)の上にブロックデバイスを提供します。

mountがすべてを処理するので、多くの場合、イメージをマウントするときにループデバイスを考慮する必要はありません。ただし、ループデバイスはまだ関与しています。 losetup -l -aはそれらを表示します。

mountとmount -o loopの違いは何ですか も参照してください。

18
Stephen Kitt

Linuxを使用しているようで、Linuxはその機能に間違った名前を使用しています。

私は1988年にSunOS-4.0でその機能を発明し、その機能をfbkと呼びます-ファイルはBlocKデバイスをエミュレートします。

背景は、デバイスドライバーがプレーンファイルの上にブロックデバイスをエミュレートすることです。これは、ファイルシステムがプレーンファイルをファイルシステムのバックグラウンドストレージとして使用できないためです。それはむしろブロックデバイスを必要とし、これがfbkがエミュレートするものです。

しばらくの間、一部の人々はプログラムをmountをもう少し賢くし、fbkプログラムがそれを検出した場合にファイルのmountインスタンスを自動的に作成するマウント実装がありますブロックデバイスであると予想される引数は、代わりにプランファイルのように見えます。

11
schily

ファイルからファイルシステムをマウントするためにバックグラウンドで必要でなかったとしても、ブロックデバイスを絶対に必要とするドライバーまたはプログラムを使用するすべてのセットアップで必要になります。 nbd(ネットワークブロックデバイス)サーバー、mdraid、lvmなどの複合ブロックデバイスドライバーを考えてみてください。

1
rackandboneman