49

I have a drive with this configuration:

fdisk -l

Disk /dev/sda: 500.1 GB, 500107862016 bytes 255 heads, 63 sectors/track, 60801 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk identifier: 0x000f1b8b

Device Boot Start End Blocks Id System /dev/sda1 * 1 2612 20971520 83 Linux /dev/sda3 60736 60801 525312 82 Linux swap / Solaris

There is 478GB unallocated space, how would I go about adding this space to /dev/sda1 without losing the data that is currently on /dev/sda1? (the filesystem is ext4).

NOTE: it is a server with only SSH, no GUI for running stuff like gparted.

αғsнιη
  • 41,407
Seb
  • 601
  • 1
  • 5
  • 5
  • I can netboot the server and use it while the drive is unmounted. – Seb Mar 06 '13 at 20:08
  • 1
    Also see https://askubuntu.com/a/937351/621883 especially the answer containing growpart and resize2fs was useful for me. – klor Aug 21 '18 at 19:53

5 Answers5

68

Enlarge the partition: fdisk -u /dev/sda.

p to print the partition table, take note of the number, start, end, type of sda1.

Delete it: d:

Recreate it using command n with same number (1), start and type but with a bigger end (taking care not to overlap with other partitions). Try to align things on a megabyte boundary that is for end, make it a multiple of 2048 minus 1. Change the type if needed with t (for partitions holding an extX or btrfs filesystem, the default of 83 is fine).

Then w to write and q to quit.

The partition table will have been modified but the kernel will not be able to take that into account as some partitions are mounted.

However, if in-use partitions were only enlarged, you should be able to force the kernel to take the new layout with:

partx /dev/sda

If that fails, you'll need to reboot. The system should boot just fine.

Then, resize the filesystem so it spreads to the extent of the enlarged partition (might be located in /sbin):

resize2fs /dev/sda1

Which for ext4 will work just fine even on a live FS.

AdminBee
  • 22,803
  • 2
    I know this is old, but will this keep the data if you delete the partition? – Canadian Luke May 07 '14 at 03:02
  • 6
    @CanadianLuke, yes, deleting the partition in fdisk only modifies the partition table. If you recreate it the same size, there will be no change at all. The data is never altered unless you shrink a partition and create another logical or extended partition in the middle of what your partition used to be, in which case the partition record for that extended/logical partition will be written over some data there. – Stéphane Chazelas May 07 '14 at 10:47
  • This also works great for ntfs partitions (with an existing volume, with data). – Kenny Evitt Aug 02 '14 at 19:55
  • That sounds reasonable, but what if i have Extended, Linux LVM and Linux swap/Solaris partitions which starts on the end of Linux partition? Should I delete these partitions>? I am worried that in that case, filesystem won't start, becuase may be using Linux LVM for example in same start and end. And i don't want to loose data too. – changtung Sep 21 '18 at 10:40
  • @cyan resizing a LVM logical volume with a ext4 FS on it, or resizing a partition used as a physical volume for LVM would be different questions with different procedures. – Stéphane Chazelas Sep 21 '18 at 10:48
  • If this is a newer GPT not an MBR one must also be aware of the part-uuid or your disks may fail to mount depending on how /etc/fstab is configured. – Max Power Mar 20 '22 at 23:54
  • Worked for me on a Synology box (single drive, no BTRFS) after a dd copy to a new larger drive using 2 SATA-to-USB adapters. I couldn't find partx but the reboot clued in the kernel, resize2fs took a long time but did not complain and it started an, "optimizing file system," that takes forever in DSM Storage Manager. Thanks for a fantastic and perfectly thorough answer. – Stephan Samuel Mar 29 '24 at 22:00
18

It is very easy to expand an ext4 partition with growpart.

  1. Backup current partition table

    sfdisk -d /dev/sdb > sdb_partition_bak.dmp
    
  2. Execute dry-run to see what will be changed. If you don't have this tool. Run apt-get install cloud-utils

    growpart -N /dev/sdb 1
    
  3. If everything is fine

    growpart /dev/sdb 1
    
  4. Resize file system. It may take 10 seconds

    resize2fs /dev/sdb1
    
  5. Check the new size

    df -h
    
Steffo
  • 107
  • 4
Kiryl
  • 181
9

You can't do it safely while the partition is mounted, meaning you need to boot some other partition and do it from there.

gparted is a nice, easy GUI for this purpose. In our deleted comment exchange you mentioned it would not start because of "can't access display" -- this implies you aren't in X; since it is a GUI it won't work without that.

Of course, if you don't have another partition to use, you'll need a live CD or something -- I think they usually come with gparted. Your best bet is probably the actual gparted live CD, which looks to have a reasonably recent latest stable version (and will fit on a CD, which is nice since the "live CD" is rapidly becoming the "live DVD").

I've never had gparted cause a problem but of course do back your important tish up first.

All that said, a quote from from man resize2fs may be of interest:

The resize2fs program will resize ext2, ext3, or ext4 file systems. It can be used to enlarge or shrink an unmounted file system located on device. If the file system is mounted, it can be used to expand the size of the mounted file system, assuming the kernel and the file system supports on-line resizing. (Modern Linux 2.6 kernels will support on-line resize for file systems mounted using ext3 and ext4; ext3 file systems will require the use of file systems with the resize_inode feature enabled.)

Keep in mind though, this is about filesystem expansion which is a distinct operation from partition expansion (which must be done before filesystem expansion). So, if you can get whatever tool to expand the partition while it is mounted, being sure to keep the exact same starting block, you could expand the rootfs in place.

goldilocks
  • 87,661
  • 30
  • 204
  • 262
  • I can't use gparted as I only have SSH access (it is a headless server). I am able to unmount the HDD, as the system does not run on /dev/sda. – Seb Mar 06 '13 at 20:17
  • 1
    If you don't have physical access to the system and thus can't usefully unmount and change the partition, I think you are out of luck, or at least into very sketchy territory -- eg, you could attempt to use fdisk while mounted, select (x)pert, (c)hange number of cylinders. But I have not done this and would only do so if there was absolutely no other choice. – goldilocks Mar 06 '13 at 20:25
  • I just said that I can unmount the partition. I can even netboot the whole server and go in from another server, which would be just like using a Live CD (just without a GUI). – Seb Mar 06 '13 at 20:28
  • @Seb : my bad, sorry. – goldilocks Mar 06 '13 at 21:32
  • Just for reference: On-line growing of ext2/3/4 is actually possible. It has been around for decades. No need for unmounting. Shrinking however is another topic. – Hermann Aug 25 '23 at 09:29
  • @Hermann Filesystem expansion (what you are referring to) and physical partition expansion (what this question is mostly about) are two distinct things, and you cannot expand a filesystem if it is an exact fit in its partition (which they usually are) without first expanding the partition. However, I've added a note WRT to resized2fs etc. – goldilocks Aug 25 '23 at 13:30
7

I know this is very old issue, but many people are looking for that resolve.

For this example you have the following typical situation. On the beginning is a single partition, and on the end a swap partition is located. it isn't good because swap can be heavily loaded, and end of rotated disk is the slowest part of it. what I suggest?

  1. Create boot partition at the begin. Why at the beginning? because many tools have got problems with end of large disk above 2TB barrier. After boot partition should be swap partition. This is for performance. Rest of disk should be used for other partitions.

But what with this situation? I don't recommend expanding sda1. I suggest creating other partitions after sda1 & sda2, mounted as /home and /usr. On that directories are stored the most user and system data, and it is possible to securely move data from that directories to new partitions.

  1. But. (second "but") if you still want keep your current structure, you should first remove swap partition. You should do swapoff, remark this in /etc/fstab. if swapon tells you (see man) no swap is used, you can remove it by partition tool (fdisk or similar).

    When you don't have this partition, you can enlarge your sda1. Using fdisk you should firstly print partition. It is for remembering where it starts. Secondly remove partition using 'd' key. Don't panic, nothing is written to hard drive :). After print you see, no partition exist on the disk.

    Next create new partition, but be careful. See on what sector original partition started. Write the same number. After that look at the end. fdisk prompts you for last available sector. Use calculator and assign in your mind how much swap do you need in kilobytes. Multiple it by 2, and subtract this number from last sector number prompted by fdisk. Create partition. Print this (it is still in fdisk temporary memory), and look all is ok.

    After this press 'w' key, this will tru write new partitioning to the drive. You will see information all is synced, or sync is failed. If failed, you can call command partx /dev/sda for doing sync. If it still fails, you should reboot your system. After reboot you have prepared larger partition, but filesystem on it is still smaller. You should grow it. EXT4 is growable on the fly :), use resize2fs /dev/sda1 for do it.

    You don't need remounting rebooting etc. Last, you should restore swap partition. Simply use fdisk again, create new partition as swap. After writing 'w', device sda2 will be restored. Prepare swap structure on it using mkswap /dev/sda2, remove remarks for swap on /etc/fstab and finally do swapon -a. Look using swapon or top command, swap is activated.

I know, it's very long explanation. I hope it will be usable for any. Notice, in my opinion xfs filesystem is much better, unfortunately this fs doesn't support shrinking without temporary copying to alternate place, but shrink is used rarely. It is nice, xfs takes extremely little place for his own metadata, and is faster in many ways in comparison to ext4.

Another hint, better use some LVM as middle layer for partitioning. after that any resizing is much easier. Performance is comparable, of course, you can use mix of HDD management. you can use in common raw partitions and LVM.

slm
  • 369,824
Znik
  • 649
1

I find parted simpler and safer than deleting and re-creating the partition with fdisk:

sudo parted /dev/sda
print
resizepart

To resize the first partition to fill the disk, resizepart 1 -1. I had swap space in the way, so had to start with swapoff -a at the command line, then rm in parted. To avoid this issue, I create a swap file instead of a swap partition (i.e. https://unix.stackexchange.com/a/238784/103025).