红联Linux门户
Linux帮助

基于Dom0(rhel6.5 x86_64)制作一个运行于DomU的微型Linux系统

发布时间:2016-09-01 10:55:08来源:linux网站作者:11号313
xl create命令能够基于预配置的根文件系统、能运行于XenDomU的内核、ramfs和Xen配置文件启动DomU,当然,在其启动之前,所有需要用到的其它组件都需要准备就绪方才可以。这一切准备就绪后,使用xlcreate命令有点类似于按下主机的电源按钮对其进行启动。下面开始制作过程。
 
一、制作根文件系统
创建空的虚拟磁盘映像,以之作为新建非特权域的虚拟磁盘映像文件,此映像文件并不真正占用为其指定的空间,而是随着存储的内容而变化。文件的路径和其虚拟空间大小(这里为2048)也可根据需要进行指定。
1、创建目录让镜像文件放在此目录下:
[root@hxk ~]# mkdir /xen/vm1 -pv
mkdir: 已创建目录 "/xen"
mkdir: 已创建目录 "/xen/vm1"
2、创建镜像文件
[root@hxk ~]# dd if=/dev/zero of=/xen/vm1/test.imgoflag=direct bs=1M seek=2048 count=1
3、接下来将此虚拟磁盘映像格式化为ext4文件系统。
[root@hxk ~]# mkfs.ext4 /xen/vm1/test.img
4、将格式化完毕的虚拟磁盘映像文件挂载至某目录下,如/mnt,并创建根文件系统目录结构。
[root@hxk ~]# mount -o loop /xen/vm1/test.img /mnt
5、Linux系统的启动过程中,内核初始化完成后,会运行/sbin/init以启动PID号为1的init进程,并在其配置文件的辅助下启动完成挂载额外文件系统、启动服务、启动终端等后续任务。我们这里将/sbin/init的任务精简为仅启动bash进程并打印命令提示符于终端。
我们需要复制 /sbin/init与/bin/bash
这两个二进制程序的运行依赖于一些系统库文件,ldd命令可以查看每个二进制程序所依赖的库文件,将每个二进制程序所依赖的库文件复制到虚拟磁盘映像文件挂载点(/mnt)中对应的路径下即可。
这里的操作我们通过shell脚本实现
---------------------------------------------------
#!/bin/bash
#
DEST=/mnt
libcp() {
LIBPATH=${1%/*}
[ ! -d $DEST$LIBPATH ] && mkdir -p$DEST$LIBPATH
[ ! -e $DEST${1} ] && cp $1$DEST$LIBPATH && echo "copy lib $1 finished."
}
bincp() {
CMDPATH=${1%/*}
[ ! -d $DEST$CMDPATH ] && mkdir -p$DEST$CMDPATH
[ ! -e $DEST${1} ] && cp $1$DEST$CMDPATH
for LIB in  `ldd $1 | grep-o "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`; do
libcp $LIB
done
}
read -p "Your command: " CMD
until [ $CMD == 'q' ]; do
! which $CMD &&echo "Wrong command" && read -p "Input again:" CMD&& continue
COMMAND=` which $CMD | grep -v "^alias" |grep -o "[^[:space:]]\{1,\}"`
bincp $COMMAND
echo "copy $COMMAND finished."
read -p "Continue: " CMD
done
---------------------------------------------------
将此脚本内容复制到1.sh中
然后给与执行权限
[root@hxk ~]# chmod +x 1.sh 
运行该脚本,如下图所示输入init与bash即可
基于Dom0(rhel6.5 x86_64)制作一个运行于DomU的微型Linux系统
6、建立相关的一些文件
[root@hxk ~]# cd /mnt
[root@hxk mnt]# mkdir -pv proc etc/{init,rc.d} var/{log,run}sys dev usr/lib64 tmp
/sbin/init的运行还需要一些配置文件,它们是位于/etc/init目录以.conf结尾的文件。我们这里为其建立一个简单的配置文件rcS.conf。因此,这里需要创建/mnt/etc/init/rcS.conf文件
[root@hxk mnt]# cp /etc/init/rcS.conf etc/init/
修改其内容为:
# rcS - runlevel compatibility
#
# This task runs the old sysv-rc startup scripts.
#
# Do not edit this file directly. If you want to change thebehaviour,
# please create a file rcS.override and put your changesthere.
start on startup
stop on runlevel
task
# Note: there can be no previous runlevel here, if we have oneit's bad
# information (we enter rc1 not rcS for maintenance). Run /etc/rc.d/rc
# without information so that it defaults to previous=Nrunlevel=S.
console output
exec /etc/rc.d/rc.sysinit
上面的配置文件依赖于/etc/rc.d/rc.sysinit脚本来完成系统的初始化,因此,这里编辑/mnt/etc/rc.d/rc.sysinit,为其添加如下内容。
#!/bin/bash
echo -e "\tWelcome to Xen DomU test"
exec /bin/bash
而后执行如下命令让其具有执行权限:
chmod +x  /mnt/etc/rc.d/rc.sysinit
完成后卸载此磁盘映像文件。
umount  /mnt
 
二、为目标DomU制作配置文件
我们这里已经制作完成一个根文件系统,接着还需要能运行于DomU的内核,相应的ramfs和Xen配置文件。事实上,这里的Dom0中使用的内核就可以运行于DomU,其相应的ramfs文件也可以直接使用,因此,此两者文件我们就不再另外制作。
接下来只需再为目标DomU提供一个配置文件,其就能启动了。于是我们去新配置文件/etc/xen/test,其内容如下。
kernel = "/boot/vmlinuz-2.6.32-431.el6.x86_64"
ramdisk = "/boot/initramfs-2.6.32-431.el6.x86_64.img"
name = "test"
memory = "128"
disk = [ 'file:/xen/vm1/test.img,xvda,w', ]
vcpus=1
root = "/dev/xvda ro"
extra = "selinux=0 init=/sbin/init"
---------------------------------------------------
参数资料:
Xen配置文件一般由选项(options)、变量(variables)、CPU、网络、PCI、HVM、计时器(timers)、驱动(drivers)、磁盘设备(diskdevices)、动作(behavior),以及图形及声音(Graphics andaudio)几个段组成,分别用于定义不同类别的域属性或设备属性。
上面的配置文件中的各选项作用如下。
kernel:为当前域指定可用于DomU的内核文件;
ramdisk:与kernel指定的内核文件匹配使用的ramdisk映像文件,根据需要指定,此为可选项;
name:当前域的独有名称;每个域必须使用全局惟一的名称,否则将产生错误;
memory:当前域的可用物理内存空间大小,单位为MB,默认为128;
disk:当前域的所有可用磁盘设备列表,格式为disk = [ “disk1”, “disk2”,…],每个disk都有三个参数进行定义,格式为“backend-dev,front-dev,mode”;
backend-dev主要有两种类型,物理设备或虚拟磁盘映像文件,它们的格式分别为“phy:device”和“file:/path/to/file”;
frontend-dev定义其在DomU中的设备类型;
mode则用于定义其访问权限,r为只读,w为读写;
vcpus:配置给当前域使用的虚拟CPU的个数;默认为1;
root:为当前域指定其根文件系统所在的设备,这个将作为内核参数在内核启动传递给内核;
extra:传递给内核的额外参数,其中selinux=0表示禁用selinux,init则用于指定init程序的路径;多个参数之间使用空格隔开;
on_reboot:执行xmreboot命令或在当前域内部执行重启操作时由Xen执行的动作;其常用的值为destroy和restart;
on_crash:当前域由于各种原因崩溃时由Xen执行的动作;其常用的值为destroy、restart和preserve,preserve可以保存系统崩溃前的状态信息以用于调试;
on_reboot:执行xm shutdown命令或在当前域内部执行关机操作时由Xen执行的动作;
/dev/sdb
disk = [ 'phy:/dev/sdb,xvda,w', ]
其它常用参数:
vif:定义当前域的可用虚拟网络接口列表,每个虚拟网络接口都可以使用“name=value”的格式定义其属性;也可在定义某接口时不指定任何属性,其所有属性将均由系统默认配置;例如:vif= ['ip = "192.168.1.19", bridge=xenbr0']
type:接口设备的类型,默认为netfront;
mac:MAC地址,默认为随机;
bridge:桥接到的物理设备,默认为Dom0中的第一个桥接设备;
ip:ip地址;
script:配置此接口的脚本文件,省略时将使用默认的配置脚本;
vifname:后端设备的设备名称,默认为vifD.N,其中D为当前域的ID,N为此网络接口的ID;
vfb:为当前域定义虚拟帧缓冲,其有许多可用属性,可以使用“name=value”的格式进行定义;
vnc或sdl:定义vnc的类型,vnc=1表示启动一个可由外部设备连接的vnc服务器,sdl=1则表示启用一个自有的vncviewer;两者可以同时使用;
vncdisplay:vnc显示号,默认为当前域的ID,当前域的VNC服务器将监听5900+此显示号的端口;
vnclisten:VNC服务器监听的地址,默认为127.0.0.1;
vncunused:如果此属性的值为非零值,则表示vncserver监听大于5900的第一个没被占用的端口;
vncpasswd:指定VNC服务器的认证密码;
display:用于域的自有vncviewer显示,默认为DISPLAY环境变量的值;
cpu:指定当前域应该在哪个物理CPU上启动,0表示第一颗CPU,1表示第二颗,依次类推;默认为-1,表示Xen可自行决定启动当前域的CPU;
cpus:指定当前域的VCPU可以在哪些物理CPU上运行,如cpus =”3,5-8,^6”表示当前域的VCPU可以在3,5,7,8号CPU上运行;
bootloader:bootloader程序的路径;基于此bootloader,PVDomU的内核也可直接位于其文件系统上而非Dom0的文件系统;
 
三、启动名为test的DomU 
启动DomU,可使用xm create命令或xlcreate命令,但要使用xm命令,需要事先启动Xend服务;然而,要使用xl命令,则不能启动Xend服务。我们这里仍然以xm为例。
xm create  -c /etc/xen/test
在启动中如果发现下图错误:
基于Dom0(rhel6.5 x86_64)制作一个运行于DomU的微型Linux系统
则是因为/etc/xen/test内给的内存太小了,现在加大内存变为512
再次启动
其中的-c选项表示启动后直接连接至虚拟机的终端,整个启动过程就在当前屏幕上显示。如下面所示的启动过程的最后几行
dracut: Switching root
Welcome to Xen DomU test
bash: cannot set terminal process group (-1): Inappropriateioctl for device
bash: no job control in this shell
则说明成功。
可以按ctrl+右中括号返回
在Dom0的终端上执行xm list命令即可查看test的运行状态。
[root@hxk ~]# xm list
Name                                  ID   MemVCPUs      State  Time(s)
Domain-0                               0   496    2     r-----    88.1
test                                   3   512    1    -b----     2.4
 
本文永久更新地址:http://www.linuxdiyf.com/linux/23791.html