How to Expand Swap on a Linux VM

Published by Torry Crass on

I searched for a while to come up with a method for expanding swap in an online way thinking that it might now be possible given all kinds of disk and file system advances over the past few years.  It's been a little bit since I've had to do this after all. Unfortunately, no such luck so I thought I'd post the quick on the way that I did it so I remember better in the future.

The main goal of this excersize is to expand the swap partition without a reboot. It should be noted that this process is for a flat disk, not a LVM disk group.

– Information Gathering

First is information gathering. You need your /etc/fstab contents and it couldn't hurt to get the swap sizing as well.

[root@vm-guest ~]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Mon Jan 28 12:10:28 2013
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=dd126223-ae2a-438b-9f15-bb5fbc65b235 /                       ext4    defaults        1 1
UUID=8b2358d7-2010-46d8-8685-73632b25a8ea swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0

Check your swap entry

[root@vm-guest ~]# swapon -s
Filename                                Type            Size    Used    Priority
/dev/sdb1                               partition       2096120 1736    -1

Now check the actual partition table with fdisk

[root@vm-guest ~]# fdisk -l

Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000c1142

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        2611    20970496   83  Linux

Disk /dev/sdb: 2147 MB, 2147483648 bytes
22 heads, 16 sectors/track, 11915 cylinders
Units = cylinders of 352 * 512 = 180224 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000de00f

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               6       11916     2096128   82  Linux swap / Solaris

– Rescan The Drive

Now you should expand your swap disk in the VM. In this case I used VMware which is as simple as right clicking on the system, finding the associated drive in the configuration, increasing to the size desired and clicking OK.

Once complete, you'll need to rescan the disk to get it to show up on the OS. Keep in mind, your volume information may be different on your system, you'll need to adjust the rescan to the right disk entry.

[root@vm-guest ~]# cd /sys/class/scsi_disk/
[root@vm-guest scsi_disk]# ls
2:0:0:0  2:0:1:0
[root@vm-guest scsi_disk]# cd 2\:0\:1\:0/
[root@vm-guest 2:0:1:0]# ls
allow_restart  app_tag_own  cache_type  device  FUA  manage_start_stop  power  protection_mode  protection_type  provisioning_mode  subsystem  thin_provisioning  uevent
[root@vm-guest 2:0:1:0]# echo '1' > device/rescan

Check that your expansion succeeded as follows.

[root@vm-guest 2:0:1:0]# fdisk -l

Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000c1142

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        2611    20970496   83  Linux

Disk /dev/sdb: 3221 MB, 3221225472 bytes
22 heads, 16 sectors/track, 17873 cylinders
Units = cylinders of 352 * 512 = 180224 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000de00f

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               6       11916     2096128   82  Linux swap / Solaris

– Unmount Existing Swap and Create New Swap Partition

Now you'll need to turn off, unmount, the existing swap in order to create and expand the swap.

[root@vm-guest ~]# swapoff -v /dev/sdb1
swapoff on /dev/sdb1

Now fdisk the partition again to remove the existing swap partition and create a new one with the larger size.

[root@vm-guest ~]# fdisk /dev/sdb

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): m
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

Command (m for help): p

Disk /dev/sdb: 3221 MB, 3221225472 bytes
22 heads, 16 sectors/track, 17873 cylinders
Units = cylinders of 352 * 512 = 180224 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000de00f

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               6       11916     2096128   82  Linux swap / Solaris

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-17873, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-17873, default 17873):
Using default value 17873

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): L

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

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

Calling ioctl() to re-read partition table.
Syncing disks.

– Create New Swap, Update FSTAB and Turn On Swap

Now make your swap partition and note the new UUID, you'll need this to update your fstab file.

[root@vm-guest ~]# mkswap /dev/sdb1
Setting up swapspace version 1, size = 3145636 KiB
no label, UUID=82bb14fc-fa5b-4dca-bb24-9aceb0ba9061

Now you'll need to update your /etc/fstab file with the new UUID so you can mount the swap.  Once you edit the fstab file then you can turn on the swap.

[root@vm-guest ~]# vim /etc/fstab
[root@vm-guest ~]# swapon -a
[root@vm-guest ~]# swapon -s
Filename                                Type            Size    Used    Priority
/dev/sdb1                               partition       3145632 0       -1


And that should be all.  As you can see, the swap is now increased.