dd を使用して、同じファイルを複数回ファイルに書き込みます。

dd を使用して、同じファイルを複数回ファイルに書き込みます。

ddを使用してドライブに大量の仮想ファイルを作成しようとしています。私は現在これをやっています:

#!/bin/bash
writeFile(){ #$1 - destination directory/filename, $2 - source filepath $3 - blocksize, $4 - blockcount $5 - log file name

if [ "$#" -ne 5 ]; then
    echo "Bad number of args - Should be 4, not $#"
    return 1;
fi

dest_filepath=$1
src_filepath=$2
block_size=$3
block_count=$4
log_file=$5

int_regex='^[0-9]+$' 

file_size=$(($block_size * $block_count))
src_file_size=`ls -l $src_filepath | awk '{print $5}'`
full_iter=0
while [[ $file_size -ge $src_file_size ]]; do
    file_size=$((file_size - $src_file_size))
    full_iter=$((full_iter + 1))
done

section_block_count=$(($src_file_size / $block_size))
echo $section_block_count $block_size
topping_off_block_count=$(($file_size / $block_size))

dest_dir=$(dirname $dest_filepath)
if [ -d "$dest_dir" ] && [ -r $src_filepath ] && [[ $block_size =~ $int_regex ]] && [[ $block_count =~ $int_regex ]]; then
    data_written=0
    for (( i=0 ; i < $full_iter ; i=$((i+1)) )); do
        (time dd of=$dest_filepath if=$src_filepath bs=$block_size count=$section_block_count seek=$data_written) >> $log_file 2>&1 #Output going to external file
        data_written=$(($data_written + $src_file_size +1 ))
        echo $data_written
    done

    if [[ $file_size -gt 0 ]]; then
        (time dd of=$dest_filepath if=$src_filepath bs=$block_size count=$topping_off_block_count seek=$data_written) >> $log_file 2>&1 & #Output going to external file
    fi
    return 0;
fi

return 1;   
}

src_filepathただし、これは一度だけ書き込んだり、ファイルの同じ部分を何度も書きたり、違いを特定する方法がわからないため、機能しません。この特別な場合に私がやっていることは、256MBファイルで4回を書き込んで単一の1GBファイルを作成することですが、どんなサイズにも書けるように一般的な状態に保ちたいと思います。

目的は、ハードドライブを断片化し、ddの出力(特に転送速度)と所要時間を測定することです。

私は機能が制限された組み込みシステムを使用していますが、オペレーティングシステムはビジボックスを使用する非常に低レベルのLinuxバージョンです。

正しいサイズのファイルを書き込むようにどのように変更できますか?

答え1

コメントに返信:conv=notruncカットせddずに最後まで見えるようにしないでください。 (省略されていますが、O_TRUNCシステムコールには追加されません。O_APPENDopen(2)

質問に答えるには:dd代わりに使用に固執する場合は、catシェルが追加する出力ファイルを開き、標準出力にddを書き込むようにしてください。

dd if=src bs=128k count=$count of=/dev/stdout >> dest 2>> log

また、ドライブを断片化したい場合は、スペースを使用するために多くのfallocate(1)割り当てを実行してから、ドライブがいっぱいになったらddの使用を開始できます。 util-linuxのfallocateプログラムは、単純なシステムコールフロントエンドですfallocate(2)

たとえば、xfsはオープン、追加モードを検出し、閉じてから数秒間EOFの外部に割り当てられた予測的に事前割り当てされたスペースを保持します。そのため、XFSでは、同じファイルに繰り返し追加されるループが多数ある小さなファイルを作成するのと同じくらい、断片化を生成しません。

組み込みシステムを使用しているので、xfsを使用しないとします。この場合、かなりスマートなファイルシステムを使用すると、より多くのアイテムを閉じたり、再び開いたり、書き込んだりすると、予想よりも断片化が少なくなる可能性があります。各書き込み間の同期を実行し、FSがすべてのデータを割り当てて書き込むのを待ってから、より多くのデータが来ることを知らせることができます。

関連情報