博文

目前显示的是标签为“Linux Skills”的博文

通过简单的例子,学习systemtap

看例子先!  怎样遍历数组: 1.  # 2.  # Print the system call count by process name in descending order. 3.  # 4. 5.  global syscalls 6. 7.  probe begin { 8.     print ("Collecting data... Type Ctrl-C to exit and display results\n") 9.  } 10. 11. probe syscall.* { 12.    syscalls[execname()]++ 13. } 14. 15. probe end { 16.    printf ("%-10s %-s\n", "#SysCalls", "Process Name") 17.    foreach (proc in syscalls-) 18.       printf("%-10d %-s\n", syscalls[proc], proc) 19. }   这中间,比较难理解的是第17行,那么它的解释如下: The variable proc is an index variable that iterates over the range of values possible for the array index of syscalls. Also note the en dash (-) after syscalls that denotes that the iteration runs in reverse order. This character ensures that the number of system calls made print in descending order. To print in ascending order, change the...

外网主机ssh和vnc访问内网主机

之前,孤陋寡闻,以为外网访问内网纯属扯淡!早上开shlug的邮件列表,看到这个thread。实验了一下,夷~,竟然可以。太棒了! 外网通过ssh访问内网的方法: $ ssh -f -N -R 7070: 127.0.0.1:22  外网主机用户名@外网主机ip $ ssh 内网主机用户名@ 127.0.0.1  -p 7070 原理:将外网7070的端口映射到内网主机的22端口 外网通过VNC访问内网的方法: 同ssh访问的方法一样,我们还可以使用VNC服务: 在内网主机上安装好VNC,然后,开启一个session(默认的端口是从5900开始的) 在内网主机操作: $vnc4server :1 $vnc4passwd //设定VNC连接密码 $ssh -f -N -R 1234: 127.0.0.1:5901  外网主机用户名@外网主机ip 好,已经将5901绑定到外网主机的1234端口了。 然后,操作外网主机: 在外网主机菜单Applications->Internet->Remote Desktop Viewer 选择VNC协议,填入 127.0.0.1:1234 然后, 会要求输入密码,就是内网主机通过vnc4passwd设定的密码了。 OK啦~

在ubuntu中通过ndiswrapper使用无线网卡

首先,科普一下ndiswrapper: NDISwrapper is a free software driver wrapper that enables the use of Windows XP drivers for network devices ( PCI cards , USB modems , and routers ), on Unix-like operating systems. NDISwrapper works by implementing the Windows kernel and NDIS APIs , and dynamically linking the Windows drivers to this implementation. It therefore works only on systems based on the architectures supported by Windows, namely IA-32 or x86-64 . 对于那些厂商提供Linux驱动的网络硬件,就不许要这个ndiswrapper啦。我使用的是NETGEAR,是老美生产的无线网卡,但不提共LINUX的驱动。具体型号是NETGEAR WNA3100,之前在Ubuntu10.10上,使用自编译的ndswripper,老连不上。但是使用debian可以。 今天,由于Debian老出问题,而且ubuntu10.10也推出了中国定制版,于是,便安装了Ubuntu。在图书馆,都使用无线的网络。因此,要安装包,必须先到xp下面下载后,在重启进入Ubuntu安装,相当麻烦。 由于NETWEAR官方没有出LINUX的驱动,因此需采用ndiswrapper这个工具来加载windows驱动。在ubuntu中,已经自带了ndiswrapper程序,位于/usr/sbin/ndiswrapper-1.9. 具体使用的方法,可以查看Help. 先ndiswrapper-1.9 -i bcmwlhigh5.inf.inf #安装windows driver. 然后ndiswrapper-1.9 -m #将配置信息写到modprobe中。 然后sudo modprobe ndiswrapper #将模块插入到KERNEL中。 这个时候,基本上就OK了...

ubuntu 10.10 安装systemtap 补充

前几天,看到yufeng的日志( http://blog.yufeng.info/archives/1098) 有介绍ubuntu10.10安装systemtap的方法,尝试并安装成功( http://haifeng-hust.blogspot.com/2011/03/ubuntu1010systemtap.html)。 但是这种方法安装出来的stap在pass3编译ko的时候经常出问题。因此利用deb包半手工安装。 在 http://ftp.debian.org/debian/pool/main/s/systemtap/ 的页面中有两个版本1.4.1和1.2.5.就目前10.10版本的ubuntu,安装1.4.1时依赖包libdw1需要1.4.9版本,但是对于deb包,最高的就是1.4.7版本。因此只要降低systemtap的版本。 由于在安装1.4.7的时候,没有安装成功,这时候,无论安装什么包都会提示sudo apt-get install -f,非常烦人。除去提示的方法就是用sudo dpkg -r 卸载刚才没有安装成功的包。 到 http://ftp.debian.org/debian/pool/main/s/systemtap/ 上面下载1.2.5版本的三个包systemtap-runtime systemtap-common systemtap.然后在安装systemtap1.2.5的时候,会发生libsqlite依赖包版本过低的问题。因此需要升级libsqlite,升级包地址请猛击: http://packages.debian.org/squeeze/i386/libsqlite3-0/download 然后安装之。这时候,就可以安装systemtap了。 然后测试: sudo tap -ve 'probe begin{printf("Hello world\n");exit();}' sudo tap -ve 'probe kernel.function("sys_open").return{printf("%s\n",execname());exit();}' 另外一个比较纠结的问题是,有时候会莫名其妙重启系统。另外,这个stap的版本较老,一些参数比如...

使用VNCServer

图片
通过VNCServer,可以远程使用桌面,而不用老是对着黑漆漆的tty。安装步骤如下: 安装vnc4server haifeng@Tek-life:~$ sudo apt-get install vnc4server 然后配置vncserver haifeng@Tek-life:~$ vim .vnc/xstartup 1 #!/bin/sh 2 3 # Uncomment the following two lines for normal desktop: 4 unset SESSION_MANAGER 5 # exec /etc/X11/xinit/xinitrc 6 7 #[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup 8 #[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources 9 xsetroot -solid grey 10 #vncconfig -iconic & 11 x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" & 12 exec /etc/X11/xinit/xinitrc 13 #x-window-manager & 14 #gnome-session & 好了,配置结束 创建密码 haifeng@Tek-life:~$ vncpasswd Password: Verify: 然后,开个VNC服务 haifeng@Tek-life:~$ vncserver :20 xauth: /var/run/gdm/auth-for-haifeng-OFLDyx/database not writable, changes will be ignored New 'Tek-life:20 (haifeng)' desktop is Tek-life:20 Starting applications specified in /home/haifeng/.vnc/xstartup Log file is /home/haifeng/.vnc/Tek-lif...

在ubuntu10.10中安装Systemtap

SystemTAP是个好东西。属于居家必备的工具之一。这两天安装了一下,其中还蛮折腾的。 安装步骤: sudo apt-get install systemtap Ubuntu Desktop默认没有安装kernel debug info的包,systemtap无法追踪内核信息。查看内核版本 haifeng@Tek-life:~$ uname -a Linux Tek-life 2.6.35-27-generic #48-Ubuntu SMP Tue Feb 22 20:25:29 UTC 2011 i686 GNU/Linux 从这里下载对应的kernel debug info包,安装 sudo dpkg -i linux-image-2.6.35-27-generic-dbgsym_2.6.35-27.48_i386.ddeb 至此内核追踪已经可以执行,但module的信息还需要多做些工作 sudo apt-get install elfutils 将以下内容保存为script.sh,并改变为可执行 1 #!/bin/bash 2 for file in `find /usr/lib/debug -name '*.ko' -print` 3 do 4 buildid=`eu-readelf -n $file| grep Build.ID: | awk '{print $3}'` 5 dir=`echo $buildid | cut -c1-2` 6 fn=`echo $buildid | cut -c3-` 7 rm -rf /usr/lib/debug/.build-id 8 mkdir -p /usr/lib/debug/.build-id/$dir 9 ln -s $file /usr/lib/debug/.build-id/$dir/$fn 10 ln -s $file /usr/lib/debug/.build-id/$dir/${fn}.debug 11 done 基本上就OK了。 测试: haifeng@Tek-life:~$ stap -l 'module("*").function("*...

用git管理源码

git管理源码,好处自不必说。学习git参考的是《pro git》。 该书的豆瓣链接:http://book.douban.com/subject/3420144/ 关于文件的修改: 如果,自己想添加新的文件。最好是,自己建立一个分支: git branch new-branch    //建立新的分支 git checkout new-branch //切换到新的分支下工作 这时候,可以添加或者修改文件。 注意,这个时候,该分支下新添加的文件与master分支是没有一点关系的。 另外,说一下git revert ,git reset --hard和 --soft的区别 git reset --mixed id ,是将git的HEAD变了(也就是提交记录变了),但文件并没有改变,(也就是working tree并没有改变)。 git reset --soft id. 实际上,是git reset --mixed id 后,又做了一次git add git reset --herd id.是将git的HEAD变了,文件也变了。 git revert与git reset最大的不同是,git revert 仅仅是撤销 某次 提交。 比如git revert HEAD~1  ,那么会撤销倒数第二次的提交结果。而倒数第一次的提交记录,仍然在。 如果git reset --hard HEAD~1,那么,commit退回到倒数第三次的状态中。 总体来讲,还是git revert 好啊,雁过留声嘛。 其实,通过git reset --soft id的方法,可以将原来多次的git提交记录合并为一个。 两个分支的合并:(分支也就是版本的意思) git pull . 分支1,  将分支1的变化提交到分支2。 在分支合并部分,不要用git merge 和 git push。容易出错。 另外,还有一种分支合并的方法是rebase。这种方法,更符合思维。 git checkout A1 git rebase master 过程是,找到将A1和master的共同commit点。A1 把自分叉以来的所有补丁都达到master上。相当于: git checkout master git pull . A1 ----or---- git checkout master git merge A1 关于查...

通过内核获取config文件

有两种方法,但前提是需要配置了,才能在编译好的内核中再获取config文件。貌似是一个蛋生鸡,鸡生蛋的纠结问题。 但,有时候,我们需要配置内核运行。因此,一般是需要获得一个既有的能跑的config文件。下面介绍的这两种获取config的方法就是用于此目的的。 首先,说一下方法: 法1.在运行的内核中的/proc/config.gz 保存的便是配置文件了 法2.通过/usr/src/linux/scripts/extract-ikconfig 脚本获得一个已经编译好的内核。 这两种方法的前提是,获取内核config的内核在编译的时候,下面的两项被选中了。 CONFIG_IKCONFIG This option enables the complete Linux kernel ".config" file contents to be saved in the kernel. It provides documentation of which kernel options are used in a running kernel or in an on-disk kernel. This information can be extracted from the kernel image file with the script scripts/extract-ikconfig and used as input to rebuild the current kernel or to build another kernel. It can also be extracted from a running kernel by reading /proc/config.gz if enabled (below). 如果这一项配置了,那么通过脚本extract-ikconfig获得config文件 CONFIG_IKCONFIG_PROC This option enables access to the kernel configuration file through /proc/config.gz. 如果这一项配置了,那么...

shell脚本后台执行的若干总结

命令后面直接加上&的幼儿园方法不讨论,因为解决不了问题。 shell关闭了,但仍然让脚本执行的方法: 1. nohup 就是忽略掉了父进程hungup信号,继续执行。默认是将脚本所有的输出,输出到了/dev/null或者 nohup.out. 2.用setsid的方法,让脚本的父进程设置为init,这样,关闭shell,脚本照样执行。但对于有输出的脚本程序就不行了,那么用什么方法捏?可以指定其标准输出和错误输出都到/dev/null中。 setsid python /opt/proxy/localproxy/proxy.py > /dev/null 2>&1 另外,搞清楚: command >/devnull 2>&1 与 command > /dev/null 2>/dev/null 其区别不解释. 对于xterm远程登录,可能掉线的情况,推荐方法是用screen.这样可以续上原来的session. screen的具体用法不解释。

ubuntu 9.10 network-server configure

删除网桥: ip link set br0 down brctl delbr br0 tftp服务器 sudo vi /etc/inetd.conf tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /tftpboot   重新启动服务: sudo /etc/init.d/openbsd-inetd restart 测试: 在/tftpboot 文件夹下新建立一个文件 cd /tftpboot touch test 进入另外一个文件夹 tftp 192.168.227.101 tftp> get test   NFS服务器: 1、进行NFS服务器端与客户端的安装: sudo apt-get install nfs-kernel-server  nfs-common  portmap 安装客户端的作用是可以在本机进行NFS服务的测试。 2、配置portmap 两种方法任选一种就可以: (1):sudo emacs /etc/default/portmap 去掉 -i 127.0.0.1 (2)sudo dpkg-reconfigure portmap 运行后选择“否” 3、配置挂载目录和权限 vim /etc/exports 配置如下: /home/nfsboot *(rw,sync) 解释一下: /home/nfsboot是NFS的共享目录,*表示任何IP都可以共享这个目录,你可以改为受限的IP,rw表示的是权限,sync是默认的。 4、更新exports文件 只要你更改了/etc/exports, 你不可以通过sudo exportfs -r 来更新 这个文件 5、重启NFS服务 sudo /etc/init.d/nfs-kernel-server restart 重启nfs服务 6、进行测试 尝试一下挂载本地磁盘(我的linux系统...

CentOS5.4安装xen

终于把xen编译好了,只有DOM0,安装的时候,出了很多错误,说实话都没有解决。于是,采用了最简单的方法: 下载: xen3.4.2: http://bits.xensource.com/oss-xen/release/3.4.2/xen-3.4.2.tar.gz linux 2.6.18.8打过xen补丁的: http://bits.xensource.com/oss-xen/release/3.4.2/linux-2.6.18-xen-3.4.2.tar.gz 安装方法: step 1: 分别解压后,将linux-2.6.18.8解压后的内核拷入xen-3.4.2目录内,并重命名为 xen-2.6.18-xen.hg。 为了不再进行同步linux,修改xen-3.4.2/buildconfigs/src.hg-clone文件,将其中的某些行删除,删除后的内容为: # Mercurial HG ?= hg LINUX_SRCDIR ?= linux-$(LINUX_VER)-xen.hg # Repository to clone. XEN_LINUX_HGREPO ?= $$(sh buildconfigs/select-repository $(LINUX_SRCDIR) $(LINUX_SRC_PATH)) # Set XEN_LINUX_HGREV to update to a particlar revision. XEN_LINUX_HGREV  ?= tip $(LINUX_SRCDIR)/.valid-src: $(__XEN_LINUX_UPDATE) set -e ; \ touch $@ step 2: 安装xen的时候,需要依赖一些库文件,因此,要预先检查一下 进入xen-3.4.2/tools/check目录 分别运行 ./chk build 和 ./chk install 都提示OK,则可,否则,安装之。 step3: 准备xen-3.4.2/studom目录内的相关文件: grub-0.97.tar.gz   newlib-1.16.0.tar.gz    pc...

试解Linux中的free

图片
在我的机器上运行free命令: root@Localhost:/home/hayfeng# free              total       used       free     shared    buffers     cached Mem:        153832     141612      12220          0      17340      94580 -/+ buffers/cache:      29692     124140 Swap:       281096      10432     270664 第一行: total = used + free      |  153832 = 141612 + 12220 第二行: -buffers/cache(代表用户程序使用的空间,不包括内核为用户线程加载的文件映射):    = used - ( buffers + cached )   |   29692 = 141612 - ( 17340 + 94580 ) +buffers/cache(代表用户进程可以使用的空间),当然内核映射的线性文件也可以映射给用户进程,因此:    = free + ( buffers + cached )   |  124140 = 12220 + ( 17340 + 94580 ) ----- 从上面的-buffers/cache 和 + buffers/cache 来看,buffers和cached是属于内核的,但可以被用户进程使用。因此: 1、计算用户进程所使用的物理内存时的计算方法是:已经用掉的内存总量减去buffers和cached。(哎,难道内核线程不需要私有内存了?) 2、计算用户进程所能够使用物理内存时的计算方法是:可用的物理内存总量加上buffers和cached。因为内核映射的物理内存可以被用户进程共享嘛。 这些东西,会者不难,难者不会啊! 该文章讨论贴: http://www.linuxforum.net/forum/showflat.php?Cat=&Board=linuxK&Number=747039&page=0&view=expanded&sb=5&o=7&fpart=

红黑树演示

图片
Red/Black Tree Demonstration: Maintenance Version 转自: http://peterpannju.blogbus.com/logs/21992610.html     红黑树是个复杂的数据结构。其插入,删除操作复杂度都为O(lgn)。     红黑树在 linux 内核中应用很多,比如虚拟内存管理,进程调度等。且其常常和 hash 一起出现,是非常重要的数据结构。 Contents:   Defination of Red-Black Tree   Insertion   Deletion   Comparison with BST & AVL   Red-Black Tree Demonstration   Defination of Red-Black Tree As defined in CLRS, a red-black tree is a binary search tree (BST) that satisfies the following properties: Every node is either red or black. The root is black. Every leaf (NIL) is black. If a node is red, then both its children are black. (Or in other words, two red nodes may not be adjacent.) For each node, all paths from the node to descendant leaves contain the same number of black nodes.     红黑树的数据并不存储在叶节点上。叶节点全部是 NIL。这可以帮助红黑树插入删除操作。 红黑树的高度不超过2lg(n+1)。证明请参考 CLRS。 Insertion     红黑树的插入方法有两种。分别为 Okasaki's Insertion Method 和 CLRS Insertion Method。CLRS给出的方法比 Okasaki 的更复杂,但是效率较高。这里,我们采用 CLRS 中所采用的方法。   static   void ...

Linux 系统内核初始化过程

转载自: http://linux.chinaunix.net/bbs/ 一、对硬件数据结构的初始化过程。 1、系统首先调用 printk() 函数在屏幕上打印 Linux 内核版本号和编译内核所使用的 gcc 编译器版本号、启用时间等,如果这个过程失败,将显示一个参考信息给用户。 2、调用 arch/i386/kernel/setup.c 中的 setup_arch() 函数,初始化系统主板上各个集成电路控制器,最后在 command line、memory_start 和 memory_end 中返回结果。 获取外设的参数。将硬盘、鼠标、显示器、根设备的主从设备号、高级电源管理以及总线类型等参数, 写入相关的内存单元。 如果设置了 RAM盘,则把各参数写入相应的内存单元。 设置 init_task.mm 代码结构在内存中的起点和终点以及数据段的终点。 把命令行参数拷贝到 save_command_line 变量。分析、排除 “mem=”形式的命令。获取 CPU类型,以判断是否支持扩展分页,即允许页框大小为 4MB的页。调整内存边界参数 start_mem 。 调用 reguest_region() 函数为主板上的 I/O芯片申请I/O内存使用空间。这些集成芯片是 timer定时计数器、DMA控制器1、DMA控制器2以及协处理器 fpu。 3、调用 arch/i386/init.c 中的 paging_init() 函数初始化内核页表。它实现的功能如下: 调整 memory_start 按下一个可用页边界对齐。 对临时页目录表项中的第 0 个目录项清零,这样就将从 0 开始的最初 4MB 的线性地址和物理地址消除,以便使用户可使用0 到 4194303 之间的线性地址空间。 初始化页目录的第0项到768项以及各个目录项对应的页表表项。 4、调用 arch/i386/kernel/trap.c 中的 trap_init() 函数中对中断描述符表IDT进行初始化。为了使用异常处理,trap_init() 函数将处理异常的函数地址的选择符写入 IDT的陷阱门描述符中。这些门的设置时由 set_trap_gate() 和set_system_gate() 函数来完成的。 5、调用 arch/i386/kernel/irq.c 中的 init_IRQ() 函数。设置基准时...

ubuntu 9.04 启动后进入字符界面

图片
因为在ubuntu下面要做一些实验,所以在windows的VMware虚拟机里面安装了ubuntu 9.04 桌面版。我机器本身配置不高,迅驰1.6CPU,512MB内存,共享显存。所以如果也在虚拟机里面启动桌面的话,会相当影响HOST OS的性能。于是,边让其在字符界面下工作。 但在网上尝试了很久,有两种方法,第一:在/etc/目录下面加入inittab文件,让其默认运行在level 3目录下面,然后把/etc/init.d/rc3.d/目录下面含有S13gdm的文件删除,这样就可以登录到文本界面了。----这种方法,我尝试了,不行!不是因为我的不是gnome界面,不知道是什么就是不行,这种方法在网上最泛滥。很多博客里面都是这样copy来copy去,而并没有去切身实践过,唉,网络有利有弊啊~。其实我们发帖是应该负责任的,不应该制造网络垃圾~ 第二种方法是安装rcconf,这样的话讲要启动的gdm服务关掉,我觉得这种方法应该是可行的,就像windows下面,msconfig命令的作用一样,可以定制我们要启动的服务,但我apt-get install rcconf或者是zhconf都没有找到,可能是我没有加入那么多的源的原因吧。 -------下面的这种方法,仅仅适用于“在启动的时候,不会看见图形画面”并不能不进入图形桌面----------- 第三种方法是将/boot/grub/munu.lst的文件里面,启动项里的splash去掉。 综上,用第二种方法应该是最好的。 我觉得这种方法最安全,最简洁,最实用!因此,建议网友们用这种方法来达到我们的目的。