Files
import this d32b680351 Server Ansible maintenance & documentation (#6514)
* Create ansible playbook for trimming and rotationg logs

* add docs for triming and log rotation

* update ansible docs

* add info on logic

* cleanup the cleanup guide

* update scraped stats

* ready for review

* address review
2026-03-10 13:28:39 +00:00

283 lines
6.4 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { Steps } from 'nextra/components';
import { Callout } from 'nextra/components';
### Self-Managed VMs, Hypervisor (Host) Cleanup & Ansible Automated Maintenance
This chapter covers both:
- Guest VM configuration
- Host libvirt qcow2 behavior
If you run [KVM/libvirt](/operators/nodes/preliminary-steps/vps-setup/advanced), then this chapter is an essential part of your server hygiene procedure.
**Verify disk usage**
You can always identify what is consuming disk space
```sh
df -h
du -xhd1 /var | sort -h
du -xhd1 /var/log | sort -h
find /var -type f -exec ls -lh {} + 2>/dev/null | sort -k 5 -h | tail -n 30
journalctl --disk-usage
```
#### Inside each VM
<Callout type="info" emoji="️">
In case your VMs are paused on the hypervisor (the host server), with no disk space left, start with [freeing some space on the hypervisor](/operators/troubleshooting/vps-isp#on-the-hypervisor-host-machine) and then return to this chapter, when the VMs are running again.
</ Callout>
<Callout>
**This part can be automated via [Ansible](/operators/orchestration/ansible), using the playbook [`system-maintenance.yml`](/operators/orchestration/ansible#4-system-maintenance). If this is your way, then proceed with Ansible and skip directly to the part called [*On the Hypervisor (host machine)*](#on-the-hypervisor-host-machine).**
</ Callout>
<Steps >
###### 1. Ensure root FS is *not* mounted with continuous discard
- This step is to enable `fstrim` to work in the next step and prevent two same logic processes fighting each other
```sh
mount | grep " / "
```
- If you see:
```sh
type ext4 (... discard ...)
```
- Remove discard from `/etc/fstab` and `remount`:
```sh
mount -o remount,nodiscard /
mount | grep " / "
```
Continuous discard can cause problematic allocation behavior.
###### 2. Enable frequent `fstrim`
- This service will trim free space every 15 minutes
```sh
mkdir -p /etc/systemd/system/fstrim.timer.d
```
```sh
cat >/etc/systemd/system/fstrim.timer.d/override.conf <<'EOF'
[Timer]
OnCalendar=
OnCalendar=*:0/15
Persistent=true
RandomizedDelaySec=0
EOF
```
- Reload and restart the daemon:
```sh
systemctl daemon-reload
systemctl enable --now fstrim.timer
fstrim -av
```
###### 3. Prune `journald`
- Trim logs by running these commands
```sh
journalctl --vacuum-size=100M
journalctl --vacuum-time=3days
journalctl --disk-usage
```
- Compare the outcome of the last one with the previous check
###### 4. Make `journald` limits persistent
- Create a new file `/etc/systemd/journald.conf.d/limits.conf` with these hard caps:
```sh
mkdir -p /etc/systemd/journald.conf.d
cat >/etc/systemd/journald.conf.d/limits.conf <<'EOF'
[Journal]
Storage=persistent
Compress=yes
Seal=yes
SystemMaxUse=100M
RuntimeMaxUse=50M
SystemMaxFileSize=25M
RuntimeMaxFileSize=10M
MaxRetentionSec=3day
RateLimitIntervalSec=30s
RateLimitBurst=1000
EOF
systemctl restart systemd-journald
```
###### 5. Disable classic `rsyslog`
Prevent duplicate logging as most Ubuntu VPS images run both `journald` and `rsyslog` by default.
That duplicates logs into `/var/log/syslog`.
- Disable rsyslog by these commands:
```sh
systemctl disable --now rsyslog.service || true
systemctl mask rsyslog.service || true
pgrep -x rsyslogd >/dev/null 2>&1 && pkill -9 -x rsyslogd || true
```
- Optional cleanup of `syslog`:
```sh
rm -f /var/log/syslog /var/log/syslog.1
rm -f /var/log/kern.log /var/log/kern.log.1
rm -f /var/log/auth.log /var/log/auth.log.1
rm -f /var/log/ufw.log /var/log/ufw.log.1
```
> Note: Running `logrotate --force /etc/logrotate.conf` may fail after disabling `rsyslog`. That is expected and safe.
###### 6. Reduce `nym-node` log growth
- Create a new dir for a service file controlling `nym-node` logs:
```sh
mkdir -p /etc/systemd/system/nym-node.service.d
```
- Create the service file:
```sh
cat >/etc/systemd/system/nym-node.service.d/10-logging.conf <<'EOF'
[Service]
LogLevelMax=warning
LogRateLimitIntervalSec=30s
LogRateLimitBurst=300
StandardOutput=journal
StandardError=journal
SyslogIdentifier=nym-node
EOF
systemctl daemon-reload
systemctl restart nym-node
```
</ Steps>
#### On the Hypervisor (host machine)
<Callout type="warning" emoji="⚠️">
**Do *NOT* shrink the disk size with a `nym-node` on it - this would irreversibly corrupt your data! Instead follow the steps in this sub-chapter.**
</ Callout>
**All the steps below are done from the host machine.**
<Steps>
###### 1. Check your VMs state
- These two commands give you a quick overview of your VMs
```sh
virsh list --all
ls -lh /var/lib/libvirt/images
```
###### 2. Verify `qcow2` actual allocation vs virtual size
- The allocation defined by creating VMs is not equal to the actual usage
```sh
qemu-img info --force-share /var/lib/libvirt/images/<IMAGE_NAME>.img
# for example:
# qemu-img info --force-share /var/lib/libvirt/images/ubuntu1.img
```
- Look at:
```
virtual size
file length
disk size
```
###### 3. Monitor actual host allocation growth
- Watch how disk allocation changes in 5 minutes
- This provides you an easy calculation how much disk space is consumed in a day, week or month
```sh
watch -n 300 'du -sh /var/lib/libvirt/images'
df -h
```
###### 4. Sparsify
- If images grew previously, sparsify once
- Shutdown a VM first:
```sh
virsh shutdown <IMAGE_NAME>
# for example:
# virsh shutdown ubuntu1
```
- Then `sparsify`:
```sh
virt-sparsify --in-place /var/lib/libvirt/images/<IMAGE_NAME>.img
# for example:
# virt-sparsify --in-place /var/lib/libvirt/images/ubuntu1.img
```
- Finally re-start the machine
```sh
virsh start <IMAGE_NAME>
# for example:
# virsh start ubuntu1
```
- Repeat per VM if necessary
- If you want to sparsify all of them, you can run it in a loop
```sh
for vm in $(virsh list --all --name); do
virsh shutdown "$vm"
while [ "$(virsh domstate "$vm")" != "shut off" ]; do
sleep 5
done
virt-sparsify --in-place /var/lib/libvirt/images/${vm}.img
done
```
- Then use same logic to start them all
```sh
for vm in $(virsh list --all --name); do
virsh start "$vm"
done
```
- Finally make sure that they are all running:
```sh
virsh list --all
```
###### 5. Ensure host filesystem supports hole punching
```sh
df -T /var/lib/libvirt/images
stat -f -c %T /var/lib/libvirt/images
```
- The filesystem must support hole punching (fallocate) such as `ext4` or `xfs`
###### 6. Final validation
- Finally check that how much space is on your host disk:
```sh
df -h
du -sh /var/lib/libvirt/images
```
</ Steps>