ターミナルを使用して Android でスパース ファイルを作成する方法

ターミナルを使用して Android でスパース ファイルを作成する方法

Android でスパース ファイルを作成しようとしています。このために、Android ターミナル エミュレーターを使用しています。Busybox をインストールしたので、dd コマンドを使用できます。truncate などの他のコマンドはインストールされていません。質問: Android ターミナルでスパース ファイルを作成する方法を誰か知っていますか?

インターネットで見つけたいくつかのコマンドを試してみました:

dd if=/dev/zero of=/sdcard/file.img bs=1 count=0 seek="wanted size"    

しかし、ファイルは作成されませんでした。次のことも試しました:

dd if=/dev/zero of=/sdcard/file.img bs="wanted size" count=1.   

しかし、次のエラーが発生します。

dd "path of if" invalid argument    

それを正しいやり方で得る方法を誰か知っていますか?

答え1

私自身すでに答えを見つけました。

dd if=/dev/zero of=/sdcard/file.img bs=1 count=0 seek="wanted size"    

ドライブ上のサイズはブロック サイズとカウントによって決まるため、ファイルは作成されません。カウントを 0 に設定すると、ファイルは 0 バイトになり、存在しなくなります。

dd if=/dev/zero of=/sdcard/file.img bs="wanted size" count=1    

次のエラーが発生します:

dd "path of if" invalid argument    

ここでの問題は、ブロック サイズに制限があることです。それほど大きく設定することはできません。必要なブロック サイズのカウントを計算する必要がありました。64k を選択しました。512 MB のスパース ファイルを作成するためのコマンドは次のとおりです。

dd if=/dev/zero of=/sdcard/file.img bs=64k count=8192    

seek の使用はオプションです。

答え2

次のコマンドはデバイス上に5ギガバイトのスパースファイルを作成します
dd of=sparse.img bs=1 count=0 seek=5G

dd はバイトのブロックをコピーするプログラムです。 は
if=入力ファイルを指定するために使用されます。ここでは必要ありません。 は出力ファイルを
of=指定するために必要です。 は
bs=ブロック サイズ (読み取りまたは書き込みあたりのバイト数) を指定するために必要です。 は
seek=スキップする出力ブロックの数を指定するために必要です。 は
count=コピーするブロックの数を指定するために使用されます。

countが指定されていない場合のデフォルトの動作は、入力ファイル全体をコピーすることです (デフォルトでは stdin にコピーされます)。bsは通常、デバイスの最適な読み取り/書き込みサイズに設定する必要がありますが、この場合は に設定することで、1に人間が判読できる数値を使用できます。 とはseekどちらも、 が定義するブロック単位で値を取得します。seekcountbsbytes=bs*(count+seek)

スパース ファイルはcount=0、 と の代わりに を使用してseekファイル サイズを設定することで作成されます。受け入れられた回答では、スパース ファイルは作成されず、代わりにファイルがゼロで埋められます。

関連情報