使用Plakar备份你的Linux VPS
在Debian 12或Ubuntu 24.04上安装plakar,创建加密去重备份存储,通过stdin管道备份文件系统路径和数据库,安排自动备份,并恢复文件或完整数据库转储。
什么是plakar,为什么用它来备份VPS?
Plakar是一个用Go编写的开源备份工具。它以单一二进制文件的形式发布,内置加密、去重、Web界面和原生调度器。创建仓库时默认启用加密。Plakar可以备份文件系统路径、通过stdin管道传输的数据库转储以及S3存储桶。该项目于2026年1月加入了Linux基金会和CNCF。
如果你已经在使用restic或borgbackup,以下是plakar的不同之处。Restic需要rclone等外部工具进行远程同步,需要cron进行调度。Borgbackup需要在远程端运行borg服务器,且没有内置Web界面。Plakar原生处理所有这些功能:plakar sync在存储之间复制,plakar scheduler按间隔运行备份,plakar ui启动浏览器界面用于浏览快照。
Restic和plakar都支持通过stdin备份来管道传输数据库转储。Borgbackup不支持。三者都进行去重。Plakar在创建仓库时默认启用加密,而restic和borgbackup允许创建未加密的仓库。
本指南涵盖单个VPS上的本地备份。关于远程服务器的异地复制,请参阅使用 Plakar 进行异地备份和复制。
开始之前需要什么?
你需要一台运行Debian 12或Ubuntu 24.04的VPS,具有root或sudo访问权限。Virtua Cloud VPS非常适合此用途。你还需要配置好基于密钥认证的SSH访问,以及至少10 GB的可用磁盘空间用于备份存储。
如果你计划备份数据库,请先安装MySQL或PostgreSQL。这些安装不在本文讨论范围内。
本指南中的所有命令都以root身份运行。如果你使用sudo用户,请在每个命令前加上sudo。
如何在Debian 12或Ubuntu 24.04上安装plakar?
添加官方plakar apt仓库,导入GPG签名密钥,然后安装软件包。相同的步骤适用于Debian 12和Ubuntu 24.04。apt包通过正常的系统升级周期自动处理更新。
安装前置依赖:
apt update
apt install -y curl gnupg2
导入GPG密钥并添加仓库:
curl -fsSL https://plakar.io/dist/keys/community-v1.1.0.gpg | gpg --dearmor -o /usr/share/keyrings/plakar.gpg
echo "deb [signed-by=/usr/share/keyrings/plakar.gpg] https://plakar.io/dist/repos/deb/ stable main" | tee /etc/apt/sources.list.d/plakar.list
GPG密钥通过signed-by绑定到仓库。Apt只信任使用该特定密钥签名的软件包。这可以防止被入侵的第三方仓库向你的系统注入软件包。
安装plakar:
apt update
apt install -y plakar
确认安装:
plakar version
plakar/v1.0.6
如何创建加密的Kloset存储?
Kloset存储是plakar的存储后端。它以去重、加密的形式保存所有快照。每个数据块在写入磁盘之前都会被加密。Kloset引擎在加密之前进行去重,因此不同快照之间的相同数据块只存储一次,同时仍然完全加密存储在磁盘上。
在/var/backups/plakar创建存储:
mkdir -p /var/backups/plakar
plakar at /var/backups/plakar create
Plakar会提示输入密码短语:
repository passphrase:
生成一个强密码短语:
openssl rand -base64 32
将此密码短语保存在密码管理器或其他安全位置。如果丢失,你将无法访问存储中的任何快照。没有恢复机制。
设置存储目录的权限,使只有root可以访问:
chmod 700 /var/backups/plakar
ls -la /var/backups/
drwx------ 5 root root 4096 Mar 20 10:00 plakar
如果省略at <path>,默认存储位置是~/.plakar。在服务器上,使用专用路径如/var/backups/plakar,这样它就不依赖于用户的主目录。
如何使用plakar备份文件系统路径?
备份VPS上重要的目录:/etc用于系统配置,/home用于用户数据,/var/www用于网站内容。每个plakar backup命令接受一个路径。每个目录运行一次备份,或将它们分组在一个公共父目录下。由于去重,快照之间未更改的文件只存储一次。
plakar at /var/backups/plakar backup /etc
每次备份会创建一个由短十六进制ID标识的快照。输出列出每个处理的文件和摘要:
a5bcf13b: OK ✓ /etc/hostname
a5bcf13b: OK ✓ /etc/ssh/sshd_config
...
info: backup: created unsigned snapshot a5bcf13b of size 1.4 MiB in 210ms (wrote 1.7 MiB)
同一路径的第二次备份运行更快,因为只存储更改的块。以同样的方式备份其他路径:
plakar at /var/backups/plakar backup /home
plakar at /var/backups/plakar backup /var/www
为快照添加标签
使用-tag标志为快照添加标签。当你有很多快照需要过滤时很有用:
plakar at /var/backups/plakar backup -tag "daily,filesystem" /etc
排除文件
日志文件、缓存和构建产物会浪费备份空间。使用-ignore进行内联模式排除:
plakar at /var/backups/plakar backup -ignore "*.log" -ignore "cache/" /etc
对于更长的列表,从文件加载模式。语法遵循gitignore规则:
cat > /etc/plakar-excludes <<EOF
*.log
*.tmp
*.swp
cache/
.cache/
node_modules/
__pycache__/
.git/
EOF
chmod 600 /etc/plakar-excludes
plakar at /var/backups/plakar backup -ignore-file /etc/plakar-excludes /etc
扫描模式
预览plakar将备份的内容,但不向存储写入任何数据:
plakar at /var/backups/plakar backup -scan /etc
这会列出符合备份条件的每个文件。在调整排除模式时很有用。
备份时验证
添加-check在备份完成后立即运行完整性验证:
plakar at /var/backups/plakar backup -check /etc
这会多花几秒钟,但能及早发现损坏。
如何使用plakar备份MySQL数据库?
通过stdin:源将mysqldump输出直接管道传输到plakar。没有中间转储文件接触磁盘。SQL流从mysqldump直接进入plakar的加密和去重管道。
备份单个数据库:
mysqldump --single-transaction \
--routines \
--triggers \
--events \
myapp_db | plakar at /var/backups/plakar backup stdin:myapp_db.sql
每个标志的作用:
--single-transaction:在不锁定InnoDB表的情况下获取一致性快照。其他查询继续运行。--routines:包含存储过程和函数。--triggers:包含表触发器。--events:包含计划事件。
备份服务器上的所有数据库:
mysqldump --all-databases \
--single-transaction \
--routines \
--triggers \
--events \
--set-gtid-purged=OFF | plakar at /var/backups/plakar backup stdin:all_databases.sql
--set-gtid-purged=OFF省略GTID元数据。这使转储可以在不同MySQL实例之间移植,导入时不会出现GTID冲突。
快照将SQL转储存储为以stdin:标签命名的单个文件。恢复时引用此名称。
如何使用plakar备份PostgreSQL数据库?
方法相同:通过stdin:将pg_dump管道传输到plakar。PostgreSQL认证通常对postgres系统用户使用peer认证,因此在该账户下运行转储命令。
备份单个数据库:
su - postgres -c "pg_dump --format=plain myapp_db" | plakar at /var/backups/plakar backup stdin:myapp_db.sql
备份所有数据库和角色,使用pg_dumpall:
su - postgres -c "pg_dumpall" | plakar at /var/backups/plakar backup stdin:all_pg_databases.sql
pg_dumpall包含pg_dump跳过的全局对象,如角色和表空间。当你需要完整的集群备份时使用它。pg_dump --format=plain生成纯SQL文件,恢复时可直接管道传输到psql。
如何列出和浏览plakar快照?
使用plakar ls列出存储中的所有快照。每行显示时间戳、快照ID、压缩大小、备份持续时间和源路径。
plakar at /var/backups/plakar ls
2026-03-20T10:05:12Z a5bcf13b 1.4 MiB 0s /etc
2026-03-20T10:06:01Z 5fc17459 0 B 0s /home
2026-03-20T10:06:15Z 7ed22fb8 24 B 0s /var/www
2026-03-20T10:10:45Z ec916c75 2.0 KiB 0s /
2026-03-20T10:12:03Z 08ee9b7e 1.2 MiB 0s /
Stdin备份在列表中以/作为源路径显示。快照ID用于区分它们。
按标签过滤:
plakar at /var/backups/plakar ls -tag daily
浏览特定文件系统快照的内容:
plakar at /var/backups/plakar ls a5bcf13b
缩小到子目录:
plakar at /var/backups/plakar ls a5bcf13b:/etc/ssh/
Web界面
要使用可视界面,启动内置Web UI。在无桌面的服务器上,添加-no-spawn防止尝试打开浏览器:
plakar at /var/backups/plakar ui -no-spawn -addr localhost:8080
该界面可以浏览快照、查看文件内容和下载单个文件。Plakar会自动生成认证令牌并打印附带令牌的URL。
禁用令牌认证(不建议在生产环境中使用):
plakar at /var/backups/plakar ui -no-spawn -no-auth -addr localhost:8080
完成后按Ctrl+C停止。要持续访问,在前面放一个带TLS的反向代理,并保持令牌认证启用。
如何使用plakar验证备份完整性?
对快照ID运行plakar check来验证每个块。Plakar从存储中读回每个块,解密并重新计算校验和。如果任何块被损坏或篡改,检查将失败。
plakar at /var/backups/plakar check a5bcf13b
info: a5bcf13b: ✓ /etc/hostname
info: a5bcf13b: ✓ /etc/ssh/sshd_config
info: a5bcf13b: ✓ /etc/apt/sources.list.d/plakar.list
...
info: check: verification of a5bcf13b:/etc completed successfully
每个文件如果校验和匹配就会显示对勾。损坏的文件显示错误标记。
一次验证存储中的所有快照:
plakar at /var/backups/plakar check
更快的结构检查,跳过单个块的摘要验证:
plakar at /var/backups/plakar check -fast a5bcf13b
定期运行完整性检查。对于大多数VPS工作负载,每周一次是合理的频率。从不验证的备份是不可信赖的备份。
如何从plakar备份中恢复文件?
使用plakar restore将整个快照恢复到目标目录。Plakar在目标路径下重建完整的目录树。原始权限和时间戳被保留。
mkdir -p /tmp/restore
plakar at /var/backups/plakar restore -to /tmp/restore a5bcf13b
info: restore: restoration of a5bcf13b:/etc at /tmp/restore completed successfully
要恢复单个文件,使用plakar cat并重定向输出:
plakar at /var/backups/plakar cat a5bcf13b:/etc/hostname > /tmp/hostname.restored
从快照中只恢复一个目录:
plakar at /var/backups/plakar restore -to /tmp/restore 7ed22fb8:/var/www
这只提取/var/www及其内容。快照中的其他内容不受影响。
始终先恢复到临时位置。在直接覆盖任何内容之前,将恢复的文件与当前服务器状态进行比较。粗心地恢复到/可能会覆盖自快照创建以来已更改的配置文件。
如何从plakar恢复数据库转储?
使用plakar cat将快照中的SQL转储直接流式传输到数据库客户端。没有中间磁盘文件。使用要恢复的stdin备份的快照ID。
MySQL
恢复单个数据库:
plakar at /var/backups/plakar cat ec916c75:myapp_db.sql | mysql myapp_db
从完整转储恢复所有数据库:
plakar at /var/backups/plakar cat 08ee9b7e:all_databases.sql | mysql
PostgreSQL
恢复单个数据库:
plakar at /var/backups/plakar cat f86ce26a:myapp_db.sql | su - postgres -c "psql myapp_db"
恢复完整集群:
plakar at /var/backups/plakar cat c09e650e:all_pg_databases.sql | su - postgres -c "psql"
在非生产数据库或全新测试服务器上测试恢复。没有经过测试的恢复的备份策略不是备份策略。至少每季度安排一次恢复测试。
如何使用plakar的调度器自动化备份?
Plakar有一个内置调度器,按定义的间隔运行备份任务。不需要cron。你在YAML文件中定义任务,plakar处理计时、执行和可选的备份后完整性检查。
首先,使用保存的凭据注册存储,这样调度器可以在没有交互式密码短语提示的情况下访问它。创建一个权限受限的密码短语文件:
mkdir -p /etc/plakar
openssl rand -base64 32 > /etc/plakar/passphrase
chmod 600 /etc/plakar/passphrase
chown root:root /etc/plakar/passphrase
ls -la /etc/plakar/passphrase
-rw------- 1 root root 45 Mar 20 10:20 /etc/plakar/passphrase
创建存储时使用此密码短语(如果你已经用不同的密码短语创建了存储,则更新存储)。按名称注册存储:
plakar store add mybackups \
location=/var/backups/plakar \
passphrase_cmd="cat /etc/plakar/passphrase"
现在创建调度器配置。每个任务备份一个路径:
mkdir -p /etc/plakar
cat > /etc/plakar/scheduler.yaml <<'EOF'
agent:
tasks:
- name: backup etc
repository: "@mybackups"
backup:
path: /etc
interval: 24h
check: true
- name: backup home
repository: "@mybackups"
backup:
path: /home
interval: 24h
- name: backup www
repository: "@mybackups"
backup:
path: /var/www
interval: 24h
EOF
chmod 600 /etc/plakar/scheduler.yaml
先手动测试:
plakar scheduler start -tasks /etc/plakar/scheduler.yaml
调度器在前台运行并记录任务执行。按Ctrl+C停止。要作为后台守护进程运行,使用下面描述的systemd服务。
调度器原生处理文件系统备份。需要通过mysqldump或pg_dump管道传输的数据库转储需要包装脚本。创建一个:
cat > /etc/plakar/backup-databases.sh <<'EOF'
#!/bin/bash
set -euo pipefail
# MySQL
if command -v mysqldump &>/dev/null; then
mysqldump --all-databases \
--single-transaction \
--routines \
--triggers \
--events \
--set-gtid-purged=OFF | plakar at @mybackups backup -tag "daily,mysql" stdin:all_databases.sql
fi
# PostgreSQL
if command -v pg_dump &>/dev/null; then
su - postgres -c "pg_dumpall" | plakar at @mybackups backup -tag "daily,postgresql" stdin:all_pg_databases.sql
fi
EOF
chmod 700 /etc/plakar/backup-databases.sh
如何将plakar调度器作为systemd服务运行?
将调度器包装在systemd单元中,使其在启动时运行、故障时重启,并与journalctl集成用于日志记录。
cat > /etc/systemd/system/plakar-scheduler.service <<EOF
[Unit]
Description=Plakar Backup Scheduler
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/plakar scheduler start -tasks /etc/plakar/scheduler.yaml
ExecStop=/usr/bin/plakar scheduler stop
Restart=on-failure
RestartSec=30
User=root
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
EOF
如果你还运行数据库备份脚本,为它创建一个单独的定时器:
cat > /etc/systemd/system/plakar-db-backup.service <<EOF
[Unit]
Description=Plakar Database Backup
After=network.target mysql.service postgresql.service
[Service]
Type=oneshot
ExecStart=/etc/plakar/backup-databases.sh
User=root
EOF
cat > /etc/systemd/system/plakar-db-backup.timer <<EOF
[Unit]
Description=Run Plakar Database Backup Daily
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
EOF
启用并启动所有服务。enable --now使服务在重启后存活并立即启动:
systemctl daemon-reload
systemctl enable --now plakar-scheduler.service
systemctl status plakar-scheduler.service
● plakar-scheduler.service - Plakar Backup Scheduler
Loaded: loaded (/etc/systemd/system/plakar-scheduler.service; enabled; preset: enabled)
Active: active (running)
数据库备份定时器:
systemctl enable --now plakar-db-backup.timer
systemctl list-timers plakar-db-backup.timer
NEXT LEFT LAST PASSED UNIT ACTIVATES
Fri 2026-03-21 02:00:00 UTC 15h left n/a n/a plakar-db-backup.timer plakar-db-backup.service
监控调度器日志:
journalctl -u plakar-scheduler.service -f
如何删除旧快照?
通过ID删除快照。默认情况下,plakar rm执行试运行并显示将被删除的内容。添加-apply以实际删除快照:
plakar at /var/backups/plakar rm a5bcf13b
rm: would remove these 1 snapshot(s), run with -apply to proceed
2026-03-20T10:05:12Z a5bcf13b 1.4 MiB 0s /etc
plakar at /var/backups/plakar rm -apply a5bcf13b
info: rm: removal of a5bcf13b completed successfully
Plakar的去重意味着删除一个快照只释放未被任何剩余快照引用的数据块的空间。如果两个快照共享90%的数据,删除一个只释放独特的10%。
出了问题?
每个命令都提示"repository passphrase"。 Plakar每次交互访问存储时都需要密码短语。按调度器部分所示,使用plakar store add和passphrase_cmd注册存储。然后按名称引用存储:
plakar at @mybackups backup /etc
你也可以使用-keyfile标志为单次命令指向密码短语文件:
plakar -keyfile /etc/plakar/passphrase at /var/backups/plakar backup /etc
永远不要在shell配置文件或.bashrc中导出PLAKAR_PASSPHRASE。它会出现在shell历史记录和进程列表中。改用passphrase_cmd模式或-keyfile标志。
备份时出现"permission denied"。 Plakar需要对源文件有读取权限。以root身份运行可以避免此问题。如果使用专用备份用户,请通过ACL或组成员身份授予目标目录的读取权限。
快照比预期的大。 你可能在备份日志文件、缓存或构建产物。使用-ignore或-ignore-file排除它们。先运行-scan查看包含了什么。
备份期间出现"no space left on device"。 备份存储和临时打包文件需要磁盘空间。使用df -h检查。存储会随着添加快照而增长。请监控它。
读取plakar日志。 Plakar将输出写到stdout。将stdout和stderr都重定向到文件:
plakar at /var/backups/plakar backup /etc > /var/log/plakar-backup.log 2>&1
要获得详细输出,使用全局-trace标志(放在at之前):
plakar -trace all at /var/backups/plakar backup /etc > /var/log/plakar-debug.log 2>&1
后续步骤
你的备份现在按计划运行,但它们与所保护的数据位于同一块磁盘上。磁盘故障、勒索软件或被入侵的服务器会同时摧毁两者。
将你的备份转移到异地。使用 Plakar 进行异地备份和复制介绍了如何使用plakar sync将快照复制到远程服务器或S3兼容存储。
版权所有 2026 Virtua.Cloud。保留所有权利。 本内容为 Virtua.Cloud 团队原创作品。 未经书面许可,禁止复制、转载或再分发。