ESXi常见问题和速用命令
在×××的那个esxi启动界面,进入命令行alt+f1
看网卡型号 esxcfg-nics -l
看PCI lspci
修改root password
vicfg-user --url https://esxi-host/sdk/webService --username root --password [old-pwd] -u root -e user -l root -o modify -p [new-pwd]
esxcli hardware – 想获取ESXi主机的硬件及配置信息时,esxcli硬件命名空间就能够派上用场了。
esxcli hardware cpu list – 获取CPU信息(系列、型号以及缓存)
esxcli hardware memory get – 获取内存信息(可用内存以及非一致内存访问)
esxcli iscsi – iscsi命名空间可以被用于监控并管理硬件iSCSI及软件iSCSI设置。
esxcli iscsi software –用于启用/禁用软件iSCSI initiator。
esxcli iscsi adapter –用于设置软硬件iSCSI适配器的发现、CHAP以及其他设置
esxcli iscsi sessions – 用于列出主机上已建立的iSCSI会话。
esxcli network –需要监控vSphere网络并对如下网络组件进行调整时,包括虚拟交换机、VMkernel网络接口、防火墙以及物理网卡等,esxcli网络命名空间就派上用场了。
esxcli network nic –列出并修改网卡信息,比如名字、唤醒网卡以及速度。
esxcli network vm list – 列出有一个活动网络端口的虚拟机的网络信息。
esxcli network vswitch –检索并管理VMware的标准交换机以及分布式虚拟交换机。
esxcli network ip – 管理VMkernel端口,包括管理、vMotion以及FT网络。还可以修改主机的所有IP栈,包括DNS、IPsec以及路由信息。
esxcli software – 软件命名空间可以用于检索ESXi主机已安装的软件及驱动并可以安装新组件。
esxcli software vib list – 列出ESXi主机上已经安装的软件及驱动。
esxcli storage – 可能是最常用的esxcli命令命名空间之一,包括了管理连接到vSphere的存储的所有信息。
esxcli storage core device list – 列出当前存储设备
esxcli storage core device vaai status get –获得存储设备支持的VAAI的当前状态。
esxcli system – 通过该命令使你能够控制ESXi的高级选项,比如设置syslog并管理主机状态。
esxcli system maintenanceMode set –enabled yes/no – 将主机设置为维护模式
查看并更改ESXi高级设置(提示:使用esxcli system settings
advanced list –d 命令查看非默认设置)
esxcli system syslog –查看 Syslog 及配置信息
esxcli vm – ESXi的虚拟机命名空间用于列出运行在主机上的虚拟机的各种信息,如果需要可以强制关闭这些虚拟机。
esxcli vm process list –列出已启动的虚拟机的进程信息。
esxcli vm process kill – 停止正在运行的虚拟机的进程,关闭虚拟机或者强制关闭虚拟机电源。
esxcli vsan – ESXi的VSAN命名空间包括配置并维护VSAN的很多命令,包括数据存储、网络、默认域名以及策略配置。
esxcli vsan storage – 配置VSAN使用的本地存储,包括增加、删除物理存储并修改自动声明。
esxcli vsan cluster – 本地主机脱离/加入VSAN集群。
esxcli esxcli – esxcli命令包括一个称为esxcli的命名空间,通过使用esxcli命名空间,你可以获得更多信息。
esxcli esxcli command list – 列出所有的esxcli命令及其提供的功能。
当然,上述命令及示例并未涵盖ESXi提供的所有功能。所有的ESXi命令有多个开关及选项,提供了多种功能。通过输入-h参数可以获得相关帮助信息。
通过命令行进行故障诊断是一件很棘手的事儿,但通过对25个ESXi命令有一个深入的理解,你应该能够顺利解决大多数问题。
1、启用客户机操作系统和远程控制台之间的复制和粘贴操作
解决方法:要在客户机操作系统和远程控制台之间进行复制和粘贴,必须使用 vSphere Client 启用复制和粘贴操作。
步骤
a、使用 vSphere Client 登录到 vCenter Server 系统并选择虚拟机。
b、在摘要选项卡中,单击编辑设置。
c、选择选项 > 高级 > 常规,然后单击配置参数。
d、单击添加行,并在“名称”和“值”列中键入以下值。
名称值
isolation.tools.copy.disable false
isolation.tools.paste.disable false
注意这些选项将替代在客户机操作系统的 VMware Tools 控制面板中做出的任何设置。
e、单击确定以关闭“配置参数”对话框,然后再次单击确定以关闭“虚拟机属性”对话框。
f、重新启动虚拟机。
2、sco系统迁移过去之后找不到启动列表
解决方法:目前解决方法:使用软驱制作应急盘,通过应急盘来找到启动列表,如果不行的话,只能使用,现成的虚拟镜像导入vmware中,但是这种方法,要自己设置与自己相关的应用。
3、linux做迁移时手动添加的逻辑分区(LVM卷),迁移过去之后找不到这些分区
解决方法::给虚拟机额外添加硬盘后融合,然后将数据重新拷入加入的硬盘中。
4、安装esxi的时候找不到万兆网卡
解决方法:解决方法:安装各个厂商OEM的esxi版本。
5、迁移时提示vss原卷不能克隆
解决方法:解决方法:查看是否有额外的设备插在服务器上,如usb设备。
6、Windows迁移之后,配置网卡的时候,会提示“IP已经被分配给其他的适配器”
解决方法:打开命令行窗口(运行cmd),输入: (1)、set DEVMGR_SHOW_NONPRESENT_DEVICES=1
(2)、devmgmt.msc
在弹出的“设备管理器”窗口。选择“查看(V)”—“显示隐藏的设备(W)”,然后展开“网络适配器”子项,可以看到一些透明图标显示的网卡信息,这些信息是源服务器的物理网卡信息。然后选择透明的设备卸载,RAS同步适配器为系统正常设备,不需要将其卸载。
7、Asianux3.0迁移之后不能显示图形化界面
解决方法:解决方法:cp /etc/X11/xorg.conf /etc/X11/xorg.conf.bak
vi /etc/X11/xorg.conf
将xorg.conf文件中的selection “Devices”字段中Driver对应的值修改为“vmware”即可,修改完成后通过startx启动图形化界面。
8、迁移域控主机后发生当虚拟机开启后,物理机就断网
解决方法:单播和多播的问题
9、在VC中虚拟机的鼠标全屏之后,不能控制整个屏幕
解决方法:当时安装的是esxi 4.1,将esxi4.1升级到esxi4.1upd01 ,同时要将VC client也升级到对应的版本。
10、迁移过去的win2003的系统,隔段时间之后会蓝屏或重启
解决方法:查看系统日志,有可能是杀毒软件的原因,将杀毒软件卸载重装。
11、使用FT功能需同时具备以下条件
解决方法:1 所有ESX必须为4.0以上,Build版本相同,以及在同一个HA Cluster中
2 服务器的CPU要求是同一系列(并且要求是AMD Barcelona+, Intel Penryn+的CPU)
3 BIOS中要启用VT及禁用Hyperthreading(超线程),最好同时禁用电源管理
4 每个VM只能分配1颗vCPU
5 要有专门的千兆网络负责FT
6 VM要放在共享存储上
7 VM的配置文件必须为版本7
8 Guest OS不要启用Paravirtualized
9 启用FT的VM不支持自动DRS
10 启用FT的VM不支持Snapshot
11 启用FT的VM不支持 MS Cluster
12 启用FT的VM不支持物理RDM Mapping
13 启用FT的VM的虚拟CD-ROM最好断开
14 启用FT的VM不支持NPIV (N-Port ID Virtualization)
15 启用FT的VM不支持Device HotAdd/HotPlug
大型虚拟机可能会阻止使用容错
如果虚拟机太大(大于 15GB)或内存的变化速率大于 VMotion 通过网络进行复制的速率,
则启用容错或使用VMotion 迁移正在运行的容错虚拟机时可能会失败。
12、如何确认克隆后的系统SID是否更新 解决方法:Windows2003/2008 、windows 7可使用本地账户登录系统,输入“whoami /user”查看Windows xp没有whoami命令,可通过注册表查看
13、vSphere所需要开放的端口
解决方法:80 vCenter Server需要端口80用于直接HTTP连接。端口80会将请求重定向到HTTPS端口 443。如果意外使用了http://server而不是https://server,此端口将非常有用。
389 此端口在vCenter Server的本地和所有远程实例上必须处于打开状态。这是vCenter Server组的目录服务的LDAP端口号。vCenter Server系统需要绑定端口389,即使没有将此 vCenter Server实例加入到
链接模式组。如果此端口上正在运行另一服务,则最好移除该服务,或将其端口更改为其他端口。可以在从1025到65535的任一端口上运行LDAP服务。如果此实例充当Microsoft Windows活动目录,请将端口号从389 、更改为从 1025 到 65535 的任一可用端口。
443 vCenter Server系统用于侦听来自vSphere Client的连接的默认端口。要使vCenter Server从vSphere Client接收数据,请在防火墙中打开443端口。vCenter Server系统还使用端口443侦听从vSphere Web Access Client和其他SDK客户端传输的数据。如果对HTTPS使用另一个端口号,则登录vCenter Server系统时必须使用<ip-address>:<port>。
636 对于vCenter链接模式,这是本地实例的 SSL端口。如果此端口上正在运行另一服务,则最好移除该服务,或将其端口更改为其他端口。可以在从1025到65535的任一端口上运行 SSL服务。
902 vCenter Server系统用于将数据发送到受管主机的默认端口。受管主机也会通过UDP端口902定期向vCenter Server系统发送检测信号。服务器和主机之间或各个主机之间的防火墙不得阻止此端口。
902/903 不得在vSphere Client和主机之间阻塞端口902和903。这些端口由vSphere Client 使用以显示虚拟机控制台。
8080 Web服务HTTP。用于VMware VirtualCenter Management Webservices。
8443 Web服务HTTPS。用于VMware VirtualCenter Management Webservices。
60099 Web服务更改服务通知端口
如果希望vCenter Serve 系统使用不同的端口接收vSphere Client数据,请参见《VMware vSphere 数据中心管理指南
14、虚拟机文件有哪些
解决方法:
.vmx vmname.vmx 虚拟机配置文件
.vmxf vmname.vmxf 其他虚拟机配置文件
.vmdk vmname.vmdk 虚拟磁盘特性
-flat.vmdk vmname-flat.vmdk 预分配虚拟磁盘
.nvram vmname.nvram 或 nvram 虚拟机 BIOS
.vmsd vmname.vmsd 虚拟机快照
.vmsn vmname.vmsn 虚拟机快照数据文件
.vswp vmname.vswp 虚拟机交换文件
.vmss vmname.vmss 虚拟机挂起文件
.log vmware.log 当前虚拟机日志文件
-#.log vmware-#.log(其中 # 表示从 1 开始的编号) 旧的虚拟机日志条目
15、如何更改vSphere Center的生成日志
解决方法:
修改“vpxd.cfg”文件,然后添加如下内容:
<directory>D:VMwareLogs</directory>
调整日志文件的大小:
<maxFileSize>10485760</maxFileSize>
<maxFileNum>10</maxFileNum>
保存之后,重启vCenter Server之后,即可生效
16、windows迁移必须在迁移机上开启的服务
解决方法:
需要注意5个服务不能被禁用
1)windows installer
2)volume shadow
3)TCP/IP netBIOS
4)server
5)workstation
如果 Converter Standalone 连接远程 Windows XP 计算机失败,并发出 bad username/password的错误消息,
请确保 Windows 防火墙没有阻止文件和打印机共享。步骤
1 选择开始 > 设置 > 控制面板 > 管理工具 > 本地安全策略。
2 在左侧的安全设置列表中,选择本地策略 > 安全选项。
VMware vCenter Converter Standalone 用户指南
3 在右侧的策略列表中,选择网络访问:本地帐户的共享和安全模式。
4 确保选中经典 – 本地用户以自己的身份验证。
Windows Server 2008(确保启用了 Computer Browser Windows Service)
Windows XP(需要打开简单文件共享,启用文件和打印机共享)
17、Linux迁移注意事项
1)关闭防火墙(service etcinit.diptables stop)
2)SSH 必须打开(sshd start)
3)迁移时需要在help address时为虚拟机设置一个IP地址
redflag 迁移之后没有图形化界面,通过Xconfigurator来重新配置。
redhat 迁移之后没有图形化界面,通过system-config-display来重新配置。
4)迁移后的系统不带IP,需要手动设置
5)数据库或域需要关闭
6)建议冷迁
18、ESXi不能解析主机名
解决方法:
1) Login to ESXi host
2) vi /etc/hosts
3) Key in every ESXi host in Cluster as the following format
IP Address ESXi hostname
192.168.10.10 esx01
192.168.10.11 esx02
… …
192.168.10.9 vCenter01
4) Repeat all the above editing in all ESXi hosts
5)Login in to vCenter
6)Edit /Windows/System32/drive/etc/hosts
19、SCO迁移后添加网卡不能使用
解决方法:
迁移完成之后,通过netconfig来把原来的网卡删除掉,(如果进入的是图形界面,选tool-unix进入命令窗口)不要把上面的HW SCO TCP/IP Loopback driver 这个网卡删掉。
删除下面的那个网卡,删除完成之后,后提示你重新配置内核,然后重新启动。选择sco虚拟机—编译–添加网卡。重启之后,通过netconfig来添加网卡,添加的是AMD PCNet-PCI Adapter Compatiable……的网卡,然后配置IP。
注意配置IP的时候那个broadcast address不要改,这个是广播地址。网关不需要配置。
20、Linux下安装VMware-tools出现“/etc/vmware-tools/locations”错误
故障内容:
A previous installation of VMware software has been detected.
The previous installation was made by the tar installer (version 3).
Keeping the tar3 installer database format.
Error: Unable to find the binary installation directory (answer BINDIR)
in the installer database file “/etc/vmware-tools/locations”.
解决方法:
1、删除etc/vmware-tools目录rm -rf vmware-tools
2. 删除/tmp/vm* rm -rf vm*(注意不要把 VMwa*的也删除)
3、然后用tar –zxvf解压
21、所有的虚拟机开启或VMotion出现“文件<unspecified filename>被锁定,无法访问”
故障内容:环境的所有VM运行出现异常缓慢,关机后的虚拟机开机或VMotion出现“文件<unspecified filename>被锁定,无法访问”
解决方法:检查日志,特别是存储上LUN的占用情况,如果有存储使用空间接近预警状态,请登陆存储查看,一般这种情况,是存储空间已经没有空余导致,由于vSpherer4的BUG,有时候在没有报警的情况下,存储空间就已经满了情况。请增加存储或移除部分虚拟机。
22、Windows系统的虚拟机无法进入安全模式
解决方法:选中虚拟机右键“编辑设置”—“选项”–—“引导选项”,在“启动引导延迟”填上“1000”(1秒=1000毫秒,数字可以随便填,稍大一点即可)。然后启动按F8即可进入安全模式。
本文出自 “今夜灿烂” 博客,请务必保留此出处http://saturn.blog.51cto.com/184463/667895
23、vSpherer4.1中32位win2003会不定时的关机,关机后无法再次登录
故障现象:客户的X86 Windows2003VM系统在使用中会不定时的关机。关机时间不确定,几个小时到几天,关机瞬间就像物理机断电一样,关机后的VM能再次开启,但只要输入账号和密码就立即关机,连安全模式也一样状况。其他X64VM系统没有任何问题。
解决方法:通过两个月的煎熬,排除了网络病毒、物理硬件和系统版本的原因,通过不断的分析ESXi和主机日志,发现有类似如下日志
Sep 07 01:45:03.709: mks| SOCKET 10 (91) recv error 104: Connection reset by peer
Sep 07 01:45:03.709: mks| SOCKET 10 (91) destroying VNC backend on socket error: 1
Sep 07 03:26:42.676: vmx| Vix: [10666095 mainDispatch.c:907]: VMAutomation_PowerOff: Powering off. (VM Powering off)
通过400长期的周旋,发现这是7月底发现的BUG,通过在ESXi主机下输入命令:
/etc/init.d/sfcbd-watchdog stop
chkconfig sfcbd-watchdog off
chkconfig sfcbd off
问题解决,但VC上插件和监控状态失效,去官网(http://kb.vmware.com/selfservice/microsites/search.do?cmd=displayKC&docType=kc&docTypeID=DT_KB_1_1&externalId=2000609)下载最新补丁,安装,一切OK。
24、VM(windows2003)全屏最大化后,鼠标移动缓慢或错位
解决方法:
1、查看是否安装VMware-tools
2、查看系统内硬件加速是否开启(完全)
3、将虚拟机分辨率调整为:800×600
4、到控制台中打开,上面菜单栏中à视图à自动匹配窗口勾去掉 5、查看虚拟机中的显卡驱动是否为:VMware SVGA II
一般情况下,这5点中,满足1、2、3基本可以解决问题,如果全部满足还不行那你只能阿弥陀佛了。当然前提是你已经排除VM OS本身的问题如CPU或内存占用比较大,存储读写延时等等。(注:附件中有图片)
24、用VDR备份无法创建静默快照,因为创建快照操作超过了拖延已冻结虚拟机中 I/O的时限。
解决方法:停止服务VMware Tools Services,打开Vmware Tools安装程序,选择Modify。不要安装Volume Shadow Copy Services Support,完成后重启VM.
25、如何从本地上传下载文件到ESXi主机
解决方法:1、可以通过ESXi的命令SCP上传和下载,在没有三方工具的情况下这个命令需要需要通过另外一台Linux中转才能把需要的文件上传和下载要需要的文件下。
2、由于Client登陆VC后,可以在上面看到共享的存储空间和本地硬盘,这说明ESXi主机内一定有一个文件同样也可以看到这些空间。经过分析发现/vmfs/volumes/目录就是存储和本地硬盘的存放点。可以通过这个目录上传和下载ESXi主机中的文件。
26、在 vCenter Server 升级到 5.0 版本后,ESX 4.0 Update 2 主机可能崩溃
解决方法:发生崩溃时,同时在紫色屏幕上显示以下消息:NOT_IMPLEMENTED bora/vmkernel/filesystems/visorfs/visorfsObj.c:3391。
解决办法:升级到 vCenter Server 5.0 之前,将由 vCenter Server 管理的所有 ESX 4.0 Update 2主机升级到 ESX 4.0 Update 3。
27、HA配置到90%时失败,提示:Internal AAM Error-agent could not start
故障状态:
1、第一台主机加入到Cluster没问题,但是第二台主机加入到cluster时,走到90%出错,提示如下错误:Internal AAM Errors-agent could not start
复制代码
2、在aam_config_util_addnode.log文件里有类似如下错误信息:
01.01/23/10 16:20:49 [myexit ] Failure location:
02.01/23/10 16:20:49 [myexit ] function main::myexit called from line 2199
03.01/23/10 16:20:49 [myexit ] function main::start_agent called from line 1168
04.01/23/10 16:20:49 [myexit ] function main::add_aam_node called from line 171
05.01/23/10 16:20:49 [myexit ] VMwareresult=failure
故障分析:
这种故障一般和UDP 8043端口无法访问有一定关系;
解决方案:
确保UDP 8043端口畅通无阻,比如:
执行如下命令:
tcpdump -i vswif0 -s 900 -n udp port 8043 -w ${主机名}.pcap
28、查阅和重装VirtualCenter Server agents(vpxa)服务
故障状态:
·配置VMware High Availability (HA) 失败;
·重新配置 VMware HA时,提示如下错误:
Could not Enable aam firewall ruleset :vim.fault.HostConfigFault
·无法将ESX添加到VirtualCenter;
·尝试重新将ESX添加到VirtualCenter时,提示如下错误:
unable to access the specified host, either it doesn’t exist, the server software is not responding, or there is a network problem
·在hostd.log文件中有如下内容:
[2010-05-24 10:45:51.463 ‘Vmomi’ 15752112 info] Throw vim.fault.AlreadyExists
[2008-05-26 10:45:51.463 ‘Vmomi’ 15752112 info] Result:
(vim.fault.AlreadyExists) {
name = “vpxuser”
msg = “”
}
解决方案;
备注:当看到如下错误时,请在ESX主机上重装vpxa:
unable to access the specified host, either it doesn’t exist, the server software is not responding, or there is a network problem.
查看安装在ESX/ESXi服务器上的VirtualCenter agent(vpxa)版本号的方法如下:
1.首先确定VirtualCenter的版本号:点击Help按钮,点击About可查阅;
命令查看VMware-vpxa的命令:
rpm -V VMware-vpxa
29、使用IBM服务器可能导致ESXi/ESX 4.1服务器HBA卡和PCI设备停止响应
故障状态:
当使用IBM x3650 M3或BladeCenter HS22V服务器时,可能会在ESXi/ESX 4.1上遇到下面的问题:
1、HBA卡停止响应;
2、某些PCI设备无响应;
3、可以在ALT+F12界面和日志信息里看到这样的信息:
vmkernel: 6:01:34:46.970 cpu0:4120)ALERT: APIC: 1823: APICID 0x00000000 – ESR = 0x40
4、HBA卡停止响应,例如:
vmkernel: 6:01:42:36.189 cpu15:4274)<6>qla2xxx0000:1a:00.0: qla2x00_abort_isp: **** FAILED ****
vmkernel: 6:01:47:36.383cpu14:4274)<4>qla2xxx 0000:1a:00.0: Failed mailbox send register test
5、HBA卡可能进入离线状态,例如:
vmkernel: 6:01:47:36.383 cpu14:4274)<4>qla2xxx 0000:1a:00.0: ISP error recovery failed – board disabled
故障分析:
具体问题还不太清楚,期待VMware官方能够给出解释并放出相关补丁;
解决方案:
在ESXi/ESX 4.1里面雀圣启用了中断重映射代码,而这个代码和部分IBM服务器不兼容,可以通过禁止掉这个代码缺省启动的方式来临时解决这个问题:
1、进入到命令行界面,执行如下命令:
#esxcfg-advcfg -k TRUE ioDisableIR
#init 6
2、重启后检查这个选项是否依然缺省启动:
#esxcfg-info -c
iovDisableIR=TRUE
备注:这就表示缺省没有启动;
也可以利用vSphere Client登录到服务器的GUI进行修改
30、虚拟机无法关闭停止在95%左右的解决办法
一次做虚拟机回收工作,由于目标虚拟机当时杀毒软件正在运行,CPU占用很高,本来想登陆关闭虚拟机,但是远程连接根本没反映,打开VC带的控制台,鼠标点击进去,操作也是在是慢,总归到底,最后,直接将虚拟机电源关闭。之后,就看着任务开始执行,但进度条走到95%的时候,咋都不动了。
解决思路:
这个问题,属于一个“沟通”问题,应该从两方面入手:
1、一个是vCenter端是否已经将此命令顺利传送到ESX;
2、然后是,ESXi/ESX端是否顺利接到命令,以及是否执行了此命令。
解决过程:
1、SSH连接ESX;
2、vmware-cmd <path.vmx> getstate 确定虚拟机状态;
<path.vmx> 为完全路径(空格等前别忘了加上转义符 /);vmware-cmd -l命令可查看虚拟机路
3、官方文档说若为On,可继续执行其他命令来结束虚拟机;
但是我走到这里,显示的为Off;这就说明,ESX已经将虚拟机关闭了,那这问题就是一个沟通问题
4、登陆VC,我想先从VC端将此问题虚拟机所在的主机断开连接,之后再重新连接,这样就会进行一次新的对话,但是,由于前一个未关闭虚拟机的任务未执行完毕,之后的任务好像都成队列似的在等待,没有反应。
5、任务无法执行,重启相关VC和ESX服务
VC:在Vitual Center的WIN机器上的,在服务管理器重启VC服务。
ESX:在SSH登陆后对两个服务器执行重启。(注:虚拟机服务会短暂中断)
命令如下:
service mgmt-vmware restart
service vmware-vpxa restart
6、在这沟通中的三个服务都已经重启完毕,此时再执行步骤2时,发现返回的结果为On–那台虚拟机正在运行,发现这个,那么按照官方的文档,后续的几个命令就可以有用武之地了。
7、kill -9 xxxx
ps -auxwww |grep -i <VMNAME>.vmx 可以看到虚拟机的PID
8、执行步骤2,现在已为Off
9、登陆VC查看,刷新下,如果状态还未改变,再重启下VC服务器,即可。
31、为主机应用Host Profiles提示compliance错误
故障状态:
为主机应用Host Profiles失败,提示如下错误:
01.Specification state absent from host: device ‘<datastore>’ state needs to be set to ‘on’
02.Host state doesn’t match specification: device ‘<datastore>’ needs to be reset
03.Specification state absent from host: device ‘<datastore>’ Path Selection Policy needs to be set to ‘VMW_PSP_FIXED’
04.Host state doesn’t match specification: device ‘<datastore>’ Path Selection Policy needs to be set to default for claiming SATP
故障分析:
这是由于PSA组件导致的;
解决方案:
1、右击Host Profiles后点击Enable/Disable Profiles配置选项;
2、展开“Storage Configuration”选项,展开“Pluggable Storage Architecture”这个uxanxiang;
3、去掉“PSA Device Configuration”;
4、展开“Native Muti-Pathing(NMP)”这个选项后,接着展开“PSP and SATP configuration for NMP devi”选项;
5、去掉“PSP configuration for”这个选项后点击OK即可。
33、分析、解决IOPS导致的虚拟机/存储性能下降和虚拟机磁盘延时较大的问题
故障状态:
1、虚拟机性能较低;
2、在执行备份时磁盘延时很厉害;
3、虚拟磁盘vmdk延时较大;
故障分析:
这种问题基本都是由于虚拟机没有足够的IO Per Second(IOPS),或者IOPS低于30;
解决方案:
在解决问题前,首先要解决以下两个问题:
问题1:什么是IOPS?
IOPS全称为Input/Output Per Second,它是衡量一个磁盘(虚拟磁盘和物理磁盘)、存储的基本也是十分重要的标准。不同的磁盘、存储有着不同的IOPS。IOPS的高低直接会影响着系统的性能。当前,VMware虚拟化环境中最大的瓶颈也就在于这个IOPS。针对数据密集型业务的数据库业务和流媒体业务,由于它们的IOPS很大,所以在虚拟化环境中部署它们一定要充分考量它们的负载,也就是IOPS大小,结合实际的存储性能来查看是否符合业务标准。
问题2:如何计算IOPS?
如何计算每台虚拟机的IOPS?
要想计算每个虚拟机的总的IOPS数量,首先就要确认磁盘类型以及它们的IOPS是多少。处于RAID阵列里面的每个盘的IO有利于增长整体存储的可用IOPS。而位于这个存储上面的单台虚拟机的IOPS,则可以通过将这个存储的总IOPS除掉虚拟机数量即可基本得到单台虚拟机的IOPS。
现实案例:
假定有6颗10000RPM的磁盘,那么它们的总的可用IOPS大约为150×6=900。如果LUN上面运行的虚拟机数量为50个,则单台虚拟机的IOPS为900/50=18 IOPS。如果以这个为标准,则意味着虚拟机的性能相对底下。如果想要满足虚拟机的基本IOPS需求,那么应该为900/30=30,也就是说同一个Volume里IOPS为30(最低要求)虚拟机需要数量控制在30台以下。
备注:备份存储会消耗更多的IOPS,同时也会给Volume带来更多额外的符合。如果是这样,则需要用额外手段解决备份时的额外资源消耗(可以通过I/O meter软件来测试IOPS)
34、丢失或锁定文档导致虚拟机无法Power On
故障状态:
1、虚拟机无法开启;
2、尝试开启虚拟机时,看到类似如下错误信息:
- Unable to open Swap File;
- Unable to access a file since it is locked;
- Unable to access Virtual machine configuration;
3、在/var/log/vmkernel文件里可以看到类似如下信息:
WARNING: World: VM xxxx: xxx: Failed to open swap file <path>ock was not free
WARNING: World: VM xxxx: xxx: Failed to initialize swap file <path>
4、当尝试开启虚拟机的console控制台时,可能会收到如下错误信息:
Error connecting to <path><virtual machine>.vmx because the VMX is not started
5、在开启虚拟机时,卡在95%位置无响应;
6、从模板部署一台新的VM之后无法开启虚拟机;
7、虚拟机在vCenter Server和ESXi/ESX主机之间报告控制台电源状态冲突;
故障分析:
导致这个问题的因素可能很多,但是众多问题中,都穿插或包含着文件损坏或文件被锁定等问题的可能。虚拟机常用的文件包括:
- *.vswp
- *-flat.vmdk
- *-delta.vmdk
- *.vmx
- *.log
解决方案:
首先需要确认哪些文件处于锁定状态:
1、利用vSphere Client登录ESXi/ESX主机、vCenter Server主机;
2、在Datastore里找到想要开启但是无法开启的虚拟机所在位置;
3、尝试开启虚拟机,如果无法开启且console显示错误,先查阅vmware.log日志文件的相关信息来确认问题;
4、利用SSH或COS选用root权限登录到ESXi/ESX主机之后执行下面的命令查看虚拟机的完整路径:
#vmware-cmd -l
系统将输出类似如下信息来显示注册到ESXi/ESX主机的虚拟机:
/vmfs/volumes/<UUID>/<虚拟机目录>/<虚拟机名>.vmx
5、执行下列命令切入到这个虚拟机所在的目录:
#cd /vmfs/voluems/<UUID>/<虚拟机目录>
6、然后查阅vmware.log日志,在文件的尾部查看什么原因导致这个问题后再针对性的分析。
准确定位并删除掉锁定文件
由于虚拟机可以在主机之间移动,如果虚拟机注册到的主机保持对文件的锁定状态,那么,这个锁定文件可以有效保障ESXi/ESX主机对虚拟机文件的控制权和有效保护虚拟系统。主机由Service Console接口的MAC来确定。lock由VMkernel或Service Console负责维护;
备注:ESXi服务器没有Service Console所以,lock由VMkernel单独负责维护;
首先要确定VMkernel可能锁定的文件:
1、执行下面的命令来报告锁定目录所在的MAC地址:
#vmkfstools -D /vmfs/volumes/<UUID>/<虚拟机目录>/<锁定状态文件>
2、由于负责锁定.vmdk文件的主机会将MAC地址写入到vmkernel日志里面,那么可以用下面的命令查阅:
#tail /var/log/vmkernel
35、Storage vMotion失败:looking for lines staring with “CBTMotion”
故障状态:
1、执行Storage vMotion失败;
2、系统提示如下错误信息:
01.A general system error occurred: Storage VMotion failed to copy one or more of the VM’s disks. Please consult the VM’s log for more details, looking for lines starting with “CBTMotion-“.
复制代码3、/var/log/vmware/hostd.log文件里有类似如下信息:
01.Failed with error 340983807: Storage VMotion failed to copy one or more of the VM’s disks. Please consult the VM’s log for more details, looking for lines starting with “CBTMotion”.
复制代码故障分析
可能由于虚拟机的硬件版本号过老导致;
解决方案:
关掉虚拟机后右击uxniji选择Upgrade Virtual Machine Hardware即可。
36、添加LUN时提示HostDatastoreSystem.QueryVmfsDatastoreCreateOptions
故障状态:
系统能够扫描到Devices LUN,但是在添加过程中却提示如下错误信息:HostDatastoreSystem.QueryVmfsDatastoreCreateOptions ,如图所示:
故障分析:
这样的问题一般都是由于LUN的尺寸过大导致,一般来说,VMware ESXi/ESX Server标准支持最大的LUN尺寸为2TB-512Byte,但是由于国内很多技术人员对这个-512Byte并不太在意,所以习惯型的讲成2TB,这就导致很多用户在使用时,直接分配了2TB的空间,这就可能导致了上述问题;
解决方案:
针对这样的问题,建议如下:
1、如果已经分好了2TB的LUN,建议调整为1.88TB左右后再尝试添加;
2、新LUN规划用户则请严格参照官方文档的参数设计,建议是1.88TB左右为一个LUN生成Datastore
37、vCenter Converter推送Agent出错:Converter Agent installer/uninstaller Failed
故障状态:
1、利用vCenter Converter推送Agent到Windows Server 2003服务器上时,失败;
2、系统提示类是如下错误信息:
01.Converter Agent installer/uninstaller failed on ‘xxxxxxxxx’.
3、VMware vCenter Converter的日志文件converter-server.log里面有类似如下错误提示:
01.[#6] [2011-01-21 10:50:55.976 04080 info ‘App’] [agentManager,83] [AgentManager] Install Agent on 192.168.10.10
02.[#6] [2011-01-21 10:51:16.976 04080 error ‘App’] [agentManager,95] [AgentManager] Install Agent failed: converter.fault.AgentDeploymentFault
03.[#7] [2011-01-21 11:18:37.289 03976 info ‘App’] Reusing existing VIM connection to 192.168.30.150
04.[#7] [2011-01-21 11:18:37.476 03976 error ‘App’] Found dangling SSL error: [0] error:00000001:lib(0):func(0):reason(1)
05.[#7] [2011-01-21 11:19:00.945 02756 info ‘App’] [agentManager,83] [AgentManager] Install Agent on 192.168.10.10
06.[#7] [2011-01-21 11:19:21.961 02756 error ‘App’] [agentManager,95] [AgentManager] Install Agent failed: converter.fault.AgentDeploymentFault
7.[#7] [2011-01-21 11:19:32.445 03976 info ‘App’] [diagnosticManager,357] Generating Converter.Server log bundle.
故障分析:
以下几种情况可能导致这样的问题:
1、445端口没能打开;
2、曾经手动安装过Agent后卸载;
3、Windows服务管理其中的server服务没有启动导致的IPC$连接失败;
4、防火墙阻绝;
解决方案
1、确认445端口或NetBIOS协议能正常使用;
2、建议在Converter时关闭防火墙;
3、如果依然有问题,尝试用Converter Standardalone版本迁移或采用ConverterCD进行冷克隆。
38、解决在vSphere 5.0里开启HA时,提示:Datastore Heartbeating不足的问题
故障状态:
为ESXi 5.0+vCenter 5.0配置HA时,提示如下信息:
故障分析:
这是由于vSphere 5.0里的HA部分已经重写,并且新增了Datastore Heartbeating用于网络Partition心跳检测支持;
解决方案:
有2个选择,一个是加多存储用于心跳检测,这也是正确的选择,就不多讲,另一个就是忽略掉这个问题,方法如下:
1、vSphere Client登录到vCenter Server 5.0后,右击HA Cluster,点击Edit,然后找到高级选项设定:
2、再如上图所示的内容中,添加下参数:
das.ignoreinsufficienthbdatastore
备注:缺省情况下,这个参数的值是false的。
39、通过vSphere Client登陆ESXi主机提示“正在更新”的问题
故障状态:
通过vSphere Client登陆VCenter Server4.1正常,登陆ESXi主机提示如下图:
故障分析:
需要通过‘vSphereclient.vmware.com’来更新Client说明客户端存在问题,由于登陆VCenter Server4.1不存在任何问题,所以基本确定版本的问题。查看ESXi版本和vSphere Client,发现Client的版本低于ESXi版本。
解决方案:
由于Client所在网络无法上Internet,所以无法更新Client客户端,可以通过安装高版本的Client来解决此问题。
40、红旗32位Linux进入系统时提示”udevu”无法继续进入系统的问题
故障状态:进入系统后,出现下图的界面,之后无法向下运行,必须按Ctrl+C才能继续向下运行
故障分析:由于系统安装时候是完整的,光盘镜像包是完整的,安装的时候不存在任何问题。考虑到物理机上不存在这种问题,怀疑虚拟机虚拟驱动的问题,安装新的VMware-tools问题依旧。
解决方案:考虑到红旗Linux比较新,去官方下载11月份最新的VMware-tools,问题解决 (下载地址:http://packages.vmware.com/tools/esx)
50、虚拟机文件被锁,无法正常 power on 故障状态: 启动虚拟机时95%,停顿并且进程中断,提示:ubable to access files since it is locked。 祸根:HA 解决方法: 1.首先将cluster中的HA功能关闭。如果该功能不关闭,容易造成死锁,,VM不断跳动,,不断再不同的ESX内循环被锁,徒劳而无功。 2.磁盘文件被锁,要解决,必须要知道到底是哪台ESX把他给锁住了,这是关键。 方法:看/var/log/vmkernel但是,在做这些前, 再准备些别的工作。 3.在VC中,把被锁的VM从Inventory中remove掉。原因很简单,这是一个 unregister的过程。 4.根据/var/log/vmkernel,搜索owner,可以找到类似以下的语句: Oct 19 04:23:33 esx-hostname vmkernel: 3:06:29:47.992 cpu6:1656)FS3: 1975: Checking if lock holders are live for lock [type 10c00001 offset 52008960 v 380, hb offset 3554304 Oct 19 04:23:33 esx-hostname vmkernel: gen 17, mode 1, owner 48f5f637-462688bc-fd28-0e1a6434b6f8 mtime 38112] OK,owner后面的48f5f637-462688bc-fd28-0e1a6434b6f8就是你的target了。 因为他就是锁住VM 的宿主.。 5.根据以下命令,,找出到底哪台ESX的UUID是 48f5f637-462688bc-fd28-0e1a6434b6f8 [root@esxhostname root]# esxcfg-info |grep -i ‘system uuid’ 6.找到目标主机后,当然是杀死他锁住VM的进程。之所以会被锁,原因就是HA 把VM从别的HOST迁移过来,但是又没有unregister和register的过程,所以在第3步的时候,你查看VM的Summary的时候,host ip还是属于出问题的 host。 但是VM又被新的host霸王硬上功的power on,注册都没注册, 又怎么启动呢。找到 PID 用下面的命令: ps -efwww|grep virtualmachine.vmx 找到 PID 后, kill -9 PID 7.这时候,还要确定一件事情, .vswp文件的事情。这个是给台客处理问题时吸取的经验。就因为忽略了这个,所以在杀掉迚程后,重新注册VM,还说没有 SWAP文件,启动还是失败。 在 VM 启动时会自动生成SWAP,没有SWAP文件,其实就是因为 SWAP 存在了, 因为重名而导致无法正常生成。 进入到/vmfs/volumes/lunid/vm_path/下,vmkfs -d virtual_machine.vswp 或者进入Datastore Browser,在里面把SWAP文件删除也可。 8.完全之策,你还可以进入到VM的SETTINGS–OPTIONS–SWAPFILE LOCATION, 对该保存的位置做下设置。 9.重新注册VM。进入Datastore Browser,找到VM.vmx,add to inventory。 10.启动 VM. Good Luck。
51、忽视掉ESXi/vCenter Server提示SSH事件的方法
1. vSphere Client连接到VC或者ESXi服务器;2. 在Home -> Inventory -> Hosts and Clusters里展开选中你的ESX服务器;3. 右边选择Configuration,然后点击Software栏目里的Advanced Settings;4. 在Advanced Settings里选择左边列表中的UserVars;5. 选中左边列表中的UserVars后,在右边拖到最下面,将UserVars.SuppressShellWarning的值改为1即可,不需要重启。 |
1. vSphere Client连接到VC或者ESXi服务器;2. 在Home -> Inventory -> Hosts and Clusters里展开选中你的ESX服务器;3. 右边选择Configuration,然后点击Software栏目里的Advanced Settings;4. 在Advanced Settings里选择左边列表中的UserVars;5. 选中左边列表中的UserVars后,在右边拖到最下面,将UserVars.SuppressShellWarning的值改为1即可,不需要重启。 |
---|---|
1. vSphere Client连接到VC或者ESXi服务器;2. 在Home -> Inventory -> Hosts and Clusters里展开选中你的ESX服务器;3. 右边选择Configuration,然后点击Software栏目里的Advanced Settings;4. 在Advanced Settings里选择左边列表中的UserVars;5. 选中左边列表中的UserVars后,在右边拖到最下面,将UserVars.SuppressShellWarning的值改为1即可,不需要重启。 | |
52、尝试迁移一台带USB设备的VM失败 故障状态:
在执行虚拟机迁移向导时,如果系统检测到不兼容的USB设备存在,则系统会提示如下错误信息:
Currently connecteddevice ‘USB 1’ uses backing ‘path:1/7/1’,which is not accessible.
故障分析:
这种问题通常发生在为主机开启了VMDirectPath I/O支持下的USB Passthrough Devices功能,然后为特定的VMs分配了USB设备,比如:加密狗;
解决方案:
1、确认USB设备能够被虚拟机识别和支持,并确保在添加USB设备到VMs时,勾选了with vMotion选项;
2、在执行vMotion动作之前,重新尝试将USB设备添加到VMs;
3、确认ESXi主机没被重启过,因为,ESXi主机重启之后,原本支持的vMotion WithvMotion功能将会失效。
53、Convert Linux系统的Troublshooting过程
(1)、确认源转换Linux机器的OS在官方的支持列表中;
(2)、拥有root权限;
(3)、确认DNS的设定有没有问题,注意:应该同时在Linux和Windows都加上;
(4)、确认源Linux能够ping同ESX或vCenter的IP。如果在2%时失败,最大的可能就是权限问题或防火墙阻隔问题;
(5)、确认Linux允许SSH登陆进去。这个,可以帮助我们在converting的时候登录到Linux系统;
(6)、确认是给helper virtual machine设定的静待IP,而不是DHCP获取的(如果网内没有DHCP服务器);
(7)、确认源和目标都在同一子网。如果通过路由链接的不同子网可能会出错;
(8)、注意,converter不支持做了软阵列的Linux系统。可以用冷克隆光盘来做,它会把软阵列的设定为/dev/md0。
(9)、VMware Converter Standalone的日志目录:C:Documents and SettingsAll UsersApplication DataVMwareVMware vCenter Converter Standalone,用于排错时用。
54、vCenter Service Status页面故障:Unable to retrieve health status
故障状态:
vCenter Server Status页面提示如下错误信息:
Unable to retrieve health status for vCenter inventory service
Unable to retrieve health status for VMware vSphere Profile-Driven storage service
执行vCenter Server的搜索动作时,提示如下错误提示:
Unable to connect to webservices to perform query.
Verify that the “VMware VirtualCenter Management WebServices” service running onhttps://<vcenter-host-name>:10443
故障分析:
这个问题一般都由于当vCenter Server服务发生了变更或全新安装了一台vCenter Server,但是数据库依然是原来的数据库导致;
解决方案:
替换掉vws.jar、jointool.jar和ds.jar文件即可,步骤如下:
下载本文附件中的vws.zip
文件然后解压缩vws.jar、jointool.jar和ds.jar文件;
停止掉VirtualCenter Server服务以及VirtualCenter Management Webservices服务;拷贝vws.jar和jointool.jar到C:ProgramFilesVMwareInfrastructuretomcatwebappsWEB-INFlib覆盖掉原来的文件;拷贝ds.jar文件到C:Program FilesVMwareInfrastructureInventory Servicelib覆盖掉原来的文件;重新启动相关服务或vCenter Server服务器即可。
55、VMRC 控制台的连接已断开…正在尝试重新连接
故障状态:
用vSphere Client连接到ESXi 5.0的主机,启动其中的虚拟机后,无法连接控制台,打开控制台之后,窗口上方提示一行“VMRC 控制台的连接已断开…正在尝试重新连接。”
故障分析:
从情况看,类似于Windows系统的DEP策略处于开启状态导致的问题一样。但这个情况是所有虚拟机都提示这个错误,排错DEP的问题,用本地vSphere Client登录一个VC平台,问题仍旧一样。为了排除问题,换了一台笔记本登录VC,突然发现问题不见了。原来是本地的vSphere Client出了问题,再三思索,发现出现问题前我对本地WIN7用360安全卫士升级了补丁,是否是补丁破坏了vSphere Client某个文件呢
解决方案:
重现安装vSphere Client,问题解决。
56、端口 80 的 vCenter Server 和 IIS 之间的冲突
故障状态:
vCenter Server 和 Microsoft Internet Information Service (IIS) 都将端口 80 用作直接 HTTP 连接的默认端口。该冲突会导致安装 vSphere Authentication Proxy 后 vCenter Server 无法重新启动。 在 vSphere Authentication Proxy 安装完成后, vCenter Server 无法重新启动。
故障分析:
如果安装 vSphere Authentication Proxy 时未安装 IIS ,则安装程序会提示您安装 IIS 。因为 IIS 使用端口 80 ,这是用于 vCenter Server 直接 HTTP 连接的默认端口, 所以 vCenter Server 在 vSphere Authentication Proxy。安装完成后无法重新启动。请参见第 32 页,“ vCenter Server 所需的端口” 。
解决方案: 要为端口 80 解决 IIS 和 vCenter Server 之间的冲突,请执行以下操作之一。
如果在安装 vCenter Server 之前已安装 IIS 将 vCenter Server 直接 HTTP 连接的端口由 80 更改为其他值。 如果在安装 IIS 之前已安装 vCenter Server 重新启动 vCenter Server 之前, 将 IIS 默认网站的绑定端口由 80 更改为其他。
57、在 UEFI 模式下安装 ESXi 后主机无法引导
故障状态:
在 UEFI 模式下, 在主机上安装 ESXi 后重新引导时, 重新引导可能失败。 出现此问题的同时, 还显示一条类似于以下内容的错误消息: 发生异常网络错误。无可用的引导设备 (Unexpected network error. No boot device available)。
故障分析:
主机系统无法识别作为引导磁盘在其上安装 ESXi 的磁盘。
解决方案:
1 屏幕上显示错误消息时,按 F11 显示引导选项。
2 选择一个类似于添加引导选项的选项。该选项的文字可能有所不同,具体取决于您的系统。
3 在安装 ESXi 的磁盘上选择文件 EFIBOOTBOOTx64.EFI 。
4 更改引导顺序,以便主机从添加的选项引导。
58、将 Microsoft SQL 数据库设置为不受支持的兼容模式会导致 vCenter Server 安装或升级失败
当数据库设置为不支持的版本的兼容性模式时,使用 Microsoft SQL 数据库的 vCenter Server 安装会失败。
故障状态: 将显示以下错误消息: 输入的数据库用户没有使用选定数据库安装和配置 vCenter Server 所需的必要权限。 请更正以下错误 : %s
故障分析:
数据库版本必须是 vCenter Server 支持的版本。 对于 SQL , 即使数据库是受支持的版本, 但如果将其设置为以不支持的版本的兼容性模式运行, 仍会发生此错误。 例如, 如果将 SQL 2008 设置为以 SQL 2000 兼容性模式运 行,就会发生此错误。
解决方案: u 请确保 vCenter Server 数据库是受支持的版本, 并且没有设置为以不支持的版本的兼容性模式运行。
59、误删运行中的虚拟机,通过xx-flat.vmdk恢复方法
故障状态:误删了运行中的虚拟机,进入目录查看,只剩下xx-flat.vmdk文件,从文件的类型看,只是File格式,不是Virtual Disk格式,新建虚拟,选择添加已存在磁盘,提示不存在
解决方案:
1. 新建一虚拟机,不要创建硬盘
2. 用ssh的方式登录host,查找xx-flat.vmdk文件所在位置及目录,
3. 在上面这个文件相同目录下创建新xxx.vmdk文件,大小要和xx-flat.vmdk文件一样大,
用ls -la查看xx-flat.vmdk文件大小,
用vmkfstools -c 文件大小 -a lsilogic xxx.vmdk 来创建新磁盘文件
4. 将这个磁盘文件添加到新建的虚拟机中;
5. 用原文件xx-flat.vmdk覆盖新建的xxx-flat.vmdk(注意一定是-flat.vmdk),使用mv命令
6. 完成后开启虚拟机就可以了
60、在view桌面中,Win7下安装出现软件出现“系统管理员设置了系统策略,禁止进行此安装”的提示
解决方案:
1、打开“开始->控制面板->管理工具->本地安全策略”->点击“软件限制策略”,如果提示“没有定义软件限制策略”,那么就右键“创建软件限制策略”->创建后,双击右侧“强制”,选择“除本地管理员以外的所有用户”,确定
2、windows开始菜单,运行里面输入gpedit.msc打开组策略,
在“计算机配置”→管理模板→windows组件→windows installer,右边 第一项就是禁用windows installer。把它改成 “未配置”后者“已禁用”就可以了。
3、删除HKEY_CLASSES_ROOTInstallerProducts4080110900063D11C8EF10054038389C注册表项目。(建议使用此法,能解决大多数你出现的情况,在运行栏里输入regedit进入注册表,按照以上路径找到项目删除就可以了)
61、持续较高的 CPU 使用情况的解决方案
故障状态:
CPU 使用情况中的临时高峰表示 CPU 资源的使用情况最佳。持续较高的 CPU 使用情况可能表示存在问题。 您可以使用 vSphere Client CPU 性能图表监控主机、群集、资源池、虚拟机和 vApp 的 CPU 使用情况。
问题 n 主机 CPU 使用情况一直很高。 CPU 使用情况值较高时会增加主机上虚拟机的就绪时间和处理器列队。
n 虚拟机 CPU 使用情况超过 90% ,且 CPU 就绪值超过 20% 。应用程序性能将受到影响。
原因
主机可能缺少满足要求所需的 CPU 资源。
解决方案: n 验证是否在主机的每台虚拟机上均安装了 VMware Tools 。
n 将主机上或资源池中其他虚拟机的 CPU 使用情况与此虚拟机的 CPU 使用情况值进行比较。 主机的虚拟机 视图上的堆栈条形图显示主机上所有虚拟机的 CPU 使用情况。 n 确定虚拟机就绪时间过长是否由其 CPU 使用情况时间达到 CPU 限制设置所致。 如果出现这种情况, 请增
加虚拟机上的 CPU 限制。 n 增加 CPU 份额以给予虚拟机更多机会运行。 如果主机系统受到 CPU 约束, 则主机上的总就绪时间可能仍 维持在相同级别。如果主机就绪时间没有减少,则为高优先级虚拟机设置 CPU 预留,保证它们收到所需 要的 CPU 周期。 n 增加分配给虚拟机的内存量。此操作会减少所缓存应用程序的磁盘和 / 或网络活动。这可能会降低磁盘
I/O ,并减少主机对虚拟化硬件的需求。具有较少资源分配的虚拟机通常可累积更多的 CPU 就绪时间。 n 将虚拟机上的虚拟 CPU 数量减少到执行工作负载所需要的数量。例如,四路虚拟机上的单线程应用程序
只能从单个 vCPU 中受益。 而管理程序还需维护三个空闲 vCPU , 占用本可用来处理其他工作的 CPU 周期。 n 如果主机不在 DRS 群集中,则将它添加到一个群集中。如果主机在 DRS 群集中,则增加主机数,并将一 个或多个虚拟机迁移到新主机上。 n 如有必要,请在主机上升级物理 CPU 或内核。
n 使用最新版本的管理程序软件并启用 CPU 节省功能(例如 TCP 分段卸载、较大内存页面和巨型帧)。
本文转载自网络
推荐阅读
-
纯干货分享 | 研发效能提升——敏捷需求篇-而敏捷需求是提升效能的方式中不可或缺的模块之一。 云智慧的敏捷教练——Iris Xu近期在公司做了一场分享,主题为「敏捷需求挖掘和组织方法,交付更高业务价值的产品」。Iris具有丰富的团队敏捷转型实施经验,完成了企业多个团队从传统模式到敏捷转型的落地和实施,积淀了很多的经验。 这次分享主要包含以下2个部分: 第一部分是用户影响地图 第二部分是事件驱动的业务分析Event driven business analysis(以下简称EDBA) 用户影响地图,是一种从业务目标到产品需求映射的需求挖掘和组织的方法。 在软件开发过程中可能会遇到一些问题,比如大家使用不同的业务语言、技术语言,造成角色间的沟通阻碍,还会导致一些问题,比如需求误解、需求传递错误等;这会直接导致产品的功能需求和要实现的业务目标不是映射关系。 但在交付期间,研发人员必须要将这些需求实现交付,他们实则并不清楚这些功能需求产生的原因是什么、要解决客户的哪些痛点。研发人员往往只是拿到了解决方案,需要把它实现,但没有和业务侧一起去思考解决方案是否正确,能否真正的帮助客户解决问题。而用户影响地图通常是能够连接业务目标和产品功能的一种手段。 我们在每次迭代里加入的假设,也就是功能需求。首先把它先实现,再逐步去验证我们每一个小目标是否已经实现,再看下一个目标要是什么。那影响地图就是在这个过程中帮我们不断地去梳理目标和功能之间的关系。 我们在软件开发中可能存在的一些问题 针对这些问题,我们如何避免?先简单介绍做敏捷转型的常规思路: 先做团队级的敏捷,首先把产品、开发、测试人员,还有一些更后端的人员比如交互运维的同学放在一起,组成一个特训团队做交付。这个团队要包含交付过程中所涉及的所有角色。 接着业务敏捷要打通整个业务环节和研发侧的一个交付。上图中可以看到在敏捷中需求是分层管理的,第一层是业务需求,在这个层级是以用户目标和业务目标作为输入进行规划,同时需要去考虑客户的诉求。业务人员通过获取到的业务需求,进一步的和团队一起将其分解为产品需求。所以业务需求其实是我们真正去发布和运营的单元,它可以被独立发布到我们的生产环境上。我们的产品需求其实就是产品的具体功能,它是我们集成和测试的对象,也就是我们最终去部署到系统上的一个基本单元。产品需求再到了我们的开发团队,映射到迭代计划会上要把它分解为相应的技术任务,包括我们平时所说的比如一些前端的开发、后端的开发、测试都是相应的技术任务。所以业务敏捷要达到的目标是需要去持续顺畅高质量的交付业务价值。 将这几个点串起来,形成金字塔结构。最上层我们会把业务目标放在整个金字塔的塔尖。这个业务目标是通过用户的目标以及北极星指标确立的。确认业务目标后再去梳理相应的业务流程,最后生产。另外产品需求包含了操作流程和业务规则,具需求交付时间、工程时间以及我们的一些质量标准的要求。 谈到用户影响的地图,在敏捷江湖上其实有一个传说,大家都有一个说法叫做敏捷需求的“任督二脉”。用户影响地图其实就是任脉,在黑客马拉松上用过的用户故事地图其实叫督脉。所以说用户影响地图是在用户故事地图之前,先帮我们去梳理出我们要做哪些东西。当我们真正识别出我们要实现的业务活动之后,用户故事地图才去梳理我们整个的业务工作流,以及每个工作流节点下所要包含的具体功能和用户故事。所以说用户影响地图需要解决的问题,我们包括以下这些: 首先是范围蔓延,我们在整张地图上,功能和对应的业务目标是要去有一个映射的。这就避免了一些在我们比如有很多干系人参与的会议上,那大家都有不同想法些立场,会提出很多需求(正确以及错误的需求)。这个时候我们会依据目标去看这些需求是否真的是会影响我们的目标。 这里提到的错误需求,比如是利益相关的人提出的、客户认为产品应该有的、某个产品经理需求分析师认为可以有的....但是这些功能在用户影响地图中匹配不到对应目标的话,就需要降低优先级或弃掉。另外,通常我们去制定解决方案的时候,会考虑较完美的实现,导致解决方案括很多的功能。这个时候关键目标至关重要,会帮助我们梳理筛选、确定优先级。 看一下用户影响到地图概貌 总共分为一个三层的结构: 第一层why,你的业务目标哪个是最重要的,为什么?涉及到的角色有哪些? 第二层how ,怎样产生影响?影响用户角色什么样的行为? (不需要去列出所有的影响,基于业务目标) 第三层what,最关键的是在梳理需求时不需一次把所有细节想全,这通常团队中经常遇到的问题。 我们用这个例子来看一下 这是一个客服中心的影响地图,业务目标是 3个月内不增加客服人数的前提下能支持1.5倍的用户数。此业务目标设定是符合 smart 原则的,specific非常的具体,miserable 是可以衡量的,action reoriented是面向活动的, real list 也是很实际的。 量化的目标会指引我们接下来的行动,梳理一个业务目标,尽量去量化,比如 :我们通过打造一条什么样的流水线,能够提高整个部署的效率,时间是原来的 1/2 。这样才是一个能量化的有意义的目标。 回到这幅图, how 层级识别出来的内容,客服角色:想要对它施加的影响,把客户引导到论坛上,帮助客户更容易的跟踪问题,更快速的去定位问题。初级用户:方论坛上找到问题。高级用户:在论坛上回答问题。通过我们这些用户角色,进行活动,完成在不增加客户客服人数的前提下支持更多的用户数量。 最后一个层级,才是我们日常接触比较多的真正的功能的特性和需求,比如引导到客户到论坛上,其实这个产品就需要有一个常见问题的论坛的链接。这个层次需要我们团队进一步地在交付,在每个迭代之前做进一步的梳理,细化成相应的用户故事。 这个是云智慧团队中,自己做的影响地图的范例,可以看下整个的层级结构。序号表示优先级。 那我们用户影响地图可以总结为:
-
[姿势估计] 实践记录:使用 Dlib 和 mediapipe 进行人脸姿势估计 - 本文重点介绍方法 2):方法 1:基于深度学习的方法:。 基于深度学习的方法:基于深度学习的方法利用深度学习模型,如卷积神经网络(CNN)或递归神经网络(RNN),直接从人脸图像中学习姿势估计。这些方法能够学习更复杂的特征表征,并在大规模数据集上取得优异的性能。方法二:基于二维校准信息估计三维姿态信息(计算机视觉 PnP 问题)。 特征点定位:人脸姿态估计的第一步是通过特征点定位来检测和定位人脸的关键点,如眼睛、鼻子和嘴巴。这些关键点提供了人脸的局部结构信息,可用于后续的姿势估计。 旋转表示:常见的旋转表示方法包括欧拉角和旋转矩阵。欧拉角通过三个旋转角度(通常是俯仰、偏航和滚动)描述头部的旋转姿态。旋转矩阵是一个 3x3 矩阵,表示头部从一个坐标系到另一个坐标系的变换。 三维模型重建:根据特征点的定位结果,三维人脸模型可用于姿势估计。通过将人脸的二维图像映射到三维模型上,可以估算出人脸的旋转和平移信息。这就需要建立人脸的三维模型,然后通过优化方法将模型与特征点对齐,从而获得姿势估计结果。 特征点定位 特征点定位是用于检测人脸关键部位的五官基础部分,还有其他更多的特征点表示方法,大家可以参考我上一篇文章中介绍的特征点检测方案实践:人脸校正二次定位操作来解决人脸校正的问题,客户在检测关键点的代码上略有修改,坐标转换部分客户见上图 def get_face_info(image). img_copy = image.copy image.flags.writeable = False image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) results = face_detection.process(image) # 在图像上绘制人脸检测注释。 image.flags.writeable = True image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) box_info, facial = None, None if results.detections: for detection in results. for detection in results.detections: mp_drawing.Drawing.detection = 无 mp_drawing.draw_detection(image, detection) 面部 = detection.location_data.relative_keypoints 返回面部 在上述代码中,返回的数据是五官(6 个关键点的坐标),这是用 mediapipe 库实现的,下面我们可以尝试用另一个库:dlib 来实现。 使用 dlib 使用 Dlib 库在 Python 中实现人脸关键点检测的步骤如下: 确保已安装 Dlib 库,可使用以下命令: pip install dlib 导入必要的库: 加载 Dlib 的人脸检测器和关键点检测器模型: 读取图像并将其灰度化: 使用人脸检测器检测图像中的人脸: 对检测到的人脸进行遍历,并使用关键点检测器检测人脸关键点: 显示绘制了关键点的图像: 以下代码将参数 landmarks_part 添加到要返回的关键点坐标中。
-
跨平台传输大法好!教你怎么在Windows和Linux间用scp命令搬家
-
如何在vSAN集群中通过命令行移除和添加ESXi主机?
-
如何在Linux上用Aria2命令下载BT种子、磁力链接和直链文件?
-
ESXi常见问题和速用命令
-
用bat命令批量执行文件提取、去除空格和修改文件名的步骤
-
Grid++Report 锐浪报表开发常见问题解答集锦-报表设计 问:怎样在设计时打印预览报表? 答:为了及时查看报表的设计效果,Grid++Report 报表设计应用程序提供了四种查看视图:普通视图、页面视图、预览视图与查询视图。通过窗口下边的 Tab 按钮可以在四种视图中任意切换。在预览视图中查看报表的打印预览效果,在查询视图中查看报表的查询显示效果。如果在报表的记录集提供了数据源连接串与查询 SQL,在进入预览视图与查询视图时会利用数据源连接串与查询 SQL 从数据源中自动取数,否则 Grid++Report 将自动生成模拟数据进行模拟打印预览与查询显示。注意:在预览视图与查询视图中看到的报表运行结果有可能与在你程序中的最终运行结果有差异,因为在报表的生成过程中我们可以在程序中对报表的生成行为进行一定的控制。 问:怎样用 Grid++Report 设计交叉表? 答:Grid++Report 没有提供专门实现交叉表的功能,其它的报表构件提供的交叉表功能一般也比较死板和功能有限。利用 Grid++Report 的编程接口可以做出灵活多变,功能丰富的交叉表。示例程序 CrossTab 就是一个实现交叉表的例子程序,认真领会此例子程序,你就可以做出自己想要各种交叉表,并能提取一些共用代码,便于重复使用。 问:怎样设置整个报表的缺省字体? 答:设置报表主对象的字体属性,也就是设置了整个报表的缺省字体。如果改变报表主对象的字体属性,则没有专门的设置字体属性的子对象的字体属性也跟随改变。同样每个报表节与明细网格也有字体属性,他们的字体属性也就是其拥有的子对象的缺省字体。 问:怎样在打印时限制一页的输出行数? 答:设定明细网格的内容行的‘每页行数(RowsPerPage)’属性即可。另外要注意‘调节行高(AdjustRowHeight)’属性值:为真时根据页面的输出高度自动调整行的高度,使整个页面的输出区域充满。为假时按设计时的高度输出行。 问:怎样显示中文大写金额? 答:将对象的“格式(Format)”属性设为 “$$” 及可,可以设置格式的对象有:字段(IGRField)、参数(IGRParameter)、系统变量(IGRSystemVarBox)与综合文字框(IGRMemoBox),其中综合文字框是在报表式上设格式。 问:能否实现自定义纸张与票据打印? 答:Grid++Report 完全支持自定义纸张的打印,只要在报表设定时在页面设置中选定自定义纸张,并指定准确的纸张尺寸。当然要在最终输出时得道合适的打印结果,输出打印机必须支持自定义纸张打印。Windows2000/XP/2003 操作系统上可以在打印机上定义自定义纸张,也可以采用这种方式实现自定义纸张打印。 问:怎样实现 0 值不打印? 答:直接设置格式串就可以,在“数字格式”设置对话框中选定“0 不显示”,就会得到合适的格式串。也可以通过直接录入格式串来指定 0 不显示,但格式串必须符合 Grid++Report 的规定格式。另一种实现办法是在报表获取明细记录数据时,在 BeforePostRecord 事件中将值为零的字段设为空,调用字段的 Clear 方法将字段置为空。 问:怎样实现多栏报表? 答:在明细网格上设‘页栏数(PageColumnCount)’属性值大于 1 即可。通过 Grid++Report 的“页栏输出顺序”还可以指定多栏报表的输出顺序是“先从上到下”还是“先从左到右”。 问:如何实现票据套打? 答:Grid++Report 为实现票据套打做了很多专门的安排:报表设计器提供了页面设计模式,按照设定的纸张尺寸显示设计面板,如果将空白票据的扫描图设为设计背景图,在定位报表内容的输出位置会非常方便。报表部件可以设定打印类别,非套打输出的内容在套打打印模式下就不会输出。 问:Grid++Report 有没有横向分页功能? 答:回答是肯定的,在列的总宽度超过打印页面的输出宽度时,Grid++Report 可以另起新页输出剩余的列,如果左边存在锁定列,锁定列可以在后面的新页中重复输出,这样可以保证关键数据列在每一页都有输出。仔细体会 Grid++Report 提供的多种打印适应策略,选用最合适的方式。Grid++Report 的多种打印适应策略为开发动态报表提供了很好的支持。 问:怎样实现报表本页小计功能? 答:定义一个报表分组,将本分组定义为页分组,在本分组的分组头与分组尾上定义统计。页分组就是在每页产生一个分组项,在每页的上端与下端都会分别显示页分组的分组头与分组尾,页分组不用定义分组依据字段。 报表运行 问:怎样与数据库建立连接? 答:如果在设计报表时指定了数据集的数据源连接串与查询 SQL 语句,Grid++Report 采用拉模式直接从数据源取得报表数据,Grid++Report 利用 OLE DB 从数据源取数,OLE DB 提供了广泛的数据源操作能力。如果 Grid++Report 的数据来源采用推模式,即 Grid++Report 不直接与数据库建立连接,各种编程语言/平台都提供了很好的数据库连接方式,并且易于操作,应用程序在报表主对象(IGridppReport)的 FetchRecord 事件中将数据传入,例子程序提供了各种编程语言填入数据的通用方法,对C++Builder 和 Delphi 还进行了专门的包装,直接关联 TDataSet 对象也可以将 TDataSet 对象中的数据传给报表。 问:打印时能否对打印纸张进行自适应?支持表格的折行打印吗? 答:Grid++Report 在打印时采用多种适应策略,通过设置明细网格(IGRDetailGrid)的‘打印策略(PrintAdaptMethod)’属性指定打印策略。(1)丢弃:按设计时列的宽度输出,超出范围的内容不显示。(2)绕行:按设计时列的宽度输出,如果在当前行不能完整输出,则另起新行进行输出。(3)缩放适应:对所有列的输出宽度进行按比例地缩放,使总宽度等于页面的输出宽度。(4)缩小适应:如果列的总宽度小于页面的输出宽度,对所有列的输出宽度进行按比例地缩小,使总宽度等于页面的输出宽度。(5)横向分页:超范围的列在新页中输出。(6)横向分页并重复锁定列。 问:如何改变缺省打印预览窗口的窗口标题? 答:改变报表主对象的‘标题(Title)’属性即可。 问:利用集合对象的编程接口取子对象的接口引用,但不是自己期望的结果。 答:Grid++Report中所有集合对象的下标索引都是从 1 开始,另按对象的名称查找对象的接口引用时,名称字符是不区分大小写的。 问:怎样在运行时控制报表中各个对象的可见性?即怎样在运行时显示或隐藏对象? 答:在报表主对象(GridppReport)的 SectionFormat 事件中设定相应报表子对象的可见(Visible)属性即可。 问:报表主对象重新载入数据,设计器中为什么没有反映新载入的数据? 答:应调用 IGRDesigner 的 Reload 方法。 问:怎样实现不进入打印预览界面,直接将报表打印出来?
-
F#探险之旅(二):函数式编程(上)-函数式编程范式简介 F#主要支持三种编程范式:函数式编程(Functional Programming,FP)、命令式编程(Imperative Programming)和面向对象(Object-Oriented,OO)的编程。回顾它们的历史,FP是最早的一种范式,第一种FP语言是IPL,产生于1955年,大约在Fortran一年之前。第二种FP语言是Lisp,产生于1958,早于Cobol一年。Fortan和Cobol都是命令式编程语言,它们在科学和商业领域的迅速成功使得命令式编程在30多年的时间里独领风骚。而产生于1970年代的面向对象编程则不断成熟,至今已是最流行的编程范式。有道是“*代有语言出,各领风骚数十年”。 尽管强大的FP语言(SML,Ocaml,Haskell及Clean等)和类FP语言(APL和Lisp是现实世界中最成功的两个)在1950年代就不断发展,FP仍停留在学院派的“象牙塔”里;而命令式编程和面向对象编程则分别凭着在商业领域和企业级应用的需要占据领先。今天,FP的潜力终被认识——它是用来解决更复杂的问题的(当然更简单的问题也不在话下)。 纯粹的FP将程序看作是接受参数并返回值的函数的集合,它不允许有副作用(side effect,即改变了状态),使用递归而不是循环进行迭代。FP中的函数很像数学中的函数,它们都不改变程序的状态。举个简单的例子,一旦将一个值赋给一个标识符,它就不会改变了,函数不改变参数的值,返回值是全新的值。 FP的数学基础使得它很是优雅,FP的程序看起来往往简洁、漂亮。但它无状态和递归的天性使得它在处理很多通用的编程任务时没有其它的编程范式来得方便。但对F#来说这不是问题,它的优势之一就是融合了多种编程范式,允许开发人员按照需要采用最好的范式。 关于FP的更多内容建议阅读一下这篇文章:Why Functional Programming Matters(中文版)。F#中的函数式编程 从现在开始,我将对F#中FP相关的主要语言结构逐一进行介绍。标识符(Identifier) 在F#中,我们通过标识符给值(value)取名字,这样就可以在后面的程序中引用它。通过关键字let定义标识符,如: let x = 42 这看起来像命令式编程语言中的赋值语句,两者有着关键的不同。在纯粹的FP中,一旦值赋给了标识符就不能改变了,这也是把它称为标识符而非变量(variable)的原因。另外,在某些条件下,我们可以重定义标识符;在F#的命令式编程范式下,在某些条件下标识符的值是可以修改的。 标识符也可用于引用函数,在F#中函数本质上也是值。也就是说,F#中没有真正的函数名和参数名的概念,它们都是标识符。定义函数的方式与定义值是类似的,只是会有额外的标识符表示参数: let add x y = x + y 这里共有三个标识符,add表示函数名,x和y表示它的参数。关键字和保留字关键字是指语言中一些标记,它们被编译器保留作特殊之用。在F#中,不能用作标识符或类型的名称(后面会讨论“定义类型”)。它们是: abstract and as asr assert begin class default delegate do donedowncast downto elif else end exception extern false finally forfun function if in inherit inline interface internal land lazy letlor lsr lxor match member mod module mutable namespace new nullof open or override private public rec return sig static structthen to true try type upcast use val void when while with yield 保留字是指当前还不是关键字,但被F#保留做将来之用。可以用它们来定义标识符或类型名称,但编译器会报告一个警告。如果你在意程序与未来版本编译器的兼容性,最好不要使用。它们是: atomic break checked component const constraint constructor continue eager event external fixed functor global include method mixinobject parallel process protected pure sealed trait virtual volatile 文字值(Literals) 文字值表示常数值,在构建计算代码块时很有用,F#提供了丰富的文字值集。与C#类似,这些文字值包括了常见的字符串、字符、布尔值、整型数、浮点数等,在此不再赘述,详细信息请查看F#手册。 与C#一样,F#中的字符串常量表示也有两种方式。一是常规字符串(regular string),其中可包含转义字符;二是逐字字符串(verbatim string),其中的(")被看作是常规的字符,而两个双引号作为双引号的转义表示。下面这个简单的例子演示了常见的文字常量表示: let message = "Hello World"r"n!" // 常规字符串let dir = @"C:"FS"FP" // 逐字字符串let bytes = "bytes"B // byte 数组let xA = 0xFFy // sbyte, 16进制表示let xB = 0o777un // unsigned native-sized integer,8进制表示let print x = printfn "%A" xlet main = print message; print dir; print bytes; print xA; print xB; main Printf函数通过F#的反射机制和.NET的ToString方法来解析“%A”模式,适用于任何类型的值,也可以通过F#中的print_any和print_to_string函数来完成类似的功能。值和函数(Values and Functions) 在F#中函数也是值,F#处理它们的语法也是类似的。 let n = 10let add a b = a + blet addFour = add 4let result = addFour n printfn "result = %i" result 可以看到定义值n和函数add的语法很类似,只不过add还有两个参数。对于add来说a + b的值自动作为其返回值,也就是说在F#中我们不需要显式地为函数定义返回值。对于函数addFour来说,它定义在add的基础上,它只向add传递了一个参数,这样对于不同的参数addFour将返回不同的值。考虑数学中的函数概念,F(x, y) = x + y,G(y) = F(4, y),实际上G(y) = 4 + y,G也是一个函数,它接收一个参数,这个地方是不是很类似?这种只向函数传递部分参数的特性称为函数的柯里化(curried function)。 当然对某些函数来说,传递部分参数是无意义的,此时需要强制提供所有参数,可是将参数括起来,将它们转换为元组(tuple)。下面的例子将不能编译通过: let sub(a, b) = a - blet subFour = sub 4 必须为sub提供两个参数,如sub(4, 5),这样就很像C#中的方法调用了。 对于这两种方式来说,前者具有更高的灵活性,一般可优先考虑。 如果函数的计算过程中需要定义一些中间值,我们应当将这些行进行缩进: let halfWay a b = let dif = b - a let mid = dif / 2 mid + a 需要注意的是,缩进时要用空格而不是Tab,如果你不想每次都按几次空格键,可以在VS中设置,将Tab字符自动转换为空格;虽然缩进的字符数没有限制,但一般建议用4个空格。而且此时一定要用在文件开头添加#light指令。作用域(Scope)作用域是编程语言中的一个重要的概念,它表示在何处可以访问(使用)一个标识符或类型。所有标识符,不管是函数还是值,其作用域都从其声明处开始,结束自其所处的代码块。对于一个处于最顶层的标识符而言,一旦为其赋值,它的值就不能修改或重定义了。标识符在定义之后才能使用,这意味着在定义过程中不能使用自身的值。 let defineMessage = let message = "Help me" print_endline message // error 对于在函数内部定义的标识符,一般而言,它们的作用域会到函数的结束处。 但可使用let关键字重定义它们,有时这会很有用,对于某些函数来说,计算过程涉及多个中间值,因为值是不可修改的,所以我们就需要定义多个标识符,这就要求我们去维护这些标识符的名称,其实是没必要的,这时可以使用重定义标识符。但这并不同于可以修改标识符的值。你甚至可以修改标识符的类型,但F#仍能确保类型安全。所谓类型安全,其基本意义是F#会避免对值的错误操作,比如我们不能像对待字符串那样对待整数。这个跟C#也是类似的。 let changeType = let x = 1 let x = "change me" let x = x + 1 print_string x 在本例的函数中,第一行和第二行都没问题,第三行就有问题了,在重定义x的时候,赋给它的值是x + 1,而x是字符串,与1相加在F#中是非法的。 另外,如果在嵌套函数中重定义标识符就更有趣了。 let printMessages = let message = "fun value" printfn "%s" message; let innerFun = let message = "inner fun value" printfn "%s" message innerFun printfn "%s" message printMessages 打印结果: fun value inner fun valuefun value 最后一次不是inner fun value,因为在innerFun仅仅将值重新绑定而不是赋值,其有效范围仅仅在innerFun内部。递归(Recursion)递归是编程中的一个极为重要的概念,它表示函数通过自身进行定义,亦即在定义处调用自身。在FP中常用于表达命令式编程的循环。很多人认为使用递归表示的算法要比循环更易理解。 使用rec关键字进行递归函数的定义。看下面的计算阶乘的函数: let rec factorial x = match x with | x when x < 0 -> failwith "value must be greater than or equal to 0" | 0 -> 1 | x -> x * factorial(x - 1) 这里使用了模式匹配(F#的一个很棒的特性),其C#版本为: public static long Factorial(int n) { if (n < 0) { throw new ArgumentOutOfRangeException("value must be greater than or equal to 0"); } if (n == 0) { return 1; } return n * Factorial (n - 1); } 递归在解决阶乘、Fibonacci数列这样的问题时尤为适合。但使用的时候要当心,可能会写出不能终止的递归。匿名函数(Anonymous Function) 定义函数的时候F#提供了第二种方式:使用关键字fun。有时我们没必要给函数起名,这种函数就是所谓的匿名函数,有时称为lambda函数,这也是C#3.0的一个新特性。比如有的函数仅仅作为一个参数传给另一个函数,通常就不需要起名。在后面的“列表”一节中你会看到这样的例子。除了fun,我们还可以使用function关键字定义匿名函数,它们的区别在于后者可以使用模式匹配(本文后面将做介绍)特性。看下面的例子: let x = (fun x y -> x + y) 1 2let x1 = (function x -> function y -> x + y) 1 2let x2 = (function (x, y) -> x + y) (1, 2) 我们可优先考虑fun,因为它更为紧凑,在F#类库中你能看到很多这样的例子。 注意:本文中的代码均在F# 1.9.4.17版本下编写,在F# CTP 1.9.6.0版本下可能不能通过编译。 F#系列随笔索引页面
-
未曾有因缘经-尔时波斯匿王。国大夫人。出入行来。常使四人。名扇提罗(扇提罗者汉言石女无男女根故名石女)。最大筋力。令此四人。担皇后舆。皇后所乘。七宝辇舆。留在祇洹精舍门外。敕诸黄门。令守护之。黄门转令四扇提罗。守夫人舆。其身自往佛边听法。扇提罗等。各于舆下。睡眠不识。时有凶人。偷取夫人珍宝辇舆一摩尼珠。尔时黄门。暂出看舆。不见宝珠。心中惶怖。惧夫人责。问石女言。使汝守舆。何故偷珠各各答言。实不偷也。黄门大怒。鞭打石女。苦痛彻骨。时有一石女。自审不偷横受楚毒。奔走逃突入精舍中。称怨大唤众皆闻之莫知所由。 波斯匿王和皇后出宫的时候经常用四名力气很大的石女抬轿。皇后所乘的轿子有七宝装饰。这一次被留在世尊精舍的门外,让太监看守。太监就转命四名石女守着轿子,自己跟随听佛讲法。这四名石女睡着了,有人偷了轿于上的一颗摩尼宝珠,她们也不失道。这时太监不放心,出来察看。发现轿子上的宝珠没有了,心中十分害怕皇后斥责,便问石女说:让你们看护轿于,你们怎么监守自盗偷宝珠呢?这些石女都说:不是她们偷的。太监发了脾气,用鞭子抽打石女,痛彻骨隋。其中有一名石女觉得自己没有偷窃宝珠而被鞭打,便逃入世尊讲法精舍,大声喊冤。大家听了都不知道发生了什么事情。 佛语阿难。汝可出往彼黄门所。无令横鞭无过之人。何以故。此四石女者。乃是皇后前世之师。自无过罪。何以横鞭。自造后世恶业因缘。是时皇后。闻佛此语。即起恭敬。合掌白佛。如世尊说。四担舆石女。乃是皇后前世时师。迷意不解。惟愿世尊。说其因缘。令诸会众普得闻知。佛告皇后。唤石女来。于世尊前。验其虚实。皇后奉命。即遣黄门。摄之将来。时四石女。见佛叩头啼哭。长跪合掌。白世尊曰。实不偷珠。有何因缘。横罗此罪。鞭打楚痛。身体破坏。世尊告言。罪业因缘。自身所造。非父母为。非从天堕。人行善恶。受苦乐报。如响应声。贪现前利。心行邪谄。不知后世累劫受殃。夫恶从心生。反以自贼。如铁生垢。消毁其形。王叉手白佛。前后说法。皆有因缘。令四石女。先世本业有何因缘愿佛为说。开悟盲冥多所利益。众人蒙祐。 佛对阿难说:你去到太监那里让他不要鞭打没有过错的人,这四名石女是皇后前生的老师,没有犯什么错,为什么要鞭打她们呢?这会造作后世的恶业因缘。皇后听到佛说这话,于是恭敬起立,合掌问佛:世尊所说这四名抬轿石女是我前世的老师,我十分迷惑,请您说说其中因缘由来,让大家都能明了知晓。佛告诉皇后:你召唤石女进来,在我面前可以验证虚实。皇后就命令太监把四名石女传来。四名石女见佛后,叩头啼哭,顶礼世尊说:实在不是我们偷了宝珠,因为什么缘故而遭此痛苦,鞭打加身呢?世尊说道:罪业的因缘是自己所造,并不是父母所为,更不是从天而降。人们造作善恶之事,就会有苦乐报应,就如同喊话回声一样如影随形。为了贪得现前的利益而做奸邪欺骗的事情,却不知后世多生多劫会遭受苦报。恶从心生,却是自己的敌人,如同铁器生锈,腐蚀其形。波斯匿王向佛致礼问道:世间的事情都有前后因缘,这四名石女前生有什么因缘请佛说一说,开导我们这些无知之人,利益大众。 佛告王曰。欲闻者善。着心谛听。吾今说之。佛复惟曰。今我法中。有诸比丘。言行不同。心口相违。或为利养钱财饮食。或为名誉要集眷属。或有厌恶。王法役使出家为道。都无有心向三脱门。度三有苦。以不净心。贪受信施。不知后世。弥劫受殃。偿其宿债。为是等故。岂得不说。