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_APPEND)open(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가 모든 데이터를 할당하고 쓸 때까지 기다렸다가 더 많은 데이터가 올 것임을 알릴 수 있습니다.

관련 정보