在提供VM给用户使用的时候,可能需要生成一个随机密码供用户第一次登陆VM使用,这就涉及到修改VM映像中root密码的问题。对于Linux映像而言,可以使用qemu-nbd和chroot来进行修改。本文中以CentOS为例(因为ubuntu更加简单)。

    宿主机OS:Ubuntu 12.04LTS

    VM OS:CentOS 6.2

    首先,无论采用何种虚拟化技术,都要生成一个映像文件,可以是raw、qcow2等格式的,这里以kvm为例(因为比较方便,xen要写配置文件太麻烦),生成一个4G的映像文件。

    # kvm-img create -f raw centos.img 4G

    然后,将下载好的iso文件挂载到VM的光驱上,在映像中安装系统。

    # kvm -m 1024 -cdrom CentOS-6.2-x86_64-minimal.iso -drive file=centos.img -boot d -net nic -net tap -nographic -vnc :6

    (如果你对kvm不熟,注意:"-vnc"和冒号之间有个空格)

    接下来,用VNC打开安装界面,按步骤安装。

    # vncviewer 192.168.1.102:6

    安装完以后就会进入系统,你可以自定义地配置映像中的系统来满足未来量产的需求。其中,为了能够通过chroot修改root密码,必须关闭SELINUX,否则使用chroot对系统文件进行修改都不会生效,因为受到SELINUX的保护。

    # sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

    关闭VM,接下来把映像挂载起来用chroot进行修改。(如果不关机,也可以挂载映像文件并修改VM文件系统里的内容,但是似乎不会生效。)

   用mount挂载全虚拟化模式下安装的映像文件是不行的,所以这里就要用到qemu-nbd,这个工具很强大,即便映像文件中的文件系统类型是ntfs的,也可以被挂载起来。

   # qemu-nbd --connect=/dev/nbd0 /home/p_w_picpaths/centos.img

   (这里的映像文件路径必须是绝对路径,qemu-nbd似乎不能识别相对路径)

   # partprobe /dev/nbd0

   # mount /dev/nbd0p1 /mnt

   (具体分区表请通过fdisk -l /dev/nbd0查看)

   挂载完毕后,chroot到/mnt下,然后使用passwd修改root密码

    # chroot /mnt

   # passwd root

   修改完毕后,推出chroot的shell,卸载映像文件。

   # exit

   # umount /mnt

   # qemu-nbd --disconnect /dev/nbd0

   启动VM。

   # kvm -m 1024 -drive file=centos.img -boot c -net nic -net tap -nographic -vnc :6
 

   再登录VM的时候,会发现root密码已经被修改了。