ループデバイスが必要なのはなぜですか?


15

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

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


9
「...同じ手間をかけずに取得できます。」-あなたはそこが間違っています;)-Linuxでは、ループデバイスの「面倒」なしではファイルマウントできません。それmountはちょうど今、あなたのために面倒を行うのに十分であるということです。(スティーブン・ハリスが答えで示しているように)
marcelm

回答:


22

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

ループマウントを行わない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

しかし、使用してlosetupからkpartxパーティションにアクセスできる場合:

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

明示的なを必要とせずlosetup、を使用するだけですmount -o loop,offset=$((512*2048))。ここで、512はセクタサイズであり、パーティションの時点で与えた2048ものです。fdiskStart
ルスラン

はい、これは単なる使用例です。この特定の例では、オフセットの計算が簡単になる場合がありますが、ユースケース(たとえば、同時にマウントする複数のパーティション)があり、それらを簡単にlosetupおよびにすることができますkpartx。ツールに一生懸命やらせてください:-)
スティーブンハリス

18

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

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

mountとmount -o loopの違いも参照してください。


したがって、ブロックデバイス化は、mount?によって暗黙的に処理されます。
corsel

2
はい、追加などのmount世話をしますlosetup-o loop
スティーブンキット

@corsel、ほとんどの場合、mount call losetupを使用すると問題なく動作しますが、ディスクイメージから複数のパーティションをマウントするなどの例外があります。
hildred

11

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

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

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

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


3
あなたのプロフィールで得た非常に印象的な履歴書。尊重
...-corsel

11
あなたの投稿はややエリートとして出てきます。最初の実装を書いたかもしれませんが、Linuxは異なる実装を使用するため、「間違った」名前を使用せず、実装用に選択したものとは異なる名前を使用します。
オースティンヘメルガーン

4
私は彼らが正しい名前を使ったと言ったことは一度もありません。
オースティンヘメルガルン

9
「ループ」名は「ループバック」の略で、ブロックデバイスでの操作がVFSに「ループバック」される方法を指します。Solaris 8は、lofi同様に機能する(「ループバックファイル」)デバイスを導入しました。BSDはそれらを名前vnd(「vnodeディスク」)で導入したため、この概念には長年にわたってさまざまな名前が付けられてきました。
caf

2
CSで最も困難な2つの問題:キャッシュの一貫性、識別子の命名、オフバイワンエラー。
イェンス

1

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.