操作场景
本文档指导您制作本地或其他平台的 Linux 服务器系统盘镜像。
操作步骤
准备工作
制作系统盘镜像导出时,需要进行以下检查:
说明:
如果您是通过数据盘镜像导出,则可以跳过此操作。
检查 OS 分区和启动方式
1. 执行以下命令,检查 OS 分区是否为 GPT 分区。
sudo parted -l /dev/sda | grep 'Partition Table'
若返回结果为 msdos,即表示为 MBR 分区。
若返回结果为 gpt,即表示为 GPT 分区。
2. 执行以下命令,检查操作系统是否以 EFI 方式启动。
sudo ls /sys/firmware/efi
若存在文件,请您在导入镜像时选择启动模式为 UEFI,若当前选择的启动模式与镜像文件的启动模式不一致,可能影响您实例的正常启动。
若不存在文件,请您在导入镜像时选择启动模式为 Legacy BIOS。详细介绍可参见文档 启动模式 Legacy BIOS/UEFI 最佳实践。
检查系统关键文件
需检查的系统关键文件包括且不限于以下文件:
说明:
请遵循相关发行版的标准,确保系统关键文件位置和权限正确无误,可以正常读写。
/etc/grub2.cfg
: 此文件包含 GRUB2(引导加载程序)的配置信息。如果文件位置错误或权限设置不正确,可能会导致以下问题:系统无法启动,因为 GRUB 无法找到或读取其配置文件。
无法正常更新 GRUB 配置,例如在安装新内核时。
如果权限设置过于宽松(例如,允许非 root 用户写入),可能导致安全漏洞,因为恶意用户可能修改引导配置。
若要检查文件权限,请使用
ls -l /etc/grub2.cfg
命令。kernel 参数里推荐使用 uuid 挂载 root,其它方式(如 root=
/dev/sda
)可能导致系统无法启动。挂载步骤如下:1.1 执行以下命令,获取
/root
的文件系统名称。df -TH
返回结果如下图所示,表示
/root
文件系统名称为 /dev/vda1
。
1.2 执行以下命令,获取 UUID。
sudo blkid /dev/vda1
说明:
文件系统 UUID 不固定,请您定期确认及更新。例如,重新格式化文件系统后,文件系统的 UUID 将会发生变化。
1.3 执行以下命令,使用 VI 编辑器打开
/etc/fstab
文件。vi /etc/fstab
1.4 按 i 进入编辑模式。
1.5 将光标移至文件末尾,按 Enter,添加如下内容。结合前文示例则添加:
UUID=<UUID> / ext4 defaults 0 0
1.6 按 Esc,输入 :wq,按 Enter。保存设置并退出编辑器。
/etc/fstab
:此文件包含文件系统挂载信息。如果文件位置错误或权限设置不正确,可能会导致以下问题:系统启动时无法正确挂载文件系统,可能导致某些目录无法访问或使用。
无法手动挂载文件系统,因为挂载信息无法读取或解析。
如果权限设置过于宽松,可能导致安全漏洞,因为恶意用户可能修改挂载设置。
请勿挂载其它硬盘,迁移后可能会由于磁盘缺失导致系统无法启动。
若要检查文件权限,请使用
ls -l /etc/fstab
命令。/etc/shadow
:此文件包含加密的用户密码。如果文件位置错误或权限设置不正确,可能会导致以下问题: 用户无法登录,因为系统无法验证用户密码。
如果权限设置过于宽松(例如,允许非 root 用户读取),可能导致安全漏洞,因为恶意用户可能访问加密密码,并尝试破解它们。
若要检查文件权限,请使用
ls -l /etc/shadow
命令。卸载软件
卸载会产生冲突的驱动和软件(包括 VMware tools、Xen tools、Virtualbox GuestAdditions 以及一些自带底层驱动的软件)。
检查 virtio 驱动
云服务器系统内核需要支持 Virtio 驱动(包括块设备驱动
virtio_blk
和网卡驱动 virtio_net
)才能在腾讯云上正常运行。为避免导入自定义镜像后,创建的云服务器实例无法启动,您需要在导入镜像前,检查是否需要在源服务器中检查以及修复镜像中对 Virtio 驱动的支持。操作详情请参考 Linux 系统检查 Virtio 驱动。安装 cloud-init
Cloud-init 主要提供实例首次初始化时自定义配置的能力。如果导入的镜像没有安装 cloud-init 服务,基于该镜像启动的实例将无法被正常初始化,导致该镜像正常导入失败。安装详情请参考 Linux 系统安装 cloud-init。
检查其它硬件相关的配置
上云之后的硬件变化包括但可能不限于:
显卡更换为 Cirrus VGA。
磁盘更换为 Virtio Disk,设备名为 vda、vdb。
网卡更换为 Virtio Nic,默认只提供 eth0。
查找分区和大小
执行以下命令,查看当前操作系统的分区格式,判断需要复制的分区以及大小。
mount
以如下返回结果为例:
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)sys on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)dev on /dev type devtmpfs (rw,nosuid,relatime,size=4080220k,nr_inodes=1020055,mode=755)run on /run type tmpfs (rw,nosuid,nodev,relatime,mode=755)/dev/sda1 on / type ext4 (rw,relatime,data=ordered)securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)cgroup on /sys/fs/cgroup/unified type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate)cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,name=systemd)pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma)cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)systemd-1 on /home/libin/work_doc type autofs (rw,relatime,fd=33,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=12692)systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=39,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=12709)debugfs on /sys/kernel/debug type debugfs (rw,relatime)mqueue on /dev/mqueue type mqueue (rw,relatime)hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,pagesize=2M)tmpfs on /tmp type tmpfs (rw,nosuid,nodev)configfs on /sys/kernel/config type configfs (rw,relatime)tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=817176k,mode=700,uid=1000,gid=100)gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=100)
根据
/dev/sda1 on / type ext4 (rw,relatime,data=ordered)
表明根分区(/)位于 /dev/sda1
中,使用 ext4 文件系统。由于在输出中没有看到类似 /boot
和 /home
的挂载点信息,我们可以推断它们没有独立的分区,而是包含在根分区(/dev/sda1
)中。如果您需要复制整个磁盘(包括根分区、/boot
和 /home
),您可以复制整个 /dev/sda
设备。这样,您将获得一个完整的磁盘镜像,包括 MBR 和所有分区。注意:
导出的镜像中至少需要包含根分区以及 mbr。如果导出的镜像缺少 mbr,将无法启动。
在当前操作系统中,如果
/boot
和/home
为独立分区,导出的镜像还需要包含这两个独立分区。导出镜像
根据实际需求,选择不同的方式导出镜像。
使用 VMWare vCenter Converter
或 Citrix XenConvert 等虚拟化平台的导出镜像工具。详情请参见各平台的导出工具文档。说明:
目前腾讯云服务器迁移支持的镜像格式有:qcow2,vhd,raw,vmdk。
注意:
您可选择 使用 qemu-img 命令 或 使用 dd 命令 其中一种方式导出镜像:
使用
qemu-img
命令执行以下命令,安装所需包。本文以 Debian 为例,不同发行版的包可能不同,请对应实际情况进行调整。
apt-get install qemu-utils
执行以下命令,将
/dev/sda
导出至 /mnt/sdb/test.qcow2
。sudo qemu-img convert -f raw -O qcow2 /dev/sda /mnt/sdb/test.qcow2
其中,
/mnt/sdb
为挂载的新磁盘或者其他网络存储。
如果您需要转换成其他格式,请修改 -O
的参数值。可修改的参数值如下:参数值 | 含义 |
qcow2 | qcow2 格式 |
vhd | vhd 格式 |
vmdk | vmdk 格式 |
raw | 无格式 |
使用
dd
命令
例如,执行以下命令,导出 raw 格式的镜像。sudo dd if=/dev/sda of=/mnt/sdb/test.imag bs=1K count=$count
其中,
count
参数即为需要复制分区的数量,您可以通过 fdisk
命令查出该数量值。如果您需要全盘复制,count
参数则可以忽略。例如,执行以下命令,查看 /dev/sda 的分区数量。
fdisk -lu /dev/sda
返回类似如下结果:
Disk /dev/sda: 1495.0 GB, 1494996746240 bytes255 heads, 63 sectors/track, 181756 cylinders, total 2919915520 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 4096 bytesI/O size (minimum/optimal): 4096 bytes / 4096 bytesDisk identifier: 0x0008f290Device Boot Start End Blocks Id System/dev/sda1 * 2048 41945087 20971520 83 Linux/dev/sda2 41945088 46123007 2088960 82 Linux swap / Solaris/dev/sda3 46123008 88066047 20971520 83 Linux/dev/sda4 88066048 2919910139 1415922046 8e Linux LVM
由
fdisk
命令的返回结果可得知,sda1 结束位置在41945087 * 512= 21474836464 字节处,将字节数转换为兆字节:21474836464 字节 / (1024 * 1024) = 20480 MB,因此在这个例子中可以将count
参数设置为略大于实际分区大小的值,例如 20481 MB。这样可以确保复制整个分区,避免因四舍五入误差而导致的不完整复制。在实际操作中,您需要根据您自己的分区情况计算相应的 count
参数值。说明:
转换镜像格式(可选)
检查镜像
说明:
当您未停止服务直接制作镜像或者其它原因,可能导致制作出的镜像文件系统有误,因此建议您在制作镜像后检查是否无误。
当镜像格式和当前平台支持的格式一致时,您可以直接打开镜像检查文件系统。例如,Windows 平台可以直接附加 vhd 格式镜像,Linux 平台可以使用 qemu-nbd 打开 qcow2 格式镜像,Xen 平台可以直接启用 vhd 文件。本文以 Linux 平台为例,检查步骤如下:
1. 依次执行以下命令,检查是否已有 nbd 模块。
modprobe nbd
lsmod | grep nbd
返回结果如下,则说明已有 nbd 模块。如返回结果为空,则请检查内核编译选项
CONFIG_BLK_DEV_NBD
是否打开。如未开启,您需要更换一个包含 NBD 模块的系统,或者自行编译内核并打开 CONFIG_BLK_DEV_NBD 选项。
2. 依次执行以下命令,检查镜像。
qemu-nbd -c /dev/nbd0 xxxx.qcow2
mount /dev/nbd0p1 /mnt
执行
qemu-nbd
命令后,/dev/nbd0
就映射了 xxx.qcow2
中的内容。而 /dev/nbd0p1
代表该虚拟磁盘的第一个分区,若 nbd0p1 不存在或 mount 不成功,则很可能是镜像错误。