ubuntu系统迁移到虚拟机。以及启动报错ALERT! UUID=x-x does not exist . Dropping to a shell !或error: no such device: x

本文详细介绍了如何使用tar命令和dd命令备份及还原Linux系统,包括从Win10+Ubuntu双系统迁移到新硬盘,以及将主机Ubuntu系统迁移到Mac虚拟机。主要步骤涉及分区文件的tar压缩与解压,以及dd的二进制拷贝,同时强调了修改UUID以确保系统正常启动的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:

tar命令备份还原系统https://www.cnblogs.com/chenjiye/p/11332387.htmlhttps://m.linuxidc.com/Linux/2014-01/94973.htm

mac挂载U盘只读时解决办法https://www.xiaorongmao.com/blog/49

 

之前尝试过将win10+ubuntu18双系统迁移到新硬盘,当时参考了很多教程,主要有两种方式:

1、新旧硬盘分区拷贝文件+修改新硬盘/boot/grub/grub.cfg和/etc/fstab的uuid

首先在原系统中利用tar压缩各分区,就是把各分区挂载在文件系统中的目录压缩成一个压缩包,比如/boot分区压缩成boot.tar.gz,/usr分区压缩成usr.tar.gz,/分区压缩成root.tar.gz(需要排除单独分区的--exclude=/boot与--exclude=/usr目录,如果只有一个/分区那就只用压缩root.tar.gz),压缩命令参考

tar -cvpzf backup.tar.gz --exclude=/proc --exclude=/lost+found --exclude=/backup.tar.gz --exclude=/mnt --exclude=/sys --exclude=/media /

。然后在新硬盘上按照旧硬盘的分区表对应进行分区,新硬盘分区要比旧硬盘对应分区中所有参与压缩的文件大小的总和要大,以便能装得下压缩包解压后的文件,这一步可以通过liveCD试用Ubuntu并挂载新硬盘后通过命令行操作,或者GUI的GParted操作,Ubuntu18自带GParted很傻瓜的。然后继续在liveCD试用Ubuntu中挂载新硬盘,比如新硬盘各分区挂载到/mnt/disk_new/boot、/mnt/disk_new/usr、/mnt/disk_new/,然后分别解压root.tar.gz、boot.tar.gz、usr.tar.gz到/mnt/disk_new/boot、/mnt/disk_new/usr、/mnt/disk_new,解压命令参考

tar -xvpzf backup.tgz -C /

。因为tar解压只覆盖目标目录中同名的文件(https://m.linuxidc.com/Linux/2014-01/94973.htm红字部分),目录也是文件,所以这里既使最后解压root.tar.gz到/mnt/disk_new/也只是解压文件到根目录而不会覆盖掉/mnt/disk_new/boot与/mnt/disk_new/usr,因为root.tar.gz压缩时已经排除了/boot和/usr目录,从而这里解压无所谓先后。

新旧硬盘对应分区的文件通过tar压缩解压同步后,还需要改两个文件,/etc/fstab和/boot/grub/grub.cfg,后者是系统启动后按磁盘分区的uuid挂载对应分区到文件目录,还有swap交换分区,前者指定了root根目录所在磁盘分区的uuid,这两个文件都是系统启动所必须的,新旧硬盘的对应分区几乎不可能生成相同的uuid,应该手动修改。

haypin@ubt:~/catkin_ws$ cat /etc/fstab
# /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>
# / was on /dev/sda1 during installation
UUID=42839afd-cfc2-4cdf-b0cd-df412aaac50c /               ext4    errors=remount-ro 0       1
# swap was on /dev/sda5 during installation
UUID=0205cec7-5266-4d86-b905-e1fdb42c690d none            swap    sw              0       0
haypin@ubt:~/catkin_ws$
haypin@ubt:~/catkin_ws$ grep -C 1 -e "uuid" /boot/grub/grub.cfg
if [ x$feature_platform_search_hint = xy ]; then
  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  42839afd-cfc2-4cdf-b0cd-df412aaac50c
else
  search --no-floppy --fs-uuid --set=root 42839afd-cfc2-4cdf-b0cd-df412aaac50c
fi
--
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  42839afd-cfc2-4cdf-b0cd-df412aaac50c
	else
	  search --no-floppy --fs-uuid --set=root 42839afd-cfc2-4cdf-b0cd-df412aaac50c
	fi
--
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  42839afd-cfc2-4cdf-b0cd-df412aaac50c
		else
		  search --no-floppy --fs-uuid --set=root 42839afd-cfc2-4cdf-b0cd-df412aaac50c
		fi
--
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  42839afd-cfc2-4cdf-b0cd-df412aaac50c
		else
		  search --no-floppy --fs-uuid --set=root 42839afd-cfc2-4cdf-b0cd-df412aaac50c
		fi
--
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  42839afd-cfc2-4cdf-b0cd-df412aaac50c
		else
		  search --no-floppy --fs-uuid --set=root 42839afd-cfc2-4cdf-b0cd-df412aaac50c
		fi
--
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  42839afd-cfc2-4cdf-b0cd-df412aaac50c
	else
	  search --no-floppy --fs-uuid --set=root 42839afd-cfc2-4cdf-b0cd-df412aaac50c
	fi
--
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  42839afd-cfc2-4cdf-b0cd-df412aaac50c
	else
	  search --no-floppy --fs-uuid --set=root 42839afd-cfc2-4cdf-b0cd-df412aaac50c
	fi
haypin@ubt:~/catkin_ws$

在liveCD的Ubuntu中执行blkid查看各分区的uuid,然后对应替换到/etc/fstab和/boot/grub/grub.cfg中,比如我这里整个文件系统也就是/分区都放在一个分区/dev/sda1,所以/dev/sda1的uuid对应填写到/etc/fstab的/分区对应的uuid,以及/etc/fstab中所有--set=root的uuid。

haypin@ubt:~/catkin_ws$ sudo blkid
/dev/sda1: UUID="42839afd-cfc2-4cdf-b0cd-df412aaac50c" TYPE="ext4" PARTUUID="e1b3dc5c-01"
/dev/sda5: UUID="0205cec7-5266-4d86-b905-e1fdb42c690d" TYPE="swap" PARTUUID="e1b3dc5c-05"

我没有使用update-grub以及grub-install /dev/sda1等方法http://m.blog.chinaunix.net/uid-27037833-id-3235145.html,我相信所谓修复grub也是填充正确的uuid到/boot/grub/grub.cfg和/etc/fstab这两个文件。

2、新旧硬盘对应分区dd二进制拷贝,不用修改/etc/fstab和/boot/grub/grub.cfg

这就是比较偷懒的方法了,是磁盘分区与分区之间字节级的拷贝,连同分区的uuid也拷贝,从而不用修改/etc/fstab和/boot/grub/grub.cfg。

在旧硬盘机器或新硬盘liveCD或第三方电脑上,确定新旧硬盘,比如新硬盘各分区/dev/sda1、/dev/sda2、/dev/sda3、/dev/sda5分别对应旧硬盘分区/dev/sdc1、/dev/sdc2、/dev/sdc3、/dev/sdc7,则只用:

dd if=/dev/sdc1 of=/dev/sda1
dd if=/dev/sdc2 of=/dev/sda2
dd if=/dev/sdc3 of=/dev/sda3
dd if=/dev/sdc7 of=/dev/sda5

在拷贝之前可以将一些不是系统必须的数据文件移动到U盘并在liveCD中使用GParted压缩旧硬盘分区,以减少dd拷贝的数据量,当然,新硬盘分区的大小必须不小于对应旧硬盘分区。

详见我的填坑笔记https://blog.youkuaiyun.com/HayPinF/article/details/106489709

3、主机Ubuntu系统迁移到虚拟机Ubuntu

这是我自己的一个需求,要把系统迁移到mac的虚拟机中,好让我的眼睛在Retina的滋润下能持续输入。

首先创建Ubuntu虚拟机,在mac+Parallels上使用我要迁移的Ubuntu16.04的iso镜像创建虚拟机,在安装过程中叉掉拷贝文件的窗口,此时看到的ubutnu桌面其实就是一个livdCD,我本想着此时将主机Ubuntu的各分区的压缩文件解压到"虚拟机的磁盘",并且也fdisk -l看到了虚拟机的/dev/sda,但此时一是不能在livdCD的Ubuntu上安装Parallels tools,也就不能挂载主机的外接U盘,二是blkid根本不会给出这个/dev/sda虚拟磁盘的任何分区的uuid,并且事实上主机中该虚拟机的虚拟磁盘只有两百兆,说明虚拟机的虚拟磁盘必须是安装好系统后才会动态增长,liveCD的虚拟磁盘都没有分区,压根就不能拿来用,这个想法作罢。

3.1 还是老老实实创建一个Ubuntu16的虚拟机,安装好Parallels tools。

然后执行sudo blkid得到/分区和swap分区的uuid,或者复制/boot/grub/grub.cfg与/etc/fstab到外部U盘。

haypin@ubt:~/catkin_ws$ sudo fdisk -l
[sudo] haypin 的密码: 
Disk /dev/sda: 64 GiB, 68719476736 bytes, 134217728 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0xe1b3dc5c

设备       启动     Start    末尾    扇区  Size Id 类型
/dev/sda1  *         2048 132216831 132214784   63G 83 Linux
/dev/sda2       132218878 134215679   1996802  975M  5 扩展
/dev/sda5       132218880 134215679   1996800  975M 82 Linux 交换 / Solaris

Partition 2 does not start on physical sector boundary.




haypin@ubt:~/catkin_ws$ sudo blkid
/dev/sda1: UUID="42839afd-cfc2-4cdf-b0cd-df412aaac50c" TYPE="ext4" PARTUUID="e1b3dc5c-01"
/dev/sda5: UUID="0205cec7-5266-4d86-b905-e1fdb42c690d" TYPE="swap" PARTUUID="e1b3dc5c-05"
haypin@ubt:~/catkin_ws$

3.2 我安装Ubutnu虚拟机时选择将文件系统只放在虚拟磁盘的一个分区下,也就是安装好后的/dev/sda1分区,但迁移来源主机上是分成/usr、/home和/共三个分区,所以我直接压缩/目录并且不排除/usr、/home子目录,也就是压缩文件系统三个分区的所有文件到一个压缩包,但要排除/proc、/sys和/media以及/backup.tar.gz压缩文件本身:

tar -cvpzf backup.tar.gz --exclude=/proc --exclude=/backup.tar.gz --exclude=/sys --exclude=/media /

参考自:https://www.cnblogs.com/chenjiye/p/11332387.html

3.3 将存储有backup.tar.gz的U盘挂载到mac主机上,然后挂载到Ubuntu16虚拟机上,解压并覆盖根目录:

tar -xvpzf backup.tar.gz -C /

3.4 修改/boot/grub/grub.cfg中所有"root"字样的uuid和/etc/fstab中/分区的uuid为虚拟机虚拟磁盘/dev/sda1分区也就是/分区的uuid,修改/etc/fstab中swap分区的uuid为虚拟磁盘/dev/sda5分区也就是swap分区的uuid。

这里可以偷个懒,直接将覆盖之前虚拟机的/boot/grub/grub.cfg和/etc/fstab保存到U盘,待tar xvpfz backup.tar.gz -C /覆盖后再替换回来。

 

总结:

inux系统备份还原或者迁移,一是带权限压缩文件tar -cvpzf,必须排除/proc、/sys,这两个目录与硬件相关,/dev不用排除,/boot我没有排除,只在还原覆盖后修改了/boot/grub/grug.cfg的uuid,/etc也没有排除,只在还原覆盖后修改了/etc/fstab的uuid。二就是uuid的替换,必须替换成新硬盘或虚拟磁盘各分区的uuid,否则可能启动报错ALERT! UUID=xxx-xxx-xxx-xxx-xxxx does not exist . Dropping to a shell !或error: no such device: xxxx-xxx-xxx-xxx-xxxx。这都是指定uuid的磁盘分区找不到报错

 

 

补充:

有可能在tar -xvzf backup.tar.gz解压时报错磁盘空间不足,是因为解压替换了的同路径同名文件+解压后新增的文件+文件系统之前已经存在的文件总和大于了磁盘或分区容量,我在后面迁移系统到VMware创建的虚拟机时遇到了这个问题,由于我是创建的新的虚拟机,解压时不必要保留虚拟机内除了/proc、/sys之外的任何文件夹,所以我在解压之前先保存好/boot/grub/grug.cfg和/etc/fstab之后删掉除/proc、/sys、/run、/media(当然不能删除我存储有backup.tar.gz压缩包的挂载U盘)的所有文件夹,然后再执行解压,空间就足够了。

 

<think>嗯,用户遇到了在安装Ubuntu系统后重启出现的问题,显示“ALERT! UUID=... does not exist. Dropping to a shell”,然后进入了紧急模式。我需要先理解这个错误的原因。 首先,用户提到执行了“modules (cat /proc/modules; ls /dev)”,这可能是在错误信息中出现的提示。不过主要的错误是UUID不存在,导致系统无法挂载根文件系统。这时候系统会进入一个恢复shell,用户需要手动修复。 接下来,我需要分析可能的原因。常见的有:UUID对应的磁盘分区未被正确识别,可能是硬件连接问题,者/etc/fstab中的UUID错误,者是文件系统损坏,内核模块缺失导致磁盘驱动未加载等。 用户之前的问题是关于“Missing modules”,所以这次可能也是相关的问题,比如安装Ubuntu时没有正确安装所需的磁盘控制器驱动模块,导致系统重启后无法识别磁盘。例如,如果使用RAID某些SATA控制器,可能需要特定的内核模块。 然后,我需要考虑如何引导用户一步步排查。首先检查UUID是否正确,使用blkid查看所有分区的UUID,确认是否与/boot/grub/grub.cfg/etc/fstab中的一致。如果UUID不匹配,就需要修正。 另外,检查硬件连接是否正常,比如SATA线是否松动,者硬盘是否被正确识别。使用lsblkfdisk -l查看磁盘是否存在。 如果是内核模块的问题,可能需要从恢复模式加载对应的模块,比如ahci、nvme等。用户可能需要进入initramfs的shell,使用modprobe加载模块,然后重新生成initramfs。 还有可能是在安装时没有正确安装某些必要的软件包,比如linux-modules-extra,导致缺少驱动。用户可能需要通过chroot到系统,安装缺失的包,并更新initramfs。 此外,如果用户是在虚拟机中安装,可能需要检查虚拟磁盘的设置,确保配置正确,没有使用不兼容的控制器类型。 最后,需要总结常见的解决步骤,让用户逐步检查,从确认UUID、检查硬件连接、加载模块、修复fstab,到重建initramfs和grub。同时提醒备份数据,避免操作失误导致数据丢失。</think>--- ### 问题分析 安装Ubuntu后重启出现 `ALERT! UUID=... does not exist. Dropping to a shell`,表明系统无法通过UUID挂载根文件系统(通常是 `/` 分区),直接进入紧急模式(initramfs shell)。此问题常见原因包括: 1. **硬件识别问题**:磁盘未正确连接控制器驱动未加载。 2. **UUID配置错误**:`/etc/fstab` GRUB 配置中指定的UUID与磁盘实际UUID不匹配。 3. **文件系统损坏**:分区表文件系统损坏。 4. **内核模块缺失**:缺少必要的磁盘控制器驱动模块(如SATA、NVMe驱动)。 --- ### 分步解决方法 #### 步骤1:检查硬件连接 1. **物理检查**: - 确认硬盘数据线、电源线连接牢固(物理机适用)。 - 虚拟机需检查虚拟磁盘配置(如SATA/NVMe控制器类型)。 2. **查看磁盘识别状态**: 在initramfs shell中输入以下命令: ```bash lsblk # 查看磁盘是否被识别 blkid # 显示所有分区的UUID ``` - 若磁盘未列出(如无 `/dev/sda` `/dev/nvme0n1`),可能是硬件未识别驱动未加载。 --- #### 步骤2:修复UUID配置 1. **核对UUID**: - 输入 `blkid` 查看实际分区UUID,例如: $$/dev/sda1: UUID="260d48b6-cd87-4b70-9792-4ec954940e90" TYPE="ext4"$$ - 对比以下文件中的UUID是否一致: - `/etc/fstab`:系统挂载配置文件。 - `/boot/grub/grub.cfg`:GRUB引导配置。 2. **修正UUID**: -UUID错误,在initramfs shell中临时挂载根分区并修改文件(需先加载必要模块): ```bash # 加载文件系统模块(如ext4) modprobe ext4 # 挂载根分区到临时目录 mkdir /mnt/root mount /dev/sda1 /mnt/root # 替换为实际分区 nano /mnt/root/etc/fstab # 修改UUID ``` --- #### 步骤3:加载缺失的磁盘驱动模块 若硬件未识别(`lsblk` 无输出),可能是驱动模块未加载: 1. **手动加载模块**: ```bash # 常见模块(根据磁盘类型选择): modprobe ahci # SATA控制器驱动 modprobe nvme # NVMe SSD驱动 modprobe sd_mod # SCSI磁盘驱动 modprobe usb_storage # USB存储设备驱动 ``` 2. **检查模块是否生效**: 输入 `lsblk` 查看磁盘是否出现。 --- #### 步骤4:修复文件系统重新生成initramfs 1. **文件系统修复**: ```bash fsck -y /dev/sda1 # 替换为问题分区 ``` 2. **重建initramfs**(需挂载根分区): ```bash mount /dev/sda1 /mnt/root chroot /mnt/root update-initramfs -u # 重新生成initramfs update-grub # 更新GRUB配置 exit reboot ``` --- #### 步骤5:修复GRUB引导(可选) 若问题由GRUB配置错误引起: ```bash # 在initramfs shell中尝试修复 mount /dev/sda1 /mnt/root mount --bind /dev /mnt/root/dev mount --bind /proc /mnt/root/proc mount --bind /sys /mnt/root/sys chroot /mnt/root grub-install /dev/sda # 安装到磁盘(非分区) update-grub exit reboot ``` --- ### 常见原因与案例 - **案例1:虚拟机控制器类型不匹配** - 问题:在VirtualBox中使用默认的“SATA控制器”可能引发UUID错误。 - 解决:改为“SCSI控制器”“NVMe控制器”重新安装。 - **案例2:RAIDLVM配置错误** - 若使用RAID/LVM,需加载 `dm-mod` 模块并激活卷组: ```bash modprobe dm-mod vgchange -ay ``` --- ### 总结流程 1. **检查硬件连接与磁盘识别** → `lsblk`、`blkid`。 2. **加载驱动模块** → `modprobe ahci`、`nvme` 等。 3. **修正UUID配置** → 修改 `/etc/fstab` 和 `grub.cfg`。 4. **修复文件系统** → `fsck`。 5. **重建initramfs与GRUB** → `update-initramfs -u`、`update-grub`。 若仍无法解决,可能需要通过Live USB重新安装系统更换磁盘控制器类型(如AHCI/RAID模式切换)。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值