43

What's the easiest way to resize an ext4 partition (or any type partition depending on the method) from the command line (potentially with the fewest commands, but also the easiest to understand)?

Using a tool like Gparted is obviously easy in a GUI, but what about in the command line? I guess text-based GUIs can count for the answer too since it's technically still in the command line. It just needs to be easy.

By partition I mean a simple partition on a single disk of a personal computer (e.g. on a laptop). For example, I want to resize /dev/sda4. There's no RAIDs, there's not more than one disk drive, there's not anything complicated here. Just a simple partition on a single disk (/dev/sdaX on /dev/sda).

3
  • 1
    You probably know this, but Gparted is a GUI front-end to GNU Parted. Previous to Parted 2.4, you could resize, but this has since been removed. I suspect the only way is do it manually, resizing partition table, creating device maps, then resizing the file system.
    – Sparhawk
    Jun 17 '14 at 12:08
  • Have you seen this article about resizing partitions?
    – psimon
    Jun 24 '14 at 15:01
  • I haven't seen that specific one, but the gist of it is that you delete the partition then make a new one of the size you want. But what I'm inherently doing is not "deleting" anything, just resizing. The best answer to this question would likely be a way to "resize" a partition, not delete one and create a new one, and the resize2fs steps would be entirely unnecessary and happen in the background (because naturally and obviously the user also wants to use all the space in the partition so it shouldn't be an extra step).
    – trusktr
    Jun 25 '14 at 3:03
13

You can use fdisk to change your partition table while running.  Refer to Live resizing of an ext4 filesytem on Linux (on The silence of the code blog):

Disclaimer: The following instructions can easily screw your data if you make a mistake.  I was doing this on a VM which I backed up before performing the following actions.  If you lose your data because you didn’t perform a backup don’t come and complain.

...

First: Increase the disk size.

In ESXi this is simple, just increase the size of the virtual disk. Now you have a bigger hard drive but you still need to a) increase the partition size and b) resize the filesystem.

Second: Increase the partition size.

You can use fdisk to change the partition table while running.  The stock Ubuntu install has created 3 partitions: one primary (sda1), one extended (sda2) with a single logical partition (sda5) in it. The extended partition is simply used for swap, so I could easily move it without losing any data.

  1. Delete the primary partition

  2. Delete the extended partition

  3. Create a new primary partition starting at the same sector as the original one just with a bigger size (leave some for swap)

  4. Create a new extended partition with a logical partition in it to hold the swap space

    me@ubuntu:~$ sudo fdisk /dev/sda
    
    Command (m for help): p
    
    Disk /dev/sda: 268.4 GB, 268435456000 bytes
    255 heads, 63 sectors/track, 32635 cylinders, total 524288000 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: 0x000e49fa
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1   *        2048   192940031    96468992   83  Linux
    /dev/sda2       192942078   209713151     8385537    5  Extended
    /dev/sda5       192942080   209713151     8385536   82  Linux swap / Solaris
    
    Command (m for help): d
    Partition number (1-5): 1
    
    Command (m for help): d
    Partition number (1-5): 2
    
    Command (m for help): n
    Partition type:
       p   primary (0 primary, 0 extended, 4 free)
       e   extended
    Select (default p): p
    Partition number (1-4, default 1):
    Using default value 1
    First sector (2048-524287999, default 2048):
    Using default value 2048
    Last sector, +sectors or +size{K,M,G} (2048-524287999, default 524287999): 507516925
    
    Command (m for help): p
    
    Disk /dev/sda: 268.4 GB, 268435456000 bytes
    255 heads, 63 sectors/track, 32635 cylinders, total 524288000 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: 0x000e49fa
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1            2048   507516925   253757439   83  Linux
    
    Command (m for help): n
    Partition type:
       p   primary (1 primary, 0 extended, 3 free)
       e   extended
    Select (default p): e
    Partition number (1-4, default 2): 2
    First sector (507516926-524287999, default 507516926):
    Using default value 507516926
    Last sector, +sectors or +size{K,M,G} (507516926-524287999, default 524287999):
    Using default value 524287999
    
    Command (m for help): p
    
    Disk /dev/sda: 268.4 GB, 268435456000 bytes
    255 heads, 63 sectors/track, 32635 cylinders, total 524288000 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: 0x000e49fa
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1            2048   507516925   253757439   83  Linux
    /dev/sda2       507516926   524287999     8385537    5  Extended
    
    Command (m for help): n
    Partition type:
       p   primary (1 primary, 1 extended, 2 free)
       l   logical (numbered from 5)
    Select (default p): l
    Adding logical partition 5
    First sector (507518974-524287999, default 507518974):
    Using default value 507518974
    Last sector, +sectors or +size{K,M,G} (507518974-524287999, default 524287999):
    Using default value 524287999
    
    Command (m for help): p
    
    Disk /dev/sda: 268.4 GB, 268435456000 bytes
    255 heads, 63 sectors/track, 32635 cylinders, total 524288000 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: 0x000e49fa
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1            2048   507516925   253757439   83  Linux
    /dev/sda2       507516926   524287999     8385537    5  Extended
    /dev/sda5       507518974   524287999     8384513   83  Linux
    
    Command (m for help): t
    Partition number (1-5): 5
    
    Hex code (type L to list codes): 82
    Changed system type of partition 5 to 82 (Linux swap / Solaris)
    
    Command (m for help): p
    
    Disk /dev/sda: 268.4 GB, 268435456000 bytes
    255 heads, 63 sectors/track, 32635 cylinders, total 524288000 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: 0x000e49fa
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1            2048   507516925   253757439   83  Linux
    /dev/sda2       507516926   524287999     8385537    5  Extended
    /dev/sda5       507518974   524287999     8384513   82  Linux swap / Solaris
    
    Command (m for help): w
    The partition table has been altered!
    
    Calling ioctl() to re-read partition table.
    
    WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
    The kernel still uses the old table. The new table will be used at
    the next reboot or after you run partprobe(8) or kpartx(8)
    Syncing disks.
    
    me@ubuntu:~$ sudo reboot 
    

I noticed afterwards that I didn’t set the bootable flag but apparently you don’t really need it.

Third: Enlargen the filesystem.

You can do this with resize2fs online on a mounted partition.

me@ubuntu:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        91G   86G   12M 100% /
udev            3.9G  4.0K  3.9G   1% /dev
tmpfs           1.6G  696K  1.6G   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            3.9G  144K  3.9G   1% /run/shm
none            100M   16K  100M   1% /run/user

me@ubuntu:~$ sudo resize2fs /dev/sda1
resize2fs 1.42.5 (29-Jul-2012)
Filesystem at /dev/sda1 is mounted on /; on-line resizing required
old_desc_blocks = 6, new_desc_blocks = 16
The filesystem on /dev/sda1 is now 63439359 blocks long.

me@ubuntu:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       239G   86G  142G  38% /
udev            3.9G   12K  3.9G   1% /dev
tmpfs           1.6G  696K  1.6G   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            3.9G  152K  3.9G   1% /run/shm
none            100M   36K  100M   1% /run/user

Slight catch: After rebooting the swap space wasn’t active. Turned out you need to run mkswap, adjust /etc/fstab to the new UUID and turn the swap on

me@ubuntu:~$ sudo mkswap /dev/sda5 
Setting up swapspace version 1, size = 8384508 KiB
no label, UUID=141d401a-b49d-4a96-9b85-c130cb0de40a

me@ubuntu:~$ sudo swapon --all --verbose
swapon on /dev/sda5
swapon: /dev/sda5: found swap signature: version 1, page-size 4, same byte order
swapon: /dev/sda5: pagesize=4096, swapsize=8585740288, devsize=8585741312

Edit /etc/fstab to replace the UUID for the old swap partition with the new one from mkswap.

6
  • 33
    You should put the relevant information from the link, into your answer, because of link rot. Also, wordpress.com is currently blocked where I live (China), so I can't even see the "answer".
    – WormFood
    Oct 11 '16 at 13:32
  • 1
    @Thushi, output of fdisk -l paste.ubuntu.com/24757891. I want to merge sda5 and sda6 as sda6. Does it damage my data?
    – alhelal
    Jun 3 '17 at 8:42
  • fdisk not does seem take into account used/free data - which could lead to potential data loss (to my understanding). I don't think it should be listed as an "easy" way in this case. Mar 29 '20 at 19:23
  • This is good answer. Works well for enlarging partitions (both ext4 and LVM). I just did it for ext4 (added extra disk space in cloud VM):
    – dotokija
    Feb 24 at 10:38
  • fdisk /dev/sda2 In fdisk use p to see partitions, then d to delete partition 2 (yes, delete! careful), then n to create partition 2 again, choose the same first block as the old partition 2, and the new last block, p again to check partition table, last is w to write (careful, use q if something doesn't look good, when you write w there is no way back). After that online resize is possible, in my case resize2fs /dev/sda2 /var.
    – dotokija
    Feb 24 at 10:46
12

If you're going to be increasing the size of both the partition and the filesystem, then first run fdisk to increase the size of the partition, and then run resize2fs to increase the size of the filesystem.

If you're going to be shrinking the size of both, run resize2fs first and then run fdisk.

2
  • How do I increase the size of the partition using fdisk? The only option I can find is to delete the partition and create a new one in its place, but this results in a non-bootable system when I try. Sep 1 at 9:45
  • @AaronFranke That's a whole nother question! Tho sadly, it might not be a great question for this site, as I'm not sure there is a good single answer to why you might not be able to resize some partition using fdisk. You might not be able to resize your partition because it's the 'boot' or 'root' partition? In that case, you might need to boot otherwise, e.g. from a bootable disc/thumbdrive, and then run fdisk. Sep 1 at 19:57
7

gparted uses resize2fs to change the partition's size. It doesn't take many arguments. Below are the ones I've found useful.

-M shrinks to the file system's minimum size.

-p shows a percentage indicator.

-P prints the file system's minimum size and exits.

1
  • 4
    resize2fs doesn't alter the partition table at all, it changes the size of a filesystem. After using it you'll have to resize the partition that the filesystem was on accordingly.
    – bool3max
    Apr 14 '19 at 19:10
7

A scriptable method, assuming that there is free space directly after the partition to be resized:

echo "- +" | sfdisk -N <partnum> /dev/sdX

...followed by resize2fs /dev/sdX<partnum>.

The - tells sfdisk to reuse the existing start sector, and the + tells it to make the size as large as possible given the available space.

1
  • 1
    Whilst oddly terrifying, this did exactly what I wanted after dd-ing over a filesystem from a ddrescue image to a new drive that happened to be larger. Thank you.
    – Landak
    Jan 23 at 12:26
5

I'm answering this in case you have a similar situation as mine. I had to resize the FileSystem (Ext4) on a dynamic disk running Ubuntu 18.0.4 LTS as Guest. I managed to resize the disk from the Host and then resize the FileSystem.

Running the usual commands wasn't possible. For example:

$ resize2fs /dev/sda2
resize2fs 1.44.1 (24-Mar-2018)
The filesystem is already 13180160 (4k) blocks long.  Nothing to do!

and fdisk was quite complicated, also probably I had to run a LiveCD in order to work on the unmounted disk.

These two commands solved my problem easily and fast:

$ growpart /dev/sda 2
CHANGED: partition=2 start=4096 old: size=105441280 end=105445376 new: size=409595871,end=409599967

$ resize2fs /dev/sda2
resize2fs 1.44.1 (24-Mar-2018)
Filesystem at /dev/sda2 is mounted on /; on-line resizing required
old_desc_blocks = 7, new_desc_blocks = 25
The filesystem on /dev/sda2 is now 51199483 (4k) blocks long.

Note: 2 in the first command, which indicates the partition number on the device /dev/sda.

1

Resize a Linux Root Partition Without Rebooting

Introduction

A typical Linux server deployed from a ProfitBricks supplied image has a single storage volume, /dev/vda. If we take a look at that using fdisk we will see that the disk is divided into two partitions. The first one, /dev/vda1, is the boot partition where the OS resides. The second partition, /dev/vda2, is configured as swap space.

root@debian:~# fdisk -l /dev/vda

Disk /dev/vda: 50 GiB, 53687091200 bytes, 104857600 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 Disklabel type: dos Disk identifier: 0x0041f8a8

Device Boot Start End Sectors Size Id Type /dev/vda1 2048 96471039 96468992 46G 83 Linux /dev/vda2 96471040 104857599 8386560 4G 82 Linux swap / Solaris

In the example above, the total 50 GB storage volume is split into 46 GB usable space and 4 GB for swap. What if after provisioning we find that 46 GB of disk space is not enough but we prefer not to add an additional storage volume? The goal is to increase the amount of disk space available on the root filesystem. This can be accomplished with minimal disruption. We do not need to reboot the server!

Requirements

  • A Linux Server created from a ProfitBricks supplied image.
  • SSH or console access (via the DCD) to the Linux Server.
  • The partprobe command. Can be installed from the parted package on most Linux distributions.
  • The fdisk, swapoff, mkswap, swapon, and resize2fs commands. Likely available by default.
  • A current snapshot or other backup of the system you are working on. Just to be safe!

Provision Additional Space

To increase the size of the hard drive, go into the DCD (Data Center Designer) and upscale the drive.

After you have increased the amount of drive space, click on "provisioning" to process the change. Takes around a minute and your hard drive is bigger.

We then need to switch off the swap - so make sure you can live a few minutes without swap space:

root@debian:~# swapoff -a

Once swap has been disabled, we need to reconfigure the partitions using fdisk:

We will delete the two existing partitions first. We run fdisk /dev/vda and then use the d command to delete partition 2, and then delete partition 1. Follow the example below:

root@debian:~# fdisk /dev/vda

Command (m for help): d Partition number (1,2, default 2):

Partition 2 has been deleted.

Command (m for help): d Selected partition 1 Partition 1 has been deleted.

Now we recreate our partitions. In the example we have 4 GB of swap space. So we need to keep at least that much space available for the new swap partition.

Recreate /dev/vda1 first. Press n to create a new partition. Enter p to create a primary partition. We can press Enter to accept the default value of 2048 for the first sector. Then enter a size for the partition. You can enter a value in GB, so if we are increasing the disk to 100 GB, we subtract our 4 GB for swap, and enter +96G for 96 GB.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-209715199, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-209715199, default 209715199): +96G

Created a new partition 1 of type 'Linux' and of size 96 GiB.

Now we recreate the swap partition following a simalar process. Press n and then p to create a new primary partition. Press Enter to accept the default value for "First sector". We can also press Enter again to accept the default value for "Last sector".

Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (201328640-209715199, default 201328640):
Last sector, +sectors or +size{K,M,G,T,P} (201328640-209715199, default 209715199):

Created a new partition 2 of type 'Linux' and of size 4 GiB.

Since this second partition is going to be used for swap space, we need to change the partition type. This can be done by pressing t at the fdisk prompt. We then press 2 to select the second partition. If you want to see the list of available partition types, press L, otherwise enter 82 to select "Linux swap / Solaris".

Command (m for help): t
Partition number (1,2, default 2): 2
Partition type (type L to list all types): L

0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris 1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT- 2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT- 3 XENIX usr 3c PartitionMagic 84 OS/2 hidden or c6 DRDOS/sec (FAT- 4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx 5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data 6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / . 7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility 8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt 9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi ea Rufus alignment e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD eb BeOS fs f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ee GPT 10 OPUS 55 EZ-Drive a7 NeXTSTEP ef EFI (FAT-12/16/ 11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f0 Linux/PA-RISC b 12 Compaq diagnost 5c Priam Edisk a9 NetBSD f1 SpeedStor 14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f4 SpeedStor 16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ f2 DOS secondary 17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fb VMware VMFS 18 AST SmartSleep 65 Novell Netware b8 BSDI swap fc VMware VMKCORE 1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fd Linux raid auto 1c Hidden W95 FAT3 75 PC/IX bc Acronis FAT32 L fe LANstep 1e Hidden W95 FAT1 80 Old Minix be Solaris boot ff BBT Partition type (type L to list all types): 82

fdisk helpfully informs us that we have changed the partition type with the message:

Changed type of partition 'Linux' to 'Linux swap / Solaris'.

After that, we save using the w command and are returned to a shell prompt:

Command (m for help): w

You may get a message like this before the shell prompt:

The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: Device or resource busy

The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).

Lets forgo rebooting and instead tell the kernel about the new partitions using partprobe:

root@debian:~# partprobe

We should be returned to the shell prompt with no output from partprobe.

Now we need to resize our filesystem on /dev/vda1:

root@debian:~# resize2fs /dev/vda1
resize2fs 1.42.12 (29-Aug-2014)
Filesystem at /dev/vda1 is mounted on /; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 3

The filesystem on /dev/vda1 is now 25165824 (4k) blocks long.

Initialize the new swap location of /dev/vda2:

root@debian:~# mkswap /dev/vda2
Setting up swapspace version 1, size = 4193276 KiB
no label, UUID=c55c25a2-a386-4653-8455-4d9030586dd2

Finally we edit /etc/fstab and replace the old UUID with the new one returned in the output of the mkswap command. The line to change has no value for "mount point" and has "type" set to swap.

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
UUID=332f8fb5-ff1f-4297-b512-f2c93a277296 /               ext4    errors=remount-ro 0       1
/dev/fd0        /media/floppy0  auto    rw,user,noauto,exec,utf8 0       0
UUID=c55c25a2-a386-4653-8455-4d9030586dd2       none    swap    sw      0       0

After editing /etc/fstab, we need to enable swap again:

root@debian:~# swapon -a

Verify

We can verify the new larger disk size by utilizing df and/or fdisk.

Device     Boot     Start       End   Sectors Size Id Type
/dev/vda1            2048 201328639 201326592  96G 83 Linux
/dev/vda2       201328640 209715199   8386560   4G 82 Linux swap / Solaris

We can also confirm that the server was not rebooted by looking at the output of uptime:

$ uptime
 23:54:21 up 7 days,  1:15,  1 user,  load average: 0.00, 0.01, 0.05

Summary

We have successfully increased the amount of disk space available on our Linux server.

Reference

https://devops.ionos.com/tutorials/increase-the-size-of-a-linux-root-partition-without-rebooting/

OR

https://web.archive.org/web/20201113021238/https://devops.ionos.com/tutorials/increase-the-size-of-a-linux-root-partition-without-rebooting/

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.