系统迁移

系统迁移

适用范围

  如果是Windows的迁移,用Diskgenius等软件可以很方便的迁移。这里是linux系统的迁移。

  打包Ubuntu/Linux系统,迁移到其他分区或电脑,也可以迁移到虚拟机,如迁移到VMware。

将系统迁移到实体机

  以下步骤或简要摘录,或原文粘贴,按先后顺序展开。经验证,该步骤可以成功迁移Ubuntu20.04系统。

1
2
3
graph LR
a((系统迁移))--tar-->b[打包]--gparted-->c[分区]--tar-->d[解压]--boot-repair-->e[修复引导]

一、tar命令打包Ubuntu系统

  先进入单用户模式:

1
sudo init 1

  如果想恢复图形界面,键入init 5,或者重启即可。

  打包方式列举两种,一种是直接打包,不使用压缩,后缀名为.tar,好处是后续方便追加文件到打包文件;另一种是压缩打包,后缀名为.tar.gz,好处是打包文件更小。当然也有别的压缩方式,此处不展开。

1. tar命令(直接打包)

  假设要将压缩包存储在U盘上,那么插入U盘,创建挂载点文件夹,然后挂载U盘到挂载点文件夹:

  lsblk查看挂载点(MOUNTPOINTS),以下仅为示意图,非实际应当展现的内容

1
2
3
4
5
root@OpenWrt:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sde 8:64 1 114.7G 0 disk
└─sde1 8:65 1 114.7G 0 part
root@OpenWrt:~#

  sde1为U盘分区(通过SIZE容量来判断),创建/mnt/sde1文件夹

1
mkdir /mnt/sde1

  挂载该盘到/mnt/sde1:

1
mount /dev/sde1 /mnt/sde1

  lsblk查看挂载点(MOUNTPOINTS),以下仅为示意图,非实际应当展现的内容

1
2
3
4
5
root@OpenWrt:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sde 8:64 1 114.7G 0 disk
└─sde1 8:65 1 114.7G 0 part /mnt/sde1
root@OpenWrt:~#

  可以看到已经挂载上了,挂载点为/mnt/sde1文件夹

  开始打包系统到U盘,压缩包名称随意,后缀名为tar或tar.gz,以下为backup.tar

1
tar -cvpf /mnt/sde1/backup.tar --exclude=/proc --exclude=/sys --exclude=/media --exclude=/mnt --exclude=/tmp / 

操作介绍

  • -tar :Tape Archive. 命令名
  • -c :create. 新建一个压缩文件。
  • -v :verbose. 输出详细信息。
  • -p :preserve-permissions. 连同文件的权限属性一起打包进去。
  • -f :指定要生成的压缩文件。
  • / :要打包的对象,为根目录及其所有子目录和文件。
  • --exclude : 后面一连串的 exclude 指明了打包过程中需要排除掉的对象。
    其中需要特别注意的是一定要排除掉生成的压缩文件本身,不然的话,自己打包自己,可能会导致意想不到的错误。这里已经排除掉了,因为压缩文件所在位置在/mnt/sde1中,而/mnt已经被排除掉了。在本例中我们忽略掉了这五个目录以减小压缩文件的大小:/proc /sys /media /mnt /tmp. 忽略掉这五个目录对于我们不会有实际影响,根据启蒙导师鸟哥的说法,这五个目录在 Linux 系统中的作用如下:
    • /proc:本身是一个『虚拟文件系统(virtual filesystem)』喔!他放置的数据都是在内存当中, 例如系统核心、行程信息(process)、周边装置的状态及网络状态等等。因为这个目录下的数据都是在内存当中, 所以本身不占任何硬盘。(这段描述很让人晕,本身不占用任何硬盘,但是在打包过程中如果把该目录也打包进去的话,打包过根本无法完成。感兴趣的朋友可以看一下该目录下有一个/proc/kcore 文件,如果使用 ls 命令查看的话,可以看到该文件的大小显示为 128T!)
    • /sys:这个目录其实跟/proc非常类似,也是一个虚拟的文件系统,主要也是记录与核心相关的信息。 包括目前已加载的核心模块与核心侦测到的硬件装置信息等等。这个目录同样不占硬盘容量
    • /media:media是『媒体』的英文,顾名思义,这个/media底下放置的就是可移除的装置。 包括软盘、光盘、DVD等等装置都暂时挂载于此。
    • /mnt:如果你想要暂时挂载某些额外的装置,一般建议你可以放置到这个目录中。 在古早时候,这个目录的用途与/media相同。只是有了/media之后,这个目录就用来暂时挂载用了。
    • /tmp:这是让一般使用者或者是正在执行的程序暂时放置文件的地方。 这个目录是任何人都能够存取的,所以你需要定期的清理一下。当然,重要数据不可放置在此目录啊! 因为FHS甚至建议在开机时,应该要将/tmp下的数据都删除。

2. gzip方式(打包并压缩)

1
tar -cvpzf backup.tar.gz --exclude=/backup.tar --exclude=/proc --exclude=/sys --exclude=/media --exclude=/mnt --exclude=/tmp / 
  • -z :gzip. 使用 gzip 压缩方式。

    ​ 该命令大概会耗费10分钟左右的时间,视打包文件大小和机器性能而定。

二、准备一个 Linux启动盘

  现在你已经得到一个 Linux 系统的压缩包了,你可以把它拷贝到 U 盘中。但是要将其还原到另一台机器中的话,我们还需要一个能启动的 Linux-Live U 盘。最好这个 Linux-Live 系统跟你所备份的源系统是同一个操作系统版本,这样的话可以避免一些意想不到的意外。比如说我备份的系统是 Ubuntu-20.04 那么我就用 Ubuntu-20.04 的 Live 系统来进行还原工作。

  你可以直接将压缩包放到已经做好的 Live 系统 U 盘中,或者你干脆使用两个 U 盘,这都无所谓。

  而至于如何制作 Linux-Live 系统 U 盘,这个在本文中便不做论述。我相信既然你会用 Linux 系统,那这个肯定难不倒你。

三、硬盘分区

  在进行这一步之前,请确保你知道你在做什么。以下教程假设你在一台全新的机器或者不包含需要留存的数据的机器中进行。根据以下教程操作,你将丢失所操作设备上的所有数据!

  好,我们现在已经进入到了一台新机器上的 Linux-Live 系统。

  首先,我们对新的机器进行一下分区。Linux 系统上有一个非常好用的图形化分区工具:gparted.

  使用如下命令来安装该程序:

1
sudo apt-get install gparted

  当然,要确保你的机器已经接入了互联网。

  之后,启动该程序。

1
sudo gparted

  使用该工具,我们将硬盘分成三个区。假设你的机器中装入了一块1024G的硬盘,设备号为 sda,则最终的分区结果如下 (注意:在后文的描述中,sda 均指代我们要进行操作系统恢复的目标磁盘。读者在操作过程中需视视自身情况选择设备号)

分区 容量 类型 说明
sda1 256 MB FAT32 boot 分区
sda2 262144 MB ext4 根目录分区
sda3 32768 MB swap 交换分区。用于进行虚拟内存的映射,一般推荐大小为内存的两倍

  如果内存够大,可以不添加swap交换分区

四、解压恢复

  现在你已经完成分区了,接下来需要将文件从压缩包中提取出来。

首先,我们将 sda2 分区挂载到系统中。在 Ubuntu 的图形界面中,这一步非常简单,只需要点击一下任务栏中该磁盘的图标就行。

  之后我们依然使用 tar 命令来进行解压缩(若使用的是gzip,则需加-z命令):

  lsblk查看挂载点(MOUNTPOINTS),以下仅为示意图,非实际应当展现的内容

1
2
3
4
5
6
7
8
9
10
root@OpenWrt:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 200.1M 0 loop /overlay
sda 8:0 0 298.1G 0 disk
├─sda1 8:1 0 256.1M 0 part
├─sda2 8:2 0 256.1G 0 part
└─sda3 8:3 0 32.1G 0 part
sde 8:64 1 114.7G 0 disk
└─sde1 8:65 1 114.7G 0 part /mnt/sde1
root@OpenWrt:~#

  请参照第一步的挂载方法,将系统盘挂载到一个文件夹,如将sda2挂载到/mnt/sda2文件夹。

  解压系统压缩包到/mnt/sda2挂载点:

1
sudo tar -xvpf /mnt/sde1/backup.tar -C /mnt/sda2/ --numeric-owner
  • -x:extract. 表示进行解压缩操作。
    /media/cdrom/backup.tar.gz :解压缩的文件,具体视你所存放的路径而定。
  • -C /media/ubuntu/XXXX:将文件解压到该目录下,具体视你的 sda2 分区挂载的路径而定。
  • –numeric-owner:表示连同压缩包中文件的权限一块提取出来。
    该命令同样需要耗费大概10分钟左右的时间,视解压文件大小和机器性能而定。

​    还记得之前打包时被我们忽略掉的那几个目录吗?解压完成之后,我们将手动创建这几个目录。
1
2
3
cd /mnt/sda2/  # 切换路径到 sda2 分区
# 注意由于 sda2 分区并不是当前 Linux-Live 系统的根目录,因此在此处请使用相对路径创建
sudo mkdir proc sys media mnt tmp

五、修正分区uuid

  通用唯一识别码(Universally Unique Identifier,UUID),用于计算机体系中以识别信息的一个128位标识符。具有唯一性。重复UUID码概率接近零,可以忽略不计。
这里是要把系统文件里原分区的uuid改为当前分区的uuid,若不修改则会在开机的时候找不到对应分区,表现为卡在开机图标界面。

1
2
3
chroot /mnt/sda2	#切换系统目录到sda2,相当于现在/mnt/sda2是你的根目录/
blkid #查看各分区uuid
sudo gedit /etc/fstab #编辑fstab文件,将uuid值替换为对应分区的正确uuid

  以下为文件示例,总共有六项,第二项是挂载点,第三项是分区类型,一般来讲改一下UUID即可,更详细内容请自行搜索fstab文件相关内容查阅。

1
2
3
4
5
6
7
8
9
10
11
12
13
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
#根目录挂载
UUID=ae4eafa4-b60d-4b26-bec1-103adde1b7be / ext4 errors=remount-ro 0 1
#swap挂载
UUID=11968e8b-d84a-4404-923c-f56fc5406564 none swap sw 0 0
#引导挂载
UUID=3CC2-136F /boot/efi vfat defaults 0 1

六、修复系统引导

  第一步进入ubuntu liveCD模式,

  第二步安装boot-repair

1
2
sudo add-apt-repository ppa:yannubuntu/boot-repair && sudo apt-get update
sudo apt-get install -y boot-repair && boot-repair

  等待一会就会出先boot-repair的界面
点击Recommended repair,修复过程中它可能会要求你去执行一些命令,按照他的要求,打开终端,执行命令,执行完毕后,点击forward(下一步)

  在boot-repair修复完成后,重新启动,就可以见到久违的启动菜单了

  如果开机直接进入bios,没有正确的uefi引导选项,可以尝试再次进入liveCD模式,安装后,选择高级选项,手动选择efi分区,进行修复。

七、添加、修改交换空间

  成功进入迁移好的Ubuntu系统后,可以根据需要添加一个交换空间,或者调整其大小来适应当前硬件,如果不需要交换空间,那么可以跳过该步骤。

  1. 查看是否已经存在swapfile
    1
    sudo swapon --show
  2. 若无任何输出,这意味着系统当前没有可用的交换空间。
  1. 修改swapfile
    如果第一步存在swapfile,则需要先禁用

    1
    sudo swapoff /swapfile
  2. 修改swapfile空间的大小为8G

    1
    sudo dd if=/dev/zero of=/swapfile bs=1M count=8192
  3. 设置文件为swapfile类型

    1
    sudo mkswap /swapfile
  4. 修改权限
    我们需要锁定文件的权限,以便只有具有root权限的用户才能读取内容。 这可以防止普通用户访问该文件,这会产生重大的安全隐患。
    通过键入以下内容使该文件只能由root访问:

    1
    sudo chmod 600 /swapfile

    键入以下命令验证权限更改:

    1
    2
    tungee@tungee-Macmini:~$ ls -lh /swapfile
    -rw------- 1 root root 8.0G Jan 5 14:29 /swapfile
  5. 启用swapfile

    1
    sudo swapon /swapfile
  6. 使交换文件永久化

    我们最近的更改已启用当前会话的交换文件。 但是,如果我们重新启动,服务器将不会自动保留交换设置。 我们可以通过将交换文件添加到/etc/fstab文件来更改此设置。

    备份/etc/fstab文件,以防出现任何问题:

    1
    sudo cp /etc/fstab /etc/fstab.backup

    键入以下命令,将交换文件信息添加到/etc/fstab文件的末尾:

    1
    echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
  7. 接下来,我们将查看一些我们可以更新的设置以调整我们的交换空间。

    • 调整Swappiness属性
      将数据从RAM交换到交换空间的频率。数值(0-100)越高,越可能发生磁盘交换。

      设置方法:

      1
      2
      cat /proc/sys/vm/swappiness #查看当前值
      sudo gedit /etc/sysctl.conf #打开文件编辑

      在底部添加vm.swappiness=10(根据自身情况选择合理数值)

    • 调整缓存压力设置
      vfs_cache_pressure,该文件表示内核回收用于directory和inode cache内存的倾向;缺省值100表示内核将根据pagecache和swapcache,把directory和inode cache保持在一个合理的百分比;降低该值低于100,将导致内核倾向于保留directory和inode cache;增加该值超过100,将导致内核倾向于回收directory和inode cache。

      设置方法:

      1
      2
      cat /proc/sys/vm/vfs_cache_pressure #查看当前值
      sudo gedit /etc/sysctl.conf #打开文件编辑

      在底部添加vm.swappiness=10(根据自身情况选择合理数值)

八、双系统时间修复

先说下两个概念:

  • UTC即Universal Time Coordinated,协调世界时(世界统一时间)
  • GMT 即Greenwich Mean Time,格林尼治平时

Windows 与 Mac/Linux 看待系统硬件时间的方式是不一样的:

  • Windows把计算机硬件时间当作本地时间(local time),所以在Windows系统中显示的时间跟BIOS中显示的时间是一样的。
  • Linux/Unix/Mac把计算机硬件时间当作 UTC, 所以在Linux/Unix/Mac系统启动后在该时间的基础上,加上电脑设置的时区数( 比如我们在中国,它就加上“8” ),因此,Linux/Unix/Mac系统中显示的时间总是比Windows系统中显示的时间快8个小时。所以,当你在Linux/Unix/Mac系统中,把系统现实的时间设置正确后,其实计算机硬件时间是在这个时间上减去8小时,所以当你切换成Windows系统后,会发现时间慢了8小时。就是这样个原因。OK!既然知道原因了,就好解决了。

这里提供两种解决方法:

  1. 在Ubuntu中把计算机硬件时间改成系统显示的时间,即禁用Ubuntu的UTC。这又有另一个需要注意的地方:在 Ubuntu 16.04 版本以前,关闭UTC的方法是编辑/etc/default/rcS,将UTC=yes改成UTC=no, 但在Ubuntu 16.04使用systemd启动之后,时间改成了由timedatectl来管理,所以更改方法是
    1
    2
    timedatectl set-local-rtc 1 --adjust-system-clock
    #执行后重启Ubuntu,应该就没有问题了。
  1. 修改 Windows对硬件时间的对待方式,让 Windows把硬件时间当作UTC.打开命令行程序,在命令行中输入下面命令并回车
1
Reg add HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1

将系统迁移到虚拟机

  通过以上tar获得系统压缩包后,然后创建虚拟机,选择稍后安装操作系统(空sata硬盘),硬件选项中USB控制器选择正确的版本(2.0还是3.1),然后启动虚拟机,挂载linux系统镜像,选择“试用ubuntu”,打开终端,输入命令进入单用户模式:

1
sudo init 1

  查看硬盘编号(一般为/dev/sdx,x为a-z)

1
lsblk

  格式化vm空sata磁盘为ext4

1
mkfs.ext4 /dev/sda

  挂载该磁盘到一个位置

1
2
mkdir /mnt/sda
mount /dev/sda /mnt/sda

  如果系统压缩包在另一个移动设备中,请按照同样的方法挂载在不同的地方,如/mnt/u-disk:

1
2
mkidr /mnt/u-disk
mount /dev/sdb /mnt/u-disk

  然后和前文解压方式一样,此处不再赘述:

1
tar -xvpf /dev/sda/backup.tar -C /mnt/sda/ --numeric-owner

  gzip解压请加上-z选项。

  之后的操作,请自行衔接上文的第五步骤及以后。

参考来源

https://tickrain.com/archives/185 打包、分区、解压参考来源

https://www.cnblogs.com/zxhyJack/p/9165919.html 引导修复参考来源

https://www.zhihu.com/question/46525639/answer/157272414 时间修复参考来源

https://www.vanjay.cn/2019/01/05/Ubuntu-18-04-%E6%B7%BB%E5%8A%A0%E3%80%81%E4%BF%AE%E6%94%B9%E4%BA%A4%E6%8D%A2%E7%A9%BA%E9%97%B4/ 添加修改交换空间参考来源

https://zhuanlan.zhihu.com/p/83921782 补充理解资料

https://www.jianshu.com/p/47e3c90e9ac7 补充理解资料