使用命令行启动VirtualBox虚拟机

转自:使用命令行启动VirtualBox虚拟机

装上VirtualBox就琢磨着如何让它开机自动启动,又或者能够通过命令行的形式直接启动指定的虚拟机。看了下VirtualBox的官方文档,发现有一个命令可以满足我的需求,即VBoxManage。VBoxManage提供了一系列的虚拟机管理命令,包括创建/删除/启动/修改等等,这里不一一列举。有点像Xen的XM命令。不过这里只关心启动虚拟机的命令:VBoxManage startvm。VBoxManage的完整命令列表可以参考这里。

VBoxManage startvm子命令可以开启一台状态为关闭或者保存的虚拟机。该命令的语法为:

VBoxManage startvm uuid>|name... [--type gui|sdl|headless]

可以通过虚拟机的uuid或者name来指定某台虚拟机,可以通过另外一个子命令list列出系统已有的虚拟机:

$ VBoxManage list vms
"XP" {8842d793-228c-458e-a880-8051193fd2db}

我系统上已经安装了一台名为XP的虚拟机,后面括号内部的是它的UUID。

VBoxManage startvm子命令可以通过–type参数指定启动的方式,其中gui就是图形化界面,这和我们平时启动的方式一样。sdl也是图形化界面,但是少掉了部分功能,比如没有菜单等,一般用于调试过程。最后headless是在后台运行,并且默认开启vrdp服务,可以通过远程桌面工具来访问。关于这三种启动方式的介绍可以看手册中的这一篇。所以一般我们使用gui或者headless类型启动。

使用gui类型启动虚拟机:

$ VBoxManage startvm XP --type gui

执行结束后,就会启动指定的虚拟机,几乎和平时没什么区别。

使用headless类型启动虚拟机:

$ VBoxManage startvm "XP" --type headless
或者
$ VBoxHeadless --startvm "XP"

结果返回:

$ rdesktop -a 16 -N -g 1280x800 127.0.0.1:3389
Autoselected keyboard map en-us
ERROR: connect: Connection refused

翻了下手册,结果发现要获得VRDP的支持还需要安装额外的扩展包,详细说明可以参考这里。从VirtualBox的下载页面选择相应的版本下载扩展包。下载完成后,双击即可以完成安装,或者在菜单中File-Preference-Extensions可以安装和查看已安装的扩展包。

安装好再次执行上面的远程命令,这下可以看见虚拟机界面了吧。可以通过ctrl+alt+enter切换全屏。不过我这里用rdesktop全屏后,屏幕就黑了,只有点过的地方才会恢复。不知道是什么原因,我就干脆用TigerVNC了,同时在启动headless的时候加上-n参数:

{$ VBoxHeadless -n -s winxp (VBoxHeadless -s winxp --vnc --vncport 5900 --vncpass password)}

通过以下命令远程连接: $ vncviewer localhost:5900

按下F8会出现一个菜单,里面可以切换全屏。

一切相关的命令:

$ VBoxManage list runningvms # 列出运行中的虚拟机
$ VBoxManage controlvm XP acpipowerbutton # 关闭虚拟机,等价于点击系统关闭按钮,正常关机
$ VBoxManage controlvm XP poweroff # 关闭虚拟机,等价于直接关闭电源,非正常关机
$ VBoxManage controlvm XP pause # 暂停虚拟机的运行
$ VBoxManage controlvm XP resume # 恢复暂停的虚拟机
$ VBoxManage controlvm XP savestate # 保存当前虚拟机的运行状态

Read More →

VirtualBox already exists in the media registry解决方案

想复制一个虚拟机镜像,再导入使用,出现了以下问题:

Cannot register the hard disk 'c.vdi' with UUID {xxxx} because a hard disk 'c.vdi' with UUID {xxx} already exists in the media registry ('C:/Documents and Settings/xxx/.VirtualBox/VirtualBox.xml').

解决方法是重设UUID,这个和VMware不同,方法如下:

D:\Program Files\PowerCmd>"D:\Program Files\Oracle\VirtualBox\VBoxManage.exe" internalcommands sethduuid "d:\xp.vdi"
UUID changed to: a290d94b-19b8-4cbf-9cda-00084c246d15

也可以直接使用clonehd直接得到UUID不同的两个镜像,方法类似,如VBoxManage clonehd "a.vdi' "b.vdi" 

搞定!

还有一个用于压缩VDI文件的命令:

VBoxManage modifyvdi "C:\xxx.vdi" compact

Read More →

嵌入式系统VxWorks介绍及编程

VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。在美国的 F-16、FA-18 战斗机、B-2 隐形轰炸机和爱国者导弹上,甚至连1997年4月在火星表面登陆的火星探测器上也使用到了VxWorks。 

实时操作系统和分时操作系统的区别

从操作系统能否满足实时性要求来区分,可把操作系统分成分时操作系统和实时操作系统。

分时操作系统按照相等的时间片调度进程轮流运行,分时操作系统由调度程序自动计算进程的优先级,而不是由用户控制进程的优先级。这样的系统无法实时响应外部异步事件。(jm注:windows并不是分时操作系统,网上说的不正确

实时操作系统能够在限定的时间内执行完所规定的功能,并能在限定的时间内对外部的异步事件作出响应。分时系统主要应用于科学计算和一般实时性要求不高的场合。实时性系统主要应用于过程控制、数据采集、通信、多媒体信息处理等对时间敏感的场合。

VxWorks的特点

  • 可靠性

操作系统的用户希望在一个工作稳定,可以信赖的环境中工作,所以操作系统的可靠性是用户首先要考虑的问题。而稳定、可靠一直是VxWorks的一个突出优点。自从对中国的销售解禁以来,VxWorks以其良好的可靠性在中国赢得了越来越多的用户。

  • 实时性

实时性是指能够在限定时间内执行完规定的功能并对外部的异步事件作出响应的能力。实时性的强弱是以完成规定功能和作出响应时间的长短来衡量的。

VxWorks 的实时性做得非常好,其系统本身的开销很小,进程调度、进程间通信、中断处理等系统公用程序精练而有效,它们造成的延迟很短。VxWorks 提供的多任务机制中对任务的控制采用了优先级抢占(Preemptive Priority Scheduling)和轮转调度(Round-Robin Scheduling)机制,也充分保证了可靠的实时性,使同样的硬件配置能满足更强的实时性要求,为应用的开发留下更大的余地。

  • 可裁减性

用户在使用操作系统时,并不是操作系统中的每一个部件都要用到。例如图形显示、文件系统以及一些设备驱动在某些嵌入系统中往往并不使用。

VxWorks 由一个体积很小的内核及一些可以根据需要进行定制的系统模块组成。VxWorks 内核最小为 8kB,即便加上其它必要模块,所占用的空间也很小,且不失其实时、多任务的系统特征。由于它的高度灵活性,用户可以很容易地对这一操作系统进行定制或作适当开发,来满足自己的实际应用需要。

对一个实时内核的要求

一个实时操作系统内核需满足许多特定的实时环境所提出的基本要求,这些包括:

多任务:由于真实世界的事件的异步性,能够运行许多并发进程或任务是很重要的。多任务提供了一个较好的对真实世界的匹配,因为它允许对应于许多外部事件的多线程执行。系统内核分配CPU给这些任务来获得并发性。

抢占调度:真实世界的事件具有继承的优先级,在分配CPU的时候要注意到这些优先级。基于优先级的抢占调度,任务都被指定了优先级,在能够执行的任务(没有被挂起或正在等待资源)中,优先级最高的任务被分配CPU资源。换句话说,当一个高优先级的任务变为可执行态,它会立即抢占当前正在运行的较低优先级的任务。

任务间的通讯与同步:在一个实时系统中,可能有许多任务作为一个应用的一部分执行。系统必须提供这些任务间的快速且功能强大的通信机制。内核也要提供为了有效地共享不可抢占的资源或临界区所需的同步机制。

任务与中断之间的通信:尽管真实世界的事件通常作为中断方式到来,但为了提供有效的排队、优先化和减少中断延时,我们通常希望在任务级处理相应的工作。所以需要在任务级和中断级之间存在通信。 

 

Read More →

Android环境搭建笔记

参考:http://android.yaohuiji.com/archives/5

JDK和Eclipse去官网下载即可。

ADT(Android Development Tools)的安装:

ADT是Eclipse的插件,是用Eclipse进行Android开发的开发工具,它本身不是Android SDK。安装方法和同其他Eclipse插件的方法一样(Help-> Install New Software…)。ADT安装成功后eclipse工具栏中会出现小机器人图标。

这里说得比较粗,添加软件的源不是Eclipse自带的,源地址是:https://dl-ssl.google.com/android/eclipse/,具体参考这里:http://blog.chinaunix.net/uid-12845622-id-311979.html

 

Read More →

The keywords of JAVA

Java具有一组内置的关键字,这些关键字绝对不能用来做为标识符。Java  SE6里一共有50个关键字(keywords):

abstract, continue, for, new, switch assert, default, goto, package, synchronized boolean, do, if, private, this break, double, implements, protected, throw byte, else, import, public, throws case, enum, instanceof, return, transient catch, extentds, int, short, try char, final, interface, static, void class, finally, long, strictfp, volatile const, float, native, super, while

这些单词有共同的特点是:全是小写的,不能用作标识符。(如果非要用做标识符呢,会有什么事情发生?自己去试试看)。其中 instanceof 是 instance of 的连写 ,strictfp 是 strict float point 的连写

有三个看起来像是关键字,其实不是关键的东东,他们是字面值(literal)。

  • true 布尔字面值
  • false 布尔字面值
  • null 空值字面值

Read More →

C语言中的main函数参数及返回值

开发中遇到了需要传参数给main函数的问题,不常用,也就不记得了,特意查了一下,参考这里

一个简单的C语言例子,如下(例子来源于参考网站):

int main(int argc, char *argv[])
{
   int i;
   for (i = 1; i < argc; i++)
       printf("%s%s", argv[i], (i < argc-1) ? " " : "");
   printf("\n");
   return 0;
}

程序编译后,添加参加如:c:\demo.exe hello,world

程序就会运行出来结果:

hello,world

C语言约定:argv[0]的值是启动该程序的程序名,因此argc的值至少为1,如果argc的值是1,说明程序名后面没有命令行参数。

Read More →

BAT脚本获取批处理文件所在路径

参考:http://www.cnblogs.com/lm002003/archive/2012/05/15/2502365.html

BAT命令经常使用,有必要记住几个常命令,命令大全参考:http://blog.csdn.net/annhf/article/details/1842362

这里是MARK一个获取路径的小知识,开发时遇到一个小问题,获取可执行文件的当前路径,这样文件不论转移到哪儿,都可以运行,“write once, run anywhere!”的精髓啊。

在批处理开头加入cd /d %~dp0就可实现当前目录切换,%0是批处理文件本身的路径,%~dp进行扩展, d向前扩展到驱动器,p往后扩展到路径。例如,你的bat文件在e:/mybat/test.bat,则%0就是e:/mybat/test.bat, %~dp0是e:/mybat/,例子来源参考网站。

更多有用的命令:

  • %~0: 取文件名(名+扩展名) 
  • %~f0:取全路径 
  • %~d0:取驱动器名 
  • %~p0:只取路径(不包驱动器) 
  • %~n0:只取文件名 
  • %~x0:只取文件扩展名 
  • %~s0:取缩写全路径名 
  • %~a0:取文件属性 
  • %~t0:取文件创建时间 
  • %~z0:取文件大小 

Read More →

关于 xxxx.exe 中的 0xxxxxxxx 处最可能的异常: 0xC0000005: 读取位置 0xxxxxxxx 时发生访问冲突

参考:http://www.cnblogs.com/lin1270/archive/2013/04/17/3025831.html

多线程调试直接崩溃,没有堆栈调用,很难查问题,只有一个错误提示框,类似于“关于 xxxx.exe 中的 0xxxxxxxx 处最可能的异常: 0xC0000005: 读取位置 0xxxxxxxx 时发生访问冲突”,参考上述站点,把堆栈调出来的方法,MARK:

工具栏上的【调试】->【异常】,把图上显示的【引发】勾上即可。

Read More →

数组名和数组名取地址的区别

一直困惑了很久的一个问题,今天终于解决了,参考:http://blog.csdn.net/daniel_ice/article/details/6857019

#include <stdio.h>

int a[2] = {1,2};
int main(){
        printf("a = %p\n", a); // I
        printf("&a = %p\n", &a); // II
        printf("a + 1 = %p\n", a + 1);// III
        printf("&a + 1 = %p\n", &a + 1);// IV

        return 0;
}
//结果如下(Windows):
//a = 01137034
//&a = 01137034
//a + 1 = 01137038
//&a + 1 = 0113703C

在C中, 在几乎所有使用数组的表达式中,数组名的值是个指针常量,也就是数组第一个元素的地址。 它的类型取决于数组元素的类型: 如果它们是int类型,那么数组名的类型就是“指向int的常量指针“。

看到这里我想应该就知道为什么 会有I 和 III式的结果了。

对于II 和 IV 则是特殊情况,在《C和指针》p142中说到,在以下两中场合下,数组名并不是用指针常量来表示,就是当数组名作为sizeof操作符和单目操作符&的操作数时。 sizeof返回整个数组的长度,而不是指向数组的指针的长度。 取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量的指针。

所以&a后返回的指针便是指向数组的指针,跟a(一个指向a[0]的指针)在指针的类型上是有区别的。

Read More →

字符串常量到底存放在哪个存储区

参见搜索做的总结,原文地址如下:http://blog.csdn.net/daiyutage/article/details/8605580

一直有一个疑惑,字符串常量放在哪个存储区呢?比如:

char *pstr = "hello world!";

这里,"hello world!"是一个字符串常量,pstr是在栈中的变量,字符串常量(hello world!),如何存储?举个例子,比较清晰。

//main.cpp
int a = 0; //全局初始化区
char *p1; //全局未初始化区
main()
{
    int b; //栈
    char s[] = "abc"; //栈
    char *p2; //栈
    char *p3 = "123456"; //123456\0在常量区,p3在栈上。
    static int c = 0; //全局(静态)初始化区
    p1 = (char *)malloc(10);
    p2 = (char *)malloc(20);
    //分配得来得10和20字节的区域就在堆区。
    strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}

上面例子说得比较全了,之前还以为char s[] = "abc"; 这里的abc也是在常量区,too young, too simple啊。

下面总结的一些常识,很形象,很生动,MARK一下。

Read More →
在线学习答案查询入口
微信扫码联系
微信扫码联系