摘要:
阅读全文
posted @
2017-09-04 16:33 David1228 阅读(294) |
评论 (0) |
编辑 收藏
摘要:
阅读全文
posted @
2017-08-02 11:41 David1228 阅读(309) |
评论 (0) |
编辑 收藏
摘要:
阅读全文
posted @
2017-07-24 19:10 David1228 阅读(11369) |
评论 (0) |
编辑 收藏
摘要:
阅读全文
posted @
2017-07-19 18:10 David1228 阅读(3408) |
评论 (0) |
编辑 收藏
摘要:
阅读全文
posted @
2017-06-06 23:10 David1228 阅读(284) |
评论 (0) |
编辑 收藏
posted @
2017-06-06 23:09 David1228 阅读(238) |
评论 (0) |
编辑 收藏
摘要:
阅读全文
posted @
2017-05-30 19:26 David1228 阅读(3267) |
评论 (0) |
编辑 收藏
摘要:
阅读全文
posted @
2017-05-30 19:25 David1228 阅读(1244) |
评论 (0) |
编辑 收藏
摘要:
阅读全文
posted @
2016-12-22 23:01 David1228 阅读(4595) |
评论 (2) |
编辑 收藏
摘要:
阅读全文
posted @
2016-11-04 23:44 David1228 阅读(2283) |
评论 (0) |
编辑 收藏
摘要:
阅读全文
posted @
2016-07-28 17:57 David1228 阅读(393) |
评论 (0) |
编辑 收藏
摘要: JVM调优总结 + jstat 分析jstat -gccause pid 1 每格1毫秒输出结果jstat -gccause pid 2000 每格2秒输出结果不断的在屏幕打印出结果 S0 S1 E &n...
阅读全文
posted @
2016-01-03 23:26 David1228 阅读(2981) |
评论 (2) |
编辑 收藏
摘要:
阅读全文
posted @
2015-12-27 16:49 David1228 阅读(1081) |
评论 (0) |
编辑 收藏
摘要:
阅读全文
posted @
2015-10-31 12:37 David1228 阅读(660) |
评论 (0) |
编辑 收藏
摘要:
阅读全文
posted @
2015-10-30 20:20 David1228 阅读(2872) |
评论 (0) |
编辑 收藏
转载文章:
http://www.qixing318.com/article/by-lua-adhesive-nginx-ecological-environment.html
posted @
2015-09-08 13:22 David1228 阅读(506) |
评论 (0) |
编辑 收藏
摘要:
阅读全文
posted @
2015-09-08 09:34 David1228|
编辑 收藏
摘要:
阅读全文
posted @
2015-07-29 13:48 David1228 阅读(5544) |
评论 (0) |
编辑 收藏
摘要:
阅读全文
posted @
2014-12-03 23:56 David1228 阅读(28316) |
评论 (0) |
编辑 收藏
摘要:
阅读全文
posted @
2013-11-19 11:48 David1228 阅读(23718) |
评论 (1) |
编辑 收藏
摘要:
阅读全文
posted @
2013-11-18 18:01 David1228 阅读(2891) |
评论 (4) |
编辑 收藏
摘要:
阅读全文
posted @
2013-10-31 17:32 David1228 阅读(695) |
评论 (0) |
编辑 收藏
摘要:
阅读全文
posted @
2013-10-14 09:50 David1228 阅读(21735) |
评论 (6) |
编辑 收藏
Hibernate不支持left join带on的条件查询。
解决办法:使用原生SQL或者使用HQL方式需要修改hbm文件(如果项目中大部分不适用级联配置情况下)
需求是查询网络信息,网络信息中关联了分区、网络IP(1个网络--N个网络IP),网桥信息.
HQL:
public void queryVnets(Page page) {
StringBuffer hql = new StringBuffer();
hql.append("select new Map(vn.id as id, vn.vnName as vnName, b.name as vnType, ");
hql.append("vn.vnIptype as vnIptype, vn.vnIp as vnIp,vn.vnNat as vnNat, vn.vnFlag as vnFlag, ");
hql.append("vn.vnetFlag as vnetFlag, (case when sum(vmvn.state)='0' then 0 else 1 end) as vnState, ");
hql.append("vn.useType as useType, vn.createTime as createTime, ");
hql .append("zone.oneName as oneName, zone.oneHypervisor as oneHypervisor, zone.oneSeq as oneSeq) ");
hql.append("from VnetTable vn, ZoneTable zone, BridgeTable b ");
hql.append("left join fetch vn.VnTables vmvn where zone.id = vn.zoneId and vn.vnType = b.id ");
... ...
hql.append(" group by vn.id");
if (vnState != null && !"".equals(vnState)) {
if ("0".equals(vnState)) {
hql.append(" having sum(vmvn.state)=0");
} else if ("1".equals(vnState)) {
hql.append(" having sum(vmvn.state)!=0");
}
}
}
hbm配置文件:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.base.mapping.VnetTable" table="vnet_table" >
<id name="id" type="java.lang.String">
<column name="ID" length="32" />
<generator class="uuid.hex" />
</id>
<property name="vnId" type="java.lang.Long">
<column name="VN_ID">
<comment>创建虚拟网络时得到的ID</comment>
</column>
</property>
...
<property name="zoneId" type="java.lang.String">
<column name="ZONE_ID" length="32">
<comment>分区ID</comment>
</column>
</property>
<property name="vlanId" type="java.lang.Integer">
<column name="VLAN_ID">
<comment>VLAN_ID</comment>
</column>
</property>
<set name="vnTables" lazy="false" order-by="id asc" inverse="false" fetch="join" cascade="all">
<key column="VN_NID"/>
<one-to-many class="com.base.mapping.VnTable"/>
</set>
</class>
</hibernate-mapping>
理解inverse和cascade,可以参考:http://blog.csdn.net/wkcgy/article/details/6271321
总结: <one-to-many>中,建议inverse=”true”,由“many”方来进行关联关系的维护 <many-to-many>中,只设置其中一方inverse=”false”,或双方都不设置 Cascade,通常情况下都不会使用。特别是删除,一定要慎重。操作建议
一般对many-to-one和many-to-many不设置级联,这要看业务逻辑的需要;对one-to-one和one-to-many设置级联。 many-to-many关联关系中,一端设置inverse=”false”,另一端设置为inverse=”true”。在one-to-many关联关系中,设置inverse=”true”,由多端来维护关系表
posted @
2013-09-12 11:57 David1228 阅读(16662) |
评论 (2) |
编辑 收藏
-- 以下两个查询效率相当,查询时间均为0.0xx秒,~ 但是Hibernate HQL不支持from后面接子查询,可以直接使用SQL方式解决,ibatis当然可以用了。
SELECT count(*) from (
SELECT sum(t2.STATE) as vnSum, t1.ID FROM
vnetinfo_table t1, vm_vn_table t2
where t1.ID = t2.VN_NID and t1.ZONE_ID = '4028a49c3facdf26013fae12531b286e' GROUP BY t1.ID) t where t.vnSum = 0;
SELECT count(*) FROM vnetinfo_table v ,(
SELECT sum(t2.STATE) as vnSum, t1.ID as idd FROM
vnetinfo_table t1, vm_vn_table t2
where t1.ID = t2.VN_NID and t1.ZONE_ID = '4028a49c3facdf26013fae12531b286e' GROUP BY t1.ID) t
where v.ID = t.idd and t.vnSum = 0;
-- 查询效率太低了,查询时间均为0.5xx秒左右。要比以上两个SQL耗时很多倍。~ Hibernate支持在where后用子查询作为查询条件。
SELECT count(*) FROM vnetinfo_table v WHERE v.id in
(SELECT CASE WHEN SUM(t2.STATE)=0 THEN t1.ID ELSE '' END
FROM vnetinfo_table t1, vm_vn_table t2
where t1.ID = t2.VN_NID and t1.ZONE_ID = '4028a49c3facdf26013fae12531b286e' GROUP BY t1.ID);
-- 使用join方式替换in 查询时间均为0.09x秒左右。明显提高了效率,但是Hibernate HQL任然不支持在这种联合子查询方式。
SELECT count(*) FROM vnetinfo_table v INNER JOIN (SELECT CASE WHEN SUM(t2.STATE)=0 THEN t1.ID ELSE '' END as idd
FROM vnetinfo_table t1, vm_vn_table t2
WHERE t1.ID = t2.VN_NID and t1.ZONE_ID = '4028a49c3facdf26013fae12531b286e' GROUP BY t1.ID) t ON v.ID = t.idd and t.idd IS not NULL;
附:Mysql中关于Exists用法的介绍请参见:http://www.nowamagic.net/librarys/veda/detail/639
posted @
2013-08-21 13:47 David1228 阅读(3751) |
评论 (2) |
编辑 收藏
md5sum命令详解:linux下的shell命令 ,制作md5码 也用于软件的md5校验
MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改。MD5 全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意长度的信息逐位进行计算,产生一个二进制长度为128位(十六进制长度就是32位)的“指纹”(或称“报文摘要”),不同的文件产生相同的报文摘要的可能性是非常非常之小的。
在linux或Unix上,md5sum是用来计算和校验文件报文摘要的工具程序。一般来说,安装了Linux后,就会有md5sum这个工具,直接在命令行终端直接运行。
1、使用md5sum来产生指纹(报文摘要)命令如下:
md5sum filename > filename.md5 或者
md5sum filename >>filename.md5
也可以把多个文件的报文摘要输出到一个md5文件中,这要使用通配符*,比如某目录下有几个iso文件,要把这几个iso文件的摘要输出到iso.md5文件中,命令如下:
md5sum *.iso > iso.md5
2、使用md5报文摘要验证文件,方法有二:
把下载的文件file和该文件的file.md5报文摘要文件放在同一个目录下,然后用如下命令进行验证:
md5sum -c file.md5
然后如果验证成功,则会输出:正确结果。实战案例:
需求:虚拟机存在多份备份,当进行备份恢复时,要求检查源备份压缩文件的完整性。那么可以通过md5这种方式来验证。压缩备份文件并生成md5码,部分shell脚本如下:#----------------------------------
log "Compressing and moving $SRC_PATH"
exec_and_log "$SSH $SRC_HOST mkdir -p ${SRC_PATH}_compress"
for file in `$SSH $SRC_HOST ls $SRC_PATH | grep -v $SN_SIGN`
do
exec_and_log "$SSH $SRC_HOST cd $SRC_PATH;sudo chmod -R +r $SRC_PATH/*;tar -Sczvf ${SRC_PATH}_compress/${file}.tgz ${file}"
done
#----------------------------------
#--------------md5 begin-----------------
log "Create backup.md5"
exec_and_log "$SSH $SRC_HOST $MD5SUM ${SRC_PATH}_compress/*.tgz > ${SRC_PATH}_compress/backup.md5"
#--------------md5 end-----------------
#其中 exec_and_log是另一个公共脚本中定义的。shell中可以通过点(.)的方式将脚本引入。该函数内如下:
# Executes a command, if it fails returns error message and exits
# If a second parameter is present it is used as the error message when
# the command fails
function exec_and_log
{
message=$2
EXEC_LOG_ERR=`$1 2>&1 1>/dev/null`
EXEC_LOG_RC=$?
if [ $EXEC_LOG_RC -ne 0 ]; then
log_error "Command \"$1\" failed: $EXEC_LOG_ERR"
if [ -n "$2" ]; then
error_message "$2"
else
error_message "Error executing $1: $EXEC_LOG_ERR"
fi
exit $EXEC_LOG_RC
fi
}
# Logs a message, alias to log_info
function log
{
log_info "$1"
}
# Log function that knows how to deal with severities and adds the
# script name
function log_function
{
echo "$1: $SCRIPT_NAME: $2" 1>&2
}
# Logs an info message
function log_info
{
log_function "INFO" "$1"
}
# Logs an error message
function log_error
{
log_function "ERROR" "$1"
}
# This function is used to pass error message to the mad
function error_message
{
(
echo "ERROR MESSAGE --8<------"
echo "$1"
echo "ERROR MESSAGE ------>8--"
) 1>&2
}
生成的backup.md5内容:$ md5sum *.tgz > backup.md5
2c07174d451a687bc0e401b1dc7d84b8 checkpoint.1376892493.tgz
57a18d7f6eed36565b9012e519985130 checkpoint.1376903188.tgz
b652990806e58a81b41dc1b23db9adda checkpoint.1376904023.tgz
f4e7adb46a8fde2643e082875cc60e21 checkpoint.1376904289.tgz
ad2a59902652e2896b35507417b7016f checkpoint.tgz
4bd43eac64f238bb35c7194816da7d23 deployment.0.tgz
ee3d9266cf92f7540cc75a94343bc20a deployment.7.tgz
fcd5aae37354b5cb66f4b90544eaa5c3 disk.0.tgz
c1ef6d911b441660ec2d1e44b5a56f66 disk.1.iso.tgz
25eae70a31a7c7cff3baade4cd65fe82 disk.1.tgz
检查备份文件是否完整:exec_and_log "$SSH $SRC_HOST $MD5SUM -c ${SRC_PATH}/backup.md5"
检测结果:$ md5sum -c backup.md5
checkpoint.1376892493.tgz: OK
checkpoint.1376903188.tgz: OK
checkpoint.1376904023.tgz: OK
checkpoint.1376904289.tgz: OK
checkpoint.tgz: OK
deployment.0.tgz: OK
deployment.7.tgz: OK
disk.0.tgz: OK
disk.1.iso.tgz: OK
disk.1.tgz: OK
posted @
2013-08-20 11:34 David1228 阅读(2432) |
评论 (0) |
编辑 收藏
摘要:
阅读全文
posted @
2013-08-20 09:46 David1228 阅读(387) |
评论 (0) |
编辑 收藏
摘要:
阅读全文
posted @
2013-08-20 09:44 David1228 阅读(387) |
评论 (0) |
编辑 收藏
摘要:
阅读全文
posted @
2013-07-24 16:11 David1228 阅读(33392) |
评论 (0) |
编辑 收藏
摘要: 根据官方的说法,在ibatis3,也就是Mybatis3问世之前,Spring3的开发工作就已经完成了,所以Spring3中还是没有对Mybatis3的支持。因此由Mybatis社区自己开发了一个Mybatis-Spring用来满足Mybatis用户整合Spring的需求。下面就将通过Mybatis-Spring来整合Mybatis跟Spring的用法做一个简单的介绍。MapperFactoryB...
阅读全文
posted @
2013-07-10 18:07 David1228 阅读(21409) |
评论 (2) |
编辑 收藏
不得不承认的是,在目前的web应用开发中,Spring的应用越来越广泛,其地位变得相当重要。而在最近推出的Spring 3.2版本中,又引入了一些新的值得关注的特性。本文中将介绍其中一些值得关注的新特性。
一 不再需要web.xml
在新的Spring 3.2中,可以不再需要web.xml这个文件了,这得益于Servlet 3.0的新特性。
其中,可以使用@WebServlet在需要调用的servlet中,使用注解去设置servlet中的映射关系。这样的话,就可以不再象以往那样要通过在web.xml中对servlet进行配置,十分方便。
此外,Servlet 3.0提供了既能在容器中动态注册servlet的方法,也提供了通过实现
ServletContainerInitializer接口的方法实现在容器启动阶段为容器动态注册Servlet、Filter和listeners。容器会在应用的启动阶段,调用所有实现ServletContainerInitializer接口类中的onStartup()方法。而Spring 3.2中,则进一步简化了这点,只需要实现WebApplicationInitializer接口就可以了,其中提供了一个相关的实现类--AbstractContextLoaderInitializer,它可以动态注册DispatcherServlet。这意味着,只要spring-webmvc.jar放置在web应用的web-inf/lib中,就可以调用Dispatcher servlet了。可以参考如下的例子(来自Spring文档):
- public class MyWebApplicationInitializer implements WebApplicationInitializer {
-
- @Override
- public void onStartup(ServletContext container) {
- ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet());
- registration.setLoadOnStartup(1);
- registration.addMapping("/example/*");
- }
-
- }
二 支持Java编程式配置在Spring mvc 3.2中,一个不错的特性就是在之前版本中支持使用Java代码配置各种依赖注入的基础上,进一步简化了配置。关于使用Java编程式配置的好处,可以通过下面这个链接文章的介绍去学习
(http://blog.frankel.ch/consider-replacing-spring-xml-configuration-with-javaconfig)。
在Spring mvc 3.2中,提供了AbstractContextLoaderInitialize的一个子类AbstractAnnotationConfigDispatcherServletInitializer
去实现零XML配置的效果,只需要创建的类继承AbstractAnnotationConfigDispatcherServletInitializer
就可以了,如下代码所示:
- public
-
- class
-
- SugarSpringWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
-
- @Override
- protected Class<?>[] getRootConfigClasses() {
- return new Class[] { JavaConfig.class };
- }
-
- @Override
- protected Class<?>[] getServletConfigClasses() {
- return new Class[] { WebConfig.class };
- }
-
- @Override
- protected String[] getServletMappings() {
- return new String[] { "/" };
- }
-
- }
三功能更强大的
Spring Test
框架
现在,单元测试显得越来越重要了,每一个类都建议做好对应的单元测试。在
Spring 3.2
版本之前,如果要对
Spring MVC
进行单元测试的话,必须显式去调用某个控制器类中的某个方法,而不能直接单元测试相关的
mapping
映射。而在
Spring mvc 3.2
中,重新整合和增强了测试框架的功能,支持直接用
/*
这样的映射方式去测试某个控制器中的类。同时,之前的开源项目(
https://github.com/SpringSource/spring-test-mvc)也被收录到Spring mvc 3.2中去了
。此外,还新增加了对返回
(return)
,重定向
(redirect)
和
model
等的测试改进,下面是一个例子:
- public class SayHelloControllerIT extends AbstractTestNGSpringContextTests {
-
- private MockMvc mockMvc;
-
- @BeforeMethod
- public void setUp() {
-
- mockMvc = webAppContextSetup((WebApplicationContext) applicationContext).build();
- }
-
- @Test(dataProvider = "pathParameterAndExpectedModelValue")
- public void accessingSayhelloWithSubpathShouldForwardToSayHelloJspWithModelFilled(String path, String value) throws Exception {
-
- mockMvc.perform(get("/sayHello/Jo")).andExpect(view().name("sayHello")).andExpect(model().attribute("name", "Jo"));
- }
- }
本文的示例代码可以在:
http://blog.frankel.ch/wp-content/resources/spring-3-2-sweetness/spring-sweet-1.0.0.zip中下载。
原文链接:http://java.dzone.com/articles/spring-32-sweetness
posted @
2013-07-10 11:48 David1228 阅读(2337) |
评论 (0) |
编辑 收藏
摘要: 本文转载自:http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html场景问题 举个生活中常见的例子——组装电脑,我们在组装电脑的时候,通常需要选择一系列的配件,比如CPU、硬盘、内存、主板、电源、机箱等。为讨论使用简单点,只考虑选择CPU和主板的问题。 事实上,在选择CPU的时候,面临一系列的...
阅读全文
posted @
2013-07-04 17:07 David1228 阅读(392) |
评论 (0) |
编辑 收藏
shell中可能经常能看到:>/dev/null 2>&1 命令的结果可以通过%>的形式来定义输出分解这个组合:“>/dev/null 2>&1” 为五部分。1:> 代表重定向到哪里,例如:echo "123" > /home/123.txt2:/dev/null 代表空设备文件3:2> 表示stderr标准错误4:& 表示等同于的意思,2>&1,表示2的输出重定向等同于15:1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于 "1>/dev/null"因此,>/dev/null 2>&1 也可以写成“1> /dev/null 2> &1”那么本文标题的语句执行过程为:1>/dev/null :首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。2>&1 :接着,标准错误输出重定向 到 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。最常用的方式有: command > file 2>file 与command > file 2>&1它们有什么不同的地方吗? 首先command > file 2>file 的意思是将命令所产生的标准输出信息,和错误的输出信息送到file 中.command > file 2>file 这样的写法,stdout和stderr都直接送到file中, file会被打开两次,这样stdout和stderr会互相覆盖,这样写相当使用了FD1和FD2两个同时去抢占file 的管道。 而command >file 2>&1 这条命令就将stdout直接送向file, stderr 继承了FD1管道后,再被送往file,此时,file 只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stderr的内容。 从IO效率上,前一条命令的效率要比后面一条的命令效率要低,所以在编写shell脚本的时候,较多的时候我们会command > file 2>&1 这样的写法。 以上转载自:
http://sjolzy.cn/shell-in-the-dev-null-2-gt-amp-1-Detailed.html
------------------------------------------------------------------------------------------------------
那么,有这么个需求,我如何能判断远程主机上的某个文件是否存在呢,我能想到的有两种方法,一种方法可以使用expect脚本,但是需要远程主机上安装expect包,但是只需要知道用户名和密码就可以了;第二种方法是要求两台主机之间做好ssh互信,然后如admin,那么通过shell可以直接判断,但是文件宿主权限也需要是admin用户下的。
第二种方法脚本如下:
#!/bin/bash
ssh dst_host sh -s 2>&1 1>/dev/null <<EOF
ls $NEW_DST_DIR
EOF
IS_EXIST=$?
if [ "$IS_EXIST"x = "0"x ]; then
echo "-The file exists------------------------------"
else
echo "No file-------------------------------"
fi
--大卫
posted @
2013-07-02 14:45 David1228 阅读(947) |
评论 (0) |
编辑 收藏
OpenNebula中主机添加一切正常。
执行$onehost list 主机CPU、内存资源可以正常被监控到。但是,创建虚拟机后,虚拟机状态很长一段时间一直处于pend状态。而OpenNebula的mm_sched调度虚拟机的周期是缺省30秒调度一次,根据调度算法适配一台合适的主机,主机是新添加的而且是有足够资源的,为什么不能部署呢?
我们可以通过查看虚拟机的调度日志$ONE_LOCATION/var/sched.log发现如下错误信息:
Tue Feb 21 [HOST][E]: Exception raised: Unable to transport XML to server and get XML response back.
HTTP response: 504 Tue Feb 22 14:27:39 2011 [POOL][E]: Could not retrieve pool info from ONE。
解决方法:
在OpenNebula官方的Wiki中可以找到原因,原因是所添加的主机使用了HTTP代理上网了,所以OpenNebula读取了系统的http_proxy环境变量,此时就需要关闭http_proxy。
If the scheduler does not deploy the pending VMs, and messages like these are found in sched.log
[HOST][E]: Exception raised: Unable to transport XML to server and get XML response back. HTTP response code is 404, not 200 [POOL][E]: Could not retrieve pool info from ONE
Then you need to unset the http_proxy
environment variable, or set the no_proxy
accordingly.
wiki参考地址(这里汇总了使用或部署one过程中可能遇到的问题以及解决办法):
http://wiki.opennebula.org/faq#listing_vms_takes_a_lot_of_time_why
大家对于Opennebula的安装部署感兴趣的话,可以参考vpsee的博客(
在Centos上安装和部署Opennebula),讲解的很详细。
vpsee已经试玩了下
OpenNebula4.0,由于项目原因,目前我们还在用OpenNebula3.8.1,后面也会测试升级到OpenNebula4.0看看新功能。
升级过程同样也参考下vpsee的
OpenNebula3.x升级到OpenNebula4.0,^^ 这么好的资源优先借鉴。
posted @
2013-06-24 18:01 David1228 阅读(1066) |
评论 (0) |
编辑 收藏
启动和停止OpenNebula shell脚本如下:
给这个脚本起个名字吧,叫做oned
#!/bin/bash
#
# chkconfig: 345 80 15
# description: Startup script for the one .
# Source function library.
. /etc/rc.d/init.d/functions
APP_USER=oneadmin
APP_HOME=/opt/nebula/ONE/
RETVAL=0
start(){
checkrun
if [ $RETVAL -eq 1 ]; then
echo "Starting oned"
su - $APP_USER -c "$APP_HOME/bin/one start"
else
echo "oned is already running."
fi
}
stop(){
su - $APP_USER -c "$APP_HOME/bin/oneuser list" > /dev/null 2>&1
result=$?
if [ $result -eq 0 ]; then
echo "Shutting down oned"
su - $APP_USER -c "$APP_HOME/bin/one stop"
elif [ $result -eq 255 ]; then
echo "Shutting down oned"
pkill -9 -u oneadmin
fi
}
checkrun(){
su - $APP_USER -c "$APP_HOME/bin/oneuser list" > /dev/null 2>&1
if [ $? -eq 0 ]; then
RETVAL=0
return $RETVAL
else
RETVAL=1
return $RETVAL
fi
}
status(){
checkrun
if [ $RETVAL -eq 0 ]; then
echo "oned is running."
else
echo "oned is stopped."
exit 1
fi
}
case "$1" in
start)
start
RETVAL=$?
;;
stop)
stop
RETVAL=$?
;;
restart)
stop
start
RETVAL=$?
;;
status)
status
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
esac
echo $RETVAL
exit 0
Linux中如何设置服务开机自启动,可以参考
http://os.51cto.com/art/201301/377515.htm
1. 首先查看服务器默认的运行级别是多少? 目的是在对应运行级别下建立服务的软连接。
1> 执行命令#runlevel [root@compute-63-14]# runlevel
N 3
2> 查看/etc/inittab [root@compute-63-14 tomcat6]# cat /etc/inittab
# inittab is only used by upstart for the default runlevel.
... ...
id:3:initdefault:
2. 将写好的oned脚本拷贝到/etc/init.d/目录下
3. 在/etc/rc.d/rc3.d中建立软链接
cd /etc/init.d/rc.d/rc3.d
ln -s ../init.d/oned S99oned
S99oned是其软链接,S开头代表加载时自启动
以上已测试过,没有问题,同时有兴趣可以试试第二、三种方式。
posted @
2013-06-04 11:18 David1228 阅读(412) |
评论 (0) |
编辑 收藏
VNCServer 的X 桌面默认为 twm, 这时连接进去只能看到终端界面,而看不到远程桌面界面。可修改 /root/.vnc/xstartup 文件,将其改为 GNOME 或 KDE 桌面:
GNOME:
[root @ test vnc-4_1_2-x86_linux] # vi /root/.vnc/xstartup
#!/bin/sh
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot –solid grey
vncconfig –iconic &
xterm –geometry 80x24+10+10 –ls –title “$VNCDESKTOP Desktop” &
gnome-session &
KDE:
[root @ test vnc-4_1_2-x86_linux] # vi /root/.vnc/xstartup
#!/bin/sh
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot –solid grey
vncconfig –iconic &
xterm –geometry 80x24+10+10 –ls –title “$VNCDESKTOP Desktop” &
startkde &
修改完毕后须重新启动 VNCServer
[root @ test vnc-4_1_2-x86_linux] # vncserver –kill :1 && vncserver :1
[root @ test vnc-4_1_2-x86_linux] # vncviewer 192.168.98.32:1
连接后即可使用 GNOME 或 KDE 桌面啦(就像 WinXP 的远程桌面一般),也可以通过 WEB 访问,在浏览器中输入http://192.168.0.252:5801 即可,VNC 默认的端口号为5801。 转载:http://shaoruisky.blog.163.com/blog/static/92610707201151224518579/
posted @
2013-03-24 13:07 David1228 阅读(2757) |
评论 (0) |
编辑 收藏
Spring2.5继续坚持了这个发展趋向,特别是为那些使用Java 5或更新版本java的开发人员提供了进一步简化而强大的新特性。这些新特性包括:注解驱动的依赖性注入(annotation-driven dependency injection),使用注解而非XML元数据来自动侦测classpath上的Spring组件,注解对生命周期方法的支持,一个新的web控制器模型将请求映射到加注解的方法上,在测试框架中支持Junit4,Spring XML命名空间的新增内容,等等。
项目中使用的spring2.5版本。如果想要使用spring提供的注解功能.
applicationContext.xml配置文件中增加如下配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<!-- Using annontations -->
<context:annotation-config></context:annotation-config>
新增以下三项才可以使用注解功能
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:annotation-config></context:annotation-config>
或者<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/> 注册一个单独的Spring post-processor.
一个没有实现任何接口的业务类,配置如下:
public class LogService extends Service{
public LogBiz(){}
@Resource //默认按名称查找bean. 如果找不到,则按类型匹配bean.
private BaseDao dao;
}
tomcat启动错误1:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'logBiz': Injection of resource fields failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.ccms.base.dao.BaseDAO] is defined: expected single matching bean but found 40: [baseDAO, loginDAO, logDAO]
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessAfterInstantiation(CommonAnnotationBeanPostProcessor.java:291)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:876)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:437)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:383)
at java.security.AccessController.doPrivileged(Native Method)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:353)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:245)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:169)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:269)
... 32 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.ccms.base.dao.BaseDAO] is defined: expected single matching bean but found 40: [baseDAO, loginDAO, logDAO]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:583)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:418)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:497)
at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:145)
at org.springframework.beans.factory.annotation.InjectionMetadata.injectFields(InjectionMetadata.java:79)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessAfterInstantiation(CommonAnnotationBeanPostProcessor.java:288)
... 42 more
使用@Resource默认按名称查找bean. 如果找不到,则按类型匹配bean.而名称dao没有找到,所以会根据BaseDAO匹配,但是BaseDAO是一个接口:
<bean id="loginDAO" class="com.test.dao.loginDAO" parent="baseDAO" />
<bean id="logDAO" class="com.test.dao.logDAO" parent="baseDAO" />
<bean id="baseDAO" class="com.ccms.base.dao.BaseDAOImpl">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
<property name="simpleJdbcTemplate">
<ref bean="simpleJdbcTemplate" />
</property>
</bean>
有两个实现了BaseDAO接口的类,所以spring就不知道应该使用哪一个了。直接抛出异常。
解决方法1:
我们可以看到baseDAO名称是唯一的, 所以如果想要按照名称匹配,则直接写baseDAO就可以了
@Resource
private BaseDAO baseDAO;
解决方法2:
@Autowired //默认按照类型匹配,同样应为有两个子类bean,所以抛出异常。
@Qualifier("loginDAO") //限定bean
private BaseDAO dao;
参考博客:
http://doc.chinaunix.net/java/200801/240056.shtml
http://stackoverflow.com/questions/10534053/autowiring-two-beans-implementing-same-interface-how-to-set-default-bean-to-au
posted @
2013-03-21 10:22 David1228 阅读(2485) |
评论 (0) |
编辑 收藏
摘要: jdk并发部分,如果英文理解有点小难,可以参考http://www.yiibai.com/java6/java/util/concurrent/package-summary.html本篇转自:http://victorzhzh.iteye.com/blog/1011635很多时候我们希望任务可以定时的周期性的执行,在最初的JAVA工具类库中,通过Timer可以实现定时的周期性的需求,但是有一定的...
阅读全文
posted @
2013-03-18 18:58 David1228 阅读(1752) |
评论 (0) |
编辑 收藏
使用开源云工具OpenNebula3.8.1在KVM环境下虚拟机迁移失败问题解决。
1、虚拟机迁移失败1日志:
Fri Mar 8 17:57:18 2013 [LCM][I]: New VM state is SAVE_MIGRATE
Fri Mar 8 17:57:30 2013 [VMM][I]: ExitCode: 0
Fri Mar 8 17:57:30 2013 [VMM][I]: Successfully execute virtualization driver operation: save.
Fri Mar 8 17:57:30 2013 [VMM][I]: ExitCode: 0
Fri Mar 8 17:57:30 2013 [VMM][I]: Successfully execute network driver operation: clean.
Fri Mar 8 17:58:14 2013 [LCM][I]: New VM state is PROLOG_MIGRATE
Fri Mar 8 17:58:14 2013 [TM][I]: mv: -------------------------/one_images_3.8.1/0/42/disk.0
Fri Mar 8 17:58:14 2013 [TM][I]: ExitCode: 0
Fri Mar 8 18:02:28 2013 [TM][I]: mv: Moving bcec162:/one_images_3.8.1/0/42 to node153:/one_images_3.8.1/0/42
Fri Mar 8 18:02:28 2013 [TM][I]: ExitCode: 0
Fri Mar 8 18:02:29 2013 [LCM][I]: New VM state is BOOT
Fri Mar 8 18:02:30 2013 [VMM][I]: ExitCode: 0
Fri Mar 8 18:02:30 2013 [VMM][I]: Successfully execute network driver operation: pre.
Fri Mar 8 18:02:33 2013 [VMM][I]: Command execution fail: /var/tmp/one/vmm/kvm/restore /one_images_3.8.1/0/42/checkpoint node153 42 node153
Fri Mar 8 18:02:33 2013 [VMM][E]: restore: Command "virsh --connect qemu:///system restore /one_images_3.8.1/0/42/checkpoint" failed: error: Failed to restore domain from /one_images_3.8.1/0/42/checkpoint
Fri Mar 8 18:02:33 2013 [VMM][I]: error: unable to set user and group to '0:0' on '/one_images_3.8.1/0/42/disk.1': No such file or directory
Fri Mar 8 18:02:33 2013 [VMM][E]: Could not restore from /one_images_3.8.1/0/42/checkpoint
Fri Mar 8 18:02:33 2013 [VMM][I]: ExitCode: 1
Fri Mar 8 18:02:33 2013 [VMM][I]: Failed to execute virtualization driver operation: restore.
Fri Mar 8 18:02:33 2013 [VMM][E]: Error restoring VM: Could not restore from /one_images_3.8.1/0/42/checkpoint
Fri Mar 8 18:02:34 2013 [DiM][I]: New VM state is FAILED
Sat Mar 9 09:23:46 2013 [DiM][I]: New VM state is DONE.
Sat Mar 9 09:23:46 2013 [TM][W]: Ignored: LOG I 42 ExitCode: 0
Sat Mar 9 09:23:47 2013 [TM][W]: Ignored: LOG I 42 delete: Deleting /one_images_3.8.1/0/42
Sat Mar 9 09:23:47 2013 [TM][W]: Ignored: LOG I 42 ExitCode: 0
Sat Mar 9 09:23:47 2013 [TM][W]: Ignored: TRANSFER SUCCESS 42 -
解决方法:
在mv脚本中TAR拷贝命令前面增加$SUDO命令.
$ONE_LOCATION/var/remotes/tm/ssh/mv
#!/bin/bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2012, OpenNebula Project Leads (OpenNebula.org) #
# #
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
# not use this file except in compliance with the License. You may obtain #
# a copy of the License at #
# #
# http://www.apache.org/licenses/LICENSE-2.0 #
# #
# Unless required by applicable law or agreed to in writing, software #
# distributed under the License is distributed on an "AS IS" BASIS, #
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
# See the License for the specific language governing permissions and #
# limitations under the License. #
#--------------------------------------------------------------------------- #
# MV <hostA:system_ds/disk.i|hostB:system_ds/disk.i> vmid dsid
# <hostA:system_ds/|hostB:system_ds/>
# - hostX is the target host to deploy the VM
# - system_ds is the path for the system datastore in the host
# - vmid is the id of the VM
# - dsid is the target datastore (0 is the system datastore)
SRC=$1
DST=$2
VMID=$3
DSID=$4
if [ -z "${ONE_LOCATION}" ]; then
TMCOMMON=/var/lib/one/remotes/tm/tm_common.sh
else
TMCOMMON=$ONE_LOCATION/var/remotes/tm/tm_common.sh
fi
. $TMCOMMON
#-------------------------------------------------------------------------------
# Return if moving a disk, we will move them when moving the whole system_ds
# directory for the VM
#-------------------------------------------------------------------------------
SRC=`fix_dir_slashes $SRC`
DST=`fix_dir_slashes $DST`
SRC_PATH=`arg_path $SRC`
DST_PATH=`arg_path $DST`
SRC_HOST=`arg_host $SRC`
DST_HOST=`arg_host $DST`
DST_DIR=`dirname $DST_PATH`
SRC_DS_DIR=`dirname $SRC_PATH`
SRC_VM_DIR=`basename $SRC_PATH`
if [ `is_disk $DST_PATH` -eq 1 ]; then
log "-------------------------$DST_PATH"
exit 0
fi
if [ "$SRC" == "$DST" ]; then
exit 0
fi
ssh_make_path "$DST_HOST" "$DST_DIR"
log "Moving $SRC to $DST"
ssh_exec_and_log "$DST_HOST" "rm -rf '$DST_PATH'" \
"Error removing target path to prevent overwrite errors"
TAR_COPY="$SSH $SRC_HOST '$SUDO $TAR -C $SRC_DS_DIR -cf - $SRC_VM_DIR'"
TAR_COPY="$TAR_COPY | $SSH $DST_HOST '$TAR -C $DST_DIR -xf -'"
exec_and_log "eval $TAR_COPY" "Error copying disk directory to target host"
exec_and_log "$SSH $SRC_HOST rm -rf $SRC_PATH"
exit 0
-------------------------------------------------------------------------------------------
2、虚拟机迁移失败2日志:
Sat Mar 9 09:34:12 2013 [LCM][I]: New VM state is SAVE_MIGRATE
Sat Mar 9 09:34:24 2013 [VMM][I]: ExitCode: 0
Sat Mar 9 09:34:24 2013 [VMM][I]: Successfully execute virtualization driver operation: save.
Sat Mar 9 09:34:24 2013 [VMM][I]: ExitCode: 0
Sat Mar 9 09:34:24 2013 [VMM][I]: Successfully execute network driver operation: clean.
Sat Mar 9 09:34:25 2013 [LCM][I]: New VM state is PROLOG_MIGRATE
Sat Mar 9 09:34:25 2013 [TM][I]: mv: -------------------------/one_images_3.8.1/0/43/disk.0
Sat Mar 9 09:34:25 2013 [TM][I]: ExitCode: 0
Sat Mar 9 09:36:38 2013 [TM][I]: mv: Moving node153:/one_images_3.8.1/0/43 to bcec162:/one_images_3.8.1/0/43
Sat Mar 9 09:36:38 2013 [TM][I]: mv: -------------------target copyy
Sat Mar 9 09:36:38 2013 [TM][I]: mv: ++++++++++++++++++++++end copy
Sat Mar 9 09:36:38 2013 [TM][I]: ExitCode: 0
Sat Mar 9 09:36:38 2013 [LCM][I]: New VM state is BOOT
Sat Mar 9 09:36:38 2013 [VMM][I]: ExitCode: 0
Sat Mar 9 09:36:38 2013 [VMM][I]: Successfully execute network driver operation: pre.
Sat Mar 9 09:36:42 2013 [VMM][I]: Command execution fail: /var/tmp/one/vmm/kvm/restore /one_images_3.8.1/0/43/checkpoint bcec162 43 bcec162
Sat Mar 9 09:36:42 2013 [VMM][E]: restore: Command "virsh --connect qemu:///system restore /one_images_3.8.1/0/43/checkpoint" failed: error: Failed to restore domain from /one_images_3.8.1/0/43/checkpoint
Sat Mar 9 09:36:42 2013 [VMM][I]: error: internal error process exited while connecting to monitor: Supported machines are:
Sat Mar 9 09:36:42 2013 [VMM][I]: pc RHEL 6.0.0 PC (alias of rhel6.0.0)
Sat Mar 9 09:36:42 2013 [VMM][I]: rhel6.0.0 RHEL 6.0.0 PC (default)
Sat Mar 9 09:36:42 2013 [VMM][I]: rhel5.5.0 RHEL 5.5.0 PC
Sat Mar 9 09:36:42 2013 [VMM][I]: rhel5.4.4 RHEL 5.4.4 PC
Sat Mar 9 09:36:42 2013 [VMM][I]: rhel5.4.0 RHEL 5.4.0 PC
Sat Mar 9 09:36:42 2013 [VMM][E]: Could not restore from /one_images_3.8.1/0/43/checkpoint
Sat Mar 9 09:36:42 2013 [VMM][I]: ExitCode: 1
Sat Mar 9 09:36:42 2013 [VMM][I]: Failed to execute virtualization driver operation: restore.
Sat Mar 9 09:36:42 2013 [VMM][E]: Error restoring VM: Could not restore from /one_images_3.8.1/0/43/checkpoint
Sat Mar 9 09:36:42 2013 [DiM][I]: New VM state is FAILED
登陆到节点:
[root@bcec162 43]# virsh restore checkpoint
错误:从 checkpoint 恢复域失败
错误:internal error process exited while connecting to monitor: Supported machines are:
pc RHEL 6.0.0 PC (alias of rhel6.0.0)
rhel6.0.0 RHEL 6.0.0 PC (default)
rhel5.5.0 RHEL 5.5.0 PC
rhel5.4.4 RHEL 5.4.4 PC
rhel5.4.0 RHEL 5.4.0 PC
修改了bcec162节点的/etc/libvirt/qemu.conf文件:
# The user ID for QEMU processes run by the system instance
user = "root"
# The group ID for QEMU processes run by the system instance
group = "root"
# Whether libvirt should dynamically change file ownership
# to match the configured user/group above. Defaults to 1.
# Set to 0 to disable file ownership changes.
#dynamic_ownership = 0
bcec162节点迁移到node153节点成功。
[root@node153 43]# ll
total 5075464
-rw-r--r-- 1 root root 287215779 Mar 8 11:11 checkpoint
-rw-r--r-- 1 oneadmin kvm 283538737 Mar 9 09:34 checkpoint.1362712278
-rw-r--r-- 1 oneadmin kvm 920 Mar 9 09:26 deployment.0
-rw-r--r-- 1 root root 4621008896 Mar 9 10:14 disk.0
-rw-r----- 1 root root 401408 Mar 9 09:26 disk.1
lrwxrwxrwx 1 oneadmin kvm 29 Mar 9 10:09 disk.1.iso -> /one_images_3.8.1/0/43/disk.1
--------------------------------------------------------------------------------------------------------
3、仅修改node152节点的/etc/libvirt/qemu.conf文件:
# The user ID for QEMU processes run by the system instance
#user = "root"
# The group ID for QEMU processes run by the system instance
#group = "root"
# Whether libvirt should dynamically change file ownership
# to match the configured user/group above. Defaults to 1.
# Set to 0 to disable file ownership changes.
dynamic_ownership = 0
从bcec162节点迁移到node152不成功,日志如下:
Sat Mar 9 10:31:47 2013 [LCM][I]: New VM state is SAVE_MIGRATE
Sat Mar 9 10:31:54 2013 [VMM][I]: save: Moving old checkpoint file /one_images_3.8.1/0/43/checkpoint
Sat Mar 9 10:31:54 2013 [VMM][I]: ExitCode: 0
Sat Mar 9 10:31:54 2013 [VMM][I]: Successfully execute virtualization driver operation: save.
Sat Mar 9 10:31:54 2013 [VMM][I]: ExitCode: 0
Sat Mar 9 10:31:54 2013 [VMM][I]: Successfully execute network driver operation: clean.
Sat Mar 9 10:31:55 2013 [LCM][I]: New VM state is PROLOG_MIGRATE
Sat Mar 9 10:31:55 2013 [TM][I]: mv: -------------------------/one_images_3.8.1/0/43/disk.0
Sat Mar 9 10:31:55 2013 [TM][I]: ExitCode: 0
Sat Mar 9 10:35:02 2013 [TM][I]: mv: Moving bcec162:/one_images_3.8.1/0/43 to node152:/one_images_3.8.1/0/43
Sat Mar 9 10:35:02 2013 [TM][I]: mv: -------------------target copyy
Sat Mar 9 10:35:02 2013 [TM][I]: mv: ++++++++++++++++++++++end copy
Sat Mar 9 10:35:02 2013 [TM][I]: ExitCode: 0
Sat Mar 9 10:35:02 2013 [LCM][I]: New VM state is BOOT
Sat Mar 9 10:35:03 2013 [VMM][I]: ExitCode: 0
Sat Mar 9 10:35:03 2013 [VMM][I]: Successfully execute network driver operation: pre.
Sat Mar 9 10:35:07 2013 [VMM][I]: Command execution fail: /var/tmp/one/vmm/kvm/restore /one_images_3.8.1/0/43/checkpoint node152 43 node152
Sat Mar 9 10:35:07 2013 [VMM][E]: restore: Command "virsh --connect qemu:///system restore /one_images_3.8.1/0/43/checkpoint" failed: error: Failed to restore domain from /one_images_3.8.1/0/43/checkpoint
Sat Mar 9 10:35:07 2013 [VMM][I]: error: operation failed: failed to retrieve chardev info in qemu with 'info chardev'
Sat Mar 9 10:35:07 2013 [VMM][E]: Could not restore from /one_images_3.8.1/0/43/checkpoint
Sat Mar 9 10:35:07 2013 [VMM][I]: ExitCode: 1
Sat Mar 9 10:35:07 2013 [VMM][I]: Failed to execute virtualization driver operation: restore.
Sat Mar 9 10:35:07 2013 [VMM][E]: Error restoring VM: Could not restore from /one_images_3.8.1/0/43/checkpoint
Sat Mar 9 10:35:07 2013 [DiM][I]: New VM state is FAILED
登陆到node152节点执行restore命令:
[root@node152 43]# virsh restore checkpoint
error: Failed to restore domain from checkpoint
error: internal error process exited while connecting to monitor: qemu: could not open disk image /one_images_3.8.1/0/43/disk.0: Permission denied
将/etc/libvirt/qemu.conf文件中注释掉dynamic_ownership=0,开启user=root和group=root.
如果开启dynamic_ownership则恢复虚拟机也会报出上面的错误信息。
在node152节点上恢复虚拟机:
[root@node152 43]# virsh restore checkpoint
Domain restored from checkpoint
[root@node152 43]# virsh list
Id Name State
----------------------------------
117 one-43 running
参考文章:
https://wiki.archlinux.org/index.php/QEMU_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
http://hi.baidu.com/juacm/item/f1fc3f98d8428ad07a7f01e2
转载请保持原链接:http://www.blogjava.net/ldwblog/archive/2013/03/08/396187.html
posted @
2013-03-08 12:03 David1228 阅读(748) |
评论 (0) |
编辑 收藏
项目组内一位同事,在重构代码过程中将几个模块的Service层接口去掉后. 修改成了没有实现任何接口的类,并且继承了一个抽象基类。
然后我更新代码后执行系统中的该模块,发现部分表数据没有完整持久到数据库中。看了下代码和spring配置文件,原来调整后的Biz的业务类没有配置事务导致的。
修改了下spring配置文件(beanNames绑定了*Biz):
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id= "propertyConfigurer"
class = "com.ccms.base.util.DecryptPropertyPlaceholderConfigurer" >
<property name="locations" value= "classpath:sysConfig.properties" />
</bean>
<!--
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>${dataSource.jdbcUrl}&useUnicode=true&characterEncoding=UTF-8</value>
</property>
<property name="username">
<value>${dataSource.userName}</value>
</property>
<property name="password">
<value>${dataSource.password}</value>
</property>
<property name="maxActive">
<value>100</value>
</property>
<property name="initialSize">
<value>5</value>
</property>
<property name="maxIdle">
<value>10</value>
</property>
<property name="minIdle">
<value>0</value>
</property>
<property name="maxWait">
<value>-1</value>
</property>
<property name="defaultAutoCommit">
<value>false</value>
</property>
<property name="testOnBorrow">
<value>true</value>
</property>
<property name="testWhileIdle">
<value>true</value>
</property>
<property name="timeBetweenEvictionRunsMillis">
<value>600000</value>
</property>
<property name="numTestsPerEvictionRun">
<value>20</value>
</property>
<property name="minEvictableIdleTimeMillis">
<value>3600000</value>
</property>
</bean>
-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" >
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="${dataSource.jdbcUrl}&useUnicode=true&characterEncoding=UTF-8" />
<property name="user" value="${dataSource.userName}" />
<property name="password" value="${dataSource.password}" />
<property name="minPoolSize" value="5" />
<property name="maxPoolSize" value="50" />
<property name="maxStatements" value="0" />
<property name="idleConnectionTestPeriod" value="60" />
<property name="acquireRetryAttempts" value="3" />
</bean>
<!-- Session Factory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource" />
</property>
<!-- hbm配置文件的classPath路径 -->
<property name="mappingDirectoryLocations">
<list>
<value>classpath:/com/ccms/base/mapping</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.connection.release_mode">auto</prop>
<prop key="hibernate.autoReconnect">true</prop>
<prop key="hibernate.connection.autocommit">false</prop>
<!-- <prop key="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</prop> -->
</props>
</property>
</bean>
<bean id="myTransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="myTransactionManager" />
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED,-Exception</prop>
</props>
</property>
</bean>
<bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
<property name="transactionInterceptor"
ref="transactionInterceptor" />
</bean>
<bean
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>*Service</value>
<value>*Biz</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>
</beans>
启动tomcat后报出如下错误信息:
[2013-03-05 10:36:56] [ERROR] Context initialization failed - at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:215)
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loginBiz' defined in ServletContext resource [/WEB-INF/spring-service-resource.xml]: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.ccms.login.LoginBiz]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:445)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:383)
at java.security.AccessController.doPrivileged(Native Method)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:353)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:245)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:169)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:400)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:736)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:369)
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:261)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4135)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4630)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)
at org.apache.catalina.core.StandardService.start(StandardService.java:519)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.ccms.login.LoginBiz]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:213)
at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:110)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:433)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:299)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:331)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1266)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:438)
... 28 more
Caused by: java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
at net.sf.cglib.proxy.Enhancer.emitConstructors(Enhancer.java:718)
at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:499)
at net.sf.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33)
at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)
at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:201)
... 34 more
2013-3-5 10:36:56 org.apache.catalina.core.StandardContext listenerStart
严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loginBiz' defined in ServletContext resource [/WEB-INF/spring-service-resource.xml]: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.ccms.login.LoginBiz]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:445)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:383)
at java.security.AccessController.doPrivileged(Native Method)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:353)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:245)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:169)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:400)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:736)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:369)
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:261)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4135)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4630)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)
at org.apache.catalina.core.StandardService.start(StandardService.java:519)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.ccms.login.LoginBiz]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:213)
at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:110)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:433)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:299)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:331)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1266)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:438)
... 28 more
Caused by: java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
at net.sf.cglib.proxy.Enhancer.emitConstructors(Enhancer.java:718)
at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:499)
at net.sf.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33)
at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)
at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:201)
... 34 more
2013-3-5 10:36:56 org.apache.catalina.core.StandardContext start
------------------------------------------
通过以上错误分析之:
对于实现了接口的类,直接用了JDK的动态代理,把目标对象扔给JDK的Proxy,拿到代理对象就OK了。然而对于没有实现接口的类,Spring借助于CGLIB来实现代理。
解决办法:
当使用CGLIB来实现代理后,没有实现接口的类
1、 通过构造函数形式注入时必须有默认的构造函数,否则就会出现上面的异常。
2、通过生产setter或者getter方法注入。
3、通过修改Spring的
CglibProxyFactory工厂类。
详细解析可以参照这篇文章:
http://netfork.iteye.com/blog/286215
posted @
2013-03-05 14:54 David1228 阅读(10741) |
评论 (0) |
编辑 收藏
Deserializes JavaScript Object Notation (JSON) text to produce a JavaScript value.
JSON.parse(text [, reviver])
- text
Required. Valid JSON text.
- reviver
Optional. A function that filters and transforms the results. The deserialized object is traversed recursively, and the reviver function is called for each member of the object in post-order (every object is revived after all its members have been revived). For each member, the following occurs:
If reviver returns a valid value, the member value is replaced with the value returned by reviver.
If reviver returns what it received, the structure is not modified.
If reviver returns null or undefined, the object member is deleted.
The reviver argument is often used to transform JSON representation of International Organization for Standardization (ISO) date strings into Coordinated Universal Time (UTC) format Date objects.
A JavaScript value—an object or array.
Exception | Condition |
---|
JavaScript parser errors | The input text does not comply with JSON syntax. To correct the error, do one of the following: Modify the text argument to comply with JSON syntax. For more information, see the BNF syntax notation of JSON objects. Make sure that the text argument was serialized by a JSON-compliant implementation, such as, JSON.stringify.
|
This example uses JSON.parse to deserialize JSON text into the contact object.
var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}'; var contact = JSON.parse(jsontext); var fullname = contact.surname + ", " + contact.firstname; // The value of fullname is "Aaberg, Jesper"
This example uses JSON.parse to deserialize an ISO-formatted date string. The dateReviver function returns Date objects for members that are formatted like ISO date strings.
var jsontext = '{ "hiredate": "2008-01-01T12:00:00Z", "birthdate": "2008-12-25T12:00:00Z" }'; var dates = JSON.parse(jsontext, dateReviver); var string = dates.birthdate.toUTCString(); // The value of string is "Thu, 25 Dec 2008 12:00:00 UTC" function dateReviver(key, value) { var a; if (typeof value === 'string') { a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); if (a) { return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6])); } } return value; };
Supported in the following document modes: Internet Explorer 8 standards, Internet Explorer 9 standards. See Version Information.
Not supported in the following document modes: Quirks, Internet Explorer 6 standards, Internet Explorer 7 standards.
Serializes a JavaScript value into JavaScript Object Notation (JSON) text.
JSON.stringify(value [, replacer] [, space])
- value
Required. A JavaScript value, usually an object or array, to be serialized.
- replacer
Optional. A function or array that filters and transforms the results.
If replacer is a function, JSON.stringify calls the function, passing in the key and value of each member. The return value is serialized instead of the original value. If the function returns undefined, the member will be excluded from the serialization. The key for the root object is an empty string: "".
If replacer is an array, only members with key values in the array will be serialized. The order of serialization is the same as the order of the keys in the array. Thereplacer array is ignored when the value argument is also an array.
- space
Optional. Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.
If space is omitted, the return-value text is generated without any extra white space.
If space is a number, the return-value text is indented with the specified number of white spaces at each level. If space is greater than 10, text is indented 10 spaces.
If space is a non-empty string, such as '\t', the return-value text is indented with the characters in the string at each level.
If space is a string that is longer than 10 characters, the first 10 characters are used.
A string that contains the serialized JSON text.
If the value that is being serialized has a toJSON method, the JSON.stringify function calls the toJSON method and uses the return value for serialization. If the return value of the toJSON method is undefined, the member will not be serialized. This enables an object to determine its own JSON representation.
Values that do not have JSON representations, such as undefined, will not be serialized. In objects, they will be dropped. In arrays, they will be replaced with null.
String values begin and end with a quotation mark. All Unicode characters may be enclosed in the quotation marks except for the characters that must be escaped by using a backslash. The following characters must be preceded by a backslash:
Order of Execution
During the serialization process, if a toJSON method exists for the value argument, JSON.stringify first calls the toJSON method. If it does not exist, the original value is used. Next, if a replacer argument is provided, the value (original value or toJSON return-value) is replaced with the return-value of the replacer argument. Finally, white spaces are added to the value based on the optional space argument to generate the final serialized JSON text.
This example uses JSON.stringify to serialize the contact object to JSON text. The memberfilter array is defined so that only the surname and phone members are serialized. The firstname member is omitted.
var contact = new Object(); contact.firstname = "Jesper"; contact.surname = "Aaberg"; contact.phone = ["555-0100", "555-0120"]; var memberfilter = new Array(); memberfilter[0] = "surname"; memberfilter[1] = "phone"; var jsonText = JSON.stringify(contact, memberfilter, "\t"); /* The value of jsonText is: '{ "surname": "Aaberg", "phone": [ "555-0100", "555-0120" ] }' */
This example uses JSON.stringify to serialize an array. The replaceToUpper function converts every string in the array to uppercase.
var continents = new Array(); continents[0] = "Europe"; continents[1] = "Asia"; continents[2] = "Australia"; continents[3] = "Antarctica"; continents[4] = "North America"; continents[5] = "South America"; continents[6] = "Africa"; var jsonText = JSON.stringify(continents, replaceToUpper); /* The value of jsonText is: '"EUROPE,ASIA,AUSTRALIA,ANTARCTICA,NORTH AMERICA,SOUTH AMERICA,AFRICA"' */ function replaceToUpper(key, value) { return value.toString().toUpperCase(); }
This example uses the toJSON method to serialize string member values in uppercase.
var contact = new Object(); contact.firstname = "Jesper"; contact.surname = "Aaberg"; contact.phone = ["555-0100", "555-0120"]; contact.toJSON = function(key) { var replacement = new Object(); for (var val in this) { if (typeof (this[val]) === 'string') replacement[val] = this[val].toUpperCase(); else replacement[val] = this[val] } return replacement; }; var jsonText = JSON.stringify(contact); /* The value of jsonText is: '{"firstname":"JESPER","surname":"AABERG","phone":["555-0100","555-0120"]}' */
Supported in the following document modes: Internet Explorer 8 standards, Internet Explorer 9 standards. See Version Information.
Not supported in the following document modes: Quirks, Internet Explorer 6 standards, Internet Explorer 7 standards.
http://msdn.microsoft.com/library/cc836459(VS.85).aspx
posted @
2013-03-04 16:59 David1228 阅读(874) |
评论 (0) |
编辑 收藏
转载自:http://linuxtoy.org/archives/kvm-issue.html
笔者在部署 KVM 虚拟机时曾遇到一个奇怪的问题,几经探索之后终于解决,现在写出来跟大家分享一下。
笔者在单位部署了一台服务器,上面运行着几部 KVM 虚拟机,分别执行不同的任务。系统上线之后,需要再增加几部虚拟机。因为当初部署服务器时做了虚拟机备份,所以就复制了一个备份的虚拟机。可是新虚拟机启动之后无法在本地网络上找到新虚拟机的 IP 地址(本地网络采用 DHCP 分配 IP 地址)!因为服务器是远程控制的,当然新虚拟机也就无法使用了。
为了查找原因,笔者把虚拟机复制到本地主机上,用正常方法开启。启动过程及登录都很正常,于是检查网卡状况:
$ ifconfig
可是却只有显示 lo 信息! 怪了,eth0 呢?只有 lo 当然是没有办法同网络通讯的。于是查找一下启动信息:
$ dmesg | grep eth
发现如下信息:
udev: renamed network interface eth0 to eth1
原来 eth0 已经没有了,被命名为 eth1, 再看网卡配置
$ cat /etc/network/interfaces auto eth0 iface eth0 inet dhcp
至此事情水落石出,原来 KVM 是在启动时传递 mac 参数的,如笔者是用下面命令启动 KVM 虚拟机:
$ sudo kvm -m 256 -hda /data/kvm/mail.img -net nic,vlan=0,macaddr=52-54-00-12-30-05 -net tap,vlan=0,ifname=tap5,script=no -boot c -smp 2 -daemonize -nographic &
注意上面的 macaddr=52-54-00-12-30-05,这就是虚拟机启动后的网卡 mac,因为网络内不可以有相同的 mac,所以启动每个虚拟机的 mac 都要改。可是当换了新的 mac 后,虚拟机里的系统就认为换了新网卡,所以系统改变 eth0 为 eth1,而在网卡设置里面却只设置了 eth0, 所以虚拟机启动之后并没有启动新的 eth1 网卡,当然就连不上网络了。原因找到了之后问题的解决也就非常简单:
$ vi /etc/network/interfaces
增加以下内容:
auto eth1 iface eth1 inet dhcp
再重新启动网络:
$ /etc/init.d/networking restart
至此问题应该就完全解决了。不过有个问题还要注意,如果有多次用不同的 mac 启动虚拟机,可能你的虚拟机里已经有了 eth2, eth3 甚至是 10 都是有可能的,因为你每用一个新的 mac 去启动虚拟机,系统就会增加一个网卡。可以修改下面这个文件:
$ vi /etc/udev/rules.d/70-persistent-net.rules
删除所有的的 ethX 行,重启虚拟机即可。
{ Thanks 逸飞. }
posted @
2013-02-20 11:41 David1228 阅读(966) |
评论 (0) |
编辑 收藏
WARNING: The file has been changed since reading it!!!Do you really want to write to it (y/n)?y"/proc/sys/net/ipv4/ip_forward" E667: Fsync failedHit ENTER or type command to continue编辑/etc/sysctl.conf把net.ipv4.ip_forward = 0改成net.ipv4.ip_forward = 1如果此文件中没有这个选项则将其添加上就行。然后执行命令:#sysctl -p使其生效。
[root@IBM-007 sudo]# sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
vm.min_free_kbytes = 65536
kernel.panic_on_oops = 1
kernel.panic = 60
[root@IBM-007 sudo]#
[root@IBM-007 sudo]#
[root@IBM-007 sudo]# ll /
[root@IBM-007 sudo]#
再一次的查看
[root@IBM-007 sudo]# cat /proc/sys/net/ipv4/ip_forward
1
可以发现其原来的0就变成了1.
posted @
2013-01-30 14:12 David1228 阅读(6278) |
评论 (0) |
编辑 收藏
#!/bin/bash
# Title : {stop|start|restart} Tomcat . Default is "restart".
# Author : Cheng PJ
# E-mail : 7looki@gmail.com
# Version : 1.0
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
file_name_f1=`echo ${0} | awk -F / '{print $1}'`
file_name_f2=`echo ${0} | awk -F / '{print $NF}'`
file_pwd=`echo ${0} | sed 's#'/${file_name_f2}'$##g'`
if [ -z "${file_name_f1}" ] || [ ${file_name_f1} != ${file_name_f2} ]; then
cd ${file_pwd}
fi
tomcat_bin=`pwd`
if [ ! -f ${tomcat_bin}/startup.sh ] || [ ! -f ${tomcat_bin}/bootstrap.jar ] || [ ! -f ${tomcat_bin}/catalina.sh ]; then
echo ""
echo "This script must be in the directory under \${Tomcat_Home}/bin !"
echo ""
exit 1
fi
tomcat_whoami=`whoami`
tomcat_own_user=`ls -l ${tomcat_bin}/startup.sh | awk '{print $3}'`
tomcat_who_run=`ps -ef | grep ${tomcat_bin} | grep -v "grep\|${0}" | awk '{print $1}'`
tomcat_who_run_other=`ps -ef | grep ${tomcat_bin} | grep -v "grep\|${0}" | awk '{print $1}' | grep -v "${tomcat_who_run}\|root" | sort | uniq`
tomcat_run_num=`ps -ef | grep ${tomcat_bin} | grep -v "grep\|${0}" | wc -l`
tomcat_echo_stop () {
echo "Tomcat Stopping ... [OK]"
echo ""
}
tomcat_echo_start () {
echo ""
echo "Tomcat Starting ... [OK]"
}
tomcat_echo_error () {
echo ""
echo "Tomcat Stopped ERROR ! Please check privilege or something !"
echo ""
exit 1
}
tomcat_stop () {
if [ ${tomcat_who_run} == ${tomcat_whoami} ] || [ ${tomcat_whoami} == "root" ]; then
ps -ef | grep ${tomcat_bin} | grep -v "grep\|${0}" | awk '{print $2}' | xargs kill -9
if [ $? -eq 0 ]; then
tomcat_echo_stop;
else
tomcat_echo_error;
fi
else
echo "ERROR ! You must root or ${tomcat_who_run} to run this script !"
exit 1
fi
}
tomcat_start () {
if [ ${tomcat_own_user} == ${tomcat_whoami} ] || [ ${tomcat_own_user} == "root" ]; then
sh ${tomcat_bin}/startup.sh
if [ $? -eq 0 ]; then
tomcat_echo_start;
else
tomcat_echo_error;
fi
else
echo "ERROR ! You must root or ${tomcat_own_user} to run this script !"
exit 1
fi
}
tomcat_shutdown () {
if [ ${tomcat_run_num} -eq 0 ]; then
echo "Tomcat is not running!"
echo ""
elif [ ${tomcat_run_num} -eq 1 ]; then
tomcat_stop;
else
if [ ${tomcat_who_run_other} == "" ]; then
tomcat_stop;
else
echo "Please shutdown Tomcat with other users (${tomcat_who_run_other}) "
echo "Tomcat is not stopped !"
exit 1
fi
fi
}
tomcat_startup () {
tomcat_run_check=`ps -ef | grep ${tomcat_bin} | grep -v "grep\|${0}" | wc -l`
if [ ${tomcat_run_check} -eq 0 ]; then
tomcat_start;
else
echo "Tomcat is not stopped ! Please stop Tomcat at first !"
echo 1
fi
}
case "$1" in
start|-start|--start)
tomcat_startup
;;
stop|-stop|--stop)
tomcat_shutdown
;;
help|-help|--help)
echo ""
echo "This script used for {start|stop|restart} Tomcat !"
echo ""
echo " By ST.7looki"
echo " 7looki@gmail.com"
echo ""
;;
restart|-restart|--restart|*)
tomcat_shutdown
sleep 1
tomcat_startup
esac
posted @
2013-01-30 10:48 David1228 阅读(1480) |
评论 (2) |
编辑 收藏