如何将一个Ubuntu系统从一台笔记本电脑复制到另一台。

我打算更换我的电脑:从一台装有Ubuntu的笔记本电脑换成另一台笔记本电脑,我将在其上安装Ubuntu...

我对当前的系统非常满意,我担心的是要从零开始重建一切。

那么人们通常如何克隆Ubuntu系统呢?这可能包括数据、软件包、快捷方式设置等...


5你不能简单地从旧笔记本电脑中取出硬盘驱动器并安装到新笔记本电脑上吗?我更换了主板、微处理器、内存和硬盘驱动器,只保留了引导硬盘驱动器,并在引导后没有遇到任何重大问题,这可能不是很花哨,但它的效果非常好。 - Geppettvs D'Constanzo
或者只需使用Remastersys、UCK、Customizer等工具创建您系统的克隆副本。 - Uri Herrera
11我已经做了几次这个操作:使用USB到SATA转接器将旧笔记本电脑的硬盘连接到新笔记本电脑上,从Ubuntu live CD启动新笔记本电脑,使用gparted清除新硬盘,将整个磁盘从旧硬盘复制到新硬盘,调整分区大小,重新启动,吃点饼干,重新配置X11。这样简单的操作在Windows系统中可能永远都不会那么容易实现! - aquaherd
1重新配置X11是什么部分?另外,这个复制是普通的简单复制粘贴吗? - Whirl Mind
5个回答

有几种方法可以复制和设置您的配置。这取决于您所做的更改的大小,以及您是否升级到新版本。其中一些方法在版本之间升级时很有用,但要小心,因为它们可能会导致某些软件无法正常工作。
方法1:全新安装
最稳定和可靠的方法是进行全新安装,然后复制配置并重新安装所有软件包。这也适用于从旧版本升级到新版本。有办法使这个过程变得相当快速,并自动化大部分流程。最慢的部分将是需要下载所有未包含在安装介质中的软件包。我有8个DVD光盘映像,这使我能够比下载更快地安装。
我建议选择此选项,因为设置和安装grub可能会使您的系统无法使用。您需要对grub有扎实的掌握才能使用第二种方法。
在进行新安装(新笔记本电脑)之前,您需要从旧安装(旧笔记本电脑)中复制一些信息。
您的设置或配置
所有保存您自定义设置的文件存储在两个地方。第一个,也是最重要的地方是/home/[用户名]目录。那里可能会有数百个.[package-config-dir]文件和目录。我将列出其中最重要的,但您可以拥有更多并添加更多(如果需要)。此过程可能会导致软件包无法正常工作的问题。因此,在进行操作时要小心。在粘贴新目录之前,请备份您的全新安装系统。
这些目录和文件并不是很大,并且可能只占用几百兆字节。这种方法在升级之间也非常有用。您可以快速复制您在Ubuntu版本之间所做的所有配置更改。
默认情况下,大多数程序在首次运行时创建.[package-config-dir]。如果它不存在,则会重新创建。您不应该依赖这种行为,因为并不是所有程序都会按照此方式工作。
  1. 使用Nautilus导航到您的主目录(/home/[用户名])
  2. 选择"查看菜单→显示隐藏文件"(或Ctrl+H)

  3. 现在,您应该看到所有隐藏的.*目录。您可能需要以root身份执行此操作。只需从命令行启动nautilus即可。

    选择以下目录并将它们复制到单独的目录中。

    /home/aaron/.config  
    /home/aaron/.gconf  
    /home/aaron/.gnome2  
    /home/aaron/.gnome2_private  
    /home/aaron/.local  
    /home/aaron/.mozilla  
    

    我对这些文件进行了更改。因此我也复制它们。

    /home/aaron/.bash_aliases 
    /home/aaron/.bashrc 
    /home/aaron/.vimrc
    

    您可能使用许多其他程序,它们不会将配置存储在这些目录中。请将它们复制过去,但是要注意,如果程序无法按预期工作,则可能需要恢复.*文件或目录。您可以通过简单地删除文件或目录来执行此操作,但在复制目录之前应该备份。

  4. 取决于您如何使用系统。您可能已经对/etc目录中的某些文件进行了更改。如果有,您也应该将它们复制过去。我为工作创建了一个自定义的smb.conf文件,并且我有许多用于开发的Apache虚拟主机,因此我也将它们复制过去。您可以复制整个/etc目录,但这可能会在硬件方面与您的机器不完全相同时创建问题。从一台机器到另一台机器。

    /etc/samba/smb.conf
    /etc/hosts
    /etc/apache2 # 整个目录。
    

    在安装新软件之前或之后复制您的配置文件。不要在当前正在运行软件包安装时执行此操作。您可能会破坏安装。

您安装的软件包

使用Synaptic,您可以通过导出标记菜单选项轻松地导出所有已安装的软件包。

  1. 文件菜单 → 保存标记
  2. 勾选“保存完整状态,而不仅仅是更改”
  3. 选择一个名称和目录来保存此文件(您可能需要将其放在闪存驱动器上)

然后,您可以通过反向过程重新加载所有已安装的软件包:

  1. 文件菜单 → 读取标记
  2. 选择您在第一步中创建的文件

这可能需要最长的时间。如果您下载了很多软件包(1GB的软件包),这可能需要几个小时。

方法二:使用磁盘映像

我将把方法二作为一个单独的帖子。这是一个更高级的选项。它要求您了解分区、安装grub并使用命令行。

如何将Ubuntu安装从一台笔记本电脑复制到另一台笔记本电脑


如果恢复已安装的软件包的最后一步失败,并出现这些错误,会怎么样? - Chris

有几种方法可以复制和设置您的配置。这取决于您所做的更改有多大,以及您是否升级到新版本。其中一些方法在版本之间升级时很有用,但要小心,因为它们可能会导致某些软件无法正常工作。
方法1:全新安装
单独发布。如何将Ubuntu安装从一台笔记本电脑复制到另一台 这是最安全的方法,不需要您编辑grub和引导设置。大部分操作都可以使用图形界面工具完成。
方法2:使用磁盘映像
这可能是最快的移动方式。将硬盘分区复制为磁盘映像非常快速,如果您不想重新安装每个软件。但是创建、调整大小和移动磁盘映像可能需要很长时间。我只建议在您不打算升级到新版本Ubuntu时使用此方法。确保您了解磁盘分区和grub。我所做的大部分工作都将使用命令行。在运行命令之前,请确保您理解该命令的作用。对于由以下指令导致的数据丢失,我不承担责任。
第一步是创建您安装的磁盘映像。
首先,我们需要获取有关设置的一些信息。使用parted -lmount命令。
$ sudo parted -l
Model: ATA ST9320423AS (scsi)
Disk /dev/sda: 320GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type      File system     Flags
 1      32.3kB  197MB   197MB   primary   ext4            boot
 2      197MB   10.2GB  10.0GB  primary   linux-swap(v1)
 3      10.2GB  50.2GB  40.0GB  primary   ext4
 4      50.2GB  299GB   249GB   extended
 5      50.2GB  54.4GB  4195MB  logical   ext4
 6      54.4GB  65.9GB  11.5GB  logical   ext4
 7      65.9GB  299GB   233GB   logical   ext4

$ mount
/dev/sda5 on / type ext4 (rw,errors=remount-ro)
/dev/sda7 on /home type ext4 (rw)
/dev/sda1 on /boot type ext4 (rw)
/dev/sda6 on /usr type ext4 (rw)
# I took out the entries that were not need for these instructions

$ cat /etc/fstab 
proc            /proc           proc    nodev,noexec,nosuid 0       0
UUID=ddc8c237-e8ac-4038-a0ed-f7c866d6603b /               ext4    errors=remount-ro 0    1
UUID=aa9881d1-5cc1-4e94-8cd7-8125e18ece2f /boot           ext4    defaults        0      2
UUID=31a6fde1-6b96-4cc3-acfd-88573f52be36 /home           ext4    defaults        0      2
UUID=073146a7-5668-4728-9a6f-1a599f358a8d /usr            ext4    defaults        0      2
UUID=540b96b6-b3c3-4092-b4ad-6b33bcbbe16d none            swap    sw              0      0

你的设置可能会有所不同。我有一个单独的分区用于 /home,根目录 (/) 和 /usr

创建磁盘映像

我使用 dd,因为它简单快捷。确保您已经阅读并理解了它的工作原理。 您需要一个空的分区,其大小大于您要复制的整个分区大小。这可能需要相当长的时间。创建、调整大小和复制分区可能需要几个小时,具体取决于它们的大小。您需要将外部驱动器替换为用于此过程的存储介质的一部分。

sudo dd if=/dev/sda5 of=/media/externaldrive/sda5-root.img
sudo dd if=/dev/sda7 of=/media/externaldrive/sda7-home.img
sudo dd if=/dev/sda6 of=/media/externaldrive/sda6-usr.img

这是在我的设备上运行后的实际输出示例。
$ sudo dd if=/dev/sda5 of=/media/home0/sda5-root.img
8193087+0 records in
8193087+0 records out
4194860544 bytes (4.2 GB) copied, 55.3159 s, 75.8 MB/s

我们可以使用Linux提供的工具来减小这个磁盘映像的大小。
$ sudo resize2fs -P sda5-root.img
 resize2fs 1.41.11 (14-Mar-2010)
 Estimated minimum size of the filesystem: 605972
$ ls -sh ./sda5-root.img
 4.0G ./sda5-root.img
$ sudo resize2fs -M sda5-root.img
 resize2fs 1.41.11 (14-Mar-2010)
 Please run 'e2fsck -f sda5-root.img' first.
$ sudo e2fsck -fy ./sda5-root.img # y makes it run without asking thousands of questions.

e2fsck会输出大量的错误或修复信息。这是因为文件系统中的信息不再正确地指示分区的起始和结束位置。这是正常的,因为它已经不在原先配置的分区中了。
$ sudo resize2fs -M sda5-root.img
 resize2fs 1.41.11 (14-Mar-2010)
 Resizing the filesystem on sda5-root.img to 605505 (4k) blocks.
 Resizing the filesystem on sda5-root.img to 605505 (4k) blocks.
 The filesystem on sda5-root.img is now 605505 blocks long.
$ ls -sh ./sda5-root.img
 2.4G ./sda5-root.img

它基本上会清除分区中的所有空闲空间。因此对于较大的分区来说,这可能超过磁盘大小的50%。复制一个较小的文件要快得多。

现在,您需要使用启动盘启动新的笔记本电脑,并按照以下步骤操作。您需要使用启动盘,因为您无法对正在运行的分区进行更改,该分区当前由已安装的操作系统使用。

您现在可以将这些磁盘映像复制到新计算机的分区中。您应该已经设置好了这些分区。使用启动盘和gparted是一种快速简便的方法。确保您拥有系统所需的所有分区。您可以将这些分区设置得比之前的系统更大。当我们将磁盘映像复制到它们时,我们将调整文件系统的大小,并占用分区上的所有空闲空间。

现在是第二步:将磁盘映像复制到新驱动器和新分区中。

sudo dd if=/media/exteranldrive/sda5-root.img of=/dev/sda3 # replace the [sda3] with your partition.  

在我的机器上,输出的结果是这样的。
$ sudo dd if=./sda5-root.img of=/dev/sdb6 
4844040+0 records in  
4844040+0 records out  
2480148480 bytes (2.5 GB) copied, 87.4921 s, 28.3 MB/s  

$ sudo fsck.ext4 -fy /dev/sdb6  
e2fsck 1.41.11 (14-Mar-2010)  
Pass 1: Checking inodes, blocks, and sizes  
Pass 2: Checking directory structure  
Pass 3: Checking directory connectivity  
Pass 4: Checking reference counts  
Pass 5: Checking group summary information  
root1: 50470/504000 files (1.4% non-contiguous), 616736/2060328 blocks  

现在我们需要编辑 fstab 文件,指向正确的设备。 如果您刚刚将新磁盘分区复制到新磁盘上,fstab 文件就在该分区上,所以您需要挂载它才能访问该文件。如果您没有单独的引导分区,还需要挂载根分区以安装 grub。
$ sudo mkdir /mnt/tmp  
mount /dev/sdb6 /mnt/tmp  
$ sudo blkid  # to see what the disk uuid is   
/dev/sda5: LABEL="root1" UUID="ddc8c237-e8ac-4038-a0ed-f7c866d6603b" TYPE="ext4"  
/dev/sdb6: LABEL="root1" UUID="ddc8c237-e8ac-4038-a0ed-f7c866d6603b" TYPE="ext4"  
$ gksu gedit /mnt/tmp/etc/fstab  
replace the UUID with the UUID of your partition  
UUID=ddc8c237-e8ac-4038-a0ed-f7c866d6603b /               ext4    errors=remount-ro 0  1

在这里您可以看到,我复制到另一个磁盘的新磁盘映像具有与原始文件系统相同的UUID。因此,您可以将fstab文件从旧安装复制到新安装中,并具有工作系统。那将启动。在我的设置中,我不能让计算机保持这样,否则它将引导到它首先发现的设备。
编辑fstab并确保uuid与您为根目录、主目录和其他设置的分区匹配。
最后一步是在您的新磁盘上安装grub。
sudo chroot /mnt/tmp # your root partition.   
grub-install /dev/XXX  

在我的情况下:
grub-install /dev/sdb
update-grub

请在开始之前阅读这些说明。拥有新笔记本电脑上的所有数据却无法启动它是没有用的。

https://help.ubuntu.com/community/Grub2
https://help.ubuntu.com/community/RecoveringUbuntuAfterInstallingWindows


我有一个疑问,如果目标分区的空间比磁盘映像更大,dd命令是否允许我们使用额外的空间,还是会浪费掉? - nikhil
@nikhil. 不,dd不会使用额外的空间。但这也不是它的设计目的。它不理解文件系统。另一方面,fsck.ext4确实能够理解分区和文件系统。文件系统检查的一部分是检查分区大小,并确保文件系统与分区大小匹配。 - nelaaro
在我的情况下,我使用的是Ubuntu 18.04的Live CD,并且做了一些操作。在最后一步,我安装了boot-repair来帮助修复/boot目录,一切都运行正常。非常感谢你的帮助!- nelaaro - nobjta_9x_tq
注意,我不得不为grub绑定目录 sudo mount –bind /dev /mnt/dev && sudo mount –bind /dev/pts /mnt/dev/pts && sudo mount –bind /proc /mnt/proc && sudo mount –bind /sys /mnt/sys ,并在chroot中挂载我的EFI分区 mount /dev/XXX /mnt 其中XXX是EFI分区(而不是根目录/主目录/交换等)来源:https://blog.cadena-it.com/linux-tips-how-to/how-to-repair-restore-or-reinstall-grub-2-with-a-ubuntu-live-cd-or-usb/ 和 https://unix.stackexchange.com/a/405525 - caffeineFiend
1如果你按照答案中的指示操作,你需要将所有这些路径都设置为/mnt/tmp - caffeineFiend

试试Clonezilla。Clonezilla是一个磁盘镜像/克隆工具。你可以使用这个工具将你的Ubuntu克隆到一个新系统中。

clonezilla boot menu

Clonezilla可以克隆您的设置和整个分区。
有两个版本的Clonezilla可供选择。Clonezilla Live适用于单次使用。
欲了解更多信息,请访问此链接

3不错的选择。记住,在不同的硬件上恢复可能并不容易。我猜如果你恢复到相同大小的分区,应该没问题。你也可以尝试使用PING(Partition-Image-Is-Not-Ghost)。那是另一个工具。 - Whirl Mind

简而言之;

经进一步阅读,下面的rsync方法可能需要更多时间,并且可能不完整(例如,启动后可能无法正常工作,因此需要更新一些文件,如fstab)。我将来可能会更新这个答案,但现在只需参考复制整个根目录(/)以将操作系统转移到新计算机? 或者 https://unix.stackexchange.com/questions/608131/backup-and-restore-of-root-file-system-ubuntu-20-04

这将备份您的整个根目录(请注意,在/Drive之前使用了/,这是您要备份到的位置),并在完成后通知十秒钟(运行之前,请参阅man rsync以了解所使用选项的详细信息)

sudo rsync -aAXHS --info=progress2 --delete --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*", "/Drive", "/lost+found"} / /Drive && notify-send -t 10000 "Backup complete"

如果这对你不起作用,那么这个应该可以。
sudo rsync -aAXHS --info=progress2 --delete --exclude "/dev/*" --exclude "/proc/*" --exclude "/sys/*" --exclude "/tmp/*" --exclude "/run/*" --exclude "/mnt/*" --exclude "/media/*" --exclude "/Drive" --exclude "/lost+found" / /Drive && notify-send -t 10000 "Backup complete"

在你的 .bashrc 文件中添加以下内容,使用别名来缩短按键次数。
alias backup='sudo rsync -aAXHS --info=progress2 --delete --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*", "/USBDrive", "/lost+found"} / /USBDrive && notify-send -t 10000 "Backup complete"'

为了恢复备份,只需在上述命令中颠倒源路径和目标路径。
请注意,这仅适用于本地和独立系统。如果您的系统正在被网络上的其他系统主动访问,这不是一个更好的解决方案。
因为系统的内容可能会每分钟不断更新,并且在rsync过程中某些文件可能会发生变化。
举个例子,当rsync到达文件2时,之前文件(文件1)的内容可能已经改变。当您需要使用该备份时,这将导致依赖错误。
在这种情况下,基于快照的备份是更好的方法。因为在备份过程开始之前,系统会被“冻结”,并在备份过程结束时“解冻”,所以所有文件都是一致的。
详细信息(rsync方法)
我研究了Clonezilla,但目前不支持增量/差异备份,可以在这里看到。这意味着每次备份系统时都必须创建一个新的镜像。如果您经常备份系统,这并不高效。

看起来这个帖子中的被接受答案应该可行,但这里还有一些更多的选择;借鉴一些被接受答案的想法。被接受答案不会备份你在系统中克隆的任何存储库。

如果你在克隆后需要构建任何程序,那么你将不得不再次进行。这可能不像被接受答案那样强大和稳定。但我认为这些值得一试,尤其是如果你花了很多时间从源代码构建程序的话。

下面这些选项的另一个优点是它们应该适用于许多 Linux 发行版。最坏的情况是它不起作用,然后你可以采用被接受的答案(假设你首先备份了你的新安装或者你没有对新安装进行足够的更改以至于不介意重新安装)。

如接受的答案所述,如果您的某些程序无法正常工作,您可以尝试恢复“.*”文件或目录,该文件或目录是大多数程序的包配置文件或目录。您可以通过简单地删除文件或目录,然后再次运行相应的程序来实现此操作。如果接受的答案中的以下内容引起了您的关注:“您可以复制整个/etc目录,但如果您的机器在硬件方面没有相同的设置,这可能会导致问题。从一台机器转移到另一台机器是不行的。”那么您可以手动分别复制特定的/etc目录,或者使用下面描述的第3.9节,高级过滤规则的用法。我认为接受的答案中的“已安装的软件包”部分在下面的方法中是不必要的。正如接受的答案所述,“在安装新软件之前或之后复制配置文件。不要在当前正在运行软件包安装时执行此操作。否则可能会破坏安装。” 我找到了这篇帖子,其中使用了rsync命令(适用于大多数Linux发行版)。 但我认为您只需要从这篇帖子中了解以下内容(因为链接中的源详细描述了这一点):
请注意,这仅适用于本地和独立系统。如果您的系统正在被网络上的其他系统活动访问,则不是更好的解决方案。因为系统的内容可能每分钟都在不断更新,并且在rsync过程中某些文件可能会更改。 例如,当rsync到达第二个文件时,先前文件(文件1)的内容可能已更改。当您需要使用该备份时,这将使您面临依赖性错误。在这种情况下,基于快照的备份是更好的选择。因为在备份过程开始之前,系统将被“冻结”,并在备份过程完成时“解冻”,所有文件都是一致的。 首先,插入备份介质(USB闪存驱动器或外部硬盘)。然后使用“fdisk -l”命令找到驱动器字母。在我的情况下,我的Pen驱动器ID是/dev/sdb1。将驱动器挂载到您选择的任何位置。我要在/mnt下挂载它。sudo mount /dev/sdb1 /mnt 在其中一个评论中,有人说:“SK,我感谢您的努力。然而,在我看来,您应该更加明确地告诉读者,RSYNC不是适用于完整磁盘备份的解决方案。它是一个非常优秀的文件备份实用程序。然而,它不是一个适用于磁盘备份的实用程序。原因是必须在备份之前卸载磁盘,否则还原时会出现文件损坏的高风险。” 在另一条评论中,有人说:“您的硬盘大小不同或使用不同的文件系统并不重要。”恰恰相反。Rsync很棒,但目标文件系统确实很重要。例如,将ext4文件系统中的文件使用rsync备份到FAT文件系统中,会导致丢失文件所有权和权限信息。目标文件系统需要至少具有源文件系统的功能。 从评论者那里得到的提示:为了确保打开的文件或可能更改的文件安全,您可以在开始备份之前切换到runlevel 1。
对我来说,如果我在Nautilus中右键点击驱动器,然后点击挂载,外部驱动器会被挂载在/media/$USER下。
除此之外,你可能会想阅读第3节的大部分内容,了解可用的众多备份选项这里。 在我的情况下,我选择了3.7和3.8,这是ostechnix.com上概述的内容。我建议至少阅读3.7,完整系统备份,3.8,恢复备份,以及3.9,高级过滤规则的使用,因为它们比ostechnix.com提供更详细的信息。如果你的系统正在被网络上的其他系统活动访问,那么第3.6节,快照备份可能是你想要的,正如上面的第一点所描述的。
我考虑了第4节,文件系统克隆,但进一步阅读这篇文章后发现:
提示:随着时间的推移,文件系统会获得新功能,并且mkfs工具的默认设置也会改变,但并非所有新功能都可以在不重新格式化的情况下启用。因此,在将数据移动到新驱动器时,不要克隆块设备或文件系统,而是考虑创建一个新的文件系统,仅使用例如rsync复制文件(及其属性、ACL、扩展属性等)。

使用GParted详细说明

  1. 从Ubuntu的Live USB启动
  2. 运行GParted
  3. 选择要复制的分区,在上下文菜单中选择“复制”。
  4. 在目标磁盘的未分配空间中选择“粘贴”。
  5. 如果需要,调整新分区的大小。
  6. 点击应用按钮。
  7. 恢复GRUB(简单方法是引导修复