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) |
编辑 收藏
Netperf使用转载自:
http://os.chinaunix.net/a2004/0708/1042/000001042354.shtml 本文首先介绍网络性能测量的一些基本概念和方法,然后结合 netperf 工具的使用,具体的讨论如何测试不同情况下的网络性能。 在构建或管理一个网络系统时,我们更多的是关心网络的可用性,即网络是否连通,而对于其整体的性能往往考虑不多,或者即使考虑到性能的问题,但是却发现没有合适的手段去测试网络的性能。 当开发出一个网络应用程序后,我们会发现,在实际的网络环境使用中,网络应用程序的使用效果不是很理想,问题可能出现在程序的开发上面,也有可能由于实际的网络环境中存在着瓶颈。面对这种问题,程序员一般会一筹莫展,原因就在于不掌握一些网络性能测量的工具。 在本文中,首先介绍网络性能测量的一些基本概念和方法,然后结合 netperf 工具的使用,具体的讨论如何测试不同情况下的网络性能。 网络性能测试概述 网络性能测量的五项指标 测量网络性能的五项指标是: 可用性(availability) 响应时间(response time) 网络利用率(network utilization) 网络吞吐量(network throughput) 网络带宽容量(network bandwidth capacity) 1. 可用性 测试网络性能的第一步是确定网络是否正常工作,最简单的方法是使用 ping 命令。通过向远端的机器发送 icmp echo request,并等待接收 icmp echo reply 来判断远端的机器是否连通,网络是否正常工作。 Ping 命令有非常丰富的命令选项,比如 -c 可以指定发送 echo request 的个数,-s 可以指定每次发送的 ping 包大小。 网络设备内部一般有多个缓冲池,不同的缓冲池使用不同的缓冲区大小,分别用来处理不同大小的分组(packet)。例如交换机中通常具有三种类型的包缓冲:一类针对小的分组,一类针对中等大小的分组,还有一类针对大的分组。为了测试这样的网络设备,测试工具必须要具有发送不同大小分组的能力。Ping 命令的 -s 就可以使用在这种场合。 2. 响应时间 Ping 命令的 echo request/reply 一次往返所花费时间就是响应时间。有很多因素会影响到响应时间,如网段的负荷,网络主机的负荷,广播风暴,工作不正常的网络设备等等。 在网络工作正常时,记录下正常的响应时间。当用户抱怨网络的反应时间慢时,就可以将现在的响应时间与正常的响应时间对比,如果两者差值的波动很大,就能说明网络设备存在故障。 3. 网络利用率 网络利用率是指网络被使用的时间占总时间(即被使用的时间+空闲的时间)的比例。比如,Ethernet 虽然是共享的,但同时却只能有一个报文在传输。因此在任一时刻,Ethernet 或者是 100% 的利用率,或者是 0% 的利用率。 计算一个网段的网络利用率相对比较容易,但是确定一个网络的利用率就比较复杂。因此,网络测试工具一般使用网络吞吐量和网络带宽容量来确定网络中两个节点之间的性能。 4. 网络吞吐量 网络吞吐量是指在某个时刻,在网络中的两个节点之间,提供给网络应用的剩余带宽。 网络吞吐量可以帮组寻找网络路径中的瓶颈。比如,即使 client 和 server 都被分别连接到各自的 100M Ethernet 上,但是如果这两个 100M 的Ethernet 被 10M 的 Ethernet 连接起来,那么 10M 的 Ethernet 就是网络的瓶颈。 网络吞吐量非常依赖于当前的网络负载情况。因此,为了得到正确的网络吞吐量,最好在不同时间(一天中的不同时刻,或者一周中不同的天)分别进行测试,只有这样才能得到对网络吞吐量的全面认识。 有些网络应用程序在开发过程的测试中能够正常运行,但是到实际的网络环境中却无法正常工作(由于没有足够的网络吞吐量)。这是因为测试只是在空闲的网络环境中,没有考虑到实际的网络环境中还存在着其它的各种网络流量。所以,网络吞吐量定义为剩余带宽是有实际意义的。 5. 网络带宽容量 与网络吞吐量不同,网络带宽容量指的是在网络的两个节点之间的最大可用带宽。这是由组成网络的设备的能力所决定的。 测试网络带宽容量有两个困难之处:在网络存在其它网络流量的时候,如何得知网络的最大可用带宽;在测试过程中,如何对现有的网络流量不造成影响。网络测试工具一般采用 packet pairs 和 packet trains 技术来克服这样的困难。 收集网络性能数据的方式 当确定了网络性能的测试指标以后,就需要使用网络测试工具收集相应的性能数据,分别有三种从网络获取数据的方式: 1. 通过snmp协议直接到网络设备中获取,如net-snmp工具 2. 侦听相关的网络性能数据,典型的工具是tcpdump 3. 自行产生相应的测试数据,如本文中使用的netperf工具 Netperf Netperf是一种网络性能的测量工具,主要针对基于TCP或UDP的传输。Netperf根据应用的不同,可以进行不同模式的网络性能测试,即批量数据传输(bulk data transfer)模式和请求/应答(request/reponse)模式。Netperf测试结果所反映的是一个系统能够以多快的速度向另外一个系统发送数据,以及另外一个系统能够以多块的速度接收数据。 Netperf工具以client/server方式工作。server端是netserver,用来侦听来自client端的连接,client端是netperf,用来向server发起网络测试。在client与server之间,首先建立一个控制连接,传递有关测试配置的信息,以及测试的结果;在控制连接建立并传递了测试配置信息以后,client与server之间会再建立一个测试连接,用来来回传递着特殊的流量模式,以测试网络的性能。 TCP网络性能 由于TCP协议能够提供端到端的可靠传输,因此被大量的网络应用程序使用。但是,可靠性的建立是要付出代价的。TCP协议保证可靠性的措施,如建立并维护连接、控制数据有序的传递等都会消耗一定的网络带宽。 Netperf可以模拟三种不同的TCP流量模式: 1) 单个TCP连接,批量(bulk)传输大量数据 2) 单个TCP连接,client请求/server应答的交易(transaction)方式 3) 多个TCP连接,每个连接中一对请求/应答的交易方式 UDP网络性能 UDP没有建立连接的负担,但是UDP不能保证传输的可靠性,所以使用UDP的应用程序需要自行跟踪每个发出的分组,并重发丢失的分组。 Netperf可以模拟两种UDP的流量模式: 1) 从client到server的单向批量传输 2) 请求/应答的交易方式 由于UDP传输的不可靠性,在使用netperf时要确保发送的缓冲区大小不大于接收缓冲区大小,否则数据会丢失,netperf将给出错误的结果。因此,对于接收到分组的统计不一定准确,需要结合发送分组的统计综合得出结论。 Netperf的命令行参数 在unix系统中,可以直接运行可执行程序来启动netserver,也可以让inetd或xinetd来自动启动netserver。 当netserver在server端启动以后,就可以在client端运行netperf来测试网络的性能。netperf通过命令行参数来控制测试的类型和具体的测试选项。根据作用范围的不同,netperf的命令行参数可以分为两大类:全局命令行参数、测试相关的局部参数,两者之间使用--分隔: netperf [global options]-- [test-specific options] 这里我们只解释那些常用的命令行参数,其它的参数读者可以查询netperf的man手册。 -H host :指定远端运行netserver的server IP地址。 -l testlen:指定测试的时间长度(秒) -t testname:指定进行的测试类型,包括TCP_STREAM,UDP_STREAM,TCP_RR,TCP_CRR,UDP_RR,在下文中分别对它们说明。 在后面的测试中,netserver运行在192.168.0.28,server与client通过局域网连接(100M Hub)。 Netperf测试网络性能 测试批量(bulk)网络流量的性能 批量数据传输典型的例子有ftp和其它类似的网络应用(即一次传输整个文件)。根据使用传输协议的不同,批量数据传输又分为TCP批量传输和UDP批量传输。 1. TCP_STREAM Netperf缺省情况下进行TCP批量传输,即-t TCP_STREAM。测试过程中,netperf向netserver发送批量的TCP数据分组,以确定数据传输过程中的吞吐量: ./netperf -H 192.168.0.28 -l 60 TCP STREAM TEST to 192.168.0.28 Recv Send Send Socket Socket Message Elapsed Size Size Size Time Throughput bytes bytes bytes secs. 10^6bits/sec 87380 16384 16384 60.00 88.00 从netperf的结果输出中,我们可以知道以下的一些信息: 1) 远端系统(即server)使用大小为87380字节的socket接收缓冲 2) 本地系统(即client)使用大小为16384字节的socket发送缓冲 3) 向远端系统发送的测试分组大小为16384字节 4) 测试经历的时间为60秒 5) 吞吐量的测试结果为88Mbits/秒 在缺省情况下,netperf向发送的测试分组大小设置为本地系统所使用的socket发送缓冲大小。 TCP_STREAM方式下与测试相关的局部参数如下表所示: 通过修改以上的参数,并观察结果的 。
posted @
2013-01-21 12:31 David1228 阅读(444) |
评论 (0) |
编辑 收藏
使用httpd时候碰到一个问题,共享一下。
BC-EC配置tomcat的时候占用8443端口,如果tomcat服务器又作为http服务器,启动httpd服务的时候就报错,8443端口被占用。反过来httpd占用8443,tomcat启动就报错。
解决办法:
编辑 /etc/httpd/conf.d/nss.conf配置文件,将该文件中的
nss.conf:Listen 8443
nss.conf:<VirtualHost _default_:8443>
改成
nss.conf:Listen 8444
nss.conf:<VirtualHost _default_:8444>
这样启动httpd和tomcat就互不影响了。
posted @
2013-01-18 11:22 David1228 阅读(2715) |
评论 (0) |
编辑 收藏
--------------------------- 下面是在不启动虚机的情况下,修改虚机磁盘文件的方法(增加一种调试的手段) ---------------------------------
-- 首先关闭虚机
# losetup /dev/loop100 /one_images/5/images/disk.0
# kpartx -a /dev/loop100
-- 通过以上两个命令后,可以在/dev/mapper/目录下看到虚机的两个分区设备 loop100p1、loop100p2 (一般loop100p1是根分区)(loop设备找一个空闲的即可,我这里写的是loop100)
# mount /dev/mapper/loop100p1 /mnt
-- 将虚机根分区挂载到/mnt目录,这时虚机的文件系统结构就都在/mnt目录下了(可以进行读写操作)
# umount /mnt
# kpartx -d /dev/loop100
# losetup -d /dev/loop100
-- 通过以上三个命令卸载,重新启动虚机,修改都生效了。(测试虚机系统centos-5.5-x86_64)
posted @
2013-01-18 11:21 David1228 阅读(384) |
评论 (0) |
编辑 收藏
记录下,转自:
http://blog.csdn.net/wonderful19891024/article/details/6166264
主机自带硬盘超过300GB,目前只划分使用了3个主分区,不到70GB,如 下:
[root@db2 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 29G 3.7G 24G 14% /
/dev/sda2 29G 22G 5.2G 81% /oracle
tmpfs 2.0G 0 2.0G 0% /dev/shm
[root@db2 ~]# cat /proc/partitions
major minor #blocks name
8 0 311427072 sda
sda1
8 2 30716280 sda2
8 3 8193150 sda3
8 16 976896 sdb
8 32 976896 sdc
现在需要给系统添加1个100GB的空间存放数据文件,而又不影响现有系统上业务的运行,
使用fdisk结合partprobe命令不重启系统添加 一块新的磁盘分区。操作步骤如下:
第1步,添加新的磁盘分区
[root@db2 ~]# fdisk /dev/sda
The number of cylinders for this disk is set to 38770.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help): p
Disk /dev/sda: 318.9 GB, 318901321728 bytes
255 heads, 63 sectors/track, 38770 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 3824 30716248+ 83 Linux
/dev/sda2 3825 7648 30716280 83 Linux
/dev/sda3 7649 8668 8193150 82 Linux swap / Solaris
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Selected partition 4
First cylinder (8669-38770, default 8669):
Using default value 8669
Last cylinder or +size or +sizeM or +sizeK (8669-38770, default 38770): +100G
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16:
Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.
[root@db2 ~]#
第2步,使用工具partprobe让kernel读取分区信息
[root@db2 ~]# partprobe
使用fdisk工具只是将分区信息写到磁盘,如果需要mkfs磁盘分区则需要重启系统,
而使用partprobe则可以使kernel重新读取分区 信息,从而避免重启系统。
第3步,格式化文件系统
[root@db2 ~]# mkfs.ext3 /dev/sda4
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
12222464 inodes, 24416791 blocks
1220839 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
746 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632,
2654208, 4096000, 7962624, 11239424, 20480000, 23887872
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information:
done
This filesystem will be automatically checked every 26 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@db2 ~]#
第4步,mount新的分区/dev/sda4
[root@db2 ~]# e2label /dev/sda4 /data
[root@db2 ~]# mkdir /data
[root@db2 ~]# mount /dev/sda4 /data
[root@db2 ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 29753556 3810844 24406900 14% /
/dev/sda2 29753588 11304616 16913160 41% /oracle
tmpfs 2023936 0 2023936 0% /dev/shm
/dev/sda4 96132968 192312 91057300 1% /data
[root@db2 ~]#
posted @
2012-11-29 14:56 David1228 阅读(370) |
评论 (0) |
编辑 收藏
个人说明:以下作者应该是在Ubuntu OS上做的测试。 感谢作者vpsee。
本人在公司的Red Hat Enterprise Linux Server release 6.1 (Santiago) 服务器上做的测试,可参见最下面截图,监控Tomcat和其他日志信息。很是方便哈^^.
由于Redhat OS上没有apt-get,如果缺少相应软件包,可以通过yum或者iso源方式安装缺少的软件。
转自:
http://www.vpsee.com/2012/11/install-real-time-log-monitoring-tool-log-io/#comments 日志是个好东西,对技术人员来说写日志能纪录成长,分享经验;对机器来说纪录日志能及时发现错误,为日后的排错提供信息。如果还在一台机器上用 tail -f 监听单个日志或者用 multitail 监听多个日志也太 out 了,我们需要一种工具能纪录上百台机器、不同类型的日志,并最好能汇集到一个界面里方便查看,最好还是实时的。log.io 就是这样一个实时日志监控工具,采用 node.js + socket.io 开发,使用浏览器访问,每秒可以处理超过5000条日志变动消息。有一点要指出来的是 log.io 只监视日志变动并不存储日志,不过这个没关系,我们知道日志存储在哪个机器上。
posted @
2012-11-06 15:49 David1228 阅读(2179) |
评论 (0) |
编辑 收藏
RHEL6 已经推出很久了 ,没想到在 RedHat 自家的 RHEL6 上安装 KVM 还有这么多问题,难道不应该是像 Apache/MySQL 那样安装完就可以用的么?(注:除去商标,CentOS 就是 RHEL,CentOS6 和 RHEL6 是一回事)。以下操作在 CentOS 6.2 最小化安装版本 CentOS-6.2-x86_64-minimal.iso 上完成,其他版本可能不会遇到本文提到的部分问题。检查 CPU
和 Xen 不同,KVM 需要有 CPU 的支持(Intel VT 或 AMD SVM),在安装 KVM 之前检查一下 CPU 是否提供了虚拟技术的支持:
# egrep 'vmx|svm' /proc/cpuinfo ... flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt aes lahf_lm ida arat dts tpr_shadow vnmi flexpriority ept vpid
安装 KVM
安装 KVM 很容易,要正常运行的话还需要折腾一下:
# yum -y install qemu-kvm libvirt python-virtinst bridge-utils
安装完后关闭 selinux 并重启系统,然后确认一下是否 kvm 安装成功:
# vi /etc/sysconfig/selinux SELINUX=disabled # reboot # lsmod | grep kvm kvm_intel 50412 3 kvm 305988 1 kvm_intel # stat /dev/kvm File: `/dev/kvm' Size: 0 Blocks: 0 IO Block: 4096 character special file Device: 5h/5d Inode: 10584 Links: 1 Device type: a,e8 Access: (0666/crw-rw-rw-) Uid: ( 0/ root) Gid: ( 36/ kvm) Access: 2012-04-18 16:00:46.276341129 +0200 Modify: 2012-04-18 16:00:46.276341129 +0200 Change: 2012-04-18 16:00:46.276341129 +0200
再来确认一下 libvirt 是否能正常启动和关闭。重启 libvirtd 服务的话会报错,查看日志发现 internal error Failed to create mDNS client 错误,这个问题容易改正,安装 avahi 即可,也可以去 /etc/libvirt/libvirtd.conf 设置 mdns_adv = 0,VPSee 这里采用安装 avahi 的方法:
# /etc/init.d/libvirtd restart Stopping libvirtd daemon: [FAILED] Starting libvirtd daemon: [ OK ] # tail /var/log/libvirt/libvirtd.log 2012-04-18 13:51:03.032+0000: 18149: info : libvirt version: 0.9.4, package: 23.el6_2.7 (CentOS BuildSystem , 2012-04-16-14:12:59, c6b5.bsys.dev.centos.org) 2012-04-18 13:51:03.032+0000: 18149: error : virNetServerMDNSStart:460 : internal error Failed to create mDNS client: Daemon not running # yum -y install avahi # /etc/init.d/messagebus restart # /etc/init.d/avahi-daemon restart
重启 libvirtd 服务继续报错,发现缺少 dmidecode 包,安装 dmidecode 后终于重启 libvirtd 成功 :
# /etc/init.d/libvirtd restart Stopping libvirtd daemon: [FAILED] Starting libvirtd daemon: [ OK ] # tail /var/log/libvirt/libvirtd.log 2012-04-18 13:54:54.654+0000: 18320: info : libvirt version: 0.9.4, package: 23.el6_2.7 (CentOS BuildSystem , 2012-04-16-14:12:59, c6b5.bsys.dev.centos.org) 2012-04-18 13:54:54.654+0000: 18320: error : virSysinfoRead:465 : internal error Failed to find path for dmidecode binary # yum -y install dmidecode # /etc/init.d/libvirtd restart Stopping libvirtd daemon: [ OK ] Starting libvirtd daemon: [ OK ]
现在 kvm 和 libvirt 都安装成功和运行了,但并不表示可用了,问题接着来。
安装虚拟机
从 6 系列开始 RedHat 推荐使用 virt-install/virsh 系列工具操作 kvm,而不是直接使用 qemu-kvm,所以 qemu-kvm 被移到一个不起眼的地方 /usr/libexec/,做个链接:
# qemu-kvm -bash: qemu-kvm: command not found # ls /usr/libexec/qemu-kvm /usr/libexec/qemu-kvm # ln -sf /usr/libexec/qemu-kvm /usr/bin/kvm
VPSee 采用 RedHat 推荐的方式(virt-install)安装虚拟机,这里以安装 ubuntu-11.10-server-amd64.iso 为例:
# virt-install \ --name ubuntu \ --ram 512 \ --vcpus=1 \ --disk path=/root/ubuntu.img,size=10 \ --accelerate \ --cdrom /root/ubuntu-11.10-server-amd64.iso \ --graphics vnc
开始安装,创建硬盘 ubuntu.img 后就报错,用的是 root 帐号居然还 Permission denied?!
Starting install... Creating storage file ubuntu.img | 10.0 GB 00:00 ERROR internal error Process exited while reading console log output: char device redirected to /dev/pts/1 qemu-kvm: -drive file=/root/ubuntu.img,if=none,id=drive-ide0-0-0,format=raw,cache=none: could not open disk image /root/ubuntu.img: Permission denied Domain installation does not appear to have been successful. If it was, you can restart your domain by running: virsh --connect qemu:///system start ubuntu otherwise, please restart your installation.
修改 qemu.conf 配置,把下面几个地方的注释去掉,然后把 dynamic_ownership 的值改成0,禁止 libvirtd 动态修改文件的归属:
# vi /etc/libvirt/qemu.conf ... user = "root" group = "root" dynamic_ownership = 0 ...
重启 libvirtd 服务再用上面的 virt-install 命令安装就应该可以了。这个时候 vnc 默认绑定的是本机 127.0.0.1,如果其他机器想用 vnc 客户端访问这台 kvm 服务器正在安装的 ubuntu 的话需要把 vnc 绑定到服务器的 IP 地址或者绑定到全局 0.0.0.0. 修改 qemu.conf 文件取消 vnc_listen 一行前面的注释,记得重启 libvirtd:
# vi /etc/libvirt/qemu.conf ... vnc_listen = "0.0.0.0" ...
转载自:
http://www.vpsee.com/?s=qemu.conf
posted @
2012-10-31 13:59 David1228|
编辑 收藏