Pao*_*olo 11 filesystems backup rsync rsnapshot
我计划使用 rsnapshot 来备份我的整个 Linux 系统,尽管我对-x
选项感到困惑(与one_fs
in相同rsnapshot.conf
)。手册页说:
-x 一个文件系统,不要在每个备份点内跨分区
我知道这不是特定的 rsnapshot 选项,因为 rsync、cp、tar 和其他命令也提供此功能。
文件系统边界是指不同的分区吗?不同的挂载点?不“交叉”它们是什么意思?
回到我的情况,我读到很多人建议使用-x
rsnapshot,但我想知道这样做是否会影响我备份的完整性。我想备份下的一切/
,包括/boot
和/home
,它驻留在同一磁盘的专用分区,而在同一时间,我不想备份的文件和目录不严格属于我的系统,如/mnt
,/media
等。
mount
在我的系统上执行命令给出以下输出。实际上,使用rsnapshot -x
,什么会被包括在内,什么会被排除在外?
/dev/sda7 on / type ext4 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
udev on /dev type devtmpfs (rw,mode=0755)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
tmpfs on /tmp type tmpfs (rw,noexec,nosuid)
tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none on /run/shm type tmpfs (rw,nosuid,nodev)
/dev/sda6 on /boot type ext3 (rw)
/dev/sda8 on /home type ext4 (rw)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,noexec,nosuid,nodev)
gvfs-fuse-daemon on /home/myuser/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev,user=myuser)
Run Code Online (Sandbox Code Playgroud)
Gil*_*il' 15
“不要跨越文件系统边界”意味着“不要查看挂载点内部”。文件系统之间的边界是挂载点。实际上,这意味着“仅作用于指定的分区”,但并非所有文件系统都在一个分区上。请参阅典型 Linux 系统上存在哪些挂载点?
进行备份时,应避免使用许多文件系统,尤其是:
/proc
, /sys
, ...)动态生成的文件系统;/tmp
, /dev/shm
, ...);要备份的文件系统只是与磁盘存储相对应的文件系统。许多系统只有一个这样的文件系统,挂载在根目录上/
。你能告诉因为它们的源(第一列标题为“文件系统”的的哪个文件系统对应于磁盘上的存储df
之前输出,第一列on
的的mount
输出)是磁盘卷(一个PC型分区如/dev/sda1
,LVM逻辑卷这样如/dev/mapper/mygroup-mylogicalvolume
,……)。
有一些微妙之处可以使确定要备份的文件系统比仅查看源文件是否在磁盘上更难:
mount --bind
; 只应备份其中之一。在您的系统上,要备份的文件系统/dev/sda7
安装在/
、/dev/sda6
安装在/boot
和/dev/sda8
安装在 上/home
。所以你应该告诉 rsnapshot 备份这三个目录。您几乎应该总是使用-x
带有 rsnapshot的选项。
为了简化事情,让我们只考虑两个分区。假设运行mount
实际上产生了以下输出:
/dev/sda1 on / type ext4 (rw,errors=remount-ro)
/dev/sda2 on /home type ext4 (rw)
Run Code Online (Sandbox Code Playgroud)
当然,这是完全不现实的(/dev
不会被填充,大量的东西依赖于sysfs
和procfs
等)。让我们忽略它。
跨越文件系统边界意味着进入一个目录,其中底层文件系统(通常对应于底层分区)是不同的。通常当有人谈论跨越文件系统边界时,他们是在向下或向上遍历目录树的上下文中谈论它。
作为我的意思的一个例子,以git
. 要确定目录是否是 Git 存储库,git
首先检查当前工作目录中是否有名为“.git”的文件夹。如果有,它是一个 Git 存储库。如果没有,git
将对当前目录的父目录执行相同的检查,依此类推。默认情况下,Git 会一直这样检查,直到文件系统边界(或一旦到达/
),此时它会放弃并假设当前工作目录实际上不是 Git 存储库。
说你跑git status
进去了~/Desktop
。Git 检查是否有~/Desktop/.git
目录...不。Git 现在将检查父目录:是否有~/.git
? 不。这是文件系统边界发挥作用的地方:因为/home
是一个单独的分区,而不是检查/home/.git
,git
将放弃,向控制台打印警告,并假设当前工作目录不是 Git 存储库。它拒绝跨越文件系统边界。