複数のimgファイルを単一ループデバイスとしてマウントする


18

分割されたディスクimgファイルを単一ループデバイスとしてマウントする方法はありますか?


1
どうやって壊れたの?どんなフォーマットですか?特別な形式の場合、これにはいくつかのヒューズマジックがあるかもしれませんが、答えはそれらを一緒にすることです。
カレブ

デバイスのフォーマットにより、4ギガバイト未満のファイルに制限されています。デバイスへのルートアクセスがあります。LVMでできることはありますか
-MageProspero

回答:


16

私はあなたがその場所でそれを行うことができるとは思わないが、十分なスペースがあればこれはうまくいくはずだ:

# Create the files that will hold your data
dd if=/dev/zero of=part-00 bs=1M count=4k
dd if=/dev/zero of=part-01 bs=1M count=4k

# Create the loop devices
losetup /dev/loop0 part-00
losetup /dev/loop1 part-01

# Create a RAID array
mdadm --create /dev/md0 --level=linear --raid-devices=2 /dev/loop0 /dev/loop1

# Copy the original filesystem
dd if=original-file-00 of=/dev/md0 bs=512
# Look at the records written value
dd if=original-file-01 of=/dev/md0 bs=512 seek=<sum of records written values so far>

# Mount the new filesystem
mount /dev/md0 /mnt

RAIDディスクには、ディスクの数、RAIDレベルなどが保存される特定のヘッダーがあるため、元のファイルからRAIDアレイを単純に作成することはできません。これを行うと、元のファイルのその部分が上書きされます。

を使用しmdadm --buildてメタデータなしでアレイを作成できますが、実際に最初にバックアップを作成する必要があります。または、読み取り専用のマウントで十分な場合:

losetup -r /dev/loop0 original-00
losetup -r /dev/loop1 original-11
mdadm --build /dev/md0 --level=linear --raid-devices=2 /dev/loop0 /dev/loop1
mount /dev/md0 /mnt

なぜこれをしたいのですか?ファイルシステムが4GBを超えるファイルを処理できない場合は、正常なファイルシステムに切り替える必要があります。


デバイスマッパーでもできるかもしれませんが、上記の方が簡単です。
Wodin

非常に良い答えを受け入れるのに非常に長い時間をかけて申し訳ありません。通常の状況ではこれを行いませんが、アドベンチャーモードの質問です。
MageProspero

2
おそらくより高速であるため、truncate代わりに使用することをお勧めしますdd(FSへの実際の書き込みは実行されず、inodeを割り当てて、ファイルにホールが含まれているとマークするだけです)。
マチェイピエチョトカ

いいね 知りませんでした。
-stribika

あなたがまたは有料のCrashPlan Googleドライブのような大容量のクラウドベースのバックアップや同期のソリューションを使用する場合の経験から、非常に、非常に代わりに単一の巨大なファイルの小さな分割ファイルを使用することをお勧め。ファイルのダウンロードに失敗した場合は、100 GBのファイル全体ではなく、たとえば1 GBを再ダウンロードするだけで済みます。
RAKK

2

分割ディスクイメージ(またはパーティションイメージ)をマウントするにaffuseは、現在メンテナンスされているafftoolsから使用する必要があります:https : //github.com/sshock/AFFLIBv3

したがって、ファイルがある場合は、いくつかのサブファイルに分割します test_img.000, test_img.001, test_img.002, test_img.003, test_img.004, test_img.005, test_img.006, test_img.007, test_img.008, test_img.009

その後、仮想的にそれらに参加することができます affuse

# affuse test_img.000 /mnt/combine
# ls -lh /mnt/combine
total 0
-r--r--r-- 1 root root 2.0G 1969-12-31 16:00 test_img.000.raw

(これは、ファイル000から始まり、001、002、…で始まるすべてのファイルを結合します)

そして、イメージをマウントします

mount -o ro,loop,offset=329043456 /mnt/combine/test_img.000.raw /mnt/test

使用法はここで、いくつかの例はここで説明します。コンパイルおよびインストール後、またはこちらからマンページも利用できます

PS:私にとってaffuseは、分割ファイルのサイズが512バイトの倍数である場合にのみ機能しました。


3
この方法を試しました。これには大きな警告があります。イメージを読み取り専用でマウントすることしかできません。
RAKK

ファイルチャンクが数百個であり、数千個ではない限り、問題なく動作します。mdadmを使用してリニアRAIDパーティションを作成した方が良い場合があります。unix.stackexchange.com
Jay Taylor

1

独自のブロックストレージデバイス拡張機能(ヒューズのような拡張機能と考えてください)を記述し、アドレスに応じてシークを実行できます。

ここでは、fuse https://github.com/libfuse/python-fuse/blob/master/example/hello.pyの使用方法の例を見つけることができ ます


ありがとう、私は本当にその日のメタ円形性の周りに私の頭をラップする必要があります
MageProspero

0

私がこれまでソリューションに知っている最も近いものは、VMware VMを作成することです。RescatuxやKnoppixなどのLinuxライブCDを起動し、ホストコンピューターにSMB共有フォルダーを作成し、そのSMB共有をVMにマウントしてからdd、イメージを仮想HDにマウントします。VMwareはデフォルトでディスクイメージを分割ファイルとして保存するため、これは複数のファイルに分割されたディスクイメージを直接読み取るのに最も近い方法です。

後で、ホストコンピューターからファイルにアクセスする場合は、2番目の仮想HDをイメージに追加して、そこにファイルをコピーしてみてください。次に、VMでSMB共有フォルダーをセットアップし、ホストから接続します。この方法では、たとえば、iPod Classic(fat32のみを扱う)またはスマートフォンのSDカード(通常はカスタムROMを順番にインストールする必要がある)を使用している場合、FAT32の4 GBのファイル制限に違反する可能性があります外部ストレージでExt3またはNTFSを使用するには、SamsungやMotorolaなどの人気メーカーの電話が必要です。そのため、中国のスマートフォンを使用している場合は困惑します。

確かに効率的なソリューションではありませんが、iPod ClassicやストックROMを搭載したSamsungスマートフォンでfat32以外のFSを使用できないことに制限されているため、過去とまだこれに対する効率的な解決策を見つけることができません。私も自分で書く必要があるかもしれません。

PS:Windowsを使用している場合、これが唯一の方法である可能性があることに言及するのを忘れました。


私がこの問題を訪れてからしばらく経ちました。私はまだ持っています。また、あなたと同じ理由があります。独自のカスタムファイルシステムを持つプロセスを起動できるかどうか、正直に言って、これを試してみたいと思います。ノードでできることを知っています。通訳者を根付かせて成功させることができました。私がやったとしても、これがあなたの問題を解決するかどうかはわかりません。私のハードウェアサムスン銀河では、これで問題ありません。この問題を解決するために何か一緒に取り組みたいと思います。
MageProspero

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