30 авг. 2016 г.

Quick copy big number of files to slow flash drive

Проблема - DICOM исследование состоит из большого количества мелких файлов. Если их писать последовательно, просто смонтировав флешку, получается очень медленно.
Решение - создавать образ диска на HDD, писать туда, затем переносить образ через dd. Создаем таблицу разделов на флешке с двумя разделами - с тем, что нужно записать и остатком флешки.
#!/bin/bash
# 1st argument - name of disk device (e.g. /dev/sdb or /dev/flash etc)
# 2nd argument - source directory name
#FLASH_SIZE=`cat /sys/block/$1/size`
FLASH_SIZE=`du -s -k $2 |sed 's/\(.*[0-9]\)\(.*\)/\1*2+65535/'|bc`
date
echo $FLASH_SIZE sectors to write...
dd if=/dev/zero of=/tmp/flash.img bs=512 count=$FLASH_SIZE
echo dd image created...
/sbin/losetup /dev/loop0 /tmp/flash.img
/sbin/losetup -a
/sbin/mkfs -t vfat /dev/loop0
echo vfat fs on image made...
mount /dev/loop0 /mnt
cpstart=$(date +%s.%N); 
cp -r $2/* /mnt
cpdur=$(echo "$(date +%s.%N) - $cpstart" | bc);
printf "Copied in  %.6f seconds\n" $cpdur
echo files copied to image...
umount /mnt &
wait
dd if=/dev/zero of=$1 bs=512 count=1
echo -e "n\np\n1\n2048\n+"$FLASH_SIZE"\nt\nb\na\nw\nq\n"|fdisk $1 >/dev/null
dd if=/dev/loop0 of=$1'1' bs=512 count=$FLASH_SIZE &
wait
echo image moved to flash...
/sbin/losetup -D
rm /tmp/flash.img
echo -e "n\np\n2\n\n\nt\n2\nb\nw\nq\n"|fdisk $1 >/dev/null
mkfs -t vfat $1'2' &
wait
echo cleaning done.
date