本教程将介绍如何通过使用btrfs文件系统的Ubuntu 12.10系统上的apt-btrfs-snapshot来恢复失败的apt操作(如apt-get upgrade
)并回滚到先前的系统状态。 apt-btrfs-snapshot在apt操作之前创建系统的快照。 能够在失败的apt操作之后轻松恢复以前的系统状态,从而消除了系统管理员正常处理的许多痛苦,并且是btrfs文件系统的最大功能之一。
我不会保证这将为您工作!
1初步说明
在本教程中,我将整个系统安装在btrfs文件系统上,即ext文件系统上没有单独的/ boot
分区。 如果您使用单独的/ boot
分区,并且apt在该分区(如新内核)中安装任何内容,则无法使用apt-btrfs-snapshot撤销对/ boot
分区的更改,只能在btrfs分区上进行更改。
我的硬盘驱动器在本教程中命名为/ dev / sda
,我的系统分区是/ dev / sda1
。
Ubuntu用户注意事项:
因为我们必须使用root权限运行本教程的所有步骤,所以我们可以使用字符串sudo
在本教程中添加所有命令,也可以通过键入来成为root
sudo su
2安装apt-btrfs-snapshot
apt-btrfs-snapshot可以安装如下:
apt-get install apt-btrfs-snapshot
要检查apt-btrfs-snapshot是否能够在apt操作上创建快照,请运行
apt-btrfs-snapshot supported
应该显示:
root@server1:~# apt-btrfs-snapshot supported
Supported
root@server1:~#
如果没有,您的btrfs子体积布局可能不同于Ubuntu的默认布局,如下所示:
-
@
subvolume:挂载到/
。 - @home subvolume:挂载到
/ home
。
这是默认的Ubuntu子体积布局:
btrfs subvolume list /
root@server1:~# btrfs subvolume list /
ID 256 top level 5 path @
ID 258 top level 5 path @home
root@server1:~#
如果apt-btrfs-snapshot支持您的系统,则可以继续执行第3章。
3做一个合适的操作
现在让我们做一些apt -get升级的apt操作
来测试我们是否可以回滚到之前的状态。
更新您的包数据库...
apt-get update
...并升级您的系统:
apt-get upgrade
root @ server1:〜#apt-get升级
阅读包列表...完成
构建依赖关系树
阅读状态信息...完成
以下软件包已被保留:
linux-headers-generic-linux-image-generic
以下软件包将升级:
apport基础文件isc-dhcp-client isc-dhcp-common libwhoopsie0 linux-generic lsb-base lsb-release python3-apport python3-distupgrade python3-problem-report python3.2 python3.2-minimal
ubuntu-release-upgrader-core vim vim-common vim-runtime vim-tiny whoopsie
19升级,0新安装,0删除和2未升级。
需要获得14.4 MB的档案。
此操作后,将使用3,072 B个额外的磁盘空间。
是否要继续[Y / n]?
< - ENTER
获取:1 http://de.archive.ubuntu.com/ubuntu/量化更新/主要基础文件amd64 6.5ubuntu12 [69.6 kB]
获取:2 http://de.archive.ubuntu.com/ubuntu/ quantal-updates / main whoopsie amd64 0.2.7 [25.1 kB]
获取:3 http://de.archive.ubuntu.com/ubuntu/ quantal-updates / main libwhoopsie0 amd64 0.2.7 [7,054 B]
获取:4 http://de.archive.ubuntu.com/ubuntu/ quantal-updates / main lsb-base all 4.0-0ubuntu26.1 [10.3 kB]
获取:5 http://de.archive.ubuntu.com/ubuntu/ quantal-updates / main isc-dhcp-client amd64 4.2.4-1ubuntu10.1 [775 kB]
获取:6 http://de.archive.ubuntu.com/ubuntu/ quantal-updates / main isc-dhcp-common amd64 4.2.4-1ubuntu10.1 [836 kB]
获取:7 http://de.archive.ubuntu.com/ubuntu/ quantal-updates / main lsb-release all 4.0-0ubuntu26.1 [10.7 kB]
获取:8 http://de.archive.ubuntu.com/ubuntu/ quantal-updates / main python3.2 amd64 3.2.3-6ubuntu3.1 [2,585 kB]
获取:9 http://de.archive.ubuntu.com/ubuntu/ quantal-updates / main python3.2-minimal amd64 3.2.3-6ubuntu3.1 [1,798 kB]
获取:10 http://de.archive.ubuntu.com/ubuntu/ quantal-updates / main vim amd64 2:7.3.547-4ubuntu1.1 [1,051 kB]
获取:11 http://de.archive.ubuntu.com/ubuntu/ quantal-updates / main vim-tiny amd64 2:7.3.547-4ubuntu1.1 [413 kB]
获取:12 http://de.archive.ubuntu.com/ubuntu/ quantal-updates / main vim-runtime全部2:7.3.547-4ubuntu1.1 [6,317 kB]
获取:13 http://de.archive.ubuntu.com/ubuntu/ quantal-updates / main vim-common amd64 2:7.3.547-4ubuntu1.1 [85.7 kB]
获取:14 http://de.archive.ubuntu.com/ubuntu/ quantal-updates / main ubuntu-release-upgrader-core all 1:0.190.4 [27.7 kB]
获取:15 http://de.archive.ubuntu.com/ubuntu/ quantal-updates / main python3-distupgrade all 1:0.190.4 [141 kB]
获取:16 http://de.archive.ubuntu.com/ubuntu/ quantal-updates / main python3-problem-report all 2.6.1-0ubuntu6 [9,578 B]
获取:17 http://de.archive.ubuntu.com/ubuntu/ quantal-updates / main python3-apport all 2.6.1-0ubuntu6 [85.7 kB]
获取:18 http://de.archive.ubuntu.com/ubuntu/ quantal-updates / main apport全部2.6.1-0ubuntu6 [164 kB]
获取:19 http://de.archive.ubuntu.com/ubuntu/ quantal-updates / main linux-generic amd64 3.5.0.18.21 [1,714 B]
在2s中提取了14.4 MB(5,465 kB / s)
支持的
在'/ tmp / apt-btrfs-snapshot-mp-jnW7I _ / @ apt-snapshot-2012-11-22_11:50:38'中创建'/ tmp / apt-btrfs-snapshot-mp-jnW7I _ / @
(读取数据库... 52666当前安装的文件和目录。)
准备替换基础文件6.5ubuntu11(使用... / base-files_6.5ubuntu12_amd64.deb)...
开箱更换基础文件...
man-db的处理触发器
正在处理触发安装信息...
plymouth-theme-ubuntu-text的处理触发器
update-initramfs:延迟更新(触发器激活)
initramfs工具的处理触发器...
update-initramfs:生成/boot/initrd.img-3.5.0-17-generic
设置基础文件(6.5ubuntu12)...
(读取数据库... 52666当前安装的文件和目录。)
准备替换whoopsie 0.2.5(使用... / whoopsie_0.2.7_amd64.deb)...
whoopsie停止/等待
开箱更换whoopsie ...
准备替换libwhoopsie0 0.2.5(使用... / libwhoopsie0_0.2.7_amd64.deb)...
开箱更换libwhoopsie0 ...
准备替换lsb-base 4.0-0ubuntu26(使用... / lsb-base_4.0-0ubuntu26.1_all.deb)...
拆箱更换lsb-base ...
ureadahead的处理触发器
ureadahead将在下次重新启动时重新启动
设置lsb-base(4.0-0ubuntu26.1)...
(读取数据库... 52666当前安装的文件和目录。)
准备替换isc-dhcp-client 4.2.4-1ubuntu10(使用... / isc-dhcp-client_4.2.4-1ubuntu10.1_amd64.deb)...
开箱更换isc-dhcp-client ...
准备替换isc-dhcp-common 4.2.4-1ubuntu10(使用... / isc-dhcp-common_4.2.4-1ubuntu10.1_amd64.deb)...
开箱更换isc-dhcp-common ...
准备替换lsb-release 4.0-0ubuntu26(使用... / lsb-release_4.0-0ubuntu26.1_all.deb)...
开箱更换lsb-release ...
准备替换python3.2 3.2.3-6ubuntu3(使用... / python3.2_3.2.3-6ubuntu3.1_amd64.deb)...
开箱更换python3.2 ...
准备替换python3.2-minimal 3.2.3-6ubuntu3(使用... / python3.2-minimal_3.2.3-6ubuntu3.1_amd64.deb)...
开箱更换python3.2-minimal ...
准备替换vim 2:7.3.547-4ubuntu1(使用... / vim_2%3a7.3.547-4ubuntu1.1_amd64.deb)...
开箱更换vim ...
准备替换vim-tiny 2:7.3.547-4ubuntu1(使用... / vim-tiny_2%3a7.3.547-4ubuntu1.1_amd64.deb)...
开箱更换vim-tiny ...
准备替换vim-runtime 2:7.3.547-4ubuntu1(使用... / vim-runtime_2%3a7.3.547-4ubuntu1.1_all.deb)...
拆包替换vim-runtime ...
准备替换vim-common 2:7.3.547-4ubuntu1(使用... / vim-common_2%3a7.3.547-4ubuntu1.1_amd64.deb)...
开箱更换vim-common ...
准备替换ubuntu-release-upgrader-core 1:0.190.1(使用... / ubuntu-release-upgrader-core_1%3a0.190.4_all.deb)...
开箱更换ubuntu-release-upgrader-core ...
准备替换python3-distupgrade 1:0.190.1(使用... / python3-distupgrade_1%3a0.190.4_all.deb)...
拆包替换python3-distupgrade ...
准备替换python3问题报告2.6.1-0ubuntu3(使用... / python3-problem-report_2.6.1-0ubuntu6_all.deb)...
开箱更换python3问题报告...
准备替换python3-apport 2.6.1-0ubuntu3(使用... / python3-apport_2.6.1-0ubuntu6_all.deb)...
开箱更换python3-apport ...
准备替换apport 2.6.1-0ubuntu3(使用... / apport_2.6.1-0ubuntu6_all.deb)...
apport停止/等待
开箱更换apport ...
准备替换linux-generic 3.5.0.17.19(使用... / linux-generic_3.5.0.18.21_amd64.deb)...
拆包替换linux-generic ...
man-db的处理触发器
mime支持的处理触发器...
ureadahead的处理触发器
设置libwhoopsie0(0.2.7)...
设置whoopsie(0.2.7)...
whoopsie开始/运行,过程7859
设置isc-dhcp-common(4.2.4-1ubuntu10.1)...
设置isc-dhcp-client(4.2.4-1ubuntu10.1)...
设置lsb-release(4.0-0ubuntu26.1)...
设置python3.2-minimal(3.2.3-6ubuntu3.1)...
设置python3.2(3.2.3-6ubuntu3.1)...
设置vim-common(2:7.3.547-4ubuntu1.1)...
设置vim-runtime(2:7.3.547-4ubuntu1.1)...
处理/ usr / share / vim / addons / doc
设置vim(2:7.3.547-4ubuntu1.1)...
设置vim-tiny(2:7.3.547-4ubuntu1.1)...
设置python3-distupgrade(1:0.190.4)...
设置ubuntu-release-upgrader-core(1:0.190.4)...
设置python3问题报告(2.6.1-0ubuntu6)...
设置python3-apport(2.6.1-0ubuntu6)...
设置apport(2.6.1-0ubuntu6)...
apport启动/运行
设置linux-generic(3.5.0.18.21)...
libc-bin的处理触发器
ldconfig延期处理正在进行中
root @ server1:〜#
如您所见,apt-btrfs-snapshot在升级之前自动创建为我们系统的快照(
在本示例中称为@ apt-snapshot-2012-11-22_11:50:38
)。 你可以检查一下...
btrfs subvolume list /
root@server1:~# btrfs subvolume list /
ID 256 top level 5 path @
ID 258 top level 5 path @home
ID 260 top level 5 path @apt-snapshot-2012-11-22_11:50:38
root@server1:~#
...和:
apt-btrfs-snapshot list
root@server1:~# apt-btrfs-snapshot list
Available snapshots:
@apt-snapshot-2012-11-22_11:50:38
root@server1:~#
4回滚
现在让我们假设最后一次操作将我们的工作系统变成一个不再像预期的那样工作了。 这就是为什么我们要恢复以前的系统状态,也就是说我们想做一个回滚。
因此,我们将btrfs文件系统安装到一个单独的位置,例如/ mnt
:
mount /dev/sda1 /mnt
我们现在可以看到我们的子体积的输出:
ls -l /mnt/
root@server1:~# ls -l /mnt/
total 0
drwxr-xr-x 1 root root 230 Nov 22 10:46 @
drwxr-xr-x 1 root root 230 Nov 22 10:46 @apt-snapshot-2012-11-22_11:50:38
drwxr-xr-x 1 root root 26 Nov 22 10:57 @home
root@server1:~#
@ apt-snapshot-2012-11-22_11:50:38
是在apt操作之前我们的工作根文件系统( @
)的快照。 为了使系统从该工作快照而不是当前的子卷启动,我们将@
重命名为别的东西,然后将@ apt-snapshot-2012-11-22_11:50:38
更改为@
:
mv /mnt/@ /mnt/@_badroot
mv /mnt/@apt-snapshot-2012-11-22_11:50:38 /mnt/@
现在重启:
reboot
5检查回滚是否成功
重新启动后,我们应该检查回滚是否成功。 为此,我们重复使我们的系统无法使用的apt操作,例如:
apt-get update
apt-get upgrade
如果回滚成功, apt-get升级
应显示与以前更新相同的软件包(因为这只是检查回滚是否成功,不要再次安装更新):
root @ server1:〜#apt-get升级
阅读包列表...完成
构建依赖关系树
阅读状态信息...完成
以下软件包已被保留:
linux-headers-generic-linux-image-generic
以下软件包将升级:
apport基础文件isc-dhcp-client isc-dhcp-common libwhoopsie0 linux-generic lsb-base lsb-release python3-apport python3-distupgrade python3-problem-report python3.2 python3.2-minimal
ubuntu-release-upgrader-core vim vim-common vim-runtime vim-tiny whoopsie
19升级,0新安装,0删除和2未升级。
需要获得0 B / 14.4 MB的档案。
此操作后,将使用3,072 B个额外的磁盘空间。
是否要继续[Y / n]?
< - n
6删除@子卷(可选)
如果您确定回滚成功,并且您不再需要旧的@
子卷(现在名为@_badroot
),则可以将其删除以释放一些空间。
mount /dev/sda1 /mnt
ls -l /mnt/
root@server1:~# ls -l /mnt/
total 0
drwxr-xr-x 1 root root 230 Nov 22 10:46 @
drwxr-xr-x 1 root root 230 Nov 22 10:46 @_badroot
drwxr-xr-x 1 root root 26 Nov 22 10:57 @home
root@server1:~#
btrfs subvolume delete /mnt/@_badroot
umount /mnt
7链接
- btrfs: https : //btrfs.wiki.kernel.org/index.php/Main_Page
- Ubuntu: http : //www.ubuntu.com/