BackupPC

出自 ArchWiki

BackupPC 是一个高性能、企业级的系统,用于将 Unix、Linux、WinXX 和 MacOSX 电脑、桌面电脑和笔记本电脑备份到服务器的磁盘。BackupPC 高度可配置,易于安装和维护。

鉴于磁盘和 raid 系统的成本不断降低,现在将大量机器备份到服务器的本地磁盘或网络存储是切实可行且经济高效的。对于某些站点,这可能是完整的备份解决方案。对于其他站点,可以通过定期将服务器备份到磁带创建额外的永久存档。

请注意,BackupPC 仅提供基于文件的备份和恢复。特别是,它不适合开箱即用的“热”数据库备份(尽管可以使用预备份钩子来转储数据库并进行“冷”备份);您将需要像 xtrabackup 这样的工具来实现此目的。此外,BackupPC 仅对打开的文件提供有限的处理。请务必阅读有关 BackupPC 的局限性,并在您实际需要求助于它进行真实操作之前测试备份和恢复周期。

安装

安装 backuppc。 如果您想使用 rsync 作为传输方式,请安装 rsyncperl-file-rsyncp,并安装 rrdtool 以在 CGI 界面中显示使用情况数据。

然后 启动/启用 backuppc.service

将数据目录放置在单独的分区

BackupPC 池默认存储在 /var/lib/backuppc 下,它也充当 backuppc 用户的家目录。此路径可以通过 /etc/backuppc/config.pl 中的 $Conf{TopDir} 条目进行更改。典型的理由是您将系统保存在快速但昂贵且小的 SSD 上,并且需要将备份存储在传统硬盘上,或者您希望将备份池保存在由 LVM 管理的分区上,以便能够根据不断变化的需求调整分区大小。

文档建议不要更改 $Conf{TopDir} 条目,而是使用符号链接。但是,这样做时要小心,因为 backuppc 的软件包升级将替换 /var/lib/backuppc 或任何默认子目录 cpoolpcpool 的符号链接,替换为空目录,且不会发出任何警告

因此,建议在 fstab 中使用绑定挂载而不是符号链接,或者故意忽略 /etc/backuppc/config.pl 中的建议并仍然更改 $Conf{TopDir}。或者,使用 pacman 的 pre- 和 post- transaction hooks,例如以下内容(记住使 shell 脚本 可执行

/etc/pacman.d/hooks/backuppc-restore-symlinks-post.hook
[Trigger]
Operation = Upgrade
Type = Package
Target = backuppc

[Action]
Description = Restore symlinks for BackupPC pool directories
When = PostTransaction
Exec = /etc/pacman.d/hooks/backuppc-restore-symlinks-post.sh
/etc/pacman.d/hooks/backuppc-restore-symlinks-post.sh
#!/usr/bin/bash

if [ ! -d /tmp/backuppc-symlinks-cache ]; then
    exit 0
fi

if [ -L /tmp/backuppc-symlinks-cache/backuppc ]; then
    rmdir /var/lib/backuppc/{cpool,pc,pool,}
    mv /tmp/backuppc-symlinks-cache/backuppc /var/lib/
    echo "==> Restored /var/lib/backuppc => $(readlink /var/lib/backuppc)"
fi

for dir in cpool pc pool; do
    if [ -L /tmp/backuppc-symlinks-cache/$dir ]; then
        rmdir /var/lib/backuppc/$dir
        mv /tmp/backuppc-symlinks-cache/$dir /var/lib/backuppc/
        echo "==> Restored /var/lib/backuppc/${dir} => $(readlink /var/lib/backuppc/$dir)"
    fi
done

if [ -f /tmp/backuppc-symlinks-cache/was-running ]; then
    echo '==> BackupPC service was stopped for upgrade.'
    echo '==> Check the configuration and run `systemctl start backuppc.service` to restart the service.'
    rm -f /tmp/backuppc-symlinks-cache/was-running
fi

rmdir --ignore-fail-on-non-empty /tmp/backuppc-symlinks-cache &>/dev/null
/etc/pacman.d/hooks/backuppc-restore-symlinks-pre.hook
[Trigger]
Operation = Upgrade
Type = Package
Target = backuppc

[Action]
Description = Stash symlinks for BackupPC pool directories
When = PreTransaction
Exec = /etc/pacman.d/hooks/backuppc-restore-symlinks-pre.sh
/etc/pacman.d/hooks/backuppc-restore-symlinks-pre.sh
#!/usr/bin/bash

if systemctl is-active backuppc.service &>/dev/null; then
    systemctl stop backuppc.service
    mkdir -p /tmp/backuppc-symlinks-cache
    touch /tmp/backuppc-symlinks-cache/was-running
fi

for dir in /var/lib/backuppc/{cpool,pc,pool,}; do
    if [ -L $dir ]; then
        mkdir -p /tmp/backuppc-symlinks-cache
        mv $dir /tmp/backuppc-symlinks-cache
    fi
done

Apache 配置

BackupPC 有一个 Web 界面,可让您轻松控制它。您可以使用 Apache 和 mod_perl 或 C 包装器访问它,但其他 Web 服务器(如 lighttpd)也可以工作。 安装 apache

编辑 Apache 配置

BackupPC 的 Web UI 需要以用户 backuppc 身份运行,但 Apache 通常在用户 http 下运行。有几种方法可以解决这个问题。此处演示的两种方法对于单用途服务器(Apache 仅用于服务 BackupPC UI)或多用途服务器(Apache 也可能在常规 http 用户下服务其他网站)都很常见。

为单用途使用设置 Apache 稍微容易一些,但不如灵活。

通用设置

编辑 /etc/backuppc/config.pl。设置管理员名称

$Conf{CgiAdminUsers} = 'admin'; 

接下来,我们需要添加一个用户文件并设置管理员密码

# htpasswd -c /etc/backuppc/backuppc.users admin

BackupPC-Webfrontend 最初配置为只能从本地主机访问。如果您想从网络中的所有机器访问它,则必须编辑 /etc/httpd/conf/extra/backuppc.conf。 编辑行

Require ip 127.0.0.1

改为

Require ip 127.0.0.1 192.168.0

您必须将 192.168.0 替换为您想要从中获得访问权限的相应 IP 地址。在也执行了以下配置步骤之一后,[重新]启动 Apache 服务。

单用途 Apache 设置

安装 mod_perlAUR

编辑 Apache 配置文件以加载 mod_perl,告诉 Apache 以用户 backuppc 身份运行,并包含 /etc/httpd/conf/extra/backuppc.conf

/etc/httpd/conf/httpd.conf
LoadModule perl_module modules/mod_perl.so
User backuppc
Group backuppc
Include conf/extra/backuppc.conf

多用途 Apache 设置

与上面的示例中全局更改 Apache 用户和组不同,我们将改为使 Apache 仅以 backuppc 用户身份运行 BackupPC CGI 脚本,并保持默认用户不变。此方法使用 mod_cgi 调用用 C 编写的包装器,而不是使用额外的 mod_perl 依赖项。您仍然需要安装 perl 本身,以便包装器可以运行 BackupPC 脚本。

确保 Apache 可以运行 CGI 程序(加载 mod_cgi 的行未注释),并且通过将其包含在 /etc/httpd/conf/extra/backuppc.conf 中来读取 BackupPC 配置

/etc/httpd/conf/httpd.conf
LoadModule cgi_module modules/mod_cgi.so
Include conf/extra/backuppc.conf
webserver 用户和 suid 问题

当前 BackupPC 的设置中,webserver 需要以 backuppc 用户身份运行,这在许多 webserver 用于其他站点的设置中可能是一个问题。过去,可以 suid Perl 脚本,但几年前由于安全问题而被全局阻止。为了解决这个问题,使用了 perl-suid,但最近由于同样的问题再次被阻止,脚本无法使用 suid 位安全地运行。不过,还有另一种方法,这次是使用一个简单的二进制程序,该程序被 suid 用作启动器,它将使用正确的用户运行 backuppc Perl 脚本。这隔离了 Perl 脚本与环境,并且被认为是安全的。

您需要将原始的 backuppc CGI 替换为下面编译的 C 代码程序,并将 backuppc CGI 移动到另一个位置。

将真正的 CGI /usr/share/backuppc/cgi-bin/BackupPC_Admin 移动到 lib 目录 /usr/share/backuppc/lib/real-BackupPC_Admin.cgi

将下面的 C 代码保存到名为 wrapper.c 的文件中(如果需要,请更新 CGI 路径),并使用以下命令编译它

$ gcc -o BackupPC_Admin wrapper.c
注意: 如果编译失败并显示错误 type of ‘ac’ defaults to ‘int’ ,您可以强制 gcc 使用 C89 标准,方法是
$ gcc -std=c89 -o BackupPC_Admin wrapper.c

wrapper C 代码

#include <unistd.h>
#define REAL_PATH "/usr/share/backuppc/lib/real-BackupPC_Admin.cgi"
int main(ac, av)
char **av;
{
   execv(REAL_PATH, av);
   return 0;
}

将新的二进制文件 BackupPC_Admin 放置在 cgi-bin 目录中,并将二进制 CGI 的所有者更改为 backuppc:http 并设置 suid 位

# chown backuppc:http /usr/share/backuppc/cgi-bin/BackupPC_Admin
# chmod 4750 /usr/share/backuppc/cgi-bin/BackupPC_Admin

如果原始 Perl 脚本已设置 suid 位,请不要忘记清除它(否则 CGI 页面将无法加载)

# chmod 0755 /usr/share/backuppc/lib/real-BackupPC_Admin.cgi

保持您的 Web 服务器使用其常用用户,备份现在应该能够正确运行。

注意: 请记住,本节中描述的修复将在每次软件包升级时被覆盖,从而导致 BackupPC_Admin 页面显示类似于 Error: Wrong user: my userid is 33, instead of 126(backuppc) 的消息。您将必须再次手动重新应用整个修改才能修复它。

替代 nginx 配置

安装 nginx-mainlinefcgiwrap

创建这两个目录 

# mkdir /etc/nginx/sites-available
# mkdir /etc/nginx/sites-enabled

编辑 nginx 配置文件以包含来自 sites-enabled 的配置文件,方法是在 http 块的末尾添加此内容 

/etc/nginx/nginx.conf
http {
    ...
    include sites-enabled/*;
}
/etc/nginx/sites-available/backuppc
server {
    listen <your_server_port>;
    server_name <your_server_name>;

    root  /usr/share/backuppc/html;
    index /index.cgi;

    access_log  /var/log/nginx/backuppc.access.log;
    error_log   /var/log/nginx/backuppc.error.log;

    location / {
        allow 127.0.0.1/32;
        # allow 192.168.0.0/24;
        deny all;

        # auth_basic "Backup";
        # auth_basic_user_file conf/backuppc.users;

        location /backuppc {
            alias /usr/share/backuppc/html;
        }

        location ~ \.cgi$ {
            include fastcgi_params;
            fastcgi_pass unix:/run/fcgiwrap.sock;

            fastcgi_param REMOTE_ADDR     $remote_addr;
            fastcgi_param REMOTE_USER     $remote_user;
            fastcgi_param SCRIPT_FILENAME /usr/share/backuppc/cgi-bin/BackupPC_Admin;
        }
    }
}

并符号链接到 sites-enabled

# ln -s /etc/nginx/sites-available/backuppc /etc/nginx/sites-enabled

编辑 fcgiwrap.service 文件中的执行用户为 backuppc

启用/启动 nginx.servicefcgiwrap.socket

如果您想使用基本身份验证,请取消注释上面的相应行并创建文件 /etc/nginx/conf/backuppc.users,其中包含所有允许的用户 

# echo -n 'myuser:' >> /etc/nginx/conf/backuppc.users
# openssl passwd -apr1 >> /etc/nginx/conf/backuppc.users

按照 Certbot#Nginx 创建 Let's Encrypt 证书并配置 TLS 证书。

替代 lighttpd 配置

/etc/lighttpd/lighttpd.conf
 server.port             = 81
 server.username         = "backuppc"
 server.groupname        = "backuppc"
 server.document-root    = "/srv/http"
 server.errorlog         = "/var/log/lighttpd/error.log"
 dir-listing.activate    = "enable"
 index-file.names        = ( "index.html", "index.php", "index.cgi" )
 mimetype.assign         = ( ".html" => "text/html", ".txt" => "text/plain", ".jpg" => "image/jpeg", ".png" => "image/png", "" => "application/octet-stream" )
 
 server.modules = ("mod_alias", "mod_cgi", "mod_auth", "mod_access" )
 
 alias.url               = ( "/BackupPC_Admin" => "/usr/share/backuppc/cgi-bin/BackupPC_Admin" )
 alias.url               += ( "/backuppc" => "/usr/share/backuppc/html" )
 
 cgi.assign              += ( ".cgi" => "/usr/bin/perl" )
 cgi.assign              += ( "BackupPC_Admin" => "/usr/bin/perl" )
 
 auth.backend = "plain"
 auth.backend.plain.userfile = "/etc/lighttpd/passwd"
 auth.require = ( "/BackupPC_Admin" => ( "method" => "basic", "realm" => "BackupPC", "require" => "user=admin" ) )
/etc/lighttpd/passwd
 admin:yourpassword

并创建日志文件

# touch /var/log/lighttpd/error.log
# chown backuppc:backuppc /var/log/lighttpd/error.log

访问管理页面

在访问管理页面之前,您必须指定哪些用户/组能够编辑 BackupPC 的配置。

/etc/backuppc/config.pl
$Conf{CgiAdminUserGroup} = '<authorized groups>';
$Conf{CgiAdminUsers}     = '<authorized users>';  # <-- set to '*' if the webserver is not autenticating users

浏览至 https://127.0.0.1/BackupPC_Admin 或 http://your_backuppc_server_ip/BackupPC_Admin。

网站视图问题

由于 Apache 指令,Web 界面可能无法正确显示。如果发生这种情况,只需修改 /etc/httpd/conf/httpd.conf 中的行,该行避免客户端查看 .htaccess 和 .htpasswd,或者将目录名称 /usr/share/backuppc/html 更改为 /usr/share/backuppc/files,并使用新路径更新 /etc/httpd/conf/extra/backuppc.conf,如下所示

/etc/httpd/conf/extra/backuppc.conf
Alias           /BackupPC/images        /usr/share/BackupPC/files/

参见