AnotherUbunturelease,anothersetofX.orgshakeups.
SamsonYeungpointedouttomethefollowingfixwhichcanbeappliedonUbuntuLucid/10.04:
Createanewfile/usr/lib/X11/xorg.conf.d/20-thinkpad.confwiththefollowingcontents:
ThenrestartX.
ThisconfigurationseemstobegeneralenoughthatitworksforbothThinkpadlaptopswithTrackPointsandtheThinkpadTrackPointkeyboard.
SinceUbuntu9.04,theCtrl-Alt-BackspacekeycombinationtoforcearestartofXisnowdisabledbydefault,toeliminatetheproblemofaccidentallytriggeringthekeycombination.Inaddition,theCtrl-Alt-BackspaceoptionisnowconfiguredasanXkeymap(XKB)option,replacingtheXserver“DontZap”optionandallowingper-userconfigurationofthissetting.Asaresult,enablingordisablingtheCtrl+Alt+Backspaceshortcutcannowbedoneeasilyfromthedesktop.
EnablingCtrl-Alt-BackspaceforUbuntu10.04
*Select“System”->”Preferences”->”Keyboard”
*Selectthe“Layouts”tabandclickonthe“LayoutOptions”button.
*Select“KeysequencetokilltheXserver”andenable“Control+Alt+Backspace”.
EnablingCtrl-Alt-BackspaceforKubuntu10.04
*ClickontheApplicationlauncherandselect“SystemSettings”
*Clickon“Regional&Language”.
*Select“KeyboardLayout”.
*Clickon“Enablekeyboardlayouts”(intheLayouttab).
*Selectthe“Advanced”tab.Thenselect“KeysequencetokilltheXserver”andenable“Control+Alt+Backspace”.
目前遇到的最大的问题:编译的vim72+vimgdb在主目录存在.vimrc的情形下,出现ABORT退出。第二个问题是中键滚屏的设置查了很久找到能用的配置Irecentlyinstalled9.10onabrandnewX200.Middlebuttonscrollingdoesnotwork(IhavepracticallytriedallsolutionspostedontheInternet).
TheclosestthingIhavetoasolutionistheseterminalcommands:
xorg.conf和hal的方法都没有解决。。。。
风扇转速控制
Toenablefancontrol,themoduleparameterfan_control=1mustbegiventothinkpad-acpi.
Forexample,inUbuntu8.04(HardyHeron),addthefollowingto/etc/modprobe.d/options:optionsthinkpad_acpifan_control=1
Havingdoneso,rebootandyoucanusethefollowingcommandstocontrolfanspeed:
#echolevel0>/proc/acpi/ibm/fan(fanoff)
#echolevel2>/proc/acpi/ibm/fan(lowspeed)
#echolevel4>/proc/acpi/ibm/fan(mediumspeed)
#echolevel7>/proc/acpi/ibm/fan(maximumspeed)
#echoleveldisengaged>/proc/acpi/ibm/fan(disengaged)
IfyoureceiveaPERMISSIONDENIEDerroryoucanusethefollowingcommandsyntaxinsteadasawork-around:
#echolevel0(fanoff)
#echolevel2(lowspeed)
#echolevel4(mediumspeed)
#echolevel7(maximumspeed)
#echoleveldisengaged(disengaged)#遭遇严重问题:此问题是无线网卡驱动带来的,现在已经解决。使用backports的无线驱动。问题贴在最后。
运行正常的有:
ToenableHDAPS(notreallyworking),HDAPSjoystick(worksfinewithmodifytp-smapimodule)andSM-API(whichallowyoutospecifybatterchargeleveltomakebatterylivelonger.
$sudoaptitudeinstalltp-smapi-source(optional)$sudomodule-assistantgettp-smapi-source$sudomodule-assistantbuildtp-smapi-source$sudomodule-assistantinstalltp-smapi-source
Nowyouwillneedtoenablethosemodules,editthefile:
/etc/modules
andaddthoselinesintheendoffile:
thinkpad_ectp_smapihdaps
YoucantesttheHDAPSjoystick:
$sudomodprobethinkpad_ec$sudomodprobetp_smapi$sudomodprobehdaps$sudoaptitudeinstallhdaps-utils(装不上,源里没有,不过没关系)$hdaps-gl
Tomakeyourbatterylastlongerwithminimalchargecycles,editthefile:
/etc/sysfs.conf(新建)
Addthoselines:
#Makebatterylivelongerdevices/platform/smapi/BAT0/start_charge_thresh=50devices/platform/smapi/BAT0/stop_charge_thresh=90
Youwillneedareboottoactivatethechange.Oryoucandothosetomakeiteffectivenow:
$sudosu#echo50>/sys/devices/platform/smapi/BAT0/start_charge_thresh#echo90>/sys/devices/platform/smapi/BAT0/stop_charge_thresh(系统现在能自己读了)
/etc/default/acpi-support
Changethefollowingline:
ENABLE_LAPTOP_MODE=false
tobe:
Editthefile/etc/grub.d/10_linuxandaddacpi_osi=Linuxtothelinewith$GRUB_CMDLINE_LINUX_DEFAULT,soitwilllooklikethis:
Thenrun$sudoupdate-grub
1.sudogedit/etc/laptop-mode/laptop-mode.confandchange:
BATT_HD_POWERMGMT=192(insteadof1)
Whenthesefixesapplied,youshouldseewhatcyclecountslowsdown
sudosmartctl-a/dev/sda|grepLoad_Cycle
Formethisworksfine(Ubuntu8.10):
Createanfile/etc/hal/fdi/policy/mouse-wheel.fdianputthefollowingintoit:
Rebootandscrollingwiththetrackpointshouldwork.
2007年7月31日
元凶:SIGHUP信号
让我们来看看为什么关掉窗口/断开连接会使得正在运行的程序死掉。
在Linux/Unix中,有这样几个概念:
根据POSIX.1定义:
因此当网络断开或终端窗口关闭后,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出。
我们来看一个例子。打开两个SSH终端窗口,在其中一个运行top命令。
使用pstree命令可以更清楚地看到这个关系:
关闭第一个SSH窗口,在另一个窗口中可以看到top也被杀掉了。
如果我们可以忽略SIGHUP信号,关掉窗口应该就不会影响程序的运行了。nohup命令可以达到这个目的,如果程序的标准输出/标准错误是终端,nohup默认将其重定向到nohup.out文件。值得注意的是nohup命令只是使得程序忽略SIGHUP信号,还需要使用标记&把它放在后台运行。
虽然nohup很容易使用,但还是比较“简陋”的,对于简单的命令能够应付过来,对于复杂的需要人机交互的任务就麻烦了。
其实我们可以使用一个更为强大的实用程序screen。流行的Linux发行版(例如RedHatEnterpriseLinux4)通常会自带screen实用程序,如果没有的话,可以从GNUscreen的官方网站下载。
开始使用Screen
简单来说,Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。Screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。在screen中创建一个新的窗口有这样几种方式:
1.直接在命令行键入screen命令
Screen将创建一个执行shell的全屏窗口。你可以执行任意shell程序,就像在ssh窗口中那样。在该窗口中键入exit退出该窗口,如果这是该screen会话的唯一窗口,该screen会话退出,否则screen自动切换到前一个窗口。
2.Screen命令后跟你要执行的程序。
Screen创建一个执行vitest.c的单窗口会话,退出vi将退出该窗口/会话。
3.以上两种方式都创建新的screen会话。我们还可以在一个已有screen会话中创建新的窗口。在当前screen窗口中键入C-ac,即Ctrl键+a键,之后再按下c键,screen在该会话内生成一个新的窗口并切换到该窗口。
重新连接会话:
看看出现什么了,太棒了,一切都在。继续干吧。
你可能注意到给screen发送命令使用了特殊的键组合C-a。这是因为我们在键盘上键入的信息是直接发送给当前screen窗口,必须用其他方式向screen窗口管理器发出命令,默认情况下,screen接收以C-a开始的命令。这种命令形式在screen中叫做键绑定(keybinding),C-a叫做命令字符(commandcharacter)。
可以通过C-a来查看所有的键绑定,常用的键绑定有:
Screen常用选项
-exyx为命令字符,y为转义命令字符的字符
下面命令启动的screen会话指定了命令字符为C-t,转义C-t的字符为t,通过C-t命令可以看到该变化。
下例显示当前有两个处于detached状态的screen会话,你可以使用screen-r
[root@tivf18root]#screen–r8736如果由于某种原因其中一个会话死掉了(例如人为杀掉该会话),这时screen-list会显示该会话为dead状态。使用screen-wipe命令清除该会话:
[root@tivf18root]#screen-wipeTherearescreenson:8736.pts-1.tivf18(Detached)8462.pts-0.tivf18(Removed)1socketwipedout.1Socketin/root/.screen.
[root@tivf18root]#screen-lsThereisascreenon:8736.pts-1.tivf18(Detached)1Socketin/root/.screen.
[root@tivf18root]#-d–m选项是一对很有意思的搭档。他们启动一个开始就处于断开模式的会话。你可以在随后需要的时候连接上该会话。有时候这是一个很有用的功能,比如我们可以使用它调试后台程序。该选项一个更常用的搭配是:-dmSsessionname
启动一个初始状态断开的screen会话:
连接该会话:
管理你的远程会话
Screen提供了丰富强大的定制功能。你可以在Screen的默认两级配置文件/etc/screenrc和$HOME/.screenrc中指定更多,例如设定screen选项,定制绑定键,设定screen会话自启动窗口,启用多用户模式,定制用户访问权限控制等等。如果你愿意的话,也可以自己指定screen配置文件。
参考资料
关于作者
2006年9月21日
本文介绍了在linux系统中,通过Gnuautoconf和automake生成Makefile的方法。主要探讨了生成Makefile的来龙去脉及其机理,接着详细介绍了配置Configure.in的方法及其规则。
引子
无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令。不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或makeinstall。利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和makefile工具就可以轻而易举的理顺各个源文件之间纷繁复杂的相互关系。
但是如果通过查阅make的帮助文档来手工编写Makefile,对任何程序员都是一场挑战。幸而有GNU提供的Autoconf及Automake这两套工具使得编写makefile不再是一个难题。
模拟需求
工具简介
所必须的软件:autoconf/automake/m4/perl/libtool(其中libtool非必须)。
autoconf是一个用于生成可以自动地配置软件源码包,用以适应多种UNIX类系统的shell脚本工具,其中autoconf需要用到m4,便于生成脚本。automake是一个从Makefile.am文件自动生成Makefile.in的工具。为了生成Makefile.in,automake还需用到perl,由于automake创建的发布完全遵循GNU标准,所以在创建中不需要perl。libtool是一款方便生成各种程序库的工具。
目前automake支持三种目录层次:flat、shallow和deep。
1)flat指的是所有文件都位于同一个目录中。
就是所有源文件、头文件以及其他库文件都位于当前目录中,且没有子目录。Termutils就是这一类。
2)shallow指的是主要的源代码都储存在顶层目录,其他各个部分则储存在子目录中。
就是主要源文件在当前目录中,而其它一些实现各部分功能的源文件位于各自不同的目录。automake本身就是这一类。
3)deep指的是所有源代码都被储存在子目录中;顶层目录主要包含配置信息。
就是所有源文件及自己写的头文件位于当前目录的一个子目录中,而当前目录里没有任何源文件。GNUcpio和GNUtar就是这一类。
flat类型是最简单的,deep类型是最复杂的。不难看出,我们的模拟需求正是基于第三类deep型,也就是说我们要做挑战性的事情:)。注:我们的测试程序是基于多线程的简单程序。
生成Makefile的来龙去脉
首先进入project目录,在该目录下运行一系列命令,创建和修改几个文件,就可以生成符合该平台的Makefile文件,操作过程如下:
1)运行autoscan命令
2)将configure.scan文件重命名为configure.in,并修改configure.in文件
3)在project目录下新建Makefile.am文件,并在core和shell目录下也新建makefile.am文件
4)在project目录下新建NEWS、README、ChangeLog、AUTHORS文件
5)将/usr/share/automake-1.X/目录下的depcomp和complie文件拷贝到本目录下
6)运行aclocal命令
7)运行autoconf命令
8)运行automake-a命令
9)运行./confiugre脚本
Configure.in的八股文
当我们利用autoscan工具生成confiugre.scan文件时,我们需要将confiugre.scan重命名为confiugre.in文件。confiugre.in调用一系列autoconf宏来测试程序需要的或用到的特性是否存在,以及这些特性的功能。
下面我们就来目睹一下confiugre.scan的庐山真面目:
每个configure.scan文件都是以AC_INIT开头,以AC_OUTPUT结束。我们不难从文件中看出confiugre.in文件的一般布局:
上面的调用次序只是建议性质的,但我们还是强烈建议不要随意改变对宏调用的次序。
现在就开始修改该文件:
修改后的结果如下:
AC_PREREQ(2.59)AC_INIT(test,1.0,normalnotebook@126.com)AC_CONFIG_SRCDIR([src/ModuleA/apple/core/test.c])AM_CONFIG_HEADER(config.h)AM_INIT_AUTOMAKE(test,1.0)
由于我们是基于deep类型来创建makefile文件,所以我们需要在四处创建Makefile文件。即:project目录下,lib目录下,core和shell目录下。
实战Makefile.am
Makefile.am是一种比Makefile更高层次的规则。只需指定要生成什么目标,它由什么源文件生成,要安装到什么目录等构成。
1)标准安装路径
其它的预定义目录还包括:bindir=$(prefix)/bin,libdir=$(prefix)/lib,datadir=$(prefix)/share,sysconfdir=$(prefix)/etc等等。
2)定义一个新的安装路径
比如test,可定义testdir=$(prefix)/test,然后test_DATA=test1test2,则test1,test2会作为数据文件安装到$(prefix)//test目录下。
我们首先需要在工程顶层目录下(即project/)创建一个Makefile.am来指明包含的子目录:
由于每个源文件都会用到相同的头文件,所以我们在最顶层的Makefile.am中包含了编译源文件时所用到的头文件,并导出,见蓝色部分代码。
我们将lib目录下的swap.c文件编译成libswap.a文件,被apple/shell/apple.c文件调用,那么lib目录下的Makefile.am如下所示:
细心的读者可能就会问:怎么表1中给出的是bin_LIBRARIES,而这里是noinst_LIBRARIES?这是因为如果只想编译,而不想安装到系统中,就用noinst_LIBRARIES代替bin_LIBRARIES,对于可执行文件就用noinst_PROGRAMS代替bin_PROGRAMS。对于安装的情况,库将会安装到$(prefix)/lib目录下,可执行文件将会安装到${prefix}/bin。如果想安装该库,则Makefile.am示例如下:
最后两行的意思是将swap.h安装到${prefix}/include/swap目录下。
接下来,对于可执行文件类型的情况,我们将讨论如何写Makefile.am?对于编译apple/core目录下的文件,我们写成的Makefile.am如下所示:
由于我们的test.c文件在链接时,需要apple.o和libswap.a文件,所以我们需要在test_LDADD中包含这两个文件。对于Linux下的信号量/读写锁文件进行编译,需要在编译选项中指明-D_GNU_SOURCE。所以在test_LDFLAGS中指明。而test_LDFLAGS只是链接时的选项,编译时同样需要指明该选项,所以需要DEFS来指明编译选项,由于DEFS已经有初始值,所以这里用+=的形式指明。从这里可以看出,Makefile.am中的语法与Makefile的语法一致,也可以采用条件表达式。如果你的程序还包含其他的库,除了用AC_CHECK_LIB宏来指明外,还可以用LIBS来指明。
如果你只想编译某一个文件,那么Makefile.am如何写呢?这个文件也很简单,写法跟可执行文件的差不多,如下例所示:
我们这里只是欺骗automake,假装要生成apple文件,让它为我们生成依赖关系和执行命令。所以当你运行完automake命令后,然后修改apple/shell/下的Makefile.in文件,直接将LINK语句删除,即:
通过上述处理,就可以达到我们的目的。从图1中不难看出为什么要修改Makefile.in的原因,而不是修改其他的文件。
下载
作者简介
在windows平台和linux平台下都大量存在着库。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。由于windows和linux的本质不同,因此二者库的二进制是不兼容的。本文仅限于介绍linux下的库。
2.库的种类linux下的库有两种:静态库和共享库(动态库)。二者的不同点在于代码被载入的时刻不同。静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。
3.库存在的意义库是别人写好的现有的,成熟的,可以复用的代码,你可以使用但要记得遵守许可协议。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。共享库的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。
4.库文件是如何产生的在linux下静态库的后缀是.a,它的产生分两步Step1.由源文件编译生成一堆.o,每个.o里都包含这个编译单元的符号表Step2.ar命令将很多.o转换成.a,成文静态库动态库的后缀是.so,它由gcc加特定参数编译产生。例如:$gcc-fPIC-c*.c$gcc-shared-Wl,-soname,libfoo.so.1-olibfoo.so.1.0*.
5.库文件是如何命名的,有没有什么规范在linux下,库文件一般放在/usr/lib/lib下,静态库的名字一般为libxxxx.a,其中xxxx是该lib的名称动态库的名字一般为libxxxx.so.major.minor,xxxx是该lib的名称,major是主版本号,minor是副版本号
6.如何知道一个可执行程序依赖哪些库ldd命令可以查看一个可执行程序依赖的共享库,例如#ldd/bin/lnlibc.so.6=>/lib/libc.so.6(0×40021000)/lib/ld-linux.so.2=>/lib/ld-linux.so.2(0×40000000)可以看到ln命令依赖于libc库和ld-linux库
7.可执行程序在执行的时候如何定位共享库文件当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径此时就需要系统动态载入器(dynamiclinker/loader)对于elf格式的可执行程序,是由ld-linux.so*来完成的,它先后搜索elf文件的DT_RPATH段—环境变量LD_LIBRARY_PATH—/etc/ld.so.cache文件列表—/lib/,/usr/lib目录找到库文件后将其载入内存
8.在新安装一个库之后如何让系统能够找到他如果安装在/lib或者/usr/lib下,那么ld默认能够找到,无需其他操作。如果安装在其他目录,需要将其添加到/etc/ld.so.cache文件中,步骤如下1.编辑/etc/ld.so.conf文件,加入库文件所在目录的路径2.运行ldconfig,该命令会重建/etc/ld.so.cache文件
erehw:这样的情况一般而言,很容易会碰到.我不知道csdn的faq是否已经有人整理过去.
一般而言,在C++源代码中调用c的函数,如果对函数的申明没有注意的话,就会出现这样的问题简单的说你应该这样去申明一个c函数:
litw如下使用应该没有问题:
5.2/etc/rc.d/rc.sysinit
以上就是Linux在开机时的第一个script文件,内容不只是如此,笔者已经去掉没有太大关系或默认不会执行的部分,整个Linux通过init找到inittab后,就直接将rc.sysinit从头执行到最后,再来就换rc.sysinit之后的步骤了。
5.3/etc/rc.d/rcX.d
在inittab中,继rc.sysinit之后所要执行的,就是rcX.d的目录,X是当初开机设置的initdefault值,若将initdefault设置为3,则会转而执行/etc/rc.d/rc3.d/下的所有文件,本节将以rc3.d为例进行说明。
首先看一下rc3.d中的文件有多少(如图5-6所示)。在目录中最简单的区分方式就是看文件名,文件名都是由两个英文字母开头的,不是K就是S。K代表的是Kill,而S代表的是Start。意思很简单,默认为开机要执行的服务,其文件名的开头就是S,若用户将某个服务关闭(不论是用哪一种工具程序),该文件名就会由S开头变为K开头。反之亦然,若将某服务关闭,则文件名便会是K开头。
设置服务激活状态的另一个做法是将文件名的第一个字母直接由S变为K(如图5-7所示),或是将K变为S,这样开机默认激活状态就会从开启变为关闭,或是由关闭变为激活,是非常方便的一种做法。
◆readahead_early
◆kudzu
kudzu在开机时会依据/etc/sysconfig/hwconf已列出的硬件,以决定检测到的硬件为新加入或是已存在的。若是新加入的,会再参考/etc/sysconfig/kudz中所定义的规则以决定是否要忽略,最后确定要加进新的硬件后,就会加载适当的module,并将其记录在/etc/modprobe.conf文件中(这个文件应该是最容易使用到的),这样当往后开机时,系统便会自动加载列在modprobe.conf中的设备。
旧的Linux版本并不会以modprobe.conf为文件名,而是将其称为modules.conf。这倒是Linux的缺点,光是RedHat一个系统厂商就已经无法在每个版本保持文件名的一致性,而且Linuxkenrel版本更新的速度太快,对不是很熟悉的用户而言,还真的是有点麻烦的;但相反地,Linux也就是因为这样才越来越稳定、安全、强大。
不用多说,大家应该都知道这就是将网卡激活的程序,但要记得在/etc/sysconfig/network-scripts/目录下一定要有ifcfg-ethX的文件存在,否则是无法正常运行的。既然在此谈到有关network的设置,就一并解释一下ifconfig与ifup这两个指令的差别(很多人以为是一样的)。
◆restorecond
◆syslog
klogd
syslogd
图5-14的方框就是在kernel信息结束后其中一个xinetd服务激活的信息,从图中的第一行可以看出kernel信息结束后,紧跟着就是服务软件的信息。
从/etc/syslog.conf文件可以找出所有目前系统通过syslogd所记录的信息,有时候在找某软件的信息时,也可以从这个文件中看出要以哪一个信息文件为主,当然前提是该软件必须支持syslogd的信息记录格式。
◆irqbalance
往后CPU的走向将朝多核心的方式进行,核心越多,应该要越来越快才对,但在不同核心之间会衍生出许多性能的问题,irqbalance就可以解决其中之一。另外值得一提的是NUMA的机制(kernel内置的一种机制),和irqbalance某些部分有点相似,但NUMA是为了让各CPU之间分配内存的性能可以再提升,和irqbalance有异曲同工之妙,两者存在的目的都是为了应付在不同CPU间的处理性能问题。
为何会有CPU之间分配内存的性能问题这就要看一下Intel与AMD目前的架构,在图5-15中虚线以上是差异最大的部分,可以看到Intel仍是由单一北桥负责各CPU与内存的管理,但AMD已经将北桥崁进CPU里面,内存的管理也就全数交给CPU,造成两种完全不同的硬件架构。
从图5-15中可以看出,在用户通过CPU访问内存时是很有机会重叠到的(Intel架构为共享,因此一定会重叠;而AMD则是当CPU1要访问到CPU2的内存之类的情形),若重叠情况发生而处理方式不当时,可想见其速度会降低。在两者架构完全不同的情况下,自然管理方式会造成使用的性能差异更大,而NUMA机制就是为了解决CPU与内存之间的平衡问题,但目前一般PC的BIOS大部分却都没有支持NUMA的功能。
◆crond
◆xfs
但这个老问题其实在FedoraCore7中已经不存在了,因为在FedoraCore7的/etc/X11/xorg.conf文件已经不再使用xfs的设置,就算将xfs直接关掉再激活XWindow,也不会停在上述的错误信息。
◆anacron
◆local
zSeries上的Linux应用程序调试技巧
2004年2月01日
当某个进程崩溃时,日志文件(/var/log/messages)中就会给出附加的信息,包括程序终止原因、故障地址,以及包含程序状态字(PSW)、通用寄存器和访问寄存器的简要寄存器转储。
基本的诊断
UserDebug日志条目所提供的信息可用于确定程序的崩溃位置。一些可用的工具可帮助解决您可能会遇到的各种程序终止问题。我们将在本文中逐步介绍那些工具。
首先,让我们检查一下该日志条目中的用户PSW。该PSW包含指令地址、状态码以及关于机器状态的其他信息。眼下,我们仅关心指令地址(第33至第63位)。为简化起见,让我们假设用户PSW是070dc00080400618。记住,我们是在考察一个ESA/390(31位寻址)PSW。第32位不是指令地址的一部分,它是指示31位寻址模式的标志,但是在研究PSW值时必须处理它。为了获得实际的指令指针,可把PSW的第二个字减去0x80000000。结果是一个指令地址0x400618。为了定位代码,您需要可执行文件中的一些信息。首先使用readelf来打印一些程序头信息。
如果可执行文件包括调试符号,那么确定哪一行代码导致了问题是可以做到的。对该地址和可执行文件使用addr2line程序,如下所示:
将返回:
要研究该问题,可以检查第34行。
/lib/ld.so.1=>/lib/ld.so.1(0x40000000)该指令地址对应于加载libc.so.6的地址。在我们的简单测试案例中,只需要两个共享对象。其他应用程序可能需要更多共享对象,这使得ldd的输出更加复杂。我们将以perl作为例子。输入:
将得到:
libdl.so.2=>/lib/libdl.so.2(0x40039000)
libm.so.6=>/lib/libm.so.6(0x4003d000)
libc.so.6=>/lib/libc.so.6(0x40064000)
libcrypt.so.1=>/lib/libcrypt.so.1(0x4018f000)
/lib/ld.so.1=>/lib/ld.so.1(0x40000000)所需要的一切都在那里了,但是我发现对于这个进程,下面的内容读起来更快一点:
(0x40021000)/lib/libnsl.so.1
(0x40039000)/lib/libdl.so.2
(0x4003d000)/lib/libm.so.6
(0x40064000)/lib/libc.so.6
(0x4018f000)/lib/libcrypt.so.1
现在我们来确定崩溃发生在libc中的何处。假设libc.so.6的加载地址是0x40021000,从指令地址0x400ab738减去它,结果为0x8a738。这是进入libc.so.6的偏移。使用nm命令,从libc.so.6转储符号,然后尝试确定该地址位于哪个函数中。对于libc.so.6,nm将生成7,000多行输出。通过对计算得出的偏移部分执行grep(正则表达式查找程序)可以削减必须检查的数据量。输入:
将返回66行,在该输出的中间,我们会发现:
关于调试Linux代码的有用技巧
最后,setargs为程序设置命令行参数。您也可以在执行run时指定命令行参数,但是setargs将使参数在run的多次执行中都有效。
gdbPostMortem
当程序意外地终止时,内核会尝试产生一个核心文件,以图判断发生了什么错误。然而,核心文件通常不是在默认设置值下产生的。这可以使用ulimit命令来改变。ulimit-cunlimited帮助确保您获得应用程序的完整核心文件。
虽然核心文件当前仅提供多线程应用程序中的有限的值,不过2.5版的开发内核已开始处理这个问题。预计2.6版的内核中会提供一些理想的线程改进。
在加载符号之后,gdb将指出程序在何处终止。注意当前帧#0包含前一节中计算的地址。gdb将在31位系统上截去高位,仅显示指令地址。还要注意帧#1包含gpr14中的返回地址。
接着往下看,if提供了关于当前堆栈帧的信息。在堆栈帧中往上移到main,这就是我们离开该帧的地方(即调用memcpy的地方)。简单的ilocals提供了传递给memcpy的变量的值,其中一个变量boink.boik的值为0x0。使用ptype来检查变量类型,这样将确认它是一个整型指针,并且如果目的是为了拷贝内容到其中,它就不应该是0x0。最后一个选项是使用print,通过一个星号(*)来解除指针引用,以便接收值。
处理优化过的代码
如何处理这种情况呢?使用si和ni(nextinstruction;它类似si,但是会跳过子例程调用)将非常有帮助。在这个层次上,很好理解zArchitecture是有所帮助的。
当display在工作时,它显示x/i作为实际数据显示之前的命令。x是检查内存的命令。/i是以指令格式来格式化;/x将以16进制格式来格式化;而/a将以16进制来格式化。然而,您应该在尽可能的地方把该值看作是地址,并解析符号名称。
结束语
对于一些可用于Linux应用程序调试的基本工具以及调试过程本身,本文中的信息应该为您提供了有用的入门信息。
虽然目前Linux的优势主要体现在网络服务方面,但事实上同样也有着非常丰富的媒体功能,本文就是以多媒体应用中最基本的声音为对象,介绍如何在Linux平台下开发实际的音频应用程序,同时还给出了一些常用的音频编程框架。
一、数字音频
音频信号是一种连续变化的模拟信号,但计算机只能处理和记录二进制的数字信号,由自然音源得到的音频信号必须经过一定的变换,成为数字音频信号之后,才能送到计算机中作进一步的处理。
数字音频系统通过将声波的波型转换成一系列二进制数据,来实现对原始声音的重现,实现这一步骤的设备常被称为模/数转换器(A/D)。A/D转换器以每秒钟上万次的速率对声波进行采样,每个采样点都记录下了原始模拟声波在某一时刻的状态,通常称之为样本(sample),而每一秒钟所采样的数目则称为采样频率,通过将一串连续的样本连接起来,就可以在计算机中描述一段声音了。对于采样过程中的每一个样本来说,数字音频系统会分配一定存储位来记录声波的振幅,一般称之为采样分辩率或者采样精度,采样精度越高,声音还原时就会越细腻。
二、声卡驱动
出于对安全性方面的考虑,Linux下的应用程序无法直接对声卡这类硬件设备进行操作,而是必须通过内核提供的驱动程序才能完成。在Linux上进行音频编程的本质就是要借助于驱动程序,来完成对声卡的各种操作。
最早出现在Linux上的音频编程接口是OSS(OpenSoundSystem),它由一套完整的内核驱动程序模块组成,可以为绝大多数声卡提供统一的编程接口。OSS出现的历史相对较长,这些内核模块中的一部分(OSS/Free)是与Linux内核源码共同免费发布的,另外一些则以二进制的形式由4FrontTechnologies公司提供。由于得到了商业公司的鼎力支持,OSS已经成为在Linux下进行音频编程的事实标准,支持OSS的应用程序能够在绝大多数声卡上工作良好。
虽然OSS已经非常成熟,但它毕竟是一个没有完全开放源代码的商业产品,ALSA(AdvancedLinuxSoundArchitecture)恰好弥补了这一空白,它是在Linux下进行音频编程时另一个可供选择的声卡驱动程序。ALSA除了像OSS那样提供了一组内核驱动程序模块之外,还专门为简化应用程序的编写提供了相应的函数库,与OSS提供的基于ioctl的原始编程接口相比,ALSA函数库使用起来要更加方便一些。ALSA的主要特点有:
ALSA和OSS最大的不同之处在于ALSA是由志愿者维护的自由项目,而OSS则是由公司提供的商业产品,因此在对硬件的适应程度上OSS要优于ALSA,它能够支持的声卡种类更多。ALSA虽然不及OSS运用得广泛,但却具有更加友好的编程接口,并且完全兼容于OSS,对应用程序员来讲无疑是一个更佳的选择。
三、编程接口
如何对各种音频设备进行操作是在Linux上进行音频编程的关键,通过内核提供的一组系统调用,应用程序能够访问声卡驱动程序提供的各种音频设备接口,这是在Linux下进行音频编程最简单也是最直接的方法。
3.1访问音频设备
无论是OSS还是ALSA,都是以内核驱动程序的形式运行在Linux内核空间中的,应用程序要想访问声卡这一硬件设备,必须借助于Linux内核所提供的系统调用(systemcall)。从程序员的角度来说,对声卡的操作在很大程度上等同于对磁盘文件的操作:首先使用open系统调用建立起与硬件间的联系,此时返回的文件描述符将作为随后操作的标识;接着使用read系统调用从设备接收数据,或者使用write系统调用向设备写入数据,而其它所有不符合读/写这一基本模式的操作都可以由ioctl系统调用来完成;最后,使用close系统调用告诉Linux内核不会再对该设备做进一步的处理。
3.2音频设备文件
对于Linux应用程序员来讲,音频编程接口实际上就是一组音频设备文件,通过它们可以从声卡读取数据,或者向声卡写入数据,并且能够对声卡进行控制,设置采样频率和声道数目等等。
四、应用框架
在Linux下进行音频编程时,重点在于如何正确地操作声卡驱动程序所提供的各种设备文件,由于涉及到的概念和因素比较多,所以遵循一个通用的框架无疑将有助于简化应用程序的设计。
4.1DSP编程
对声卡进行编程时首先要做的是打开与之对应的硬件设备,这是借助于open系统调用来完成的,并且一般情况下使用的是/dev/dsp文件。采用何种模式对声卡进行操作也必须在打开设备时指定,对于不支持全双工的声卡来说,应该使用只读或者只写的方式打开,只有那些支持全双工的声卡,才能以读写的方式打开,并且还要依赖于驱动程序的具体实现。Linux允许应用程序多次打开或者关闭与声卡对应的设备文件,从而能够很方便地在放音状态和录音状态之间进行切换,建议在进行音频编程时只要有可能就尽量使用只读或者只写的方式打开设备文件,因为这样不仅能够充分利用声卡的硬件资源,而且还有利于驱动程序的优化。下面的代码示范了如何以只写方式打开声卡进行放音(playback)操作:
运行在Linux内核中的声卡驱动程序专门维护了一个缓冲区,其大小会影响到放音和录音时的效果,使用ioctl系统调用可以对它的尺寸进行恰当的设置。调节驱动程序中缓冲区大小的操作不是必须的,如果没有特殊的要求,一般采用默认的缓冲区大小也就可以了。但需要注意的是,缓冲区大小的设置通常应紧跟在设备文件打开之后,这是因为对声卡的其它操作有可能会导致驱动程序无法再修改其缓冲区的大小。下面的代码示范了怎样设置声卡驱动程序中的内核缓冲区的大小:
在设置缓冲区大小时,参数setting实际上由两部分组成,其低16位标明缓冲区的尺寸,相应的计算公式为buffer_size=2^ssss,即若参数setting低16位的值为16,那么相应的缓冲区的大小会被设置为65536字节。参数setting的高16位则用来标明分片(fragment)的最大序号,它的取值范围从2一直到0x7FFF,其中0x7FFF表示没有任何限制。
接下来要做的是设置声卡工作时的声道(channel)数目,根据硬件设备和驱动程序的具体情况,可以将其设置为0(单声道,mono)或者1(立体声,stereo)。下面的代码示范了应该怎样设置声道数目:
采样格式和采样频率是在进行音频编程时需要考虑的另一个问题,声卡支持的所有采样格式可以在头文件soundcard.h中找到,而通过ioctl系统调用则可以很方便地更改当前所使用的采样格式。下面的代码示范了如何设置声卡的采样格式:
声卡采样频率的设置也非常容易,只需在调用ioctl时将第二个参数的值设置为SNDCTL_DSP_SPEED,同时在第三个参数中指定采样频率的数值就行了。对于大多数声卡来说,其支持的采样频率范围一般为5kHz到44.1kHz或者48kHz,但并不意味着该范围内的所有频率都会被硬件支持,在Linux下进行音频编程时最常用到的几种采样频率是11025Hz、16000Hz、22050Hz、32000Hz和44100Hz。下面的代码示范了如何设置声卡的采样频率:
4.2Mixer编程
声卡上的混音器由多个混音通道组成,它们可以通过驱动程序提供的设备文件/dev/mixer进行编程。对混音器的操作是通过ioctl系统调用来完成的,并且所有控制命令都由SOUND_MIXER或者MIXER开头,表1列出了常用的几个混音器控制命令:
表1混音器命令对声卡的输入增益和输出增益进行调节是混音器的一个主要作用,目前大部分声卡采用的是8位或者16位的增益控制器,但作为程序员来讲并不需要关心这些,因为声卡驱动程序会负责将它们变换成百分比的形式,也就是说无论是输入增益还是输出增益,其取值范围都是从0到100。在进行混音器编程时,可以使用SOUND_MIXER_READ宏来读取混音通道的增益大小,例如在获取麦克风的输入增益时,可以使用如下的代码:
对于只有一个混音通道的单声道设备来说,返回的增益大小保存在低位字节中。而对于支持多个混音通道的双声道设备来说,返回的增益大小实际上包括两个部分,分别代表左、右两个声道的值,其中低位字节保存左声道的音量,而高位字节则保存右声道的音量。下面的代码可以从返回值中依次提取左右声道的增益大小:
类似地,如果想设置混音通道的增益大小,则可以通过SOUND_MIXER_WRITE宏来实现,此时遵循的原则与获取增益值时的原则基本相同,例如下面的语句可以用来设置麦克风的输入增益:
在编写实用的音频程序时,混音器是在涉及到兼容性时需要重点考虑的一个对象,这是因为不同的声卡所提供的混音器资源是有所区别的。声卡驱动程序提供了多个ioctl系统调用来获得混音器的信息,它们通常返回一个整型的位掩码(bitmask),其中每一位分别代表一个特定的混音通道,如果相应的位为1,则说明与之对应的混音通道是可用的。例如通过SOUND_MIXER_READ_DEVMASK返回的位掩码,可以查询出能够被声卡支持的每一个混音通道,而通过SOUND_MIXER_READ_RECMAS返回的位掩码,则可以查询出能够被当作录音源的每一个通道。下面的代码可以用来检查CD输入是否是一个有效的混音通道:
如果进一步还想知道其是否是一个有效的录音源,则可以使用如下语句:
目前大多数声卡提供多个录音源,通过SOUND_MIXER_READ_RECSRC可以查询出当前正在使用的录音源,同一时刻能够使用几个录音源是由声卡硬件决定的。类似地,使用SOUND_MIXER_WRITE_RECSRC可以设置声卡当前使用的录音源,例如下面的代码可以将CD输入作为声卡的录音源使用:
此外,所有的混音通道都有单声道和双声道的区别,如果需要知道哪些混音通道提供了对立体声的支持,可以通过SOUND_MIXER_READ_STEREODEVS来获得。
4.3音频录放框架
下面给出一个利用声卡上的DSP设备进行声音录制和回放的基本框架,它的功能是先录制几秒种音频数据,将其存放在内存缓冲区中,然后再进行回放,其所有的功能都是通过读写/dev/dsp设备文件来完成的:
4.4混音器框架
下面再给出一个对混音器进行编程的基本框架,利用它可以对各种混音通道的增益进行调节,其所有的功能都是通过读写/dev/mixer设备文件来完成的:
/*将两个声道的值合到同一变量中*/level=(right<<8)+left;
Where
五、小结
随着Linux平台下多媒体应用的逐渐深入,需要用到数字音频的场合必将越来越广泛。虽然数字音频牵涉到的概念非常多,但在Linux下进行最基本的音频编程却并不十分复杂,关键是掌握如何与OSS或者ALSA这类声卡驱动程序进行交互,以及如何充分利用它们提供的各种功能,熟悉一些最基本的音频编程框架和模式对初学者来讲大有裨益。
vim添加行号
Oryoucanusecat,likethefollowing::%!cat-n
批量文件名修改:
dpkg-Lxxx
apt-cacheshowk3b
apt-filesearchfilename
apt-cachedependsxxx
apt-cacherdependsxxx
sudoapt-cdromadd
sudoauto-aptrun./configure
ls/var/cache/apt/archives
sudoapt-getautoclean
sudoapt-getclean
sudoapt-getautoremove
sudotaskselinstalllamp-server
sudoaptitudepurge~ilinux-image-.*\(\!`uname-r`\)
cat/etc/issue或cat/etc/lsb-release或lsb_release-dsc
lsmod
lspci
lsusb
#加参数-v可以显示USB设备的描述表(descriptors)lsusb-v
sudoethtooleth0
sudoapt-getinstallwakeonlan或sudoethtool-seth0wolg
sudolshw
#CPUIDsudodmidecode-t4|grepID#SerialNumbersudodmidecode|grepSerial#CPUsudodmidecode-t4#BIOSsudodmidecode-t0#主板:sudodmidecode-t2#OEM:sudodmidecode-t11
sudoapt-getinstallhddtempsudohddtemp/dev/sda
$uptime11:47:04up85days,2:10,1user,loadaverage:2.40,2.18,2.34
#危险!检查第一个分区,请不要检查已经挂载的分区,否则容易丢失和损坏数据sudofsck/dev/sda1
sudomount-tsmbfs-ousername=xxx,password=xxx,iocharset=utf8//192.168.1.1/share/mnt/share
sudohdparm-i/dev/hda
cat/proc/mdstat
dmesg|grep-iraidcat/proc/scsi/scsi
sudohdparm-I/dev/sda或sudoapt-getinstallblktoolsudoblktool/dev/sdaid
du-hs目录名
syncfuser-km/media/usbdisk
#创建一个512M的交换文件/swapfilesudoddif=/dev/zeroof=/swapfilebs=1Mcount=512sudomkswap/swapfilesudoswapon/swapfile#sudovim/etc/fstab#加到fstab文件中让系统引导时自动启动/swapfileswapswapdefaults00
#首先安装sysstat包sudoapt-getinstallsysstat#每2秒刷新一次sudoiostat-x2
freeusage:free[-b|-k|-m|-g][-l][-o][-t][-sdelay][-ccount][-V]
-b,-k,-m,-gshowoutputinbytes,KB,MB,orGB-lshowdetailedlowandhighmemorystatistics-ouseoldformat(no-/+buffers/cacheline)-tdisplaytotalforRAM+swap-supdateevery[delay]seconds-cupdate[count]times-Vdisplayversioninformationandexit
watch-dfree#使用Ctrl+c退出
ps-AFL
w
pstree
xkill出现骷髅标志的鼠标,点击需要中止的程序即可
lsof-p进程的pid
lsofabc.txt
lsof-i:22
lsof-cnsd
nohup程序查看中间运行情况tailnohup
sudoapt-getinstallscreenscreenvima.txt#直接退出后使用screen-ls#1656.pts-0.ubuntu(Detached)screen-r1656#恢复#热键,同时按下Ctrl和a键结束后,再按下功能键C-a#显示所有键绑定信息C-aw#显示所有窗口列表C-aC-a#切换到之前显示的窗口C-ac#创建一个新的运行shell的窗口并切换到该窗口C-an#切换到下一个窗口C-ap#切换到前一个窗口(与C-an相对)C-a0..9#切换到窗口0..9C-aa#发送C-a到当前窗口C-ad#暂时断开screen会话C-ak#杀掉当前窗口
strace-f-F-ooutfile
echo4096>/proc/sys/fs/file-max#或者ulimit-n4096
sudopppoeconf
sudopondsl-provider
sudo/etc/ppp/pppoe_on_boot
sudopoff
sudoplog
arpingIP地址
nmblookup-AIP地址
lsof-i:80
#在网卡eth0上增加一个1.2.3.4的IP:sudoifconfigeth0:01.2.3.4netmask255.255.255.0#删除增加的IP:sudoifconfigeth0:0down
echo1|sudotee/proc/sys/net/ipv4/ip_forwardsudoiptables-tnat-IPOSTROUTING-jMASQUERADE
sudorouteadd-net192.168.0.0netmask255.255.255.0gw172.16.0.1
sudoroutedel-net192.168.0.0netmask255.255.255.0gw172.16.0.1
sudoifconfigeth0down#关闭网卡sudoifconfigeth0hwether00:AA:BB:CC:DD:EE#然后改地址sudoifconfigeth0up#然后启动网卡永久改地址方法
sudogedit/etc/network/interfaces在ifaceeth0inetstatic后面添加一行:
pre-upifconfigeth0hwether01:01:01:01:01:01配置文件应该像如下
ifaceeth0inetstaticpre-upifconfigeth0hwether01:01:01:01:01:01address192.168.1.10netmask255.255.255.0gateway192.168.1.1最后是logout或者reboot
sudonetstat-atnp
nc-zvlocalhost1-65535
#安装ethstatus软件sudoapt-getinstallethstatus#查看ADSL的速度sudoethstatus-ippp0#查看网卡的速度sudoethstatus-ieth0#或安装bwm-ngsudoapt-getinstallbwm-ng#查看当前网络流量bwm-ng
whoisbaidu.cn
tracepathbaidu.cn
sudoapt-getinstallclamavclamscan-r~/
sudoupdate-rc.d服务名defaults99
sudoupdate-rc.d服务名remove
/etc/init.d/服务名restart
/etc/init.d/服务名stop
/etc/init.d/服务名start
sudodeluser用户名
sudochfnuserid
sudousermod-L用户名#锁定用户sudousermod-U用户名#解锁或sudopasswd-l用户名#锁定用户sudopasswd-u用户名#解锁
sudousermod-Gadmin-a用户名
sudo-s
sudovim/etc/motd
对于JavaJDK6(就是1.6,sun缩短Java的版本名字了):
sudoupdate-java-alternatives-sjava-6-sun对于JavaJDK1.5
sudoupdate-java-alternatives-sjava-1.5.0-sun
im-switch-c
findsrc-typed-execmkdir-putf8/{}\;findsrc-typef-execiconv-fGBK-tUTF-8{}-outf8/{}\;
mvutf8/*srcrm-frutf8
iconv-fgbk-tutf8$i>newfile
sudoapt-getinstallzhcon使用时,输入zhcon即可
lftp:~>setftp:charsetGBKlftp:~>setfile:charsetUTF-8
sudoapt-getremovettf-kochi-gothicttf-kochi-minchottf-unfontsttf-unfonts-core
sudoapt-getinstallxpdf-chinese-simplifiedxpdf-chinese-traditionalpoppler-data
sudogedit/etc/fonts/conf.d/49-sansserif.conf将倒数第四行
sudoapt-getinstalllunar-applet鼠标点击面板右键->添加到面板->农历日期
注意:升级到ubuntu9.10后,unzip会升级到6.0,而这个版本的unzip已经取消了-O选项,如果在/etc/environment中加入了-O的内容,会导致unzip不能正常解压。请注释掉这两行,然后重新登陆。
安装ibus-gtk即可,最好另外安装:ibus-qt4
cat/etc/vsftpd.conf|grep-v^#
nl文件名cat-n文件名
cut-c5-a.py
catfile.txt|sort-u
touchfile1file2
mkdir-pv/tmp/xxs/dsd/efd
cp-av原文件或原目录新文件或新目录
difffile1file2
tail-10f/var/log/apache2/access.log或者
tailf/var/log/apache2/access.log
aproposxxxman-kxxx
find.-typef-atime-30-execmv{}../back\;
find.-typef-atime-30|xargstarzcvpfbackup.tar.gzfind.-typef-atime-30-print-exectarrvpfbackup.tar{}\;
find.-mmin+120-mmin-480-execmore{}\;
find.-typef-mtime+30-mtime-3600-execrm{}\;
find.-typef-ctime+30-ctime-3600-execrm{}\;
find.!-name*.java!-name‘*.xml’-atime+7-execrm{}\;
find.-name.svn-typed-execrm-fr{}\;
ls/usr/bin|wc-w
ls-l/usr/bin|grep^d|wc-l
du-sm*|sort-nr|head-10
#sudoapt-getinstallbchunkbchunkimage.binimage.cueimage
mkisofs-oisofile.isodirname
ddif=/dev/cdromof=isofile.iso
先确保有zenity和memcoder
#sudoapt-getinstallabcdeabcde-omp3-b
#sudoapt-getinstallabcdeabcde-oflac-b
#sudoapt-getinstalloptipngoptipng-o7old.pngnew.png#或sudoapt-getinstallpngcrush#pngcrush-bruteold.pngnew.png
#sudoapt-getinstallimagemagickconvert-density196FILENAME.pdfFILENAME.png
identify-verbosexxx.jpg
#支持7Z,ZIP,Zip64,CAB,RAR,ARJ,GZIP,BZIP2,TAR,CPIO,RPM,ISO,DEB压缩文件格式sudoapt-getinstallp7zipp7zip-fullp7zip-rar
sudoapt-getinstallrarunrar
tar-zxvfxxx.tar.gz
tar-jxvfxxx.tar.bz2
tar-zcvfxxx.tar.gzaaabbb
tar-jcvfxxx.tar.bz2aaabbb
sudoapt-getinstalllha
sudoapt-getinstallcabextract
Ctrl+h
Ctrl+l
fc-list在nautilus的地址栏里输入”fonts:///“,就可以查看本机所有的fonts(这个似乎不行)
cal#显示当月日历cal22007#显示2007年2月的日历
date-smm/dd/yy
date-sHH:MM
sudontpdatentp.ubuntu.comsudontpdatetime.nist.gov
sudocp/usr/share/zoneinfo/Asia/Shanghai/etc/localtime
SHIFT+pageUp/pageDown
setterm-dumpn(n:1~7)只是支持tty1-7。没中文。没颜色代码序列。
/var/lib/mysql
mysqldump数据库名>文件名#导出数据库mysqladmincreate数据库名#建立数据库mysql数据库名<文件名#导入数据库
mysql>setnamesutf8;
showtablestatus;#查询表状态showfullprocesslist;#查询mysql进程altertablesite_statsengine=MyISAM;#转换表为MyISAM类型,转表锁为行锁。showvariables;#查看mysql变量
xsetdpmsforceoff
sudoapt-getinstallcpufrequtils#查看cpu当前频率信息sudocpufreq-info设置模式,对应于{最省电(最低频率),用户控制,最高或最低,正常,最大性能}cpufreq-set-g{powersave,userspace,ondemand,conservative,performance}
sudohaltsudoshutdown-hnow#现在关机
sudoshutdown-h23:00#晚上11点自动关机sudoshutdown-h+60#60分钟后关机
sudorebootsudoshutdown-rnow
sudogedit/etc/motd
sudogedit/etc/ssh/sshd_config修改这一行为:PrintLastLogno
synclienttouchpadoff=1那么开启触摸板就是:synclienttouchpadoff=0
打开新立得或者命令行,查找emacs,选择你想要的版本,比如emacs22或者emacs21.
sudocp/usr/share/vim/vimcurrent/vimrc_example.vim/usr/share/vim/vimrc
sudoapt-getinstallvim-full
setnumber如果没有~/.vimrc文件,则可以在/etc/vim/vimrc中加入
setnumber
colorschemescheme可用的scheme在/usr/share/vim/vim71/colors/
sudoapt-getinstallbuild-essential
./configure&&make&&sudomakeinstall
sudoapt-getinstallapt-buildsudoapt-buildinstallkate
sudoapt-getsourcemysql-server
dpkg-source-xmysql-dfsg-5.1_5.1.30-1.dsc
sudoapt-getbuild-depmysql-server
dpkg-buildpackage-rfakeroot
apt-getsourcephp5-cgi#或手工下载源码后使用dpkg-source-xphp5_5.2.6.dfsg.1-3ubuntu4.1.dsc解开源码sudoapt-getbuild-depphp5-cgicdphp5-5.2.6.dfsg.1dpkg-buildpackage-rfakeroot-uc-b
patch-p0 sudoapt-getinstallnautilus-open-terminal rm~/.recently-used 点击菜单,鼠标停留在某条菜单上,键盘输入任意你所需要的键,可以是组合键,会立即生效;