从Xen Host Kernel复制出一个半虚拟化的Guest 创建并启动一个xen半虚拟化PV客户机

在《

创建并启动一个xen半虚拟化PV客户机

》一文中讲解了如何从Ubuntu的http源安装半虚拟化的xen guest OS,核心思想是先下载客户机的vmlinuz和initrd,启动xen虚拟机后将会选择ubuntu网络源,进行在线安装。后来准备做几个guest副本时,发现这种在逻辑卷中安装的guest好像难以复制(暂时不知道,主要是不知道如何mount这个逻辑卷,因为它又被分成了Linux和Swap格式),看如下图,该虚拟机使用的一个lv_domU2:

为了能够方便复制出多个半虚拟化guest,又重新研究和实验了在img中安装guest,这种方式下安装完一个Guest后,我们只需要复制这个guest的img和xen配置文件即可。

这种方法主要参考了:http://www.virtuatopia.com/index.php/Building_a_Xen_Virtual_Guest_Filesystem_on_a_Disk_Image_(Cloning_Host_System)。从Xen
Host复制出一个Guest。

前提:安装完kernel-xen和xen4.5,并且xl info查看没问题。

1)为guest创建root img和swap

创建一个20G的用于根文件系统的 img

# dd if=/dev/zero of=centos1.img bs=1M seek=20480 count=0

然后格式化成Linux 83文件系统格式

# mkfs -t ext3 centos1.img

创建一个2G的用于swap交换的img

# dd if=/dev/zero of=centos1.swap bs=1M seek=2048 count=0

格式化为swap

# mkswap centos1.swap

2)复制Host的根文件系统到guest的根文件系统img中

# mkdir /tmp/loop

# mount -o loop centos1.img /tmp/loop

# cp -ax /{bin,dev,etc,lib,lib64,root,sbin,usr,var} /tmp/loop

这里要非常注意!!!在x86_64中一定要记得复制/lib64,因为lib64中有一些系统必须的链接库。

创建剩余的文件夹

# mkdir /tmp/loop/{home,proc,opt,sys.tmp}

# chmod 777 /tmp/loop/tmp

3)修改guest root filesystem中的一些文件

/tmp/loop/etc/fstab:

/dev/xvda1               /                       ext3    defaults 1 1
/dev/xvda2               none                    swap    sw       0 0
none                    /dev/pts                devpts  gid=5,mode=620 0 0
none                    /dev/shm                tmpfs   defaults 0 0
none                    /proc                   proc    defaults 0 0
none                    /sys                    sysfs   defaults 0 0

注意这些文件中保存的用户信息和主机信息

/tmp/loop/etc/passwd

/tmp/loop/etc/group

/tmp/loop/etc/hosts

修改网络配置

/tmp/loop/etc/sysconfig/network 修改HOSTNAME=centos6-1,GATEWAY=192.168.122.1(xenbr0的IP)

/tmp/loop/etc/sysconfig/network-scripts/ifcfg-eth0 设置一个和Host xenbr0在同一个网段的IP
,还要删掉UUID和HWADDR,要不然和host端的硬件地址一样了。或者是在通过控制台连接到虚拟机后再修改也可以。

exported for NFS access to remote systems文件

/tmp/loop/etc/exports

卸载guest的根目录

# umount /tmp/loop/

4)创建一个xen虚拟机配置文件centos1.cfg

为了避免SCSI模块又报错,我们重新生成一个initrd,参考http://www.virtuatopia.com/index.php/A_Xen_Guest_OS_fails_to_boot_with_a_%22switchroot:_mount_failed:_No_such_file_or_directory_error_message%22_error_message.:

 mkinitrd --omit-scsi-modules --with=xennet --with=xenblk --preload=xenblk initrd-$(uname -r)-no-scsi.img $(uname -r)

指定启动内核为Host的内核文件

kernel = "/boot/vmlinuz-3.14.42-1.el6xen.x86_84"
ramdisk = "/boot/initrd-3.14.42-1.el6xen.x86_64.img"
memory = 1024
name = "centos1"
vif = [ ‘bridge=xenbr0‘ ]
disk = [‘tap:aio:/path/to/centos1.img,xvda1,w‘, ‘tap:aio:/path/to/centos1.swap,xvda2,w‘]
root = "/dev/xvda1 ro"

需要注意的是,在启动虚拟机的时候可能会报出dracut: chroot: failed to run command `/sbin/load_policy‘: No such file or directory,这就是因为clone根文件系统时没有把/lib64复制到guest中造成的,参考http://marc.info/?l=xen-users&m=135907220030809。

5)启动并控制台连接到虚拟机

xl create /path/to/centos1.cfg -c

最后出现登录提示,使用Host OS的帐号密码登录即可

CentOS release 6.6 (Final)

Kernel 3.14.42-1.el6xen.x86_64 on an x86_64

centos6-1 login:

6)这样我们就可以通过复制已经创建好的guest的根文件系统img和swap,并且复制修改一个xen客户机配置文件,修改好根文件系统中的一些文件如fstab和network,就可以很方便地clone多个虚拟机了。

时间: 2024-08-01 20:06:56

从Xen Host Kernel复制出一个半虚拟化的Guest 创建并启动一个xen半虚拟化PV客户机的相关文章

weblogic管理2 - 创建并启动一个managed server

创建一个managed server. 1.  进入网页console管理页面,如:http://10.100.25.14:7001/console     , 先点击->服务器 (红色标记框),再点击->锁定并编辑  . 2.   点击-> 新建 3. 填好相关内容 (注意端口不要与admin server冲突) , 点击-> 下一步 4.  点击-> 完成 *********至此一个managed server已经创建完成. -----------------------

如何定义,创建,启动一个线程

如何定义一个线程?第一通过继承java.lang.Thead类来定义一个线程.第二,通过实现java.lang.runnable接口定义一个线程. 为什么不采用run方法直接启动线程呢?线程是由操作系统来管理的,操作系统启动一个线程,会调用本地的一个代码,这个本地的代码会使系统初始化一个新的线程,由新的线程来启动Thead类中的run方法,所以要通过start方法来启动一个线程 两种定义线程的方式都有哪些优缺点?

如何创建和启动一个线程?

原文转自:http://www.tqcto.com/article/recommend/137.html 一.定义线程 1.继承java.lang.Thread类. 此类中有个run()方法,应该注意其用法: public void run() 如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法:否则,该方法不执行任何操作并返回. Thread 的子类应该重写该方法. 2.实现java.lang.Runnable接口. public  vo

Android--------从一个包中的Avtivity创建另外另外一个包的Context

Android中有Context的概念,想必大家都知道.Context可以做很多事情,打开activity.发送广播.打开本包下文件夹和数据库.获取classLoader.获取资源等等.如果我们得到了一个包的Context对象,那我们基本上可以做这个包自己能做的大部分事情. 那我们能得到吗?很高兴的告诉你,能!      Context有个createPackageContext方法,可以创建另外一个包的上下文,这个实例不同于它本身的Context实例,但是功能是一样的. 这个方法有两个参数:1

复制出的虚拟机启动不能ping通的解决思路分析

用clone方法复制出的Ubuntu虚拟机启动后,尽管IP等网络信息不和其他虚拟机冲突,但就是无法ping通其他虚拟机. 创建得到的虚拟机信息: ? 复制得到的虚拟机信息: ? ? ? ? ? ?通过观察网络配置文件,发现两台虚拟机的网卡名称是最大的区别.按照常理,当系统中只有一块网卡时,Linux的硬件侦测程序会把它标识为第一块网卡,即在Ubuntu中应显示为编号0而不是1.这就意味着,复制得到的虚拟机中还应存在一张网卡,只不过由于未被侦测到而未能挂载到Ubuntu系统中,而这张看不见的网卡就

面试题之java 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 要求不能出现截半的情况

题目:10. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”. 一.需要分析 1.输入为一个字符串和字节数,输出为按字节截取的字符串-------------->按照字节[byte]截取操作字符串,先将String转换成byte类型 .2.汉字不可以截半----------------------------------

009实现一个算法来删除单链表中的一个结点,只给出指向那个结点的指针(keep it up)

呵呵,这个题不能直接删除已知的结点,因为是单链表,不知道前驱,只知道 后继结点,直接删除会使链表断开.不过我们可以删除已知结点的后继结点, 把后继结点的值赋值给已知结点. #include <iostream> struct Node { int data; Node* next; }; bool removeNode(Node* vNode) { if (vNode == NULL || vNode->next == NULL) return false; Node* pNext =

根据某一文件复制出大量固定位数后缀名的递增的文件

1.trre.sh   :根据某一文件复制出大量固定位数后后缀递增的文件.   如将 SPINFO_190516_20170109.001 复制成SPINFO_190516_20170109.002 .SPINFO_190516_20170109.003  ......... SPINFO_190516_20170109.600 #for  i in {1..600}  #这种方式有的bash不兼容?for ((i=1;i<=10;i++)) do   v_num=$(printf "%.

cc150:实现一个算法来删除单链表中间的一个结点,只给出指向那个结点的指针

实现一个算法来删除单链表中间的一个结点,只给出指向那个结点的指针. 例子: 输入:指向链表a->b->c->d->e中结点c的指针 结果:不需要返回什么,得到一个新链表:a->b->d->e 解答 这个问题的关键是你只有一个指向要删除结点的指针,如果直接删除它,这条链表就断了. 但你又没办法得到该结点之前结点的指针,是的,它连头结点也不提供.在这种情况下, 你只能另觅他径.重新审视一下这个问题,我们只能获得从c结点开始后的指针, 如果让你删除c结点后的某个结点,那