单独编译 kernel 中某些 ko 的方法

更改 Linux kernel 驱动每次重编 kernel 引导非常费力。为了便于调试,可以通过已经有的 Makefile 使用 gcc 来对特定 module 进行编译。这样只需要将 module 以模块方式加载。可以在 linux 环境下进行简单的调试。

命令:

make -C $src_path M=$(pwd) modules

例如:

make -C /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/ M=$(pwd) modules

[root@localhost ata]# ls
acard-ahci.c         libahci.mod.c       pata_artop.c    pata_it821x.c        pata_piccolo.c      sata_inic162x.c
ahci.c               libahci.mod.o       pata_at32.c     pata_ixp4xx_cf.c     pata_platform.c     sata_mv.c
ahci.h               libahci.o           pata_at91.c     pata_jmicron.c       pata_pxa.c          sata_mv.ko
ahci.ko              libata-acpi.c       pata_atiixp.c   pata_legacy.c        pata_qdi.c          sata_mv.mod.c
ahci.mod.c           libata-core.c       pata_atp867x.c  pata_macio.c         pata_radisys.c      sata_mv.mod.o
ahci.mod.o           libata-eh.c         pata_bf54x.c    pata_marvell.c       pata_rb532_cf.c     sata_mv.o
ahci.o               libata.h            pata_cmd640.c   pata_mpc52xx.c       pata_rdc.c          sata_nv.c
ahci_platform.c      libata-pmp.c        pata_cmd64x.c   pata_mpiix.c         pata_rz1000.c       sata_promise.c
ahci_platform.ko     libata-pmp.c.mod    pata_cs5520.c   pata_netcell.c       pata_samsung_cf.c   sata_promise.h
ahci_platform.mod.c  libata-scsi.c       pata_cs5530.c   pata_ninja32.c       pata_sc1200.c       sata_qstor.c
ahci_platform.mod.o  libata-sff.c        pata_cs5535.c   pata_ns87410.c       pata_scc.c          sata_sil24.c
ahci_platform.o      libata-transport.c  pata_cs5536.c   pata_ns87415.c       pata_sch.c          sata_sil.c
ata_generic.c        libata-transport.h  pata_cypress.c  pata_octeon_cf.c     pata_serverworks.c  sata_sis.c
ata_generic.ko       Makefile            pata_efar.c     pata_of_platform.c   pata_sil680.c       sata_svw.c
ata_generic.mod.c    modules.builtin     pata_hpt366.c   pata_oldpiix.c       pata_sis.c          sata_sx4.c
ata_generic.mod.o    modules.order       pata_hpt37x.c   pata_opti.c          pata_sl82c105.c     sata_uli.c
ata_generic.o        Module.symvers      pata_hpt3x2n.c  pata_optidma.c       pata_triflex.c      sata_via.c
ata_piix.c           pata_acpi.c         pata_hpt3x3.c   pata_palmld.c        pata_via.c          sata_vsc.c
Kconfig              pata_ali.c          pata_icside.c   pata_pcmcia.c        pdc_adma.c          sis.h
libahci.c            pata_amd.c          pata_isapnp.c   pata_pdc2027x.c      sata_dwc_460ex.c
libahci.ko           pata_arasan_cf.c    pata_it8213.c   pata_pdc202xx_old.c  sata_fsl.c
[root@localhost ata]# rm *.ko *.o -f
[root@localhost ata]# ls

acard-ahci.c         libata-sff.c        pata_cs5520.c     pata_mpc52xx.c       pata_radisys.c      sata_mv.mod.c
ahci.c               libata-transport.c  pata_cs5530.c     pata_mpiix.c         pata_rb532_cf.c     sata_nv.c
ahci.h               libata-transport.h  pata_cs5535.c     pata_netcell.c       pata_rdc.c          sata_promise.c
ahci.mod.c           Makefile            pata_cs5536.c     pata_ninja32.c       pata_rz1000.c       sata_promise.h
ahci_platform.c      modules.builtin     pata_cypress.c    pata_ns87410.c       pata_samsung_cf.c   sata_qstor.c
ahci_platform.mod.c  modules.order       pata_efar.c       pata_ns87415.c       pata_sc1200.c       sata_sil24.c
ata_generic.c        Module.symvers      pata_hpt366.c     pata_octeon_cf.c     pata_scc.c          sata_sil.c
ata_generic.mod.c    pata_acpi.c         pata_hpt37x.c     pata_of_platform.c   pata_sch.c          sata_sis.c
ata_piix.c           pata_ali.c          pata_hpt3x2n.c    pata_oldpiix.c       pata_serverworks.c  sata_svw.c
Kconfig              pata_amd.c          pata_hpt3x3.c     pata_opti.c          pata_sil680.c       sata_sx4.c
libahci.c            pata_arasan_cf.c    pata_icside.c     pata_optidma.c       pata_sis.c          sata_uli.c
libahci.mod.c        pata_artop.c        pata_isapnp.c     pata_palmld.c        pata_sl82c105.c     sata_via.c
libata-acpi.c        pata_at32.c         pata_it8213.c     pata_pcmcia.c        pata_triflex.c      sata_vsc.c
libata-core.c        pata_at91.c         pata_it821x.c     pata_pdc2027x.c      pata_via.c          sis.h
libata-eh.c          pata_atiixp.c       pata_ixp4xx_cf.c  pata_pdc202xx_old.c  pdc_adma.c
libata.h             pata_atp867x.c      pata_jmicron.c    pata_piccolo.c       sata_dwc_460ex.c
libata-pmp.c         pata_bf54x.c        pata_legacy.c     pata_platform.c      sata_fsl.c
libata-pmp.c.mod     pata_cmd640.c       pata_macio.c      pata_pxa.c           sata_inic162x.c
libata-scsi.c        pata_cmd64x.c       pata_marvell.c    pata_qdi.c           sata_mv.c
[root@localhost ata]# make -C /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/ M=$(pwd) modules
make: Entering directory `/home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15'
  CC [M]  /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/ahci.o
/home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/ahci.c: In function ‘ahci_init_one’:
/home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/ahci.c:1226:67: warning: initialization from incompatible pointer type [enabled by default]
  CC [M]  /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/libahci.o
  CC [M]  /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/ahci_platform.o
  CC [M]  /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/sata_mv.o
  CC [M]  /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/ata_generic.o
  Building modules, stage 2.
  MODPOST 5 modules
  CC      /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/ahci.mod.o
  LD [M]  /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/ahci.ko
  CC      /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/ahci_platform.mod.o
  LD [M]  /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/ahci_platform.ko
  CC      /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/ata_generic.mod.o
  LD [M]  /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/ata_generic.ko
  CC      /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/libahci.mod.o
  LD [M]  /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/libahci.ko
  CC      /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/sata_mv.mod.o
  LD [M]  /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/sata_mv.ko
make: Leaving directory `/home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15'
[root@localhost ata]# ls
acard-ahci.c         libahci.mod.c       pata_artop.c    pata_it821x.c        pata_piccolo.c      sata_inic162x.c
ahci.c               libahci.mod.o       pata_at32.c     pata_ixp4xx_cf.c     pata_platform.c     sata_mv.c
ahci.h               libahci.o           pata_at91.c     pata_jmicron.c       pata_pxa.c          sata_mv.ko
ahci.ko              libata-acpi.c       pata_atiixp.c   pata_legacy.c        pata_qdi.c          sata_mv.mod.c
ahci.mod.c           libata-core.c       pata_atp867x.c  pata_macio.c         pata_radisys.c      sata_mv.mod.o
ahci.mod.o           libata-eh.c         pata_bf54x.c    pata_marvell.c       pata_rb532_cf.c     sata_mv.o
ahci.o               libata.h            pata_cmd640.c   pata_mpc52xx.c       pata_rdc.c          sata_nv.c
ahci_platform.c      libata-pmp.c        pata_cmd64x.c   pata_mpiix.c         pata_rz1000.c       sata_promise.c
ahci_platform.ko     libata-pmp.c.mod    pata_cs5520.c   pata_netcell.c       pata_samsung_cf.c   sata_promise.h
ahci_platform.mod.c  libata-scsi.c       pata_cs5530.c   pata_ninja32.c       pata_sc1200.c       sata_qstor.c
ahci_platform.mod.o  libata-sff.c        pata_cs5535.c   pata_ns87410.c       pata_scc.c          sata_sil24.c
ahci_platform.o      libata-transport.c  pata_cs5536.c   pata_ns87415.c       pata_sch.c          sata_sil.c
ata_generic.c        libata-transport.h  pata_cypress.c  pata_octeon_cf.c     pata_serverworks.c  sata_sis.c
ata_generic.ko       Makefile            pata_efar.c     pata_of_platform.c   pata_sil680.c       sata_svw.c
ata_generic.mod.c    modules.builtin     pata_hpt366.c   pata_oldpiix.c       pata_sis.c          sata_sx4.c
ata_generic.mod.o    modules.order       pata_hpt37x.c   pata_opti.c          pata_sl82c105.c     sata_uli.c
ata_generic.o        Module.symvers      pata_hpt3x2n.c  pata_optidma.c       pata_triflex.c      sata_via.c
ata_piix.c           pata_acpi.c         pata_hpt3x3.c   pata_palmld.c        pata_via.c          sata_vsc.c
Kconfig              pata_ali.c          pata_icside.c   pata_pcmcia.c        pdc_adma.c          sis.h
libahci.c            pata_amd.c          pata_isapnp.c   pata_pdc2027x.c      sata_dwc_460ex.c
libahci.ko           pata_arasan_cf.c    pata_it8213.c   pata_pdc202xx_old.c  sata_fsl.c

gcc: error: elf_i386/elf_x86_64: No such file or directory

最近碰到个 PM 连接的硬盘在 Fedora 15 (FC15)中无法识别的问题,但是在 Fedora 13 中却是可以侦测到的。对比 fc13 使用的是 2.6.34,fc15 则是 2.6.40(3.0.4)。决定逐一将 kernel 降级来判断到底是从那一版的 kernel 开始出现这个问题的。那在使用 fc15 的 gcc 编译 2.6.36.2 以下 kernel 时,一直报错。

错误提示:

gcc: error: elf_x86_64: No such file or directory

解决方法:

这个问题是由于 gcc 4.6 不再支持 linker-style 架构。讲 arch/x86/vdso/Makefile 中,

将以 VDSO_LDFLAGS_vdso.lds 开头所在行的 "-m elf_x86_64" 替换为 "-m64"。
将以 VDSO_LDFLAGS_vdso32.lds 开头所在行的 "-m elf_x86" 替换为 "-m32"。

可以解决这个问题。

 

参考链接:https://bbs.archlinux.org/viewtopic.php?id=119341

【转】Linux Kernel 内核编译安装

一、获取内核源码文件。

从http://www.kernel.org下载内核源码包(linux-2.6.26.tar.gz)。

# cp linux-2.6.26.tar.gz /usr/src
# tar -xvzf linux-2.6.26.tar.gz
# ln -s linux-2.6.26  linux-2.6

二、配置内核。

1. 进入内核文件所在目录。
    # cd /usr/src/linux-2.6

2. 编辑 /usr/src/linux-2.6/Makefile 文件的EXTRAVERSION的值。
    EXTRAVERSION = No_Power_Management_Support   # 以此标识内核

3. 运行命令make mrproper,以确保源文件处于一致、干净的状态。这个命令会删除内核配置文件.config(如果有的话)。

4. 保存默认的配置文件(/usr/src/linux-2.6/arch/x86/i386_defconfig)到安全位置,比如软盘,以便必要时恢复默认配置。

5. 使用配置工具设置内核选项。

#make config(基于文本的最为传统的配置界面,由于有几百个问题要回答,一般使用其它的配置工具。)
#make menuconfig(基于文本选单的配置界面)
#make xconfig(基于图形窗口模式的配置界面)
#make oldconfig(使用已有的内核配置文件,仅提示一些新的特性。)

选择相应的配置时,有三种选择:  

 “Y”- 将该功能编译进内核
 “N”- 不将该功能编译进内核
 “M”- 将该功能编译成可以在需要时动态插入到内核中的模块。

参考:Linux 2.6.19.x 内核编译配置选项简介

设置完选项后,保存更改。上述配置工具会生成配置文件 /usr/src/linux-2.6.26/.config

如果要使用现有的配置文件(比如默认的配置文件),首先将该配置文件拷贝为/usr/src/linux-2.6/.config,然后执行命令    make oldconfig

三、编译内核。

1.make clean
   清除前面过程中make后遗留下的文件。

2.make dep
   读取配置过程生成的配置文件,来创建对应于配置的依赖关系树,从而决定哪些需要编译而那些不需要。2.6内核不需要执行此步骤。

3.make zImage
   make bzImage

   这两个命令会在/usr/src/linux-2.6下创建文件vmlinux,这是未压缩的内核。

   make zImage 和 make bzImage 会各自在/usr/src/linux/arch/i386/boot/下创建文件zImage和bzImage,这是已经压缩的内核。zImage是用gzip压缩的,适合存储在软盘上的内核。bzImage是更大的超过软盘空间限制的压缩内核。

4.make modules   编译生成相应的模块。

5.make modules_install
   一旦模块被编译,它们须被拷贝到相应的子目录/lib/modules下,make modules_install 命令执行这一任务。
   模块在系统中的标准目录位于/lib/modules/x.y.z,后面的x.y.z是版本号,为安全起见,在运行make modules_install之前最好对/lib/modules进行备份。

6.make install 通过执行以下步骤完成安装。
  (1)把压缩内核映象拷贝到/boot目录下, 并创建相应的System.map符号链接; 
  (2)修改bootloader的配置文件;
  (3)调用mkinitrd程序创建内核的initrd映象. 对于GRUB而言, 将在/boot/grub/grub.conf配置文件增加如下类似的配置行:

  title Red Hat Linux (2.***)
  root(hd0, 1)
  kernel /boot/vmlinuz-2.*** ro root=LABEL=/
  initrd /boot/initrd-2.***.img

 

转自:http://wanghongwei.iteye.com/blog/232543

Linux 下使用 Crontab 命令实现定时操作重启(计划任务)

crond 服务是一个定时执行的服务,可以通过 crontab 命令添加或者编辑需要定时执行的任务:

  • crontab -u //设定某个用户的 crond 服务,一般 root 用户在执行这个命令的时候需要此参数
  • crontab -l //列出某个用户的 crond 服务的详细内容
  • crontab -r //删除没个用户的 crond 服务
  • crontab -e //编辑某个用户的 crond 服务

编辑中的内容格式:

#MIN HOUR DAY MONTH DAYOFWEEK COMMAND

 

比如:

  • #每天早上6点10分

        10 6 * * * date

  • #每两个小时

        0 */2 * * * date (solaris 5.8似乎不支持此种写法)

  • #晚上11点到早上8点之间每两个小时,早上8点

        0 23-7/2,8 * * * date

  • #每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点

        0 11 4 * mon-wed date

  • #1月份日早上4点

        0 4 1 jan * date

关于国内 DNS 解析问题

最近洋葱头天天都会发大量的网站链接错误解析、无法连接报告。

奇怪的现象是,通过国外 VPS 却能够正常访问,国内也可以通过 IP 进行访问。那问题很明显,是 DNS 解析的问题,而且在国内。GoDaddy 的 NS 时不时会出现这样的问题。果断更换成了 Linode 自身的 DNS,虽然牺牲了几十毫秒的延时,换来的是可用性。

同样,已经将本地的 DNS 也换成了 Google 提供的。又好记速度又快。

8.8.8.8
8.8.4.4

【笔记】Bash Shell 下算术运算的方法

以下摘自 www.tnc.edu.tw,by 臥龍小三。原文

 

Bash shell 的算術運算有四種方式。

  1. 第一種:使用 expr 這個外部程式

    加法 r=`expr 4 + 5`

    echo $r

    注意! '4' '+' '5' 這三者之間要有空白

    注意! 以下是錯誤的寫法:

    r=`expr 4 * 5`

    原因:* 對 bash 而言有特殊意義(萬用字元),所以要改用以下寫法:

    乘法 r=`expr 4 \* 5`

    也就是說用 \ 取消 * 的特殊意義。

  2. 第二種:使用 $(( ))

    上述計算,可用以下方式來做:

    r=$(( 4 + 5 ))

    echo $r

  3. 第三種:使用 $[ ]

    上述計算,可用以下方式來做:

    r=$[ 4 + 5 ]

    echo $r

  4. 乘法

    r=`expr 4 \* 5`

    r=$(( 4 * 5 ))

    r=$[ 4 * 5 ]

    echo $r

  5. 除法

    r=`expr 40 / 5`

    r=$(( 40 / 5 ))

    r=$[ 40 / 5 ]

    echo $r

  6. 減法

    r=`expr 40 – 5`

    r=$(( 40 – 5 ))

    r=$[ 40 – 5 ]

    echo $r

  7. 求餘數

    r=$[ 100 % 43 ]

    echo $r

  8. 乘冪 (如 2 的 3 次方)

    r=$(( 2 ** 3 ))

    r=$[ 2 ** 3 ]

    echo $r

    註:expr 沒有乘冪

Bash 的第四種算術運算方法,它使用 let 這個命令,如下所示:

加法:

n=10
let n=n+1
echo $n

結果為 11


乘法:

let m=n*10
echo $m

結果為 110


除法:

let r=m/10
echo $r


求餘數:

let r=m%7
echo $r


乘冪:

let r=m**2
echo $r

雖然 Bash shell 有數種算術運算方法,但並不是每一種方法都可以跨平台,若您的 script 檔要在其它平台上使用,建議最好用 expr 這種方式,或許可攜性會好一點。

另外,我們在 script 中經常需要把某一變數做加一運算,以下四法皆可:

m=$[ m + 1]

m=`expr $m + 1`

m=$(($m + 1))

let m=m+1

【笔记】关于多 CPU 系统了下的 APIC(Advanced Programmable Interrupt Controller)分配方式

原文如下:

External Interrupt Distribution in Multi-APIC System

Static Distribution
• According to Redirection Table (which is programmable)
Dynamic Distribution
• According to “lowest priority” scheme – Sent to the local APIC of the processor that is executing process with the lowest priority.
• Each local APIC has a programmable Task Priority Register (TPR), updated by OS to compute the priority of currently running process.

In Linux

• The booting CPU calls setup_IO_APIC_irqs() to initialize I/O APIC and set Redirection Table entries to allow all IRQs to be routed to each CPU based on “lowest priority” scheme.
• All CPUs then call setup_local_APIC() to initialize their own local APIC, and give a fixed value to TPR. 
• Linux kernel never modifies this value after initialization, resulting in a round-robin distribution of external IRQs among all the CPUs.

Linux 下如何分别打包(压缩)目录下所有文件夹,xargs,awk

这个问题可以通过一行命令完成(当然是通过管道 “|” 所包含多条命令啦)。首先需要拆分这个问题。

  • 获得所有目录列表,通过 grep 命令抓取以 d 标记开头的行,即为目录。
[edwin@edwinW /]# ls
Dropbox  bin  boot  data  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  sbin  selinux  srv  sys  tmp  usr  var  wwwroot
[edwin@edwinW /]# ls -l | grep ^d                   
drwxrwxrwx  6 nobody nobody  4096 Jul 19 05:00 Dropbox
drwxr-xr-x  2 root   root    4096 May 11 19:58 bin
drwxr-xr-x  2 root   root    4096 May 11 19:58 boot
drwxr-xr-x  3 mysql  mysql   4096 Apr 12 19:35 data
drwxr-xr-x 12 root   root   13420 Jul  5 21:45 dev
drwxr-xr-x 53 root   root    4096 Jul 12 20:38 etc
drwxr-xr-x  6 root   root    4096 May 11 19:58 home
drwxr-xr-x  9 root   root    4096 Jul  1 00:02 lib
drwxr-xr-x  7 root   root    4096 Jul  1 00:01 lib64
drwx------  2 root   root   16384 May 18  2010 lost+found
drwxr-xr-x  2 root   root    4096 May 11 19:58 media
drwxr-xr-x  3 root   root    4096 Jun 12 21:32 mnt
drwxr-xr-x  2 root   root    4096 May 11 19:58 opt
dr-xr-xr-x 96 root   root       0 Jul  5 21:45 proc
drwxr-x---  8 root   root    4096 Jul 12 20:07 root
drwxr-xr-x  2 root   root    4096 Jul  1 00:02 sbin
drwxr-xr-x  2 root   root    4096 May 11 19:58 selinux
drwxr-xr-x  2 root   root    4096 May 11 19:58 srv
drwxr-xr-x 13 root   root       0 Jul  5 21:45 sys
drwxrwxrwt  6 root   root   94208 Jul 19 23:39 tmp
drwxr-xr-x 15 root   root    4096 Jun 12 21:24 usr
drwxr-xr-x 18 root   root    4096 Jun 12 21:24 var
  • 这样只是 ls 了所有目录,接下来需要获得目录下所有文件夹名称,不需要多余信息。使用 awk 选取名称列。
[edwin@edwinW /]# ls -l | grep ^d | awk '{print $9}'
Dropbox
bin
boot
data
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
sbin
selinux
srv
sys
tmp
usr
var
  • 接下来最后一步是打包这些目录。使用 xargs 来实现。
[edwin@edwinW /]# ls -l | grep ^d | awk '{print $9}' | xargs -i tar jcvf {}.tbz {}

 

其实 Linux 下很多问题都可以这样一步一步分解成不同部分,用不同命令组合来完成,这就是 bash 脚本的精髓。

 

参考:

awk:http://linux.die.net/man/1/awkhttp://www.gnu.org/software/gawk/manual/gawk.html

xargs:http://unixhelp.ed.ac.uk/CGI/man-cgi?xargshttp://en.wikipedia.org/wiki/Xargs

cut:http://www.manpagez.com/man/1/cut/

grep:http://unixhelp.ed.ac.uk/CGI/man-cgi?grep

Linux 下流量查看监控软件 iftop 的安装

最近几天发现网站的流量消耗的非常厉害,考虑到 VPS 是有流量限制的,然后就想查看下当前的流量状况和网络连接状态。

iftop 官方网站:http://www.ex-parrot.com/~pdw/iftop/

安装 iftop,必须先安装 libpcap。libpcap 是 unix/linux 平台下的网络数据包捕获函数包,大多数网络监控软件都以它为基础。网站,http://www.tcpdump.org/release/

wget http://www.tcpdump.org/release/libpcap-0.9.8.tar.gz
tar -zxvf libpcap-0.9.8.tar.gz
cd libpcap-0.9.8
./configure
make
make install

libpcap 安装完成,再安装 iftop,

wget http://www.ex-parrot.com/~pdw/iftop/download/iftop-0.17.tar.gz
tar zxvf iftop-0.17.tar.gz
cd iftop-0.17
./configure
make
make install