在提供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密码已经被修改了。