使用partclone备份磁盘分区
在linux中,最常用的 block level
备份工具应该非 dd
莫属了。 然而用 dd
做磁盘备份有一个不好的地方就是太费空间,磁盘多大,生成的备份文件就有多大。
partclone 跟 dd
类似,也是一款 block level
的备份工具,因此使用它你无需担心会破坏磁盘中 acls
或 selinux labels
这一类特殊的文件权限。
但是跟 dd
相比, partclone
能够识别大多数常见的文件类型,只备份磁盘中用到的那些block,从而大大减少备份所耗的空间。
目前 partclone
支持的文件系统格式包括ext2, ext3, ext4, hfs+, reiserfs, xfs, jfs, ntfs, fat(12/16/32), exfat。
对每种文件系统 partclone
都提供了对应的 partclone.<fs>
对应。比如备份 ext4
文件系统则使用 parclone.ext4
进行备份。
对于不支持的文件系统, partclone
也提供了 partclone.dd
来备份。
安装partclone
archlinux上可以直接使用pacman来安装:
sudo pacman -S partclone --noconfirm
resolving dependencies... looking for conflicting packages... [0;1mPackages (1)[0m partclone-0.2.89-2 [0;1mTotal Installed Size:[0m 1.48 MiB [0;1mNet Upgrade Size: [0m 0.00 MiB [1;34m::[0;1m Proceed with installation? [Y/n] [0m (0/1) checking keys in keyring [[1;33mc[m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m] 0% (1/1) checking keys in keyring [----------------------] 100% (0/1) checking package integrity [[1;33mc[m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m] 0% (1/1) checking package integrity [----------------------] 100% (0/1) loading package files [[1;33mc[m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m] 0% (1/1) loading package files [----------------------] 100% (0/1) checking for file conflicts [[1;33mc[m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m] 0% (1/1) checking for file conflicts [----------------------] 100% (0/1) checking available disk space [[1;33mc[m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m] 0% (1/1) checking available disk space [----------------------] 100% [1;34m::[0;1m Processing package changes... [0m(1/1) reinstalling partclone [[1;33mc[m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m] 0% (1/1) reinstalling partclone [----------------------] 100% [1;34m::[0;1m Running post-transaction hooks... [0m(1/1) Arming ConditionNeedsUpdate...
备份磁盘分区
在备份磁盘分区之前,请先确保被备份的分区需要先卸载。不过如果你是用的 lvm
,那么可以创建一个逻辑卷的 live snapshot,因此可以不受此限制。
下面这个例子,我把安装好的orangepilite做个备份。
将orangepilite断电后,推出TF卡,然后插入读卡器中,插入电脑的USB接口。然后执行
sudo partclone.ext4 -c -s /dev/sdb1 -o /mnt/orangepilite.pcl
其中:
- -c
- 表示clone一个备份
- -s
- 指定clone的源
- -o
- 指定保存的镜像文件
你会发现,虽然TF卡是8G,但是产生的orangepilite.pcl只有1.3G
[lujun9972@T520 lujun9972]$ ls -lh /mnt/orangepilite.pcl -rw------- 1 root root 1.3G 3月 8 21:23 /mnt/orangepilite.pcl
不过更多的时候,我们会对镜像文件压缩存储,我们可以让 partclone
与 gzip
连用实现这一点
sudo bash -c "partclone.ext4 -c -s /dev/sdb1 |gzip -c -9 >/mnt/orangepilite.pcl.gz"
最后产生的备份文件只有454M
[lujun9972@T520 lujun9972]$ ls -lh /mnt/orangepilite.pcl.gz -rw-r--r-- 1 root root 454M 3月 8 21:34 /mnt/orangepilite.pcl.gz
相比之下,用 dd
备份后压缩的大小为5.4G!
[lujun9972@T520 mnt]$ sudo bash -c "dd if=/dev/sdb1 | gzip -c -9 >/mnt/orangepilite.dd.gz" 记录了15205152+0 的读入 记录了15205152+0 的写出 7785037824 bytes (7.8 GB, 7.3 GiB) copied, 601.261 s, 12.9 MB/s [lujun9972@T520 mnt]$ ls -l /mnt/orangepilite.dd.gz -rw-r--r-- 1 root root 5791589654 3月 8 21:49 /mnt/orangepilite.dd.gz [lujun9972@T520 mnt]$ ls -lh /mnt/orangepilite.dd.gz -rw-r--r-- 1 root root 5.4G 3月 8 21:49 /mnt/orangepilite.dd.gz
从备份还原
从备份还原很简单
sudo partclone.ext4 -r -s /mnt/orangepilite.pcl -o /dev/sdb1
这里 -r
表示还原(restore),然后把上面备份的 -s
和 -o
参数值反过来就是了。
若备份的是压缩过的文件,则只需要运行
sudo bash -c "gzip -c -d /mnt/orangepilite.pcl.gz | partclone.ext4 -r -o /dev/sdb1"