2012年3月10日土曜日

大量のUSBフラッシュメモリを再フォーマットする

MacOS X上で100個オーバーなUSBメモリの内容をガンガン消したかったのでスクリプトを書きました。
 


以前に消去前の USB メモリ(恐らくイメージを事前作成し展開)のデータを dd で読み取って split して md5 で一通りチェックしたら最初の 30MB 分ぐらいにデータが入っていることがわかったので、まず dd でゼロクリアします。その後 MacOS X 上で FAT16 のファイルシステムを作成し、終わったらイジェクトします。

usbdisk_format.sh
#!/bin/sh

DISK=$1
if [ "x$DISK" == "x" ]; then
        echo Usage: $0 /dev/disk1
        exit 1;
fi

diskutil unmountDisk $DISK 2>&1 > /dev/null
if [ $? -ne 0 ]; then
        echo $DISK: Unmount failure.
fi
mount | grep -q "$DISK"
if [ $? -eq 0 ]; then
        echo $DISK: Still mounting. dont format this disk.
        exit 0
fi


sudo dd if=/dev/zero of=$DISK bs=1m count=30 2>&1 > /dev/null
if [ $? -ne 0 ]; then
        echo $DISK: dd failure.
fi


diskutil partitionDisk $DISK  MBR 'MS-DOS FAT16' FUSION-IO 100% 2>&1 > /dev/null
if [ $? -ne 0 ]; then
        echo $DISK: format failure.
        exit 1
fi


diskutil unmountDisk $DISK 2>&1 > /dev/null
if [ $? -ne 0 ]; then
        echo $DISK: Unmount failure.
fi


exit 0


このスクリプトは引数して /dev/diskX といったデバイス名をとりますが、毎回これを指定するのは面倒なので、 USBメモリを見つけて上記スクリプトを叩くスクリプトを作りました。
このスクリプトは /dev/disk* ファイルを見つけて、そのデバイスが目的のブロックデバイスであるか、ブロックデバイスの容量やデバイス名などをベースに判断し、条件にあうデバイスは上記のスクリプトを並列実行し初期化します。

usb_batch.sh

#!/bin/sh


test_fusion_usb() {
        DISK=$1
        diskutil info $DISK | grep -q 'USB DISK Media' 
        if [ $? -ne 0 ]; then
                echo SKIP_1
                return 1;
        fi
        diskutil info $DISK | grep -q '1.0 GB (1038090240 Bytes)' 
        if [ $? -ne 0 ]; then
                echo SKIP_2
                return 1;
        fi


        # echo $DISK is USB
        return 0;
}


DISKS=`ls -1 /dev/disk[0-9] /dev/dsk[0-9][0-9]`


for d in $DISKS; do
        test_fusion_usb $d
        if [ $? -eq 0 ]; then
                echo Clearing $d
                sh usbdisk_format.sh $d &
        fi
done

あとは USB メモリを MacBook Air に刺しまくってスクリプトを実行するだけ・・・・!!





MacBook Air が落ちました。バスパワーが足りなくて、安定して並列初期化できるのは 4 枚ぐらいまでのようです。また一番大変なのは USB メモリを包装するビニール袋との戦いでした。

0 件のコメント:

コメントを投稿