Resizing a root partition (/) of a running Oracle Linux isn’t hard but the information out there on the web is limited. In my situation, I was given access to an already installed Oracle Linux environment that wasn’t using all the available space of the disk. The root partition, formatted with the btrfs filesystem, only used 4GB when 32GB were available in total.
Resizing the partition is done in two steps:
- Resizing the actual partition itself
- Expanding the filesystem on top of the partition
Resizing the partition
Resizing the partition can be done via fdisk, which takes a device name as a parameter. The device name of the root partition can be quickly found out via df:
[root@rpi3 ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 446M 0 446M 0% /dev tmpfs 459M 0 459M 0% /dev/shm tmpfs 459M 23M 436M 6% /run tmpfs 459M 0 459M 0% /sys/fs/cgroup /dev/mmcblk0p4 4.0G 1.8G 1.4G 56% / /dev/mmcblk0p2 477M 55M 393M 13% /boot tmpfs 128M 0 128M 0% /tmp /dev/mmcblk0p1 256M 18M 239M 7% /boot/efi tmpfs 92M 0 92M 0% /run/user/0
The partitions available on the system are /dev/mmcblk0 partition 1 – 4. Attach to the disk via fdisk /dev/mmcblk0:
[root@rpi3 ~]# fdisk /dev/mmcblk0 Welcome to fdisk (util-linux 2.23.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help):
p retrieves all existing partitions as well as the device size itself:
Command (m for help): p
Disk /dev/mmcblk0: 31.9 GB, 31914983424 bytes, 62333952 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 label type: dos
Disk identifier: 0x000b164b
Device Boot Start End Blocks Id System
/dev/mmcblk0p1 2048 526335 262144 c W95 FAT32 (LBA)
/dev/mmcblk0p2 526336 1550335 512000 83 Linux
/dev/mmcblk0p3 1550336 2074623 262144 82 Linux swap / Solaris
/dev/mmcblk0p4 2074624 10463231 4194304 83 Linux
Command (m for help):
The output at the very top shows that the device has 32GB available. df earlier showed that / has only a capacity of 4GB and the rest of the partitions have also only a couple of hundred MBs, meaning most of the disk space is unused.
The procedure is the following:
- Delete the existing partition
- Create a new partition starting at exactly the same sector as the old one and the end sector being the last sector of the disk
- Run
partprobeor reboot the system to make the changes take effect
Deleting the existing partition
Before you go ahead and delete the existing partition, note down the starting sector of the partition. In my case, I’m going to delete and recreate partition 4 as that is where the / is on. The starting sector for that partition is 2074624. The deletion is done via d and the partition number:
Command (m for help): d Partition number (1-4, default 4): 4 Partition 4 is deleted Command (m for help):
Creating a new partition
The new partition is created via the n command. Choose a primary partition p and select the first sector, which is the very same one of the old partition 2074624. Then choose the end sector, which is the last sector of the disk as per the fdisk output above -1 sector, i.e. Disk /dev/mmcblk0: 31.9 GB, 31914983424 bytes, 62333952 sectors = 62333952 sectors – 1 = 62333951. Last, write the changes to disk via w.
Command (m for help): n
Partition type:
p primary (3 primary, 0 extended, 1 free)
e extended
Select (default e): p
Selected partition 4
First sector (2074624-62333951, default 2074624): 2074624
Last sector, +sectors or +size{K,M,G} (2074624-62333951, default 62333951): 62333951
Partition 4 of type Linux and of size 28.8 GiB is set
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.
[root@rpi3 ~]#
Reboot the system or run partprobe, if available, to avoid the reboot.
Expanding the btrfs filesystem
Resizing the partition itself isn’t enough to make the system use the available space. The filesystem on top also needs to be expanded to accommodate the available space. This can be done via btrfs filesystem resize max /, where filesystem resize is the resize filesystem option, max tells the program to expand the filesystem to its entirety (it could also be, for example, 2g or 100m instead) and / is the partition that should be expanded.
[root@rpi3 ~]# btrfs filesystem resize max / Resize '/' of 'max' [root@rpi3 ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 446M 0 446M 0% /dev tmpfs 459M 0 459M 0% /dev/shm tmpfs 459M 23M 436M 6% /run tmpfs 459M 0 459M 0% /sys/fs/cgroup /dev/mmcblk0p4 29G 2.1G 26G 8% / /dev/mmcblk0p2 477M 55M 393M 13% /boot tmpfs 128M 0 128M 0% /tmp /dev/mmcblk0p1 256M 18M 239M 7% /boot/efi tmpfs 92M 0 92M 0% /run/user/0 [root@rpi3 ~]#
After the command is completed the filesystem has been expanded and df shows its new capacity.
Thanks for sharing, mate!
Thanks Jerald! You really helped me.
Thanks alot mate
adding to above partprobe didnt work, reboot is the only option on oel6.7
You are welcome!
Yeah, that can be, I did this on Linux 7 and am now on Linux 8. Perhaps Linux 6 doesn’t support this yet.