备份 Ext4 分区的正确姿势

2022-07-27 15:13:01 +08:00
 monetto

如题,有一个 Ubuntu 系统的 U 盘,想要做全盘备份,但是看了下 Diskgenius 全盘备份功能必须 付费版才能使用。

由于 U 盘比较大( 256G ),无法使用 dd 命令进行备份(也需要 256G 空间以供备份)

求大佬,大容量 Ext4 分区备份的正确姿势是什么

6397 次点击
所在节点    Linux
72 条回复
pagxir
2022-07-27 17:36:16 +08:00
@codehz 预取是文件系统提供的功能,甚至 page cache 都是跟文件系统挂钩的。没有 mount 文件系统的磁盘就是裸设备。没人会在 mount 分区可写下去做这种全盘备份吧,内核可没有义务保证这种情况下的一致性。
ToughGuy
2022-07-27 17:51:22 +08:00
tar -czvpf /full-backup.tar.gz --exclude=/full-backup.tar.gz --exclude=/dev --exclude=/sys --exclude=/proc --exclude=/run /
codehz
2022-07-27 17:54:33 +08:00
@pagxir (建议复习 linux 基本知识,块设备和裸设备不是一个概念,而且磁盘必然是块设备,裸设备(实际属于字符设备)要手动绑定到块设备上才可以使用(裸设备和分区与否没有任何关系,如果有,一定是有人把 raw disk 翻译成裸设备了)可以参考部分发行版提供的 raw 命令的相关说明
预读显然也是块设备提供的基本功能(不妨看下 blockdev 命令),还有 page cache 也是,你甚至可以直接对块设备进行 mmap 操作
codehz
2022-07-27 18:00:49 +08:00
codehz
2022-07-27 18:04:08 +08:00
@pagxir 此外 5.14 内核已经彻底移除裸设备功能,有需要的只能通过 O_DIRECT 参数打开块设备
https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git/commit/?h=char-misc-next&id=603e4922f1c81fc2ed3a87b4f91a8d3aafc7e093
autoxbc
2022-07-27 18:49:03 +08:00
Clonezilla 是个完整的备份解决方案,不过大多数情况可能只需要其核心 Partclone
pagxir
2022-07-27 19:31:38 +08:00
@codehz 没有挂着的磁盘就是没有预读功能。你不信我也没办法
pagxir
2022-07-27 19:36:49 +08:00
这里的裸本来就是特指裸,而你得把它变成专用名词
duke807
2022-07-27 19:46:05 +08:00
resize2fs 缩小后再 dd
dd 时还可配合 gzip
documentzhangx66
2022-07-27 19:52:20 +08:00
@codehz

1.gzip 是文件级别,而且还忽略了很多东西,比如磁盘格式、分区、权限,等等。

2.使用 dd 也是无奈的选择,因为它会对所有 block 做备份与恢复,即使这些 block 并没有数据。

3.目前最好的选择是 Symantec Ghost ,但它只支持 Windows ,而且早就停止更新了。它之所以好,是因为它把所有的东西都处理了,并且在备份、还原时,不会去处理没有数据的 block 。
pagxir
2022-07-27 20:06:57 +08:00
@duke807 其实 fstrim 之后再压缩大小也差不多,就是有些磁盘不支持 trim
codehz
2022-07-27 21:06:28 +08:00
@documentzhangx66 很抱歉,dd 也只是单纯的用 open + read + seek + write 这四个 api 在做文件操作,除了 iflag 可以多指定一些打开参数之外,没有任何魔法 https://github.com/coreutils/coreutils/blob/master/src/dd.c 除了成片的参数解析代码之外,根本没有你所说的磁盘格式,分区,权限的处理(当然,还是有别的操作的,比如可以做编码转换,但是我相信你不会在备份的时候考虑这个吧),
我相信你肯定会读代码的吧
但是如果不会,可以考虑挂一个 strace 跟踪下到底运行了哪些系统调用,我这帮你列出来好了(除去周围 glibc 的调用,命令是 dd if=/dev/sda of=/tmp/x bs=512 count=1

openat(AT_FDCWD, "/dev/sda", O_RDONLY) = 3
dup2(3, 0) = 0
close(3) = 0
lseek(0, 0, SEEK_CUR) = 0
openat(AT_FDCWD, "/tmp/x", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
dup2(3, 1) = 1
close(3) = 0
read(0, "3\300\216\320\274\0|\216\300\216\330\276\0|\277\0\6\271\0\2\374\363\244Ph\34\6\313\373\271\4\0"..., 512) = 512
write(1, "3\300\216\320\274\0|\216\300\216\330\276\0|\277\0\6\271\0\2\374\363\244Ph\34\6\313\373\271\4\0"..., 512) = 512
close(0) = 0
close(1) = 0

你总不能说 dd 用了神奇的魔法,它既能在源代码中隐藏,也能在 strace 跟踪的时候消失,然后做你所说的那些操作吧)
codehz
2022-07-27 21:58:50 +08:00
@pagxir 要不你解释下 /sys/block/<块设备名字>/queue/read_ahead_kb 这个是放着干啥的(
另外这有一份解释 VFS 和块设备的 ppt
http://devarea.com/wp-content/uploads/2017/10/Linux-VFS-and-Block.pdf
这是 linux readahead 实现的相关代码
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/mm/readahead.c
以及 backing-dev.c filemap.c 等文件里( filemap 和 filesystem 毫无关联),搜索 ra_pages 就可以找到不少相关实现
除了同名系统调用的实现是在通知 vfs 之外(总不能让用户程序自己算文件在磁盘上的位置吧,所以这部分计算得委托给 vfs 实现),其他部分均与 vfs 无关,readahead 操作就是在块设备层面实现的
你定义里的裸磁盘也就是块设备,当然也会用到这里的 readahead 能力
zyq2280539
2022-07-27 22:31:23 +08:00
dd 备份不就完事儿了,备份完在压缩一下 img 文件就可以了,我就是这么用的,需要的时候找个大硬盘解压了重新写进去就完事儿了
neutrinos
2022-07-27 23:43:22 +08:00
@duke807 是 dd 后再 resize2fs 吧?
fox0001
2022-07-27 23:48:55 +08:00
个人比较喜欢用 rsync ,生成镜像盘
lirunext
2022-07-27 23:55:49 +08:00
如果只是想简单省事,用成熟的商业软件可能会是一个比较好的选择。Acronis True Image 这款软件操作简单,我试过可以备份 NTFS 的 Windows 和 APFS 的 macOS ,官方宣传支持的文件系统中也含有 Ext4 ,http://www.tieten.cn/acronis/personal/ATI2021/index.html
wtks1
2022-07-28 00:04:23 +08:00
用再生龙试试,这个备份 linux 设备还是很好用的
pagxir
2022-07-28 00:29:01 +08:00
@codehz 请你认真看文档说明
read_ahead_kb (RW)
Maximum number of kilobytes to read-ahead for filesystems on this block device.
pagxir
2022-07-28 00:35:40 +08:00
预读是依赖于 page cache ,而没挂文件系统的 block device 压根就没有 page cache 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/869026

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX