November 19, 2013 · hacks linux mount raspberrypi raspi rootfs rpi rsync shell tricks

Alternative way to flash your Raspberry Pi OS

Did you ever want to flash your root partition straight to USB stick/HDD/SDD instead of first dd-ing it onto SD Card and then coping it again onto another media?

I got bored of the double work that is provided by RPi geeks. Yeah, it's fine if you're a total beginner (though one might get lost pretty easily) and want to use only the SD Card. But what if you know how to deal with Raspberry Pi already and perform the card setup mechanically, coping the root partition to a USB stick before you run the system? There is an easy way to do it, less time consuming and faster. It involves using loop-mounting partitions from a disk image.

Loop Mounting

Loop mounting allows us to access the partitions from disk image (all the Rapsberry Pi distributions are in fact disk images) without the need of writing them onto SD card. Let's have a look at the output of fdisk run on Raspbian image:

% sudo fdisk -lu 2013-09-25-wheezy-raspbian.img 
Disk 2013-09-25-wheezy-raspbian.img: 2962 MB, 2962227200 bytes 255 heads, 63 sectors/track, 360 cylinders, total 5785600 sectors 
Units = sectors of 1 * 512 = 512 bytes 
Sector size (logical/physical): 512 bytes / 512 bytes 
I/O size (minimum/optimal): 512 bytes / 512 bytes 
Disk identifier: 0x0002c262 Device Boot Start End Blocks Id System 2013-09-25-wheezy-raspbian.img1 8192 122879 57344 c W95 FAT32 (LBA) 
2013-09-25-wheezy-raspbian.img2 122880 5785599 2831360 83 Linux

As you can see, the .img file is nothing but a disk image, containing separate partitions, starting at block 8192 and 122880 (we'll need those numbers later on). But you wouldn't be able to mount them with using the <strong>mount</strong> command alone in Linux.

The first important data are the units, which are stated to be 512 bytes per sector. We take note of this value as the factor for use in the next operation.

Now, let's access the second partition which is 122880 sectors into the disk, according to fdisk output. We know that each sector is 512 bytes:

Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes

so we are going to pass this number to losetup tool:

% sudo losetup /dev/loop0 2013-09-25-wheezy-raspbian.img -o $((122880 * 512)) 
% sudo file -s /dev/loop0 
/dev/loop0: sticky Linux rev 1.0 ext4 filesystem data, UUID=548da502-ebde-45c0-9ab2-de5e2431ee0b (extents) (large files)

The file -s command, as you can see, shows us the type of files on the disk image. Now we can use mount to mount the partition in our filesystem:

% sudo mount /dev/loop0 /mnt

Let's have a look if the image has mounted:

% ls -al /mnt/ 
total 100 
drwxr-xr-x 22 root root 4096 Sep 25 22:19 ./ 
drwxr-xr-x 6 vivel vivek 4096 Nov 7 23:25 ../ 
drwxr-xr-x 2 root root 4096 Sep 25 21:56 bin/ 
drwxr-xr-x 2 root root 4096 Sep 25 21:26 boot/ 
drwxr-xr-x 3 root root 4096 Sep 25 21:57 dev/ 
drwxr-xr-x 97 root root 4096 Sep 25 23:08 etc/ 
drwxr-xr-x 3 root root 4096 Sep 25 21:22 home/ 
drwxr-xr-x 12 root root 4096 Sep 25 21:46 lib/ 
drwx------ 2 root root 16384 Sep 25 21:07 lost+found/ 
drwxr-xr-x 2 root root 4096 Sep 25 21:11 media/ 
drwxr-xr-x 2 root root 4096 Aug 19 19:38 mnt/ 
drwxr-xr-x 4 root root 4096 Sep 25 22:14 opt/ 
drwxr-xr-x 2 root root 4096 Aug 19 19:38 proc/ 
drwx------ 2 root root 4096 Sep 25 21:11 root/ 
drwxr-xr-x 7 root root 4096 Sep 25 22:14 run/ 
drwxr-xr-x 2 root root 4096 Sep 25 21:56 sbin/ 
drwxr-xr-x 2 root root 4096 Jun 20 2012 selinux/ 
drwxr-xr-x 2 root root 4096 Sep 25 21:11 srv/ 
drwxr-xr-x 2 root root 4096 Feb 26 2013 sys/ 
drwxrwxrwt 2 root root 4096 Aug 19 19:38 tmp/ 
drwxr-xr-x 10 root root 4096 Sep 25 21:11 usr/ 
drwxr-xr-x 11 root root 4096 Sep 25 21:11 var/

If the partition holds normal filesystem, as in our case, you can combine the losetup with mount, letting <strong>mount</strong> set up the loop device, and manage it automatically:

% sudo mount -o loop,offset=$((10860003 * 512)) 2013-09-25-wheezy-raspbian.img /mnt

After performing some operations with the mounted image, to umount it do:

% sudo umount /mnt % sudo losetup -d /dev/loop0

How to copy the contents onto desired storage?

This is really up to you. You can use just any copy command, like cp (head here for more information: https://aikiwolfie.blogspot.co.uk/2009/09/ubuntu-tip-simple-backup-command-using.html), but I prefer to use rsync. Remember to prepare the destination disk by formatting it and creating an ext4 filesystem partition (it has to be the same as the image partition). When cloning files, do not overwrite the lost+found directory.

For rsync, there is no need of excluding dev, media, mnt, opt, proc, run, and tmp directories, as we're operating on a mounted image, not a live system:

% sudo rsync -aAXv /mnt/* /path/to/USB/folder --exclude=/lost+found

After the operation is finished, the only thing you might want to do is to pre-configure the system (manually configuring network, ssh, etc.), cmdline.txt on your boot partition to recognise the USB media as root partition (changing the root=/dev/mmcblk0pX to root=/dev/sda1) as well as modifying /etc/fstab by adding:

/dev/sda1 / ext4 defaults,noatime 0 0

That's faster and a lot easier.

  • LinkedIn
  • Tumblr
  • Reddit
  • Google+
  • Pinterest
  • Pocket

Contact