Shrink EXT3 partition Without Losing Data
Release:
RedHat Enterprise Linux
Problem:
Resize the ext3 partition without losing data
Solution:
This article shows how to shrink the ext3 partition without losing data. This can be quite useful if you do not use LVM
Note: The partition that is to be resized must be unmounted when we do the resizing
Shrinking an ext3 Partition:
1) Check the disk usage of the server before proceeding
# df –h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 4.4G 2.4G 1.8G 58% /
/dev/sda1 99M 14M 80M 15% /boot
tmpfs 125M 0 125M 0% /dev/shm
2) Boot the server into linux rescue mode
Note: If the partition you want to resize doesn't hold any system files, you can do everything from the original system; the steps are the same, just omit booting into rescue system
3) Run the filesystem-specific fsck on the filesystem.
# fsck –n /dev/sda3
e2fsck 1.39 (29-May-2006)
/dev/sda3: clean, 115974/577152 files, 636274/1152640 blocks
4) Remove the journal from /dev/sda3, thus turning it into an ext2 partition
# tune2fs -O ^has_journal /dev/sda3
tune2fs 1.39 (29-May-2006)
5) Run fsck on the filesystem
# e2fsck –f /dev/sda3
e2fsck 1.39 (29-May-2006)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/sda3: clean, 115974/577152 files (0.5% non-contiguous), 636274/1152640 blocks
6) Now resize the filesystem using resize2fs. resize2fs can resize ext2 file systems, but not ext3 file systems
# resize2fs /dev/sda1 3600M
resize2fs 1.39 (29-May-2006)
Resizing the filesystem on /dev/sda3 to 921600 (4k) blocks.
The filesystem on /dev/sda3 is now 921600 blocks long.
Please take note of the amount of blocks (921600) and their size (4k).
Note: Currently, 2.3 GB are used on /dev/sda3 (see the df -h output above), so it's safe to shrink it from 4.4GB to about 3.6GB (if you make it smaller than 2.3GB, you will lose data!).
7) Now we delete our /dev/sda1 partition (don't be afraid, no data will be lost) and create a new, smaller one (but still big enough to hold our resized file system!).
# fdisk /dev/sda
Command (m for help): d
Partition number (1-4): 3
Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (79-652, default 79):
Using default value 79
Last cylinder or +size or +sizeM or +sizeK (79-652, default 652): +3870720K
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
Note: We multiply the amount of blocks from the resize2fs output (921600) by the size of a block (4k), and to go sure the partition is big enough, we add 3 to 5% to it (5% was enough for me, but if you want to go sure take 3%)
921600 * 4k * 1.05 = 3870720k
8) Now restart the server once and boot into the rescue mode once again
# exit
9) Once again run the filesystem-specific fsck on the filesystem
# fsck –n /dev/sda3
fsck 1.39 (29-May-2006)
e2fsck 1.39 (29-May-2006)
/dev/sda3: clean, 115962/464928 files, 599592/921600 blocks
10) Now create the journal on our new /dev/sda3, thus turning it into an ext3 partition again
# tune2fs -j /dev/sda3
tune2fs 1.39 (29-May-2006)
Creating journal inode: done
This filesystem will be automatically checked every 25 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
11) Now restart the server and boot from the harddisk.
# exit