Duplicate Micro SD Cards with Your Raspberry Pi

A $99 microSD Card Duplicator

You can buy SD card duplicating machines at prices from several hundred dollars to several thousand.  Or, you can duplicate ten or more cards at a time using $99 worth of parts and your Raspberry Pi running Raspbian.  Here's what you need:

  • A powered USB 2.0 hub with enough ports for the number of cards you want to duplicate at once. Your Raspberry Pi can power a couple of micro SD cards using its own power supply. To duplicate many at one time, you'll need a hub with a source of power.  $22. 
  • microSD card reader/writer USB adapters.  You need one of these for each port on your hub.  For a 10-port hub, you need ten.  About $53.  If you also need to read/write full-size SD cards, try this reader/writer; you'll also need a hub with the ports "stacked," such as this one with seven ports. Beware: Not all "SD card readers" will also write reliably; be sure you get reader/writer adapters.  You need USB 2.0 for best speed with the Raspberry Pi's USB 2.0 ports. I've tested the ones in the links.
  • A big microSD card. You will need one micro SD card with enough space to hold the Raspbian operating system and one or more operating system image files.  I suggest one that's four times the size of the cards you're working with, so if you want to duplicate 16 GB cards, get a 64 GB card for about $17.  (The USB adapters in the previous links are limited to 256 GB.)

Even after you add a few bucks for shipping you can probably get the parts you need to turn your Raspberry Pi into an SD card duplicator for less than $99. 

This process has been tested using a Raspberry Pi Model 3 B+ and Raspbian Stretch 9.4.  Please report problems or errors in these instructions to Bob.Brown@Kennesaw.edu.

Overview: Duplicating SD Cards

Thanks very much to Richard Hayler, who revealed the secret of multiple output devices with the dcfldd program.

Note: if you have a laptop or desktop computer running a Debian-like operating system, you can use that and it will possibly be faster than using a Raspberry Pi.  You will have to substitute appropriate device names.  In particular, /dev/sda is probably your system disk.  I have been politic and you have been warned.

Here's what you're going to do:

  1. Make an SD card that's perfect for your class or other purpose.  This will become your master image.
  2. Make an image on the big card from your master SD card.
  3. Shrink the image and make it auto-resize on first boot.
  4. Flash your image onto other SD cards using dcfldd, up to ten or more at a time!

It's time to say a word about shrinking the image.  There are two reasons for doing that.  The first is that it will make a smaller image, and so things will run faster.  If you work with 16 GB cards, you can probably shrink the image from 16 GB down to around 6 or 7 GB, so operations will run more than twice as fast!

The more serious problem is that "16 GB" cards from different manufacturers may be of slightly different sizes.  If you make your image using a card that's a little bit bigger than average, then try to flash it onto one that's a little bit smaller, the operation will fail.  By shrinking the image, you make sure your image will fit when you flash it onto cards that are nominally 16 GB.  The auto resize function will give you back the full capacity of the SD card upon the first boot.

The image shrinking process given is for Raspbian only, not NOOBS.

The Gory Details

In the material that follows, code, i.e. things you will type as commands or put into files is shown in bold.  These directions assume a small amount of familiarity with working in the Raspbian terminal environment.

0. Install a Little Software

You only have to do this once. Install Raspbian on your big microSD card and boot from it.

There are two bits of software you need that aren't a part of the standard Raspbian installation.  Both software packages go on your large SD card.  One is dcfldd, an extension of the dd command that performs the magic of writing multiple devices at ones.  The other is PiShrink, which packages the fiddly operations of shrinking the image file and setting up the auto resize operation.  Install dcfldd by typing:
sudo apt-get install dcfldd
in a terminal window.

Also in a terminal window, install PiShrink by Drewsif by typing these commands:
wget https://raw.githubusercontent.com/Drewsif/PiShrink/master/pishrink.sh
chmod +x pishrink.sh
sudo mv pishrink.sh /usr/local/bin

1. Make the Perfect SD Card

"Perfect" is a matter of application, and maybe even a matter of taste.  For example, if you're going to use Scratch 2 in your classes, you can decide whether to include Scratch (1) or leave it out.   Remember: Raspbian only, not NOOBS.

2. Make an Image of Your "Master" Card

Boot from the big microSD card.  Make sure you have at least as much free space on the big card as the full size of your "master" SD card.  (Erase old image files as needed.)  In a terminal window, type the following:
sudo umount /dev/sd*
sudo dd bs=4096 if=/dev/sda of=myimage.img
sudo sync

Replace "myimage.img" with whatever you want to name your image file.  I like to use something with a date, e.g. workshop_20180906.img.  For a 16 GB card, this will take about 18 minutes on a Model 3 B+.  

3. Shrink the Image and Set Up Auto-Resize

Use PiShrink to shrink the image and set up auto resize typing in a terminal window:
sudo pishrink.sh myimage.img

Replace "myimage.img" with whatever you called your image file.  This will take only a couple of minutes.  PiShrink has options for making a copy of the image file and suppressing the auto-resize function; you don't need them.

 4. Make as Many Copies as You need!

Put the SD cards to receive the copies into USB adapters and plug the adapters into your powered USB hub.  Plug the USB hub into your Raspberry Pi.

To make four copies, type:

sudo dcfldd bs=64k if=myimage.img of=/dev/sda of=/dev/sdb of=/dev/sdc of=/dev/sdd

Change if= to the name of the image you want to flash.  To make more than four cLights flashing as SD cards are copied.opies, add more of=/dev/sdX operands, where X is the next sequential letter.

This takes about eight minutes for one card.  It may take as much as 24 minutes for 10 cards.  Relax and watch the blinking lights.


More Raspberry Pi resources

Copyright © 2018 by Kennesaw State University
Creative Commons BY-NC-SA License

Last update: 2018-10-04 14:40