Linux群常见问题整理(三)

学习┊工作相关 Apr 28th, 2010 easylife

  [Linux群常见问题整理]坚持整理到了第三期,是个不错的开头。自我鼓励下,希望以后能一直坚持下去。哈哈!这次整理的一些小技巧都还是挺实用的。在发布到这里的同时,打算以后在CU上也发一份,把一些有用的知识点分享给更多学习Linux的朋友们。

  Q:Linux终端下同时输入ctrl+v,ctrl+n回车后产生乱码?(提供人:Neil)
A:如果终端显示16进制字符E就会出现乱码,只要输入16进制F就能恢复。

? BASH 1 echo -e '\xf'

  Q:bash中如何取得当前进程的pid(提供人:galf)
A:用$$来取。

? BASH 1 echo $$


Q:内核升级后重启内核失败的panic kill的问题(提供人:土猪一号)

  重启内核失败的现象如下

? BASH 1
2
3
4
5
6 mount: could not find filesystem '/dev/root'
setuproot: moving /dev failed: No such file or directory
setuproot: error mounting /proc: No such file or directory
setuproot: error mounting /sys: No such file or directory
switchroot: mount failed: No such file or directory
Kernel panic - not syncing: Attempted to kill init!

  A:产生问题的主要原因:是由于无法加载磁盘硬件的模块驱动。解决方式主要是通过make menuconfig中加载sata sici的devices设备模块驱动。常用的驱动模块如下:

? BASH 1
2
3
4
5
6
7
8
9 insmod /lib/uhci-hcd.ko
insmod /lib/ohci-hcd.ko
insmod /lib/ehci-hcd.ko
insmod /lib/jbd.ko
insmod /lib/ext3.ko
insmod /lib/scsi_mod.ko
insmod /lib/sd_mod.ko
insmod /lib/libata.ko
insmod /lib/ahci.ko

  如果你initrd中已包含了相应的SATA驱动,出现这种现象的原因就可能是因为initrd是旧版本mkinitrd生成的。

  解决方法就是加入对旧版sysfs路径的支持,方法如下:

  a)、通过make menuconfig选中以下对应的选项

? BASH 1 General setup--> [*] enable deprecated sysfs features to support old userspace tools

  b)、修改.config文件

  修改.config文件中CONFIG_SYSFS_DEPRECATED_V2

? BASH 1 CONFIG_SYSFS_DEPRECATED_V2=y #默认该选项为not set,被注释掉的。

  注:修改这项是因为旧版的mkinitrd及其nash在内核没有CONFIG_SYSFS_DEPRECATED_V2参数时默认使用旧版sysfs路径格式,从而在新内核下无法正确访问/sys内的硬盘信息节点。

  Q:如何快速编译内核模块(提供人:枪炮)
A:常用的方法有以下两种:

  方法一:

  格式:

? BASH 1 make -C $KDIR M=$PWD modules

  例子:

  如在内核源码树内

? BASH 1 make CONFIG_REISER4_FS=m M=fs/reiser4 modules

  如在内核源码树外

? BASH 1
2
3
4
5 make CONFIG_FUSE_FS=m -C /home/blue/linux/linux-2.6.24.3 M=/home/blue/linux/linux-2.6.24.3/drivers/char/mydriver/ modules
 
或者
 
make KERNEL_DIR=xxx M=$PWD modules  //KERNEL_DIR也是内核源码所在的路径

  方法二

  格式:

? BASH 1 make -C $KDIR SUBDIRS=$PWD modules

  例子:

  如在内核源码树外

? BASH 1
2 # cd /home/usb/usb-2.6.21.5/
make -C /usr/src/linux/ SUBDIRS=$PWD modules

  如在内核源码树内

? BASH 1 make CONFIG_REISER4_FS=m SUBDIRS=fs/reiser4 modules

  注:make -C $KDIR用来指定内核源代码的路径。’$KDIR’描述内核源代码的目录。Make会进入实际指定的目录执行,但是完成执行时会返回当前的目录。M=用来告诉kbuild正在构建一个外部模块,M=是外部模块(kbuild文件)所在的目录。和M=选项一样,SUBDIRS=的效果一样,是旧的语法。保证向后兼容的。

  Q:kill指令的一些小技巧(提供人:土猪一号,Mike)
A:关闭当前shell下产生的所有进程

? BASH 1 kill -9 0

  注:PID 0表同一进程组的进程

  关闭大于1所有进程

? BASH 1 kill -9 -1

  注:man中的解释
-1  All processes with pid larger than 1 will be signaled。
Kill all processes you can kill。

检查PID是否存在

? BASH 1 kill -0 pid

  注:对于信号“0”MAN中的解释:exit code indicates if a signal may be sent

  Q:用phpize编译动态扩展模块?

  A:phpize命令是用来准备PHP扩展模块的编译环境,通过phpize可以建立php的扩展模块。phpize是属于php-devel包中(档案预设存放于/usr/bin/phpize)。

  整个过程和动态编译apache的模块非常相似,类似于apache的apxs

  下面是一个例子,扩展模組的源程序位于extname目录中:

? BASH 1
2
3
4
5 $ cd extname
$ phpize
$ ./configure
$ make
# make install

  注意:如在执行./configure时出现”configure: error: Cannot find php-config. Please use –with-php-config=PATH”时,说明你的配置文件位置可能不在缺省目录(–with-php-config预设在/usr/bin/php-config)。可重下类似以下指令调整:

? BASH 1 ./configure --with-php-config=/usr/local/php/bin/php-config

  这个文件通常是在php安装目录的bin目录下的一个文件名叫做php-config或者php-config5的文件。

然后把该目录下的extname.so复制到你php.ini中的extension_dir指向的目录中,最后需要调整php.ini文件,加入extension=extname.so这一行之后才能使用此扩展库。

  重启web服务器,使你的php配置更新。用phpinfo()检查新模块是否生效。

  任意建一个PHP页面,加入以下代码:

? BASH 1 <?php phpinfo(); ?>

  访问这个页面,如果增加了你刚刚添加的模块,基本上就证明OK了。

  Q:一个不会kill shell自身的指令(提供人:竹)
A:killall5是SystemV中的一个killall(杀死所有进程)命令.它会向所有进程发送一个信号,但调用killall5命令的shell自身不会被kill(杀掉)。

  命令格式

? BASH 1 killall5 -signalnumber

  Q:什么是dmraid?(提供人:金雕,Mike)

  dmraid 全名为设备对应器磁盘阵列(Device Mapper RAID),利用Linux内核提供的设备对应器(Device Mapper)机制,为多种磁盘阵列设备提供磁盘阵列的设备文件,让用户可以在Red Hat Enterprise Linux系统中使用硬件磁盘阵列设备。

  dmraid主要针对BIOS RAID(Fake RAID)。

  更详细的资料可见:dmraid介绍Linux上应用ATA/SATA RAID技术(原文) #需×××
dmraid介绍Linux上应用ATA/SATA RAID技术(转载) #墙内可访