(this answer completely rewritten since the downvote)
Before we continue, I want to point out that some answers use
fallocate to allocate space for a file, instead of
dd. Don't do that. Use
dd. @muru pointed out some important points here and here. Although
fallocate is much much faster, it may create files with holes. I think that simply means the space is not contiguous, which is bad for swap files. I picture this as meaning that
fallocate creates a C-style linked-list of memory, whereas
dd creates a C-array contiguous block of memory. Swap files need a contiguous block.
dd does this by doing a byte-for-byte copy of binary zeros from the
/dev/zero pseudo-file into a new file it generates.
man swapon also states not to use
fallocate, and to use
dd instead. Here is the quote (emphasis added):
You should not use
swapon on a file with holes. This can be seen in
the system log as
swapon: swapfile has holes.
The swap file implementation in the kernel expects to be able to
write to the file directly, without the assistance of the filesystem. This is a problem on preallocated files (e.g.
fallocate(1)) on filesystems like
ext4, and on copy-on-write filesystems like
It is recommended to use
/dev/zero to avoid holes on XFS and ext4.
man mkswap (emphasis added):
Note that a swap file must not contain any holes. Using
create the file is not acceptable. Neither is use of
on file systems that support preallocated files, such as XFS or
ext4, or on copy-on-write filesystems like btrfs. It is recommended to use
/dev/zero in these cases. Please read notes from
swapon(8) before adding a swap file to copy-on-write filesystems.
fallocate, to create the swap files.
Option 1 (my preference): delete the old swap file and create a new one of the correct size:
Rather than resizing the swap file, just delete it and create a new one at the appropriate size!
swapon --show # see what swap files you have active
sudo swapoff /swapfile # disable /swapfile
# Create a new 16 GiB swap file in its place (could lock up your computer
# for a few minutes if using a spinning Hard Disk Drive [HDD], so be patient)
# (Ex: on 15 May 2023, this took 3 min 3 sec on a 5400 RPM 750 GB
# model HGST HTS541075A9E680 SATA 2.6, 3.0Gb/s HDD in an old laptop of mine)
sudo dd if=/dev/zero of=/swapfile count=16 bs=1G
sudo mkswap /swapfile # turn this new file into swap space
sudo chmod 0600 /swapfile # only let root read from/write to it, for security
sudo swapon /swapfile # enable it
swapon --show # ensure it is now active
In case you are adding this swap file for the first time, ensure it is in your
/etc/fstab file to make the swap file available again after each reboot. Just run these two commands:
# Make a backup copy of your /etc/fstab file just in case you
# make any mistakes
sudo cp /etc/fstab /etc/fstab.bak
# Add this swapfile entry to the end of the file to re-enable
# the swap file after each boot
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Source: see the "Step 4: Make the changes permanent" section here.
Option 2: resize the old swap file:
The accepted answer by @Ravexina is correct. However, initially I didn't understand all of its pieces, so I wanted to include some more descriptions and explain more of the details. See
dd --help and
man dd. Some of my learning on this comes from Bogdan Cornianu's blog post as well. I also add a few commands at the end to show how to verify your swap space once you create it.
How to resize swap file:
Here we will increase the size of the existing swap file by writing 8 GiB (Gibibytes) of zeros to the end of it.
Turn off usage of just this one swap file (located at "/swapfile"):
# Do this
sudo swapoff /swapfile
# NOT this, which unnecessarily disables all swap files or partitions
# sudo swapoff --all
# sudo swapoff -a
Increase the size of the swap file by 8 GiB by appending all zero bytes to the end of it (rather than rewriting the whole file, which would be slower):
sudo dd if=/dev/zero of=/swapfile bs=1G count=8 oflag=append conv=notrunc
if = input file
/dev/zero = a special Linux "file" which just outputs all zero bytes every time you read from it
of = output file
bs = block size
1G stands for 1 Gibibyte, or GiB, which is the base-2 version of "Gigabyte, which is base-10. According to
G =1024*1024*1024 bytes. This is how I like to size files since computers and hardware memory are base-2.
- If you'd like to use 1 Gigabyte, or GB, which is the base-10 version of "Gibibyte", which is base-2, then you must instead use
1GB rather than
man dd shows that
GB =1000*1000*1000 bytes.
count = multiplier of blocks; the total memory written will be
count * bs.
oflag=append means to append to the end of the output file, rather than rewriting the whole thing. See
dd --help and
man dd. From
append append mode (makes sense only for output; conv=notrunc suggested)
conv=notrunc means when "converting" the file, "do not truncate the output file";
dd --help, as you can see just above, shows this is recomended whenever doing
Note: if you wanted to rewrite the whole swap file rather than just appending to it, you could create a 32 GiB swapfile like this, for example:
sudo dd if=/dev/zero of=/swapfile bs=1G count=32
Make the file usable as swap
sudo mkswap /swapfile
Turn on the swap file
sudo swapon /swapfile
(Bonus/Optional): ensure this swap file you just created is now in usage:
$ swapon --show
NAME TYPE SIZE USED PRIO
/swapfile file 64G 1.8G -2
You can also look at some memory/swap info with these two commands as well:
# 1. Examine the /proc/meminfo file for entries named "swap", such
# as the "SwapTotal" line
cat /proc/meminfo | grep -B 1000 -A 1000 -i swap
# 2. Look at total memory (RAM) and swap (virtual memory) used
# and free:
- @Ravexina's answer
- Bogdan Cornianu's blog post here: https://bogdancornianu.com/change-swap-size-in-ubuntu/
- "How to Create and Use Swap File on Linux": https://itsfoss.com/create-swap-file-linux/
- My answer where I use the above information about increasing your swapfile size in order to solve an out-of-memory Bazel build error: Stack Overflow: java.lang.OutOfMemoryError when running bazel build