QEMU -smp参数解释及在libvirt中的设置(多CPU 多核心 多线程)

最近给一台安装了Windows Server 2003标准版的虚拟服务器分配了八个虚拟处理器,在设备管理器中,可以查看到已成功识别所有处理器,但是任务管理器的性能标签页中看到仅有四个被使用,查阅了一下微软官方的文档,发现原来标准版最多只能使用四个处理器。

解决问题的方向可以明确:让QEMU从分配多CPU,单CPU核心,改为分配单或多CPU,多CPU核心。

QEMU -smp参数

QEMU与多CPU多核心有关的参数是-smp,官方对-smp参数的解释如下:

-smp n[,cores=cores][,threads=threads][,sockets=sockets][,maxcpus=maxcpus]
Simulate an SMP system with n CPUs. On the PC target, up to 255 CPUs are supported. On Sparc32 target, Linux limits the number of usable CPUs to 4. For the PC target, the number
of cores per socket, the number of threads per cores and the total number of sockets can be specified. Missing values will be computed. If any on the three values is given, the
total number of CPUs n can be omitted. maxcpus specifies the maximum number of hotpluggable CPUs.

也许你和我一样,看了这些解释,感觉和没看一样。

经过数次“实战”,稍微了解了一些,因此,我就来给你解释一下n,cores,threads,sockets, maxcpus及他们之间的关系吧。

n: 虚拟CPU(vcpu)的个数,每个thread都视为一个虚拟CPU

sockets: CPU插槽数目,也就是CPU的个数

threads: 每个CPU核心拥有的线程数目

cores: 每个CPU拥有的CPU核心数目

maxcpus: 根据文档,是设置可热插拔的CPU数量,经测试,n的值不可超过maxcpus

根据对硬件的了解,可以知道,总的cores数目=cores*sockets,总的threads数目=总的cores数目*threads

我就不扯更多理论了,举例说明吧:

实例一. -smp 1,cores=1,threads=1,sockets=1

这里指定了虚拟CPU为一,CPU个数为一,核心数为一,线程数为一,那么在虚拟机中可以看到一个CPU,核心数为一,线程数为一:

CPU

 

实例二. -smp 2,cores=1,threads=1,sockets=2

在虚拟服务器中可以看到有两个CPU,每个CPU拥有一个核心,每个核心拥有一个线程:

cpu-2-1 cpu-2-2

实例三. -smp 16,cores=2,threads=2,sockets=4

在服务器中可以看到共有四个CPU,每个CPU拥有两个核心,每个CPU核心拥有两个线程,也就是每个CPU拥有四个线程:

cpu-3-1 cpu-3-2 cpu-3-3 cpu-3-4

 

那么,我要让Windows Server 2003的虚拟服务器能使用八个vcpu,只要控制socket的值小于等于4,且大于等于1就可以了:

这样虚拟服务器里面就可以看到一个CPU,每个CPU拥有八个个核心,每个核心拥有一个线程。

在LIBVIRT中的设置方法

相信大家也用LIBVIRT管理虚拟服务器,根据LIBVIRT的官方文档,有两个是控制-smp参数的。

控制vcpu的数量,也就是-smp的n的值:

控制sockets, cores, threads的值:

要让Windows Server 2003的虚拟服务器拥有一个八核八线程的CPU,LIBVIRT的XML配置文件的相关内容应该如下:

 

OpenWRT之中兴认证(东莞理工学院城市学院校园网)

学校校园网使用的是中兴认证,刚开学几天,纠结如何使用路由器共享网络,使用手机探讨一番,找到一个广科高人完善的Linux客户端

测试多天,经完善使用方法,分享至此。

最近一段时间比较热门的路由器是MT7620A方案(如newifi, 极路由),MIPSEL架构,本文就以此架构为例,展开教程。

 

准备:

  1. 可以使用OpenWRT的路由器一个
  2. 一个安装了Linux(我用Ubuntu Desktop 14.04 64Bit)的虚拟机(物理机也行呀)
  3. 待补充

1. 路由器刷入OpenWRT系统
推荐PandoraBox,有商业驱动。

OpenWRT的默认用户名为root,密码为空,密码为空的状态下需要使用Telnet协议连接,PandoraBox的默认用户名为root,密码为admin,可以用OpenSSH连接。

2. 取得交叉编译的工具链(并非在路由器上操作)

各种工具链可以从OpenWRT下载区域取得。

本文使用PandoraBox的工具链: http://downloads.openwrt.org.cn/PandoraBox/PandoraBox-Toolchain-ralink-for-mipsel_24kec%2bdsp-gcc-4.8-linaro_uClibc-0.9.33.2.tar.bz2

下载工具链并解包至/home目录:

Download Toolchain

如果你要自行编译,记得在make menuconfig时选上”Build the OpenWrt SDK”(一般情况下不需要自行编译,所以请无视此处)。

Package the OpenWrt-based Toolchain

编译完毕后会把工具链打包,解包即可使用。

3. 交叉编译libpcap(并非在路由器上操作)

中兴认证客户端使用了libpcap,因此需要编译一个适用于MIPSEL架构的libpcap。

先安装所需的包:

下载libpcap的源码并进入libpcap源码目录:

进行编译设置,指定使用Toolchian中的gcc与g++,安装到Toolchian的目录:

开始编译:

安装:

3. 交叉编译中兴认证Linux客户端(并非在路由器上操作)

先安装编译中兴认证Linux客户端所需的包:

进入/usr/src目录,下载中兴认证客户端的源码并进入Linux客户端的源码目录:

指定使用Toolchian中的gcc与g++,开始编译:

如果一切正常,在当前目录下会出现一个文件名为zte-client的文件:

zte-client

这个就是我们需要的,把它传送到路由器上,一般使用scp(如果你的root密码还是为空,那恐怕用不了scp了,改密码吧):

4. 对路由器进行设置(在路由器上进行操作)

登录进路由器,首先确定哪一个是WAN接口:

 

找到如图的字样,option ifname后面就是WAN接口的名称(不包括引号):

WAN

安装bash, curl:

保存以下内容至/usr/bin/enet:

赋予所有用户对/usr/bin/enet文件的执行权限:

编辑/etc/rc.local,加入以下两行命令:

 

5. 进行测试

在路由器上执行enet,可以看到一些信息,如果看到如下字样,就代表联网成功了:

这时可以尝试打开网页。

一切顺利的话,按Ctrl+C退出enet,然后让enet在后台运行:

『T.S. 89』两个晚来的提高大麦网购票成功率的方法

QQ在线人数统计及其分布图

大家可以看到,那个小亮点数目最多的,最亮的省,是广东省,尤其是珠三角地区!
所以在此提出一个猜测:
在大麦网购票失败的人当中,在广东省购票的人占的比例最大。

也许你会说广东省人多,那购票的人当中,广东省的人所占的比例自然就多,购票失败的广东人占购票失败的人的比例也会多,但你有没有想过为什么呢?

对于大麦网这种网站,要同时应付N多人访问,且保证速度,服务器仅有一台,或仅在一个地区,是不可能的,服务器是分布式的,才能为如此多的访客提供服务(证据:http://www.17ce.com/site/http/201507_a97522b8b50b05c4f2e18c9e579cf1ee.html)。使用分布式服务器,或者CDN,为了能让不同地区的访客均能以最快的速度访问到他们的网站,就要使用NS服务器智能地根据访客的IP给访客返回不同的IP地址(一般是离访客最近的,且ISP相同的)。
由于广东省人多,那同时使用分配给了广东省的服务器的人就多,人多了,服务器就不堪重负,出现拒绝服务的情况,访问人数相对较少的服务器,服务器相对比较空闲,可能仍然有余力处理大量订单。
当然这只是他们的一部分服务器,他们处理订票数据的服务器具体如何部署我不太清楚,但不排除也是分布式的。

所以,下次想提高购票的成功率,访问一个访问人数相对较少的服务器是关键。
想知道哪里人数少,可以使用QQ的在线图作为参考:http://im.qq.com/,点击右上角的“当前在线人数……”。
接下来使用分布式测速服务,例如上面的17ce,还有webkaka,360的。
以上面17ce的测试结果为例,从解析IP所在地字段可以找到许多个省份的服务器,选一个QQ在线图中较暗的省(西藏你不用考虑,因为我目前没见过有公开销售那边的服务器的IDC,所以大麦网使用那边服务器的可能性极低),且要在测试结果的解析IP所在地字段中有该省。

这里我选了黑龙江(选哪个省根据具体情况而定,你不一定要选黑龙江),可以看到有这个服务器:
联通:218.7.220.59

这个省在17ce仅找到了ISP为联通的,可能有些省有多个ISP,不一定要选和你同ISP的,选择同ISP只是可以确保延迟较低,但一般是几个路由,数十毫秒的差距,一般认为南方使用电信的人较多,北方使用联通的人较多,实际使用比例是否如此我就没统计过啦。
接下来编辑hosts文件。
我知道很多人不知道hosts文件是什么,可以点击开始->运行,Windows下输入:

这样就会使用记事本打开hosts文件。
Linux或Unix(Mac OS)的hosts文件在/etc/hosts,自行选择喜欢的编辑器,我喜欢vim,当然你得有root权限。
在末尾新建一行,写入记录(Windows, Linux, Unix均如此):

如图:

hosts

然后保存。由于DNS查询,默认是hosts文件优先(除非你自己改了优先级),因此我们系统获取到shopping.damai.cn的IP将会是218.7.220.59。
验证方法,使用Windows的,在运行的编辑框中输入:

按确定
使用Linux, Unix的,在终端中输入:

按Enter
如果你会nslookup,也可以使用nslookup。
你就可以看到相应的IP,如图:

ping

之后,你访问shopping.damai.cn,就会使用位于黑龙江的服务器。

也许有人留意到了,大麦网有海外的服务器,会不会海外的服务器更少人访问?
这个我是无法确定的,不排除大麦网让所有海外服务器共同使用一个处理订票数据的服务器,甚至该服务器还与国内一个或多个省共用。

毕竟实践是检验真理的唯一标准,因为我没经过测试,只是根据我的理论给出的方案,所以我不敢肯定此方法一定有效。

不过嘛,试试也无妨。

接下来给出另一个方案。
先看看这个图(大家不要生气,我没成功购票,可能是因为我在广东省的原因吧):

Taylor Swift

相信一部分当时盯着大麦网Taylor Swift 1989演唱会的购票页面的人会好奇,为什么倒计时还在进行,我却可以选票,立即预定按钮还出来了?

其实那个日期选择,价格选择,是通过CSS样式禁用了,“您选择了……”,和立即预定按钮,是通过CSS样式隐藏了。
我们可以通过Chrome浏览器的审查元素功能(很多浏览器都有这个功能),修改HTML元素的类,实现更改样式的目的。

找了一会儿,找到一个还没开始售票的项目:http://item.damai.cn/85215.html
我这里就以此项目为例,首先使用Chrome访问该网页。
大家可以发现此页面的时间,票的价格是无法选择的,且“您选择了……”,和立即预定按钮也无法查看到。
把鼠标移动到”2015.07.25 周六 18:00″上,按鼠标右键,点击审查元素,接下来浏览器会弹出一个审查元素的框,并且自动定位到此处的HTML代码,往上数行,可以找到一行的内容为:

如图画红框的位置:

日期选择

编辑此行(可以先用鼠标左键单击此行,此行会变蓝色,再按F2,就会进入编辑状态,或者按右键,选“Edit as HTML”),把:

修改成:

接下来利用相同的方法,定位到价格选择处的代码,不管你是不是要买最便宜的那张票,都给我定位到最便宜的那张票的代码(其实我是想方便你找代码而已),往上数行,找到代码:

如图画红框的位置:

价格选择-1

把:

修改为:

接下来,你可以定位到你要选购的票的面值的HTML代码,如780,往上数行,找到代码:

如图画红框的位置:

价格选择-2

把:

修改为:

不管你是否要选购最贵的一张票,你都给我定位到最贵的一张票的代码处,往下数行,找到代码:

如图画红框的位置:

立即预定

把:

修改为:

到这里,大功告成,可以看到页面已发生了变化:

结果

选择好日期,价格,最后你要做的就是等倒计时结束,就像这图:

Taylor Swift

​别想着你已经选择好了日期以及价格,就可以点击立即预定按钮提交,然后付款购票。
这样只是为了能让你节省一两秒选择日期和价格的时间,还有那该死的Javascript去显示“您选择了……”。

那天我购票仅使用了第二个方法,但提交过去,返回的只是500错误,也许是我没使用第一个方法的缘故吧……

已经确定Taylor Swift要在上海加一场演唱会,如果通过审核,希望这两个方法可以协助各位成功购票。

难得高三毕业了,想去看Taylor Swift的演唱会,却买不到最便宜的票。虽然后面有掉出价格高的,但是学生没那么多钱,广东到上海,路费也不少……

OpenSSH Server & FreeRadius Server Authenticate via Lightweight Directory Access Protocol

安装并配置LDAP Server

apt-get update && apt-get -y install slapd ldap-utils

输入LDAP Server的管理员密码(共两次):


 

重新配置LDAP:

dpkg-reconfigure slapd

 

Omit OpenLDAP server configuration? : no

DNS domain name: domain.com


 

NOTE:此处输入的DNS domain将会作为你的基础搜索区分名称(Base DN)。以”.”为分割符,每个”.”都是一个dc。

举个例子:你输入了domain.com,那么你的Base DN就是dc=domain,dc=com,如果输入了hello.world.com,那么你的Base DN就是dc=hello,dc=world,dc=com。

 

Organization name: domain.com

Administrator password:

NOTE:此处输入的管理员密码将会覆盖安装时输入的密码。

Database backend to use: HDB

Do you want the database to be removed when slapd is purged?: No

Move old database?: Yes

Allow LDAPv2 protocol?: No

安装并配置完毕后,会自动创建管理员账号(Bind DN),默认为cn=admin,你的Base DN。

添加Organizational Units(下文简称OU)

此处以分别使用CLI模式添加名称分别为users与groups的OU。

 

保存以下内容到一个文件,例如usersandgroups.ldif:

 

 

NOTE:dn为此Organizational Units的区分名,简单理解成路径,只不过这个路径是从你要找的文件名开始。例如这里的dn: ou=groups,dc=domain,dc=com,则代表groups这个在dc=domain,dc=com这个Base DN的中。再举一个例子:dn: ou=second,ou=first,dc=domain,dc=com,代表second这个OU位于dc=domain,dc=com这个Base DN的first OU中。

 

使用ldapadd添加:

ldapadd -D “cn=admin,dc=domain,dc=com” -xw管理员密码 -f文件名

 

NOTE:-D后面接的是你的管理员账号。

 

看到类似提示:

adding new entry “ou=groups,dc=domain,dc=com”

 

adding new entry “ou=users,dc=domain,dc=com”

则代表添加成功。

可以使用ldapsearch查看:

ldapsearch -x -b “你的Base DN”

 

添加用户与用户组的记录

此处分别使用CLI添加类型为posixGroup的用户组与posixAccount的用户。

保存以下内容到文件,例如newuserandgroup.ldif(请自行修改dn)

 

 

NOTE:有关dn的,前文已做解释,此处不说。cn是该记录在LDAP中的名称,gidNumber是用户组id,memberUid是用户组的名称,givenName是名字,sn是姓,gidNumber是用户要加入的用户组的id,homeDirectory是用户的家目录,loginShell是用户登录入系统时使用的Shell,uidNumber是用户的uid,uid是用户的用户名,userPassword是用户的密码。

 

同样的,使用ldapadd添加记录:

ldapadd -D “你的Base DN” -xw管理员密码 -f文件名

 

Linux使用LDAP作登录验证

安装验证使用的PAM模块,nss模块,以及nscd:

apt-get -y install libnss-ldap libpam-ldap nscd

 

LDAP server Uniform Resource Identifier: ldap://localhost/

NOTE: 一定要把ldapi:///改成ldap://,再输入LDAP Server的IP。

 


 

Distinguished name of the search base: dc=domain,dc=com

NOTE:此处输入你的Base DN。

 

 

LDAP version to use: 3

Make local root Database admin: Yes

Does the LDAP database require login?: No

LDAP account for root: cn=admin,dc=domain,dc=com

NOTE:此处输入你的Bind DN。

LDAP root account password:

 

修改/etc/nsswitch.conf文件,在passwd,group,shadow开头的三行末尾的compat前加入ldap,并以空格与compat分开:


 

修改/etc/pam.d/common-session文件,在末尾加入此行:

 


 

重启nscd:

service nscd restart

 

最后使用已在LDAP Server添加的账号记录登录此系统:

ssh newuser@localhost

 


 

 

 

Freeradius使用LDAP作验证

此处将会启用Freeradius的LDAP模块。

 

NOTE:开始下面步骤前,建议你使用http://soft.yzs.me/freeradius.sh安装FreeRadius Server

 

首先安装freeradius-ldap:

apt-get -y install freeradius-ldap

编辑/etc/freeradius/modules/ldap文件,把server等于号后面的内容改为你的LDAP Server IP,去掉identity前面的”#”,把等于号后面的内容改为你的Bind DN,去掉password前面的”#”,把等于号后面的内容改为你的LDAP Server的管理员密码,把basedn等于号后面的内容更改为你的Base DN,最后去掉password_attribute开头的”#”。

 

修改完毕后的内容应该如下(已去除被注释的行)

 

修改/etc/freeradius/sites-available/default文件。


authorize {

此处内容省略

}

的”{“与”}”之间加入一行:ldap。


authenticate {

此处内容省略

}

的”{“与”}”之间加入下面内容:

Auth-Type LDAP {

ldap

}

 

如果使用http://soft.yzs.me/freeradius.sh安装FreeRadius Server,则修改完毕后/etc/freeradius/sites-available/default文件的内容一般如下:

 

 

重启Freeradius:

service freeradius restart

 

最后使用radtest,对已在LDAP Server添加的用户记录进行测试:

radtest newuser newuser localhost 0 testing123

 

如果返回的内容有Access-Accept,则代表验证成功:

Sending Access-Request of id 27 to 127.0.0.1 port 1812

User-Name = “newuser”

User-Password = “newuser”

NAS-IP-Address = 208.51.63.112

NAS-Port = 0

rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=27, length=20

 

教程到此完毕,感谢阅读。

云雾互联以及微宇宙的管理员——Extreme制作。

 

QQ:865475185

Email:e@yzs.me

 

除非另有声明,本文档内容采用知识共享署名-非商业性使用-相同方式共享授权。

Android&Data to SD Card——理论编

相信每个使用Android的用户,都会安装各种APP,随时APP数量的增多,数据量的增加,data分区的可用空间越来越少,到最后安装APP时提示“储存空间不足”……

为了应付此问题,Android增加了APP2SD功能,但此功能是一个鸡肋……

对此,有人开发了LINK2SD,在SD卡上创建EXT分区,把已安装的应用均移动到SD卡的EXT分区中,并在内部储存的/data中创建对应文件的软链接,但LINK2SD依赖于zygote,也就是说需要在Android启动后才能启动LINK2SD挂载EXT分区。当年在联想A790E上使用该程序,每次启动系统,因为EXT分区未被挂载,所有软连接都变成了“坏链接”,导致Android自动重新安装所有APP……

相信各位的SD卡的容量都不会比内部存储小,既然SD卡比内部存储大,我们为何不考虑把整个/data(甚至是整个Android)放到SD卡上?

要知道如何把/data存放到SD卡上,我们首先要了解一下Android是如何挂载分区的:

我们按下电源键后,Android会根据Bootloader,加载内核。

Android内核会把物理内存以RAMDISK的方式,挂载到/,接着,内核会释放已被打包的文件至/,其中包括init, init.rc, init.*.rc, fstab.*等。

Android内核执行init这个二进制文件,init文件会运行init.rc,init.rc会根据fstab.*的内容,挂载system, data分区。

接下来的不在本文讨论范围内,省略……

看了上述的启动步骤,相信你已经大概了解DATA TO SD的方法了,没错,就是从fstab.*下手!

要更改fstab.*,意味着我们需要修改内核释放到RAMDISK的文件。

我们先来了解一下Android内核以及其释放到RAMDISK的文件的存在形式。

解包过Android固件的,相信都会留意到有一个boot.img文件,这个是内核吗?

准确来说不是,这是多个文件打包而成的,这些文件当中,内核,释放到RAMDISK的文件也是属于这些被打包的文件:

 

 

boot.img unpackage

 

boot.img-ramdisk.gz中包含了被释放到RAMDISK当中的文件,这些文件先被cpio打包,再被gzip压缩。

boot.img-zImage就是我们Android的内核,已被gzip压缩。

至于其他文件,我本人也不太了解具体用途,各位可通过搜索引擎了解。

解包RAMDISK,可以查看到类似的文件:

boot.img ramdisk unpackage

 

其中fstab.*就是我们要修改的文件,该文件包含了system, data的挂载信息,以我的华为C8813Q为例:

里面的内容表示把内部存储的第十二个分区挂载到/system,把内部存储的第十三个分区挂载到/data。

我们需在该文件中把内部存储的设备文件改成我们SD卡EXT分区的设备文件(一般是/dev/block/mmcblk1p[0-9]+)。

以为这样就完成了?No!

有些RAMDISK文件并不采用fstab.*的挂载信息,而是通过init.*.rc完成分区的挂载。

华为C8813Q就是这种货,事实上你不需要更改fstab.*当中的内容(我就被华为C8813Q坑了 d22 )。

华为C8813Q,在init.msm7627a.rc的第九行,第四十五行,第六是六行,分别挂载了/cache,/system,/data。

要更改被挂载的设备文件,我们修改init.msm7627a.rc即可。

修改完毕,确认无误后,重新打包为boot.img,并写入相应的分区(华为C8813Q是内部存储的第十二个分区)。

下次启动Android时,init就会根据你的设置,把SD卡的EXT分区挂载到/data,甚至是/system。

下面两张是我在2014年12月07日至2014年12月13日期间把CM 11以及DATA均存放到SD卡的图:

1418363999131 1418364056151

 

各位可以在第二张图查看到,SD卡的第三个,第四个分区分别被挂载到了/system, /data。

2014年12月14日至2014年12月20日期间,也就是使用600X的图:

1419261215032

1419260560984

1419260845074

 

由于本人要上学,高三期间一周仅有周日半天多一点的时间在家,因此不便发完整的教程,先分享理论编,完整教程计划于元旦假期分享。

 

最后来分享一下我的探讨Android&Data to SD Card部分过程,以及体验(要上学,住宿,而且高三,周日才放学,所以七天为一个周期):

2014年12月07日至2014年12月13日:

使用Class 10的SD卡。

研究并尝试DATA TO SD CARD,首先是把Emotion UI的DATA更改为SD卡的EXT分区,Android的启动速度比使用内部存储作为DATA慢了数秒,输入法首次加载需要数秒,但后续的使用影响不大,可以接受。

尝试ANDROID&DATA TO SD CARD,把CM 11安装到了SD卡,并成功启动,至于流畅度嘛,惨不忍睹……

 

2014年12月14日至2014年12月20日:

购买了一张600X,号称90 MB/s的读取速度。

老实说我对dd与hdparm的测试结果有点失望。

再次把CM 11安装到了SD卡(600X的),并成功启动,To my surprise!首次启动居然比使用内部存储还快,使用过程中丝毫没因IO而造成卡顿。