How to resize an OCFS2 filesystem on Linux

The post outlines the steps to resize an OCFS2 filesystem on Linux. The procedure should first be tested in test before being performed against a production environment.

1. Backup all data on the filesystem

Repartitioning a disk/device is a destructive process that may result in complete loss of volume data. Backup the contents of the volume to be resized before proceeding.

2. Globally unmount the filesystem to be resized

OCFS2 filesystem resize can only be performed with the filesystem unmounted from all cluster nodes. Unmount the filesystem to be resized on all cluster nodes. Use the mounted.ocfs2 command to verify if any nodes still have the volume mounted e.g.:

# mounted.ocfs2 -f
Device    FS    Nodes
/dev/sdb1 ocfs2 node01, node02
/dev/sdc1 ocfs2 node01, node02
/dev/sdg1 ocfs2 node01, node02
# mounted.ocfs2 -f
Device FS Nodes
/dev/sdb1 ocfs2 Not mounted
/dev/sdc1 ocfs2 Not mounted
/dev/sdg1 ocfs2 Not mounted

3. Perform a filesystem check

Before resizing the device or filesystem, perform a filesystem check. Be sure to correct/address any issues before proceeding.

# fsck.ocfs2 -fn /dev/sdb1
Checking OCFS2 filesystem in /dev/sdb1:
label: resizer
uuid: 21 bd e3 16 a6 a6 4e 95 89 23 77 c9 0d 9e 24 02 
number of blocks: 1048265
bytes per block: 4096
number of clusters: 1048265
bytes per cluster: 4096
max slots: 6

/dev/sdb1 was run with -f, check forced.
Pass 0a: Checking cluster allocation chains
Pass 0b: Checking inode allocation chains
Pass 0c: Checking extent block allocation chains
Pass 1: Checking inodes and blocks.
Pass 2: Checking directory entries.
Pass 3: Checking directory connectivity.
Pass 4a: checking for orphaned inodes
Pass 4b: Checking inodes link counts.
All passes succeeded.

4. Resize the underlying device/partition

The underlying LUN/device/partition upon which the filesystem resides must first be resized before the filesystem itself can be resized. The method, and therefore the commands required, to resize the device will differ depending upon the storage solution used. Note, as of OCFS2 version available at the time of writing this post, OCFS2 volumes may be resized larger, but not smaller.

In the following example, the OCFS2 partition to be resized resides on partition /dev/sdb1 (an iSCSI target) that is resized from 4Gb to 8Gb.

# df -kl /cfs03
Filesystem   1K-blocks Used     Available  Use%  Mounted on
/dev/sdb1    4193060   1578984  2614076    38%   /cfs03
# mount -t ocfs2
...
/dev/sdb1 on /cfs03 type ocfs2 (rw,_netdev,heartbeat=local)

Before Resize

# cat /proc/partitions | grep sdb
8  16  4194304 sdb
8  17  4194288 sdb1

During Resize (LUN resized, but not partition)

# cat /proc/partitions | grep sdb
8  16  8388608 sdb
8  17  4194288 sdb1

When using OCFS2 filesystems on partitioned devices, always ensure to recreate the partition using the original Start cylinder and larger End cylinder.

# fdisk /dev/sdb

The number of cylinders for this disk is set to 8192.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): p

Disk /dev/sdb: 8589 MB, 8589934592 bytes
64 heads, 32 sectors/track, 8192 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        4096     4194288   83  Linux

Command (m for help): d
Selected partition 1

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-8192, default 1): 
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-8192, default 8192): 
Using default value 8192

Command (m for help): p

Disk /dev/sdb: 8589 MB, 8589934592 bytes
64 heads, 32 sectors/track, 8192 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        8192     8388592   83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
Note: If using device sizes greater than 2Tb, use the parted utilty instead of fdisk to manage partitions.

After device/partition resize, ensure that all cluster nodes’ operating systems detect the new sizing of the device/partition before proceeding. The following utilities/methods can be used to dynamically detect device/partition changes; partprobe, sfdisk, blockdev, cluster-wide node reboot. Use with caution, for example:

# /sbin/partprobe /dev/sdb

OR

# /sbin/sfdisk -R /dev/sdb

OR

# /sbin/blockdev --rereadpt /dev/sdb

Verify the kernel sees the modified device partition sizing. After Resize (both LUN and partition resized):

# cat /proc/partitions | grep sdb
8 16 8388608 sdb
8 17 8388592 sdb1

Note, depending on the kernel device naming scheme employed (udev, dm, EMC PowerPath etc.), the device file name used to refer to the device on one node may differ to that on other nodes and/or change to a different name – this is normal and expected.

5. Resize the OCFS2 filesystem

Once the device/partition has been resized and it’s new size visible to all cluster nodes, resize the OCFS2 filesystem using the tunefs.ocfs2 command. For example:

# tunefs.ocfs2 -S /dev/sdb1
tunefs.ocfs2 1.2.4
Changing volume size from 1048572 blocks to 2097148 blocks
Proceed (y/N): y
Resized volume
Wrote Superblock

6. Perform filesystem check

Having resized the OCFS2 partition, perform another filesystem check before attempting to mount the resized volume.

# fsck.ocfs2 -fn /dev/sdb1
Checking OCFS2 filesystem in /dev/sdb1:
  label:              resizer
  uuid:               22 02 bb 51 b2 90 4a 4d 82 30 13 5d cc dd 05 bc 
  number of blocks:   2097148
  bytes per block:    4096
  number of clusters: 2097148
  bytes per cluster:  4096
  max slots:          6

/dev/sdb1 was run with -f, check forced.
Pass 0a: Checking cluster allocation chains
Pass 0b: Checking inode allocation chains
Pass 0c: Checking extent block allocation chains
Pass 1: Checking inodes and blocks.
Pass 2: Checking directory entries.
Pass 3: Checking directory connectivity.
Pass 4a: checking for orphaned inodes
Pass 4b: Checking inodes link counts.
All passes succeeded.

7. Mount the resized OCFS2 volume

Remount the resized OCFS2 filesystem on all cluster nodes.

# mounted.ocfs2 -f
Device FS Nodes
/dev/sdc1 ocfs2 node01, node02
/dev/sdf1 ocfs2 node01, node02
/dev/sdb1 ocfs2 node01, node02
# mount -t ocfs2
/dev/sdb1 on /cfs03 type ocfs2 (rw,_netdev,heartbeat=local)
...
# df -kl /cfs03
Filesystem   1K-blocks Used     Available Use% Mounted on
/dev/sdb1    8388592   1579120  6809472   19%  /cfs03
How to Extend ocfs2 Filesystem with tunefs.ocfs2 Command (Whole device used without partitions)
上一篇:c++17 string_view


下一篇:定时器