Bitcoin node disk full: how to recover
A full disk stops the node. Recover without corrupting the chainstate, and size the disk so it does not happen again.
When the filesystem fills, Bitcoin Core shuts itself down rather than risk a half-written block. The wrong response, deleting files in blocks/, can cost you a full resync. The right one takes a few minutes.
What a full disk looks like
$ journalctl -u bitcoind -n 5 --no-pager
*** Disk space is too low!
Error: Disk space is too low!
systemd[1]: bitcoind.service: Main process exited, code=exited, status=1/FAILUREIf the node is not running, bitcoin-cli fails with Could not connect to the server 127.0.0.1:8332. Check the service and the disk before assuming anything else.
$ df -h /var/lib/bitcoind
$ sudo du -sh /var/lib/bitcoind/blocks /var/lib/bitcoind/chainstate 2>/dev/null
$ systemctl status bitcoind --no-pagerblocks/ and chainstate/ hold the node's database. Deleting files from them can corrupt it. Free space elsewhere (logs, downloads, old backups) or use one of the three paths below.
Want to see this failure and the recovery before it happens to you? The lab has a disk-full scenario.
Path A: grow the disk
Home: stop Core, clone to a bigger NVMe or add a drive and move the datadir (path C). VPS: attach a volume or resize the disk per your provider, then grow the filesystem. Resizing in place keeps the datadir, so nothing is re-downloaded.
Path B: switch to pruning
Best when you do not need old blocks and the disk cannot grow. This is one-way: going back to full means re-downloading.
- Stop Core:
sudo systemctl stop bitcoind - If the disk is at 100%, free a few GB elsewhere first. Core needs room to start.
- Add
prune=550to/etc/bitcoin/bitcoin.conf. Removetxindex=1if present; the two cannot be combined. - Start Core and check:
$ sudo systemctl start bitcoind
$ bitcoin-cli getblockchaininfo | grep -E 'pruned|size_on_disk'
"size_on_disk": 12304711680,
"pruned": true,
$ df -h /var/lib/bitcoindCore trims old block files after it starts, so free space may take a few minutes to appear. What pruning does and costs: pruned vs full.
Path C: move the datadir
For a small OS disk with a large second volume. The systemd unit from the setup guide passes -datadir=/var/lib/bitcoind on the command line, and command-line options override bitcoin.conf (doc/init.md), so a datadir= line in the config file is ignored. Mount the new disk at /var/lib/bitcoind instead. The path stays the same, so the unit, the bitcoin-cli alias and Sparrow's cookie path keep working. The disk must already have a filesystem (ext4 here).
$ sudo systemctl stop bitcoind
$ sudo mount /dev/BIGDISK /mnt
$ sudo rsync -a /var/lib/bitcoind/ /mnt/
$ sudo umount /mnt
$ sudo mv /var/lib/bitcoind /var/lib/bitcoind.old
$ sudo mkdir /var/lib/bitcoind
$ sudo blkid /dev/BIGDISKPut the UUID that blkid printed into /etc/fstab, then mount and start:
UUID=YOUR-UUID /var/lib/bitcoind ext4 defaults 0 2$ sudo systemctl daemon-reload
$ sudo mount /var/lib/bitcoind
$ sudo systemctl start bitcoind
$ bitcoin-cli getblockchaininfo | grep -E 'blocks|headers'
$ df -h /var/lib/bitcoindLeave out nofail in the fstab line. If the disk is missing at boot you want the boot to stop, because otherwise Core would start a second sync on the OS disk. Delete /var/lib/bitcoind.old only after the node syncs normally. RPC stays local-only after a move; see security basics.
Sizing
| Mode | On disk (mid-2026) | Allocate |
|---|---|---|
Pruned, prune=550 | about 12 GB | 25 GB or more |
| Full | roughly 800 GB, growing 70 to 80 GB a year | 1 TB minimum, 2 TB for comfort |
These drift. size_on_disk in getblockchaininfo is your real number. For drives, see hardware.
Prevention
Syncing stalled but the disk has room? See sync stuck. Third-party chain snapshots to "save time" are not a recovery option; see the AssumeUTXO note there.
FAQ
Does prune mode skip downloading the blockchain?
No. You still download everything once. Prune deletes old block files after they are verified.
Can I delete files in /var/lib/bitcoind/blocks to free space?
No. Deleting block or chainstate files by hand can corrupt the datadir and force a resync. Use prune, a bigger disk, or a datadir move.
How much disk does a pruned node need?
About 12 GB at prune=550, because the UTXO set alone is around 11 GB. Allocate 25 GB or more so the OS, logs and growth fit.