ubuntu系统备份还原(迁移)到另外一台电脑上
主要参考如下博客:
https://blog.csdn.net/zeg635702733/article/details/53992224
https://blog.csdn.net/qq_35523593/article/details/78545530
系统:ubuntu16.04.4LTS
1.首先用U盘制作一个Ubuntu16.04.4LTS的系统启动盘。
2.备份原理就是将系统文件压缩打包,还原就是解压压缩包。
由于Linux系统所有都是文件,只需要将系统打包即可。有些文件是系统运行中所产生的文件以及临时文件,可以不用打包。第一种打包方式,直接在Linux系统下压缩打包(发现tar在打包最后会报错,不会有影响)。
在新电脑上使用Live USB,其实就是刚刚用U盘做的系统启动盘,进入使用ubuntu。进入试用Ubuntu后,先获取root权限,sudopasswd root,更改root密码后,然后切换root用户。su root。
第二种打包方式(推荐使用),使用Live USB,其实就是刚刚用U盘做的系统镜像,进入试用,跟上面操作一样,然后再进行打包。
这两种都是亲自测试过,都可以。
挂载备份的系统硬盘.可以使用fdisk -l(比如root权限)查看硬盘号,确认那个是作为还原系统的硬盘。
3.对新硬盘先进行分区,如果未对硬盘进行分区过,硬盘是不会被挂载的。可通过sudo blkid,会告诉你有一块无法识别文件类型的硬盘。把新硬盘进行分区,建议分区要跟备份的那台电脑分区一致,也可不一致。(跟第五步有关系)
备注:通过LiveUSB只进行分区,发现把后面的步骤做完,电脑会提示找不到这块硬盘,这个没找到原因,希望看完这篇博客,并尝试解决的,欢迎在下面留言。不过本人是通过彻底装完系统后,将它的所有的分区文件全部替换掉。
4.备份系统(内容来源:https://blog.csdn.net/qq_35523593/article/details/78545530
)linux秉承一切皆文件的思想,系统备份就相当于把整个/(根目录)所有文件打包压缩保存。
备份前先切换到root用户,避免权限问题,然后切换到/(根目录)。
tar -cvpzf /media/zx/KINGSTON/ubuntu_backup@`date+%Y-%m+%d`.tar.gz --exclude=/proc --exclude=/tmp --exclude=/boot--exclude=/home --exclude=/lost+found --exclude=/media --exclude=/mnt--exclude=/run /
下面解释一下上面这条命令。tar就是一个打包命令。
打包文件放在的目录及打包文件名字。
* /media/zx/KINGSTON/ubuntu_backup@date+%Y-%m+%d.tar.gz
这里用了一个shell命令date+%Y-%m+%d用于获取当前时间,因为备份嘛,注明时间戳还是有必要的,然后.tar.gz是说明这个文件是用tar进行打包,gzip进行压缩的。所以要根据你自己情况换为你自己的备份文件目录和文件名。
参数:
-c: 新建一个备份文档
-v: 显示详细信息
-p: 保存权限,并应用到所有文件
-z: 用gzip压缩备份文档,减小空间
-f: 指定备份文件的路径
–exclude: 排除指定目录,不进行备份
Note: 注意–exclude参数,接下来谈谈那些目录没有备份,以及为什么不备份。
我的ubuntu系统,共有四个分区,分别是:/、/home、/boot、swap。
- 非常建议系统备份的时候按照分区进行分别备份,并且也不建议安装系统的时候只给系统分一个分区。有四个分区的好处是,一般系统坏了都是/分区的问题,/home没什么关系,所以这种情况,我可以只还原/分区,其他分区完全可以不用动,系统就可以恢复,会节省很多时间。
- 另外,为了保险起见,也可以对/home和/boot备份,但是备份频率完全没必要和/分区一样高。比如/分区每周备份一次,那/home和/boot完全可以一个月备份一次,因为这两个分区出问题的概率真的很小,而且变动也不会太频繁。
- 请注意,如果没有把/home或者/boot目录单独分一个区,一定不要加–exclude=/home或–exclude=/boot参数!!!
/proc:一个虚拟文件系统,系统运行的每一个进程都会自动在这个目录下面创建一个进程目录。既然是系统自动创建,也就没必要备份的必要了。
/tmp:一个临时文件夹,系统的一些临时文件会放在这里。
/lost+found:系统发生错误时(比如非法关机),可以在这里找回一些丢失文件。
/media:多媒体挂载点,像u盘、移动硬盘、windons分区等都会自动挂载到这个目录下。
/mnt:临时挂载点,你可以自己挂载一些文件系统到这里。
/run:系统从启动以来产生的一些信息文件。
/home:用户家目录,存放用户个人文件和应用程序。
/boot:和系统启动相关的文件,像grub相关文件都放在这里,这个目录很重要!
我再次强调一次,/home和/boot目录我实际也是做了备份的,备份命令和上面差不多,当然你也可以排除一些目录不进行备份,像我/home下面的虚拟机文件,太占空间了。
tar -cvpzf /media/zx/KINGSTON/ubuntu_home_backup@`date+%Y-%m-%d`.tar.gz /home
tar -cvpzf /media/zx/KINGSTON/ubuntu_boot_backup@`date+%Y-%m-%d`.tar.gz /boot
5.替换备份系统配置文件,以及修改启动文件中的UUID:
这一步很重要。如果你的boot,是单独分区,那么你要注意了!!!,你通过live USB,在一台安装好的ubuntu电脑上,进入试用,你看/boot下里面是没有文件的。如果是单独分区的,你通过sudo blkid,并且记住/ /boot /home swap的uuid,并且可以在/etc下的fstab文件里面找到这四个uuid值,文件的信息可自行百度,不在此说明。如果/boot没有单独挂载,那么fstab里面没有/boot的uuid信息。可以看到找到boot的uuid,他是单独挂载,通过uuid值找到挂载点进入单独挂载的boot下,原来启动文件在单独挂载的boot文件目录下。
在新电脑上通过liveUSB,进入试用,将之前备份的压缩包通过U盘拷贝过来,也可直接解压。开始解压
tar -xvpzf /media/zx/KINGSTON/ubuntu_boot_backup@2018-6-30.tar.gz-C
10da9d77-10c2-4978-9065-ed8194f23545(新硬盘的/挂载的uuid值)
mkdir proc tmp lost+found media mnt run
这个 /不是live USB的/ ,而是上面新硬盘的/,他是有uuid的,是单独挂载的。
接下来就是改配置文件了,把新硬盘的boot下面的grub目录下的grup.cfg里面的uuid替换掉,这里面很重要。如果没有把boot单独分区那么你只要将里面的uuid全部改成新硬盘的/的uuid,(考虑启动过程没有其他挂载的情况)。如果是单独分区的话,注意这个文件下还有boot的uuid的值,如果还有其他挂载,还有多个uuid值。所以更改uuid值要区分/、boot、其他挂载的uuid值。一般来说,这个文件里只有出现一个或者两个关于uuid的值(boot是否单独分区)。下面这句话改为/,boot的uuid值。
search --no-floppy --fs-uuid --set=root18c7c7d4-062a-4fde-86bc-c14c3d15199b(区别/和/boot的值,不要给错,不然会开不了机的)
grub.cfg文件内容:
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig usingtemplates
# from /etc/grub.d and settings from /etc/default/grub
#
### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
sethave_grubenv=true
load_env
fi
if [ "${next_entry}" ] ; then
setdefault="${next_entry}"
set next_entry=
save_envnext_entry
setboot_once=true
else
setdefault="0"
fi
if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
else
menuentry_id_option=""
fi
export menuentry_id_option
if [ "${prev_saved_entry}" ]; then
setsaved_entry="${prev_saved_entry}"
save_envsaved_entry
setprev_saved_entry=
save_envprev_saved_entry
setboot_once=true
fi
function savedefault {
if [ -z"${boot_once}" ]; then
saved_entry="${chosen}"
save_envsaved_entry
fi
}
function recordfail {
set recordfail=1
if [ -n"${have_grubenv}" ]; then if [ -z "${boot_once}" ]; thensave_env recordfail; fi; fi
}
function load_video {
if [x$feature_all_video_module = xy ]; then
insmodall_video
else
insmod efi_gop
insmod efi_uga
insmodieee1275_fb
insmod vbe
insmod vga
insmodvideo_bochs
insmodvideo_cirrus
fi
}
if [ x$feature_default_font_path = xy ] ; then
font=unicode
else
insmod part_msdos
insmod ext2
set root='hd0,msdos7'
if [ x$feature_platform_search_hint = xy ]; then
search--no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos7 --hint-efi=hd0,msdos7--hint-baremetal=ahci0,msdos7 c7f7a223-c4aa-47f7-8f87-70e5c07de8c1
else
search--no-floppy --fs-uuid --set=root c7f7a223-c4aa-47f7-8f87-70e5c07de8c1
fi
font="/share/grub/unicode.pf2"
fi
if loadfont $font ; then
set gfxmode=auto
load_video
insmod gfxterm
setlocale_dir=$prefix/locale
set lang=zh_CN
insmod gettext
fi
terminal_output gfxterm
if [ "${recordfail}" = 1 ] ; then
set timeout=30
else
if [x$feature_timeout_style = xy ] ; then
settimeout_style=hidden
set timeout=0
# Fallbackhidden-timeout code in case the timeout_style feature is
# unavailable.
elif sleep--interruptible 0 ; then
set timeout=0
fi
fi
### END /etc/grub.d/00_header ###
### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
if background_color 44,0,30,0; then
clear
fi
### END /etc/grub.d/05_debian_theme ###
### BEGIN /etc/grub.d/10_linux ###
function gfxmode {
setgfxpayload="${1}"
if ["${1}" = "keep" ]; then
setvt_handoff=vt.handoff=7
else
setvt_handoff=
fi
}
if [ "${recordfail}" != 1 ]; then
if [ -e${prefix}/gfxblacklist.txt ]; then
if hwmatch${prefix}/gfxblacklist.txt 3; then
if [ ${match}= 0 ]; then
setlinux_gfx_mode=keep
else
setlinux_gfx_mode=text
fi
else
setlinux_gfx_mode=text
fi
else
setlinux_gfx_mode=keep
fi
else
setlinux_gfx_mode=text
fi
export linux_gfx_mode
menuentry 'Ubuntu' --class ubuntu --class gnu-linux--class gnu --class os $menuentry_id_option 'gnulinux-simple-e763fea9-65c8-4985-956a-e835125e2ed0'{
recordfail
load_video
gfxmode$linux_gfx_mode
insmod gzio
insmodpart_msdos
insmod ext2
setroot='hd0,msdos5'
if [x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root--hint-bios=hd0,msdos5 --hint-efi=hd0,msdos5 --hint-baremetal=ahci0,msdos5 18c7c7d4-062a-4fde-86bc-c14c3d15199b
else
search --no-floppy --fs-uuid --set=root 18c7c7d4-062a-4fde-86bc-c14c3d15199b
fi
linux /vmlinuz-4.4.0-31-generic root=UUID=e763fea9-65c8-4985-956a-e835125e2ed0ro find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US quiet
initrd /initrd.img-4.4.0-31-generic
}
submenu 'Ubuntu 高级选项' $menuentry_id_option 'gnulinux-advanced-e763fea9-65c8-4985-956a-e835125e2ed0' {
menuentry 'Ubuntu,Linux 4.4.0-31-generic' --class ubuntu --class gnu-linux--class gnu --class os $menuentry_id_option'gnulinux-4.4.0-31-generic-advanced-e763fea9-65c8-4985-956a-e835125e2ed0' {
recordfail
load_video
gfxmode$linux_gfx_mode
insmodgzio
insmodpart_msdos
insmodext2
setroot='hd0,msdos5'
if [x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root--hint-bios=hd0,msdos5 --hint-efi=hd0,msdos5 --hint-baremetal=ahci0,msdos5 18c7c7d4-062a-4fde-86bc-c14c3d15199b
else
search --no-floppy --fs-uuid --set=root 18c7c7d4-062a-4fde-86bc-c14c3d15199b
fi
echo '载入 Linux 4.4.0-31-generic ...'
linux /vmlinuz-4.4.0-31-generic root=UUID=e763fea9-65c8-4985-956a-e835125e2ed0ro find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US quiet
echo '载入初始化内存盘...'
initrd /initrd.img-4.4.0-31-generic
}
menuentry'Ubuntu, with Linux 4.4.0-31-generic (recovery mode)' --class ubuntu --classgnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-31-generic-recovery-e763fea9-65c8-4985-956a-e835125e2ed0'{
recordfail
load_video
insmodgzio
insmodpart_msdos
insmodext2
setroot='hd0,msdos5'
if [x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root--hint-bios=hd0,msdos5 --hint-efi=hd0,msdos5 --hint-baremetal=ahci0,msdos5 18c7c7d4-062a-4fde-86bc-c14c3d15199b
else
search --no-floppy --fs-uuid --set=root 18c7c7d4-062a-4fde-86bc-c14c3d15199b
fi
echo '载入 Linux 4.4.0-31-generic ...'
linux /vmlinuz-4.4.0-31-generic root=UUID=e763fea9-65c8-4985-956a-e835125e2ed0ro recovery nomodeset find_preseed=/preseed.cfg auto noprompt priority=criticallocale=en_US
echo '载入初始化内存盘...'
initrd /initrd.img-4.4.0-31-generic
}
}
### END /etc/grub.d/10_linux ###
### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###
### BEGIN /etc/grub.d/20_memtest86+ ###
menuentry 'Memory test (memtest86+)' {
insmodpart_msdos
insmod ext2
setroot='hd0,msdos5'
if [x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root--hint-bios=hd0,msdos5 --hint-efi=hd0,msdos5 --hint-baremetal=ahci0,msdos5 18c7c7d4-062a-4fde-86bc-c14c3d15199b
else
search --no-floppy --fs-uuid --set=root 18c7c7d4-062a-4fde-86bc-c14c3d15199b
fi
knetbsd /memtest86+.elf
}
menuentry 'Memory test (memtest86+, serial console115200)' {
insmodpart_msdos
insmod ext2
setroot='hd0,msdos5'
if [x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root--hint-bios=hd0,msdos5 --hint-efi=hd0,msdos5 --hint-baremetal=ahci0,msdos5 18c7c7d4-062a-4fde-86bc-c14c3d15199b
else
search --no-floppy --fs-uuid --set=root 18c7c7d4-062a-4fde-86bc-c14c3d15199b
fi
linux16 /memtest86+.bin console=ttyS0,115200n8
}
### END /etc/grub.d/20_memtest86+ ###
### BEGIN /etc/grub.d/30_os-prober ###
### END /etc/grub.d/30_os-prober ###
### BEGIN /etc/grub.d/30_uefi-firmware ###
### END /etc/grub.d/30_uefi-firmware ###
### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menuentries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###
### BEGIN /etc/grub.d/41_custom ###
if [ -f ${config_directory}/custom.cfg ]; then
source${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then
source$prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###
红色为/usr的uuid值,蓝色为/的uuid值,黄色为boot的uuid值。
提醒:如果对grub.cfg这个文件不了解,建议对着备份系统的grub.cfg文件修改,此过程很重要!!!!!!!!!!!!!!
接下来改掉新硬盘的/etc/fstab下面的/,/boot,/home,swap,的uuid值(新硬盘的四个单独挂载uiid值)。
/dev/sda1:UUID="22dc6da0-1ec0-4634-8691-cc83af2aa8f3" TYPE="swap"
/dev/sda2:UUID="e763fea9-65c8-4985-956a-e835125e2ed0" TYPE="ext4"
/dev/sda5:UUID="18c7c7d4-062a-4fde-86bc-c14c3d15199b" TYPE="ext4"
/dev/sda6:UUID="7165cd11-fb03-422c-8fd5-1215d96b1806" TYPE="ext4"
/dev/sda7:UUID="c7f7a223-c4aa-47f7-8f87-70e5c07de8c1" TYPE="ext4"
还有一个分区是/usr的(/dev/sda7:UUID="c7f7a223-c4aa-47f7-8f87-70e5c07de8c1" TYPE="ext4")。
到了这一步系统是迁移完了,发现桌面不能启动。其实有没有桌面,无所谓。当时比较纠结这个问题,后来经同事的提醒,原来自己只是在/home下用户目录,并没有在用户目录下创建跟桌面有关的文件夹,后来跟备份系统用户下的创建一样的文件夹,熟悉的桌面就回来了。
现在一切迁移完成。关闭电脑,拔掉U盘,重启电脑!
网上还有一种方法就是通过remastersys打包成镜像文件安装,具体安装方式请参考这篇博客:https://blog.csdn.net/xiaqunfeng123/article/details/54287517,这也是一种不错的方式。有局限性:大于4G无法打包,显卡驱动不能打包(原因:http://klikit.pbworks.com/w/page/7315114/Remastersys%20-%20Limitations%20of%20remastering)。
总结:
Tar打包方式没有文件权限及其大小局限性,就是耗时间。
这两种方法都是可以的,都是测试过,可以根据自己的具体情况选取。
如有不懂,或者有错误欢迎指出来。本人邮箱:972839018@qq.com