搞过内核开发的人都知道,内核调试是个脑力活,也是个体力活,因为底层的内核开发和应用程序开发有着较大的差别。应用程序的开发在操作系统之上,有许多优 秀的IDE供我们选择,从而能够非常方便进行调试;而内核级的开发则不一样,操作系统的内核调试器除完成一般的调试功能外,还必须工作在内核中。在 Linux中,内核调试方法有多种,可以在内核中插入printk()函数来调试分析,可以使用/proc文件系统对内核进行分析,也可以使用kgdb进 行内核源代码级的调试。本文将介绍如何使用VirtualBox 3.0.12 + RHEL 5 + KGDB的方式调试Linux内核(在一台主机运行RHEL 5,用VirtualBox 3.0.12虚拟两个RHEL 5代替两台机器,并在两台虚拟机上配置KGDB来进行内核的调试)。
kgdb提供了一种使用gdb调试Linux内核的机制。使用kgdb调试内核需要准备两台机器,一台作为开发机(用来远程查看内核信息并调试内核),另一台作为目标机(跑有要调试的内核), 并通过串口将它们连接起来。在2.6.26以前的Linux内核中使用kgdb需要打上补丁,而在2.6.26及以后的内核里已经加入了对kgdb的支 持。当kgdb内核调试环境搭好后,目标机上运行的是打了kgdb补丁的Linux内核,而开发机上运行gdb,gdb通过串口与要调试的内核进行通信, 对目标机上的内核进行控制,从而实现远程对内核的调试。
首先从http://www.virtualbox.org下 载for RHEL5的VirtualBox,目前的最新版本是VirtualBox 3.0.12。装上VirtualBox后,就可以虚拟出两个RHEL 5虚拟机来代替两台机器了。当然我们也可以使用VirtualBox的clone功能,如果第一台虚拟机的文件名为rhel1.vdi,可使用命令VBoxManage clonevdi rhel1.vdi rhel2.vdi命令迅速克隆出另一台虚拟机。我们将一台虚拟机用作目标机,另一台用作开发机。
我 们可以利用主机的命名管道来完成两台虚拟机间的通信。一台虚拟机在主机中创建命名管道并将其串口与管道相连,另外一台虚拟机也将自己的串口连接到主机的命 名管道上,这样就实现了两个虚拟机串口的连接。两台虚拟机都使用自己的COM1端口,主机的命名管道同为/tmp/vbox,在配置时由一台虚拟机创建, 另一台则不创建。我们可使用以下的方式来测试两虚拟机的串口是否连接成功:
(1)首先启动创建管道的虚拟机,再启动另一台虚拟机,然后使用命令stty ispeed 115200 ospeed 115200 -F /dev/ttyS0将各自COM1端口的输入输出波特率都设为115200。
(2)在其中一台虚拟机v1终 ... (全文...)



今天我被汪总正式提升为整个CA Program的Tech Lead,这意味着我作为intern在Sun CA Program已经爬到了顶峰。这个有点珊珊来迟的头衔也算是对我两年来在Sun工作的承认和鼓励。

Program仍在继续,希望Sun和Oracle能最终联姻成功,也希望我们的项目能在新的环境下继续存在并发展壮大。



10月28日,一年一度的虚拟化用户大会在北京隆重举行。该大会是VMware全球客户活动的重要组成部分,是VMware 中国举办的第三届虚拟化用户大会。大会以"秉云之势,承虚而入"为主题,秉承创新的理念,主要阐述"借助虚拟化技术和云计算推动企业成功"的观点,吸引了2000多名用户、合作伙伴及EMC、IBM、Intel、HP、Cisco等赞助商的参与。

大会展示了VMware从桌面到数据中心及云计算虚拟化解决方案的创新理念,详尽地描绘了其完整的云计算策略和虚拟化路线,诠释了下一代虚拟化功能和产品的发展方向。

大会上频频提出虚拟化融合的概念,它不仅仅是服务器的整合,还包括将服务器虚拟化、存储虚拟化和网络虚拟化融合在一起,形成一个统一的整体。为适应不断变化的业务需求,未来的数据中心也将是动态的、融合的。

近来,NetApp这家业界领先的创新性存储和数据管理解决方案提供商,也向外界公开了其云计算战略,并发布了Data ONTAP 8及其它最新的技术解决方案。同时,NetAPP、Cisco和VMware三大公司也联合推出了虚拟化动态数据中心解决方案,从而允许虚拟服务器、以太网、应用和数据网络支持以尽可能有效的方式展开协作。

Oracle公司也推出了其最新版的Oracle服务器虚拟化软件Oracle VM 2.2。它具有基于Xen的最新业界标准管理程序Xen 3.4,可使运行在基于英特尔微型架构的英特尔至强5500系列处理器(代码Nehalem)及6核AMD皓龙处理器的客户系统的性能得到大幅度提升。同时,它还实现了Oracle VM与Virtual Iron技术的首次集成,从而使客户能够非常容易地将Virtual Iron虚拟机迁移到Oracle VM上。这样,客户就可以加速部署并简化企业应用的管理,以最环保和最高效的方式运行数据中心。

此外,Sun、IBM、HP、Cisco等公司也在继续开发和完善着自己的虚拟化解决方案,虚拟化领域的群雄争霸局面已经形成。



第2届“谋智”杯Firefox火狐校园版浏览器全国高校挑战赛暨“谋智杯”火狐皮肤校园设计大赛正在火热进行中,为了让更多的学生能够了解Firefox浏览器并加入到大赛中来,我们华中科技大学酒店的住宅区、成年人的游乐场与难得的免费公园。将它们贯通的则是曲折的街巷,用铅笔在城市地图上标出,它们就构成一联合武汉大学于10月29日举办了一场技术活动,效果良好。

活动的安排如下:

19:30-20:30 NetBeans 6.7新特性及如何使用NetBeans进行Firefox开发    蒋海鸥

20:30-21:30 Firefox优良特性、XUL技术简介及答疑                                          龚文茂

21:30-22:00 Sun SPOT and demos                                                                           曹祺

22:00-22:30 Q&A

3

2

1



Jython是什么?

 维基百科:Jython程序可以和Java无缝集成。除了一些标准模块,Jython使用Java的模块。Jython几乎拥有标准的Python中不依赖于C语言的全部模块。比如,Jython的用户界面将使用SwingAWT或者SWT。 Jython可以被动态或静态地编译成Java字节码

Jython还包括jythonc,一个将Python代码转换成Java代码的编译器。这意味着Python程序员能够将自己用Python代码写的类库用在Java程序里。

可见,Jython是Python和Java的综合体,能直接运行于JVM之一。本文将介绍如何使用NetBeans 6.7进行Jython程序的开发。

 

首先需要安装NetBeans 6.7,下载地址为http://www.netbeans.org;打开NetBeans,在工具里选择插件,可用插件里可以搜索到python和jython,选中后点击安装即可。

插件安装成功后,会在工具菜单下生成Python Platforms的子菜单项,点击该菜单项,如果像图一这样拥有Jython或Python平台,则说明安装成功。

图一 Python Platform Manager

接下来就可以创建属于自己的工程了,选择文件 > 新建工程,进入以下用户界面,如图二所示:

图二 新建工程

本文用一个FeedReader工程作为Example,通过一个feedreader.py的jython程序来读取rss配置文件的内容,如图三所示:

图三 FeedReader Project

该jython程序的代码如下:

 

from java.net import URL

from java.lang import Exception

from java.lang import Object

from com.sun.syndication.io import SyndFeedInput

from com.sun.syndication.io import XmlReader

 

 

class FeedReader(Object): ... (全文...)



如果你正在使用ZFS作为根文件系统,你就能利用其snapshot快照机制迅速克隆出相同配置的domain。通过对其根磁盘分区进行克隆,你就能轻松地得到多个相似的domain,而它们的主要差别仅仅是使用的存储空间不同而已。本文将介绍如何利用ZFS的clone技术来创建新的 domain。

首先,我们需要关闭正在运行的domain才能进行克隆,以保持硬盘快照的一致性,命令如下:
xm shutdown -w dom1
当然,你也可以在domain中运行sys-unconfig命令使新的克隆从重新配置开始。
完成以上操作后,我们就可以使用命令zfs snapshot pool/dom1-root@clone
为dom1的根磁盘分区创建一个快照了,再使用命令zfs clone pool/dom1-root@clone pool/dom2-root来克隆一个可写的snapshot快照。
这时如果你使用zfs list命令,应该能看见新创建的snapshot及clone。接下来,我们需要复制dom1的配置文件。使用如下命令将配置文件copy到一个新的文件:
virsh dumpxml domain1 >domain1.xml
cp domain1.xml domain2.xml
对copy的配置文件,至少需要作三处改变。
首先,你需要为克隆的domain重命名,若想命名为dom2,则将<name>dom1</name>更改为<name>dom2</name>即可;
其次,你需要删除UUID这一行,从而让virsh为domain生成一个新的配置文件。删除的部分如下:
<uuid>78cd98b5e7ab16594fa0cf1260826571</uuid>
接下来,我们需要为domain指定新的磁盘分区:
<source dev='/dev/zvol/dsk/export/dom1-root'/>更改为<source dev='/dev/zvol/dsk/export/dom2-root'/>
最后,告诉virsh新domain的存在。
virsh define domain2.xml
这时候,你就可以启动自己克隆的domain了。



Xen是由剑桥大学开发的一个开放源代码的虚拟机管理器,是目前世界上最流行的虚拟机管理器之一,在《Virtualization:Xen and xVM Server》一文中有关于Xen和xVM Server的介绍。Sun公司也推出了自己基于Xen的虚拟化项目xVM,其最根本的区别就是Xen以Linux作为Dom0,而xVM以Solaris或OpenSolaris作为Dom0.本文将介绍如何将Solaris或OpenSolaris配置成xVM的Dom0。

在Solaris 10里已经集成了xVM项目,当你完整安装Solaris 10后,在grub启动时会发现有一个xVM的启动项,这时选择该启动项后Solaris 10就以Dom0的形式运行了。
在OpenSolaris下则需要安装相应的软件包并进行配置,具体过程如下:
如果你的OpenSolaris是build 126或者更新的版本,激活xVM只需要以下几条命令即可:
$ pfexec pkg install xvm-gui
$ pfexec svcadm enable milestone/xvm
$ pfexec reboot

如果是老版本的OpenSolaris,整个安装及配置过程就相对复杂一些。
首先使用命令beadm create -a -d xvm xvm创建一个独立的环境;
接着安装一些相应的软件包,命令如下:
$ pfexec beadm mount xvm /tmp/xvm-be
$ pfexec pkg -R /tmp/xvm-be install SUNWvirt-manager SUNWxvm SUNWvdisk SUNWvncviewer
$ pfexec beadm umount xvm

然后就是对menu.lst文件的修改了,步骤如下:
1.对menu.lst文件运行如下的AWK脚本
$ awk '
/^title/ { xvm=0; }
/^title.xvm$/ { xvm=1; }
/^(splashimage|foreground|background)/ {
if (xvm == 1) next
}
/^kernel\$/ {
if (xvm == 1) {
print("kernel\$ /boot/\$ISADIR/xen.gz")
sub("^kernel\\$", "module$")
gsub("console=graphics", "console=text")
gsub("i86pc", "i86xpv")
$2=$2 " " $2
}
}
{ print }' /rpool/boot/grub/menu.lst >/var/tmp/menu.lst.xvm
2.检查该AWK脚本是否运行正常
$ tail /var/tmp/menu.lst.xvm
#============ End of LIBBE entry =============
title xvm
findroot (pool_rpool,0,a)
bootfs rpool/ROOT/xvm
kernel$ /boot/$ISADIR/xen.gz
module$ /platform/i86xpv/kernel/$ISADIR/unix /platform/i86xpv/kernel/$ISADIR/unix -B $ZFS-BOOTFS,console=text
module$ /platform/i86pc/$ISADIR/boot_archive
#============ End of LIBBE entry =============

3.替换menu.lst文件并重启
$ pfexec cp /rpool/boot/grub/menu.lst /rpool/boot/grub/menu.lst.saved
$ pfexec mv /var/tmp/menu.lst.xvm /rpool/boot/grub/menu.lst
$ pfexec reboot

最后使用命令svcadm enable -r xvm/virtd ; svcadm enable -r xvm/domains启动服务后就能在OpenSolaris上安装并启动新的虚拟机了。



如果dtrace和mdb这些工具运行在OpenSolaris全局zone中,那么这些工具对运行在跑有Solaris 10的zone中的进程来说是无用的,主要是因为Solaris 10和OpenSolaris之间部分调试库的一些不兼容的改变,导致Solaris 10不能作为OpenSolaris的zone正常地运行。同时,由于新版本的OpenSolaris加入了Crossbow等许多非常优秀的特性,让运 行Solaris 10的zone能充分利用OpenSolaris作为全局zone的众多优势,也是非常有必要的。本文将介绍如何解决在OpenSolaris上正常运行 跑有Solaris 10的zone这个技术难题。
解决这个问题最大的难点之一,就是x86平台下Solaris 10的libc对%fs段寄存器的使用。Solaris 10的libc希望X86平台64位处理器的%fs寄存器来存储非0的selector值(如果%fs值为0,那么Solaris 10的_curthread()返回NULL),问题也由此产生了,由于OpenSolaris的内核清空了%fs,而在64位的x86机器上,libc 总是使用%fs来查找当前线程的ulwp_t数据结构,从而使运行Solaris 10的zone不能使用libdoor这些普通的类库和thr_main(3C)等关键libc函数。

整个解决方案比较复杂,因为必须保证在Solaris 10 zone中运行的所有线程开始运行时%fs寄存器的值非零。幸运的是,在Solaris 10和OpenSolaris中只有两个系统调用修改了%fs:SYS_lwp_private和SYS_lwp_create。 SYS_lwp_private是一个libc私有的系统调用,只有在一个进程执行后libc初始化时才被调用一次,用来配置FS段使其段基址在单一线程 ulwp_t结构的开始处。

具体过程如下:

1. Solaris 10的仿真库在s10_lwp_private()实现SYS_lwp_private,它把系统调用传到未改变的OpenSolaris内核,然后调用 thr_main(3C)来测试Solaris10环境下的libc在内核配置%fs后是否运行正常。如果返回-1,那么将调用一个特殊的 SYS_brand系统调用将%fs还原到过去的非零状态。

2. Solaris 10的仿真库在s10_lwp_create()中实现SYS_lwp_create,使得新的线程在 s10_lwp_create_entry_point()而不是在_thrp_setup()中启动。当然,新的线程最终还是必须执行 _thrp_setup(),所以s10_lwp_create()在新线程栈中的预定位置保存_thrp_setup()的地址。 s10_lwp_create_entry_point()调用thr_main(3C)测试当%fs为零时Solaris 10的libc运行是否正常。如果thr_main(3C)返回-1,那么新的线程将调用和s10_lwp_private()一样的SYS_brand 系统调用来恢复%fs。然后,新的线程再从栈中的预定位置读取真正的入口点地址并跳转到入口点。
3. 在运行Solaris 10的zone里保证fork产生的子线程继承其父线程的%fs selector值,从而使父线程即使在调整%fs寄存器后也能保持父子线程的一致性。
4. 同时,还需要考虑对SIGCANCEL等信号的处理,以防止段错误的出现。