手动将正在运行的 Linux 转换为虚拟机后出现启动问题

手动将正在运行的 Linux 转换为虚拟机后出现启动问题

我将正在运行的 debian8 安装文件复制到了映像中。以下是操作步骤。

  1. 创建一个 vdisk 映像 - raw/vdi。
  2. 将其安装到本地。
  3. 对正在运行的 Linux 发行版进行文件复制:

    rsync -aAXv --delete --exclude={"/dev/","/proc/","/sys/","/tmp/“,“/跑步/","/mnt/“,“/媒体/","/失物招领","/家/“} /* “$TMPDIR”

  4. 安装extlinux引导加载程序和相关内容/boot/extlinux.conf、更新/etc/fstab、卸载和启动。

我能够使用 qemu 进行启动。能够登录到控制台模式。

问题

  1. 尝试挂载交换分区失败,但 /etc/fstab 中没有提供任何参考。
  2. 无法加载内核模块。
  3. 我看到了启动 lig​​htdm 的消息,但显示下一个 VT 来登录。
  4. 我还没有为目标重新创建 initram-fs,这会导致问题吗?

请帮忙。

——问候,JB

答案1

已经能够解决一些问题,从而从正在运行的系统创建可启动的虚拟机映像。

问题:

  1. 没有效果。
  2. 没有效果。
  3. 这实际上是 1 个问题和 1 个错误,我有一个带有特定驱动程序的自定义 xorg.conf,删除 xorg.conf 会使 qemu 启动到图形模式。另一个原因是 qemu 速度太慢,你只需要等待很长时间才能启动 lig​​htdm。
  4. 没有效果。

为了方便起见,我将整个过程总结在一个脚本中:

#!/bin/bash
# create bootable image from running linux distro

IMG_format="raw"
IMG_name="debian8"
IMG_size="13G"

LNX_image="vmlinuz-4.4.3"
LNX_initrd="initrd.img-4.4.3"
LNX_rootdev="/dev/sda"

TMPDIR="/mnt/vmd/"
WRKDIR="/media/domnic/tmp1"

create_img(){
  IMG="$WRKDIR/$IMG_name.$IMG_format"
  echo "image => $IMG"

  if [ -a "$IMG"]; then
    echo "vm [$IMG] already exists... skipped!"
  else
    if [ "vdi" == "$IMG_format" ]; then
      #- create .vdi
      VBoxManage createhd --filename $IMG --size $(( IMG_size * 1024 ))
    else
      #- or create image on .raw disk
      fallocate -l $IMG_size $IMG
      mkfs.ext4 -F $IMG
    fi
  fi
}

mount_img(){
  echo "mount => $TMPDIR"
  IMG="$WRKDIR/$IMG_name.$IMG_format"
  if [ ! -d "$TMPDIR" ]; then
    mkdir -p $TMPDIR
  fi

  if [ "vdi" == "$IMG_format" ]; then
    #- mount .vdi
    vdfuse -a -f $IMG /mnt/vdi
    mount -o loop /mnt/vdi/1 $TMPDIR
  else
    #- mount image to tmpdir
    mount $IMG $TMPDIR
  fi
}

clone_img(){
  echo "clone => $TMPDIR"
  #- copy files
  rsync -aAX --delete --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/home/*"} /* "$TMPDIR"

  #- install bootloader
  extlinux --install $TMPDIR/boot

  #- update bootloader
  #-- qemu default: root=/dev/sda
  cat > $TMPDIR/boot/syslinux/extlinux.conf <<- EOM
DEFAULT $IMG_name_$LNX_image
LABEL   $IMG_name_$LNX_image
SAY     Booting $IMG_name - $LNX_image
LINUX   /boot/$LNX_image
INITRD  /boot/$LNX_initrd
APPEND  root=$LNX_rootdev rw
EOM

  #-- remove invalid entries from $TMPDIR/etc/fstab
  echo "/dev/sda   /   ext4   defaults   0   1" > $TMPDIR/etc/fstab

  #- unmount image and boot
  umount $TMPDIR
  if [ "vdi" == "$IMG_format" ]; then
    umount /mnt/vdi  
  fi
}

start_vm(){
  IMG="$WRKDIR/$IMG_name.$IMG_format"
  echo "vm => $IMG"

  qemu-system-i386 \
    -display sdl \
    -soundhw ac97 \
    -vga cirrus \
    $IMG
}

case $1 in
  create_img)
    create_img
    ;;
  mount_img)
    mount_img
    ;;
  clone_img)
    clone_img
    ;;
  start_vm)
    start_vm
    ;;
esac

相关内容