openstack配置以及镜像制作(整理)_第1页
openstack配置以及镜像制作(整理)_第2页
openstack配置以及镜像制作(整理)_第3页
openstack配置以及镜像制作(整理)_第4页
openstack配置以及镜像制作(整理)_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、在Ubuntu上安装和配置OpenStack NovaOpenStack Nova 需要 NTP 服务器来保持所有节点服务器(Cloud Compute)的时间同步,所以需要在前端控制服务器(Cloud Controller)上安装 NTP 服务器,然后在节点服务器上安装 NTP 客户端保持与前端的同步:OpenStack 是由 Rackspace 和 NASA 共同开发的云计算平台,帮助服务商和企业内部实现类似于 Amazon EC2 和 S3 的云基础架构服务(Infrastructure as a Service, IaaS)。OpenStack 包含两个主要模块:Nova 和 Swif

2、t,前者是 NASA 开发的虚拟服务器部署和业务计算模块;后者是 Rackspack 开发的分布式云存储模块,两者可以一起用,也可以分开单独用。OpenStack 是开源项目,除了有 Rackspace 和 NASA 的大力支持外,后面还有包括 Dell、Citrix、 Cisco、 Canonical 这些重量级公司的贡献和支持,发展速度非常快,有取代另一个业界领先开源云平台 Eucalyptus 的态势。OpenStack 是 Python 2.6 写的,CentOS 5.6 上默认的是 Python 2.4 的环境并且还有很多依赖关系不容易升级到 2.6,所以在 Ubuntu 上安装会简

3、单一些,而且 Ubuntu 是 OpenStack 的官方首选系统,文档都是按 Ubuntu 写的,所以这里采用最新的 Ubuntu 11.10 Server 64bit 版本来安装和配置 OpenStack Nova. 配置网络在安装完基本的 Ubuntu 11.10 Server 系统后升级和更新整个系统,安装完 bridge-utils 包后重启系统:$ sudo apt-get update$ sudo apt-get upgrade$ sudo apt-get install bridge-utils$ sudo reboot配置网络:$ sudo vi /etc/network/i

4、nterfacesauto loiface lo inet loopbackauto eth0iface eth0 inet staticaddress 00netmask gateway 安装 NTP 服务OpenStack Nova 需要 NTP 服务器来保持所有节点服务器(Cloud Compute)的时间同步,所以需要在前端控制服务器(Cloud Controller)上安装 NTP 服务器,然后在节点服务器上安装 NTP 客户端保持与前端的同步:$ sudo apt-get install -y ntp打开NTP的配置文件 vi /etc/ntp.conf,添加如下(其他的serve

5、r可以注释掉)server server fudge stratum 10本地地址可以作为备份,当网络不通时可以利用本地时钟进行同步,也可只用本地时钟重启NTP是配置生效$ sudo /etc/init.d/ntp restart安装和配置 MySQL 数据库OpenStack Nova 需要数据库的支持,这里选用 MySQL(当然也可以用其他的数据库,比如 PostgreSQL 等):$ sudo apt-get install mysql-server修改 MySQL 绑定地址,以便其他的节点服务器也能访问这个数据库:$ sudo vi /etc/mysql/f#bind-address

6、= bind-address = $ sudo /etc/init.d/mysql restart安装 Glance 镜像服务Glance 是个镜像服务器,用来给 OpenStack Nova 提供操作系统镜像(image)服务,提供可选择的操作系统模版(镜像)。$ sudo apt-get install glanceMySQL创建数据库glance:$ sudo mysql -uroot p -e CREATE DATABASE glance;创建用户 glancedbadmin:$ sudo mysql -uroot -p -e CREATE USER glancedbadmin;把数据

7、库glance的所有特权赋给glancedbadmin用户$ sudo mysql -uroot -p -e GRANT ALL PRIVILEGES ON glance.* TOglancedbadmin% ;为用户glancedbadmin创建密码为glancedbadmin$ sudo mysql -uroot -p -e SET PASSWORD FOR glancedbadmin% =PASSWORD(glancedbadmin);编辑 /etc/glance/glance-registry.conf 文件,修改sql_connection = 一行为:sql_connection

8、= mysql:/glancedbadmin:glancedbadmin00/glance重启glance-registry 使修改后的/etc/glance/glance-registry.conf生效$ sudo restart glance-registry安装 OpenStack NovaOpenStack Nova 已经进入 Ubuntu 11.10 源,所以直接安装就可以了,不必源码安装:安装消息队列服务器 RabbitMQ和nova的各个组件.$ sudo apt-get install -y rabbitmq-server nova-common nova-doc python

9、-nova nova-api nova-network nova-volume nova-objectstore nova-scheduler nova-compute安装 euca2ools命令行工具包$ sudo apt-get install -y euca2ools安装解压缩工具unzip.$ sudo apt-get install -y unzipMySQL创建数据库 nova$ sudo mysql -uroot p -e CREATE DATABASE nova;创建用户 novadbadmin$ sudo mysql -uroot -p -e CREATE USER nova

10、dbadmin;把数据库nova的所有特权赋给novadbadmin用户$ sudo mysql -uroot -p -e GRANT ALL PRIVILEGES ON nova.* TOnovadbadmin% ;为用户novadbadmin创建密码为novadbadmin$ sudo mysql -uroot -p -e SET PASSWORD FOR novadbadmin% =PASSWORD(novadbadmin);Nova 配置编辑/etc/nova/nova.conf-dhcpbridge_flagfile=/etc/nova/nova.conf-dhcpbridge=/u

11、sr/bin/nova-dhcpbridge-logdir=/var/log/nova-state_path=/var/lib/nova-lock_path=/var/lock/nova-force_dhcp_release=True-use_deprecated_auth-verbose-s3_host=00-rabbit_host=00-cc_host=00-nova_url=00:8774/v1.1-ec2_url=00:8773/services/Cloud-fixed_range=/24-network_size=8-routing_source_ip=00-sql_connecti

12、on=mysql:/novadbadmin:novadbadmin00/nova-glance_host=00-glance_api_servers=00:9292-image_service=nova.image.glance.GlanceImageService-vlan_interface=br100-public_interface=eth0 -flat_interface=eth0修改/etc/nova 目录的所有权,允许修改/etc/nova/nova.conf文件$ sudo chown -R root:nova /etc/nova$ sudo chmod 644 /etc/no

13、va/nova.conf重启nova的相关服务.$ sudo restart libvirt-bin; $ sudo restart nova-network; $ sudo restart novacompute;$ sudo restart nova-api; $ sudo restart nova-objectstore; $ sudo restart nova-scheduler; $ sudo restart nova-volume; $ sudo restart glance-api; $ sudo restart glance-registry每次一个个启动服务比较麻烦,可以编写

14、一个脚本取名为start.sh(自定义)#! /bin/bashsudo /etc/init.d/libvirt-bin restart;sudo /etc/init.d/nova-network restart;sudo /etc/init.d/nova-compute restart;sudo /etc/init.d/nova-api restart;sudo /etc/init.d/nova-objectstore restart;sudo /etc/init.d/nova-scheduler restart;sudo /etc/init.d/nova-volume restart;su

15、do /etc/init.d/glance-api restart;sudo /etc/init.d/glance-registry restart;将start.sh修改为可执行文件$sudo chmod 777 /home/bery/start.sh使用 Nova开始使用 Nova 前需要创建 nova 数据库表、创建网络、创建管理员帐号、创建云并联到刚才创建的管理员上:$ sudo nova-manage db sync$ sudo nova-manage network create private /24 1 255$ sudo nova-manage floating create

16、 ip_range=/24为nova数据库创建一个有管理员权限的用户bery$ sudo nova-manage user admin bery创建一个名为proj的项目$ sudo nova-manage project create proj bery重启nova的相关服务$ sudo restart libvirt-bin; $ sudo restart nova-network;$ sudo restart nova-compute;$ sudo restart nova-api;$ sudo restart nova-objectstore;$ sudo restart nova-s

17、cheduler;$ sudo restart nova-volume;$ sudo restart glance-api; $ sudo restart glance-registry因为多个管理员可以创建多个不同的云,所以某个云的管理员需要特定的权限才能访问和管理自己的 Nova 云,创建权限信息,并解压到自己的目录里,需要注意的是每次使用 nova 管理云的时候都需要读取 novarc 里面的配置信息:创建一个目录用于下载和存放nova证书以及zip压缩文件$ mkdir /home/vpsee/creds生成用于访问和管理nova云的证书$ sudo nova-manage proje

18、ct zipfile proj bery /home/bery/creds/novacreds.zip利用euca2ools管理云平台需要novacreds.zip中的内容。如果有多个节点,还需要把novacreds.zip文件拷贝到其他节点浏览文件夹中创建和提取的文件,并改变其所有权$ cd /home/bery/creds$ unzip novacreds.zip$ sudo chown bery:bery /home/bery/creds/ -R从novacreds.zip中解压出来的文件有cacert.pem, cert.pem, novarc, pk.pemnovarc包含了几个环境

19、变量,包括nova的证书,设置之后才可以使用euca2ools命令, 比如euca-describe-images, eucadescribe-instances 等等。 这些变量可以通过source novarc 文件来设置。euca-*是不可以使用默认的novarc EC2_ACCESS_KEY格式的,解决这个问题:$sudo nova-manage user exports bery输出内容类似于export EC2_ACCESS_KEY=c043916c-9a0c-4f91-ad6c-4b30908b6c77export EC2_SECRET_KEY=d0ac688e-02f3-48f

20、3-b758-96d886461ace打开novarc文件,替换一下两行export EC2_ACCESS_KEY=bery:projexport NOVA_API_KEY=bery为:export EC2_ACCESS_KEY= c043916c-9a0c-4f91-ad6c-4b30908b6c77:projexport NOVA_API_KEY= c043916c-9a0c-4f91-ad6c-4b30908b6c77$ source /home/bery/creds/novarc每次用 nova 的时候都要用到 novarc 里面的环境变量,每次 source novarc 很麻烦,所

21、以最好加到 .bashrc 里面:$ cat /home/bery/creds/novarc /home/bery/.bashrc$ source /home/bery/.bashrc再次重启 nova 相关的所有服务:$ sudo restart libvirt-bin;$ sudo restart nova-network;$ sudo restart nova-compute; $ sudo restart nova-api;$ sudo restart nova-objectstore; $ sudo restart nova-scheduler;$ sudo restart nova

22、-volume; $ sudo restart glance-api; $ sudo restart glance-registry如果一切正常的话,应该可以打印出如下的类似信息:$ euca-describe-availability-zones verboseAVAILABILITYZONE nova availableAVAILABILITYZONE |- server1AVAILABILITYZONE | |- nova-scheduler enabled :-) 2012-04-22 10:32:31AVAILABILITYZONE | |- nova-network enabled

23、 :-) 2012-04-22 10:32:32AVAILABILITYZONE | |- nova-compute enabled :-) 2012-04-22 10:32:32制作系统模板启动实例之前需要先上传一个系统模版,我们称之为镜像(image),我们可以自己手动制作镜像,也可以直接使用官方的 Ubuntu 10.10 版本镜像,下载已经做好的镜像文件并上传到镜像服务器(这里镜像服务器和前端服务器在同一台物理服务器上):$wget /ubuntu1010-UEC-localuser-image.tar.gz$ uec-publish-tarball ubuntu1010-UEC-lo

24、caluser-image.tar.gz ubuntu1010-bucket x86_64列出云里现有的可以加载的镜像,并以某个镜像(比如编号为 ami-00000003)为模版启动一个实例(操作系统):$ euca-describe-imagesIMAGE aki-00000001 ubuntu1010-bucket/vmlinuz-2.6.32-28-server.manifest.xml available public x86_64 kernelIMAGE ari-00000002 ubuntu1010-bucket/initrd.img-2.6.32-28-server.manife

25、st.xmavailable public x86_64 ramdiskIMAGE ami-00000003 ubuntu1010-bucket/maverick-server-uec-amd64.img.manifest.xml available public x86_64 machine aki-00000001 ari-00000002启动一个实例$ euca-add-keypair mykey mykey.priv$ euca-run-instances -k mykey -t m1.tiny ami-00000003使用euca-describe-instances查看实例状态$

26、euca-describe-instances RESERVATION r-gc6cgxh0 proj default INSTANCE i-00000009 ami-00000003 running mykey (proj,server1) 0 m1.tiny 2012-04-24T03:39:26Z nova aki-00000001 ari-00000002如果运行后状态为pending,可以等待一会,如果正常会变成running状态检查一下实例是否成功启动和运行:$ virsh listId Name State-1 instance-00000001 running这里我们手动制作一

27、个系统镜像,由于命令行模式相对复杂,我们在图形界面下利用kvm只做了一个img镜像(服务器版操作系统可以安装ubuntu-desktop和virtual machine manager实现图形化界面)。创建一个大小8G的“硬盘”(raw格式)$ kvm-img create -f raw ubuntu.img 8G,大小可以根据系统大小调整,默认位置为当前用户目录,先创建盘的目的是方便找到盘的位置,然后就可以利用kvm安装,选择当前创建的盘为安装盘即可,需要注意的是在分区阶段把8GB硬盘全部分成一个ext4 root分区,不要创建多个分区也不要创建swap分区。 系统安装完成后更新系统和安装相

28、应服务$ apt-get update$ apt-get upgrade$ apt-get install -y openssh-server cloud-init70-persistent-net.rules 会自动添加其他的网络接口,需要删除这个文件避免自动添加除了 eth0 以外的接口。删除后系统基本就准备好了,关闭虚拟机:$ sudo rm -rf /etc/udev/rules.d/70-persistent-net.rules$ shutdown -h now现在来转换镜像格式因为Openstack只接受ext4文件系统格式的镜像,所以需要把上面创建的raw镜像转换成ext4镜像。

29、下面的步骤用来找出镜像文件里面的分区起点是从哪里开始的:$ sudo losetup -f ubuntu.img$ sudo losetup a/dev/loop0: fb00:24117291 (/home/localadmin/ubuntu.img)$ sudo fdisk -l /dev/loop0Disk /dev/loop0: 10.7 GB, 10737418240 bytes255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectorsUnits = sectors of 1 * 512 = 512 byte

30、sSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk identifier: 0 x000502e6Device Boot Start End Blocks Id System/dev/loop0p1 * 2048 20969471 10483712 83 Linux上面最后一行显示分区是从扇区(sector)2048开始的,每个扇区是512个字节,所以是从 2048 x 512 = 1048576个字节开始的。记住这个1048576

31、,下面会用到。卸载 loop 后重新从1048576字节开始挂载:$ sudo losetup -d /dev/loop0$ sudo losetup -f -o 1048576 ubuntu.img$ sudo losetup a/dev/loop0: fb00:24117291 (/home/localadmin/ubuntu.img), offset 1048576把这整个分区拷贝到一个新文件就是一个我们要的 ext4 文件系统镜像:$ sudo dd if=/dev/loop0 of=ubuntutemplate.img20969472+0 records in20969472+0 r

32、ecords out10736369664 bytes (11 GB) copied, 107.455 s, 99.9 MB/s用完 loop 后记得卸载:$ sudo losetup -d /dev/loop0挂载(mount)刚创建的 ext4 文件系统镜像,并修改分区加载表(/etc/fstab),注释或删除以前的,加上 UUID=uec-rootfs 一行:$ sudo mount -o loop ubuntutemplate.img /mnt$ sudo vi /mnt/etc/fstab#UUID=1dc3a59e-faab-41ee-b232-3300163676bf / ext

33、4 errors=remount-ro 0 1UUID=uec-rootfs / ext4 defaults 0 0把内核(vmlinuz)和内存盘(initrd)文件拷贝出来以便后面和虚拟机镜像一起发布到OpenStack 云里。使用完虚拟机镜像后记得卸载(unmount):$ sudo cp /mnt/boot/initrd.img-3.0.0-17-server /home/localadmin/$ sudo cp /mnt/boot/vmlinuz-3.0.0-17-server /home/localadmin/$ sudo umount /mnt把刚才的虚拟机镜像 ubuntute

34、mplate.img 的文件系统标志改成 uec-rootfs:$ sudo tune2fs -L uec-rootfs ubuntutemplate.img上传镜像的方式有很多种,可以先打包再上传,相对方便 $ sudo tar czvf ubuntu-server.img.tar.gz initrd.img-3.0.0-17-server vmlinuz-3.0.0-17-server ubuntutemplate.img打包完成后用户目录下便有ubuntu-server.img.tar.gz文件,和官方提供的文件类似上传制作的镜像$ uec-publish-tarball ubuntu-

35、server.image.tar.gz ubuntu-server-bucket x86_64列出云里现有的可以加载的镜像,并以某个镜像(比如编号为 ami-00000003)为模版启动一个实例(操作系统):可以使用$ euca-describe-images查看上传的系统镜像IMAGE ami-00000003 ubuntu-server-bucket/ubuntutemplate.img.manifest.xml available private x86_64 machine aki-00000001 ari-00000002 instance-storeIMAGE ari-000000

36、02 ubuntu-server-bucket/initrd.img-3.0.0-17-server.manifest.xml available private x86_64 ramdisk instance-storeIMAGE aki-00000001 ubuntu-server-bucket/vmlinuz-3.0.0-17-server.manifest.xml available private x86_64 kernel instance-store附录资料:不需要的可以自行删除bat文件的基本应用bat是dos下的批处理文件 .cmd是nt内核命令行环境的另一种批处理文件 从更

37、广义的角度来看,unix的shell脚本以及其它操作系统甚至应用程序中由外壳进行解释执行的文本,都具有与批处理文件十分相似的作用,而且同样是由专用解释器以行为单位解释执行,这种文本形式更通用的称谓是脚本语言。所以从某个程度分析,batch, unix shell, awk, basic, perl 等脚本语言都是一样的,只不过应用的范围和解释的平台各有不同而已。甚至有些应用程序仍然沿用批处理这一称呼,而其内容和扩展名与dos的批处理却又完全不同。 = 首先批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令(大部分时候就好象我们在DOS提示符下执行的命令行一样),你可以使用DOS下的E

38、dit或者Windows的记事本(notepad)等任何文本文件编辑工具创建和修改批处理文件。 = 注 = 批处理文件中完全可以使用非dos命令,甚至可以使用不具有可执行特性的普通数据性文件,这缘于windows系统这个新型解释平台的涉入,使得批处理的应用越来越边缘化。所以我们讨论的批处理应该限定在dos环境或者命令行环境中,否则很多观念和设定都需要做比较大的变动。 = 其次,批处理文件是一种简单的程序,可以通过条件语句(if)和流程控制语句(goto)来控制命令运行的流程,在批处理中也可以使用循环语句(for)来循环执行一条命令。当然,批处理文件的编程能力与C语言等编程语句比起来是十分有限的

39、,也是十分不规范的。批处理的程序语句就是一条条的DOS命令(包括内部命令和外部命令),而批处理的能力主要取决于你所使用的命令。 = 注 = 批处理文件(batch file)也可以称之为批处理程序(batch program),这一点与编译型语言有所不同,就c语言来说,扩展名为c或者cpp的文件可以称之为c语言文件或者c语言源代码,但只有编译连接后的exe文件才可以称之为c语言程序。因为批处理文件本身既具有文本的可读性,又具有程序的可执行性,这些称谓的界限是比较模糊的。 = 第三,每个编写好的批处理文件都相当于一个DOS的外部命令,你可以把它所在的目录放到你的DOS搜索路径(path)中来使得

40、它可以在任意位置运行。一个良好的习惯是在硬盘上建立一个bat或者batch目录(例如C:BATCH),然后将所有你编写的批处理文件放到该目录中,这样只要在path中设置上c:batch,你就可以在任意位置运行所有你编写的批处理程序。 = 注 = 纯以dos系统而言,可执行程序大约可以细分为五类,依照执行优先级由高到低排列分别是:DOSKEY宏命令(预先驻留内存),COMMAND.COM中的内部命令(根据内存的环境随时进驻内存),以com为扩展名的可执行程序(由 直接载入内存),以exe位扩展名的可执行程序(由 重定位后载入内存),以bat位扩展名的批处理程序(由 解释分析,根据其内容按优先级顺

41、序调用第2,3,4,5种可执行程序,分析一行,执行一行,文件本身不载入内存) = 第四,在DOS和Win9x/Me系统下,C:盘根目录下的AUTOEXEC.BAT批处理文件是自动运行批处理文件,每次系统启动时会自动运行该文件,你可以将系统每次启动时都要运行的命令放入该文件中,例如设置搜索路径,调入鼠标驱动和磁盘缓存,设置系统环境变量等。下面是一个运行于Windows 98下的autoexec.bat的示例: ECHO OFF PATH C:WINDOWS;C:WINDOWSCOMMAND;C:UCDOS;C:DOSTools; C:SYSTOOLS;C:WINTOOLS;C:BATCH LH

42、SMARTDRV.EXE /X LH DOSKEY.COM /insert LH CTMOUSE.EXE SET TEMP=D:TEMP SET TMP=D:TEMP = 注 = AUTOEXEC.BAT为DOS系统的自动运行批处理文件,由COMMAND.COM启动时解释执行; 而在Win9x环境中,不仅增加支持了 DOSSTART.BAT, WINSTART.BAT 等许多其它自动运行的批处理文件,对AUTOEXEC.BAT 也增加了 .DOS .W40 .BAK .OLD .PWS 等许多变体以适应复杂的环境和多变的需求。 = willsort 编注 = 以下关于命令的分类,有很多值得推敲

43、的地方。常用命令中的本不是命令,而dir、copy等也很常用的命令却没有列入, 而特殊命令中所有命令对我来说都是常用命令。建议将批处理所引用的命令分为内部命令、外部命令、第三方程序三类。而内部命令和外部命令中别有一类是专用于或常用于批处理中的命令可称之为批处理命令。 以下摘录MS-DOS 6.22 帮助文档中关于批处理命令的文字,当然,其中有些概念和定义已经有些落后了。 批处理命令 批处理文件或批处理程序是一个包含若干MS-DOS命令的正文文件,扩展名为.BAT。当在命令提示符下敲入批处理程序的名称时,MS-DOS成组执行此批处理程序中的命令。 任何在命令提示符下可使用的命令都可用在批处理程序

44、中。此外,下面MS-DOS命令是专门在批处理程序中使用的。 = 常用命令 echo、call、pause、rem(小技巧:用:代替rem)是批处理文件最常用的几个命令,我们就从他们开始学起。 = 注 = 首先, 不是一个命令, 而是DOS 批处理的一个特殊标记符, 仅用于屏蔽命令行回显. 下面是DOS命令行或批处理中可能会见到的一些特殊标记符: CR(0D) 命令行结束符 Escape(1B) ANSI转义字符引导符 Space(20) 常用的参数界定符 Tab(09) ; = 不常用的参数界定符 + COPY命令文件连接符 * ? 文件通配符 字符串界定符 | 命令管道符 文件重定向符 命令

45、行回显屏蔽符 / 参数开关引导符 : 批处理标签引导符 % 批处理变量引导符 其次, : 确实可以起到rem 的注释作用, 而且更简洁有效; 但有两点需要注意: 第一, 除了 : 之外, 任何以 :开头的字符行, 在批处理中都被视作标号, 而直接忽略其后的所有内容, 只是为了与正常的标号相区别, 建议使用 goto 所无法识别的标号, 即在 :后紧跟一个非字母数字的一个特殊符号. 第二, 与rem 不同的是, :后的字符行在执行时不会回显, 无论是否用echo on打开命令行回显状态, 因为命令解释器不认为他是一个有效的命令行, 就此点来看, rem 在某些场合下将比 : 更为适用; 另外,

46、rem 可以用于 config.sys 文件中. = echo 表示显示此命令后的字符 echo off 表示在此语句后所有运行的命令都不显示命令行本身 与echo off相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。 call 调用另一个批处理文件(如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令)。 pause 运行此句会暂停批处理的执行并在屏幕上显示Press any key to continue.的提示,等待用户按任意键后继续 rem 表示此命令后的字符为解释行(注释),不执行,只是

47、给自己今后参考用的(相当于程序中的注释)。 = 注 = 此处的描述较为混乱, 不如直接引用个命令的命令行帮助更为条理 - ECHO 当程序运行时,显示或隐藏批处理程序中的正文。也可用于允许或禁止命令的回显。 在运行批处理程序时,MS-DOS一般在屏幕上显示(回显)批处理程序中的命令。 使用ECHO命令可关闭此功能。 语法 ECHO ON|OFF 若要用echo命令显示一条命令,可用下述语法: echo message 参数 ON|OFF 指定是否允许命令的回显。若要显示当前的ECHO的设置,可使用不带参数的ECHO 命令。 message 指定让MS-DOS在屏幕上显示的正文。 - CALL

48、从一个批处理程序中调用另一个批处理程序,而不会引起第一个批处理的中止。 语法 CALL drive:pathfilename batch-parameters 参数 drive:pathfilename 指定要调用的批处理程序的名字及其存放处。文件名必须用.BAT作扩展名。 batch-parameters 指定批处理程序所需的命令行信息。 - PAUSE 暂停批处理程序的执行并显示一条消息,提示用户按任意键继续执行。只能在批处 理程序中使用该命令。 语法 PAUSE REM 在批处理文件或CONFIG.SYS中加入注解。也可用REM命令来屏蔽命令(在CONFIG.SYS 中也可以用分号 ;

49、代替REM命令,但在批处理文件中则不能替代)。 语法 REM string 参数 string 指定要屏蔽的命令或要包含的注解。 = 例1:用edit编辑a.bat文件,输入下列内容后存盘为c:a.bat,执行该批处理文件后可实现:将根目录中所有文件写入 a.txt中,启动UCDOS,进入WPS等功能。 批处理文件的内容为: 命令注释: echo off 不显示后续命令行及当前命令行 dir c:*.* a.txt 将c盘文件列表写入a.txt call c:ucdosucdos.bat 调用ucdos echo 你好 显示你好 pause 暂停,等待按键继续 rem 准备运行wps 注释:准

50、备运行wps cd ucdos 进入ucdos目录 wps 运行wps 批处理文件的参数 批处理文件还可以像C语言的函数一样使用参数(相当于DOS命令的命令行参数),这需要用到一个参数表示符%。 %1-9表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。变量可以从%0到%9,%0表示批处理命令本身,其它参数字符串用%1到%9顺序表示。 例2:C:根目录下有一批处理文件名为f.bat,内容为: echo off format %1 如果执行C:f a: 那么在执行f.bat时,%1就表示a:,这样format %1就相当于format a:,于是上面的命令运行时

51、实际执行的是format a: 例3:C:根目录下一批处理文件名为t.bat,内容为: echo off type %1 type %2 那么运行C:t a.txt b.txt %1 : 表示a.txt %2 : 表示b.txt 于是上面的命令将顺序地显示a.txt和b.txt文件的内容。 = 注 = 参数在批处理中也作为变量处理, 所以同样使用百分号作为引导符, 其后跟0-9中的一个数字构成参数引用符. 引用符和参数之间 (例如上文中的 %1 与 a: ) 的关系类似于变量指针与变量值的关系. 当我们要引用第十一个或更多个参数时, 就必须移动DOS 的参数起始指针. shift 命令正充当了

52、这个移动指针的角色, 它将参数的起始指针移动到下一个参数, 类似C 语言中的指针操作. 图示如下: 初始状态, cmd 为命令名, 可以用 %0 引用 cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 | | | | | | | | | | %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 经过1次shift后, cmd 将无法被引用 cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 | | | | | | | | | | %0 %1 %2 %3 %4 %5 %6

53、%7 %8 %9 经过2次shift后, arg1也被废弃, %9指向为空, 没有引用意义 cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 | | | | | | | | | %0 %1 %2 %3 %4 %5 %6 %7 %8 遗憾的是, win9x 和DOS下均不支持 shift 的逆操作. 只有在 nt 内核命令行环境下, shift 才支持 /n 参数, 可以以第一参数为基准返复移动起始指针. = 特殊命令 if goto choice for是批处理文件中比较高级的命令,如果这几个你用得很熟练,你就是批处理文件的专家啦。

54、一、if 是条件语句,用来判断是否符合规定的条件,从而决定执行不同的命令。 有三种格式: 1、if not 参数 = 字符串 待执行的命令 参数如果等于(not表示不等,下同)指定的字符串,则条件成立,运行命令,否则运行下一句。 例:if %1=a format a: = if 的命令行帮助中关于此点的描述为: IF NOT string1=string2 command 在此有以下几点需要注意: 1. 包含字符串的双引号不是语法所必须的, 而只是习惯上使用的一种防空字符 2. string1 未必是参数, 它也可以是环境变量, 循环变量以及其他字符串常量或变量 3. command 不是语法

55、所必须的, string2 后跟一个空格就可以构成一个有效的命令行 = 2、if not exist 路径文件名 待执行的命令 如果有指定的文件,则条件成立,运行命令,否则运行下一句。 如: if exist c:config.sys type c:config.sys 表示如果存在c:config.sys文件,则显示它的内容。 * 注 * 也可以使用以下的用法: if exist command device 是指DOS系统中已加载的设备, 在win98下通常有: AUX, PRN, CON, NUL COM1, COM2, COM3, COM4 LPT1, LPT2, LPT3, LPT4

56、 XMSXXXX0, EMMXXXX0 A: B: C: ., CLOCK$, CONFIG$, DblBuff$, IFS$HLP$ 具体的内容会因硬软件环境的不同而略有差异, 使用这些设备名称时, 需要保证以下三点: 1. 该设备确实存在(由软件虚拟的设备除外) 2. 该设备驱动程序已加载(aux, prn等标准设备由系统缺省定义) 3. 该设备已准备好(主要是指a: b: ., com1., lpt1.等) 可通过命令 mem/d | find device /i 来检阅你的系统中所加载的设备 另外, 在DOS系统中, 设备也被认为是一种特殊的文件, 而文件也可以称作字符设备; 因为设备

57、(device)与文件都是使用句柄(handle)来管理的, 句柄就是名字, 类似于文件名, 只不过句柄不是应用于磁盘管理, 而是应用于内存管理而已, 所谓设备加载也即指在内存中为其分配可引用的句柄. = 3、if errorlevel 待执行的命令 很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),通过if errorlevel命令可以判断程序的返回值,根据不同的返回值来决定执行不同的命令(返回值必须按照从大到小的顺序排列)。如果返回值等于指定的数字,则条件成立,运行命令,否则运行下一句。 如if errorlevel 2 goto x2 = 注 = 返回值从大到

58、小的顺序排列不是必须的, 而只是执行命令为 goto 时的习惯用法, 当使用 set 作为执行命令时, 通常会从小到大顺序排列, 比如需将返回码置入环境变量, 就需使用以下的顺序形式: if errorlevel 1 set el=1 if errorlevel 2 set el=2 if errorlevel 3 set el=3 if errorlevel 4 set el=4 if errorlevel 5 set el=5 . 当然, 也可以使用以下循环来替代, 原理是一致的: for %e in (1 2 3 4 5 6 7 8.) do if errorlevel %e set e

59、l=%e 更高效简洁的用法, 可以参考我写的另一篇关于获取 errorlevel 的文章 出现此种现象的原因是, if errorlevel 比较返回码的判断条件并非等于, 而是大于等于. 由于 goto 的跳转特性, 由小到大排序会导致在较小的返回码处就跳出; 而由于 set命令的 重复 赋值特性, 由大到小排序会导致较小的返回码 覆盖 较大的返回码. 另外, 虽然 if errorlevel= command 也是有效的命令行, 但也只是 解释命令行时将 = 作为命令行切分符而忽略掉罢了 = 二、goto 批处理文件运行到这里将跳到goto所指定的标号(标号即label,标号用:后跟标准字

60、符串来定义)处,goto语句一般与if配合使用,根据不同的条件来执行不同的命令组。 如: goto end :end echo this is the end 标号用:字符串来定义,标号所在行不被执行。 = willsort 编注 label 常被译为 标签 , 但是这并不具有广泛的约定性. goto 与 : 联用可实现执行中途的跳转, 再结合 if 可实现执行过程的条件分支, 多个 if 即可实现命令的分组, 类似 C 中 switch case 结构或者 Basic 中的 select case 结构, 大规模且结构化的命令分组即可实现高级语言中的函数功能. 以下是批处理和C/Basic在

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论