RPi Resize Flash Partitions

From eLinux.org
Jump to: navigation, search

This page is a guide to modifying partitions on the Raspberry Pi (and Pi clones, such as the Banana Pi) for Linux-based operating systems, such as Raspian Linux, CentOS, Arch, and Linux distributions. Incorrectly using these instructions is likely to corrupt your system.

The prepared images for the Raspberry Pi are created for SD cards usually 2 GB in size. If you install it on a larger SD card than what it was designed for, you can resize or restructure the system, once it is installed, to use the full size of the SD card.


If using the official Raspian images released by the Raspberry Pi Foundation, you can use the raspi-config utility to resize the main partition to fill the SD card. Instructions are on the RPi raspi-config page. Read on if you want to know if you should use it.

The raspi-config tool is fully automatic. All you have to do is launch it, select the option expand_rootfs in the raspi-config menu, and reboot the Raspberry Pi. It takes some time for the changes to be made. Once it's finished, the Pi returns to a command-line or graphical login prompt.

Alternatively, you can just run raspi-config --expand-rootfs to make it a completely non-interactive process.


Storage devices need some structure that allows the operating system to locate existing files and create new ones. This is done using partitions and file systems. For a simplistic explanation, see Partition (basics), which applies to all systems that use partitioning.

A partition is a section of a storage device, which is formatted with a file system, in which the operating system creates a directory structure. The Linux system has a single directory structure starting at the root directory ("/"). Partitions are mounted at points in the directory structure, but the file system remains a single structure. Generally, users do not need to know about, or see, how partitions are used. This is different from Windows, where each partition becomes a separate drive, referenced by a letter such as C:, D:, and so on.

A storage device can have a single partition, or several partitions. Changing a partition structure might be seen as a difficult operation to perform without losing data, so that structure should be considered carefully before putting data onto a device.

If you skipped it, the Partition (basics) page gives more details.

Manually resizing the SD card on Linux

A tutorial video: http://www.youtube.com/watch?v=R4VovMDnsIE

The first step is to discover where your system accesses your SD card. How the SD card shows up on your system depends largely on whether you have attached it directly into an SD card slot in your computer or into an external card reader plugged into a USB port of your computer.

The best way to discover the storage devices connected to your computer is the lsblk command. Here is the sample output:

$ lsblk
sda           8:0    0 149.1G  0 disk 
├─sda1        8:1    0  48.5G  0 part 
└─sda2        8:2    0  96.3G  0 part 
mmcblk0     179:0    0   7.5G  0 disk 
├─mmcblk0p1 179:1    0   50MB  0 part 
└─mmcblk0p2 179:2    0     2G  0 part

In this sample outpet, the sda device is the computer's internal hard drive, and the mmtblk0 device is an SD card that has been inserted into the computer's SD card reader.

Here is an example of an SD card in an external card reader that is plugged into a computer's USB port:

sda           8:0    0 149.1G  0 disk 
├─sda1        8:1    0  48.5G  0 part 
└─sda2        8:2    0  96.3G  0 part 
sdb           8:16   0 465.9G  0 disk 
├─sdb1        8:17   0   50MB  0 part /boot
└─sdb2        8:18   0     2G  0 part /

If you are not sure which device represents your SD card, just remove your SD card and run lsblk again. The device that disappears was your SD card, so insert your card again and run lsblk and take note of the new device in the list.


If you have any data other than a fresh image on the SD card, backup your SD card before resizing partitions. Windows users may use the HDD Raw Copy Tool.

Linux users can just use dd (the same command you probably used to get the image onto the SD card in the first place) or the dcfldd command (which shows the progress of the operation unlike dd). For example, to copy all contents off the device that represents your SD card into an .img file in your home directory:

You should find out the block size of your sd card first (using an improper block size can lead to issues later on... TRUST)

$ sudo fdisk -l /dev/mmcblk0

Now, look at this line from the output of the previous command. It will determine what we should use as the bs (block size, not bullsh!t):

Units: sectors of 1 * 512 = 512 bytes

So, bs=512 would be the proper syntax in this instance. Other examples could be: bs=2MB (for block size = 2 Megabytes), or bs=4MB (for block size = 4 Megabytes), without specification, dd/dcfldd default to the bytes value.

And finally, to copy all contents off the device that represents your SD card into an .img file in your home directory:

$ sudo dd if=/dev/mmcblk0 of=$HOME/sdbackup.img bs=512


With the SD card in your computer or card reader, make sure it's unmounted. Use the correct device designation. In this example, I use mmcblk0 but yours may differ:

$ sudo umount /dev/mmcblk0

Use the parted (partition editor) tool to resize the partitions.

Use parted to examine the card:

$ sudo parted /dev/mmcblk0
 (parted) unit chs
 (parted) print
 Disk /dev/mmcblk0: 121535,3,31
 Sector size (logical/physical): 512B/512B
 BIOS cylinder,head,sector geometry: 121536,4,32.  Each cylinder is 65.5kB.
 Partition Table: msdos
 Number  Start      End         Type     File system     Flags
  1      16,0,0     1215,3,31   primary  fat32           lba
  2      1232,0,0   26671,3,31  primary  ext4
  3      26688,0,0  29743,3,31  primary  linux-swap(v1)

Nothing uses the card from end of 'cylinder' 29743 to the card's maximum at 121535.

Partition 1 is the boot partition. Leave that one alone. Partition 2 is the root partition, which can afford to grow to fill most of the card. If your distribution has a Partition 3 for swap space, then you need to move that to the end of the card. If your card does not have a swap partition, or if its swap partition is Partition 2, then you can skip the swap step.


To move the swap partition (if it exists between your root partition and the end of your SD card), first calculate how many cylinders your swap partition needs to move. To calculate the number to use: (Maximum - (Partition 3 End - Partition 3 Start) ) - 1 = Partition 3 New Start.

In this example: (121535 - ( 29743 - 26688)) -1 = 118479

Assuming you are using parted version 2.4 or greater:

(parted) move 3 118479,0,0

Expand the partition

To grow the root partition, you must first remove the partition boundaries, then recreate the partition as a larger container, and then resize the file system. As scary as that sounds, it doesn't destroy data, it just redefines the area "around" that data. Even so, you should make sure that you backup any important data before attempting this!

To remove and then recreate your root partition, assuming that your root partition is numbered 2 (it may not be, if you have a swap partition in the 2 slot, so use print in parted to double check):

(parted) rm 2
(parted) mkpart primary 1232,0,0 118478,3,31
(parted) quit

In this example, the starting address of the new partition is identical to its original value, and the ending address is the end of the SD card (or the start of the swap partition, if you had a swap partition that you had to move).

Clean and grow the file system

Now that you have room for a bigger file system, you must clean and then grow the existing file system that has been displaced by the changing boundaries of its partition. Remember to use the correct device designation. In this example, I use mmcblk0p2 to represent Partition 2 on an internal SD card slot, but yours may differ.

$ sudo e2fsck -f /dev/mmcblk0p2

If e2fsck asks to create a Lost+Found directory, it's OK to allow it.

Then resize:

$ sudo resize2fs /dev/mmcblk0p2


Your system now occupies all available space on your SD card. Put the card in your Pi and boot.

Once booted, verify your hard work with df:

pi@raspberrypi:~$ df -h
 Filesystem            Size  Used Avail Use% Mounted on
 tmpfs                  94M  4.0K   94M   1% /lib/init/rw
 udev                   10M  168K  9.9M   2% /dev
 tmpfs                  94M     0   94M   0% /dev/shm
 rootfs                7.1G  1.3G  5.4G  20% /
 /dev/mmcblk0p1         75M   28M   48M  37% /boot

Manually extracting partitions from the image on Linux

Get the information about offsets and sizes from the SD-Card-Image:

$ parted -s SD-Card-Image unit KiB print

Here, the -s option directs parted to go into scripting mode and the commands unit KiB print tells parted to display its results in blocks of 1024 byte (KiB, see also block size in GNU Coreutils docu) and print the partition table.

You will get some information like the following (this is created with the Raspbian Wheezy image dated 15-Jul-2012):

Disk SD-Card-Image: 1894400kiB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start     End         Size        Type     File system  Flags
 1      4096kiB   61440kiB    57344kiB    primary  fat16        lba
 2      61440kiB  1894400kiB  1832960kiB  primary  ext4

Now you can extract the partitions with

 $ dd if=SD-Card-Image of=Part1 bs=1024 skip=4096 count=57344
 $ dd if=SD-Card-Image of=Part2 bs=1024 skip=61440 count=1832960

Fill in the skip and count parameters with the numbers for start and size, which you got from the parted command above.

Manually resizing the SD card using a GUI with GParted

If you are using a PC with a linux distribution to resize the partitions, you can run GParted to resize the partitions using a GUI. This method is tested on Ubuntu 10.10 using the Gnome desktop. Versions of GParted differ slightly in their GUIs. For Windows users, it is also possible to follow the same procedure (less the installation) using the live version of GParted (GParted Live CD/USB/PXE/HD).

GParted can be installed using:

  • sudo apt-get install gparted

Note: I had to physically remove and re-insert the SD card from the card reader after writing the image before the partitions were recognised properly and the following could be done.

  • Start GParted (on my system it is [System]->[Administration]->[GParted Partition editor]).
  • Select the drive corresponding to your SD card (was /dev/sdh/ on my system). You now see the partitions mentioned above (with some tiny unallocated areas in between and a large one after).
  • Select the swap partition by clicking on it.
  • If the Resize/Move toolbar icon or [Resize/Move] menu option is disabled, go to Partition / Unmount.
  • Select the menu option [Partition]->[Resize/Move] and drag the partition to the right (click/drag in the middle).
  • Select the ext4 partition.
  • If the Resize/Move toolbar icon or [Resize/Move] menu option is disabled, go to Partition / Unmount.
  • Resize the partition by dragging the right edge of the partition all the way to the right (click/drag the right edge).
  • When you are satisfied with the changes, click on the green check mark, "Return" arrow, or other "apply" control to execute these changes.

You're done!

Manually resizing the SD card on Raspberry Pi

You can also resize the partitions of the SD card that your Pi is running on.

First you need to change the partition table with fdisk. You need to remove the existing partition entries and then create a single new partition than takes the whole free space of the disk. This will only change the partition table, not the partitions data on disk. The start of the new partition needs to be aligned with the old partition!

Start fdisk:

sudo fdisk /dev/mmcblk0

Then delete partitions with d and create a new with n. You can view the existing table with p.

  • p to see the current start of the main partition
  • d, 3 to delete the swap partition
  • d, 2 to delete the main partition
  • n p 2 to create a new primary partition, next you need to enter the start of the old main partition and then the size (enter for complete SD card). The main partition on the Debian image from 2012-04-19 starts at 157696, but the start of your partition might be different. Check the p output!
  • w write the new partition table

Now you need to reboot:

 sudo shutdown -r now

After the reboot you need to resize the filesystem on the partition. The resize2fs command will resize your filesystem to the new size from the changed partition table.

sudo resize2fs /dev/mmcblk0p2

This will take a few minutes, depending on the size and speed of your SD card.

When it is done, you can check the new size with:

df -h