修改shell终端提示信息

Shell终端默认只显示用户名、主机名、工作目录,有时候我们需要对Shell终端显示的信息简单调整一下,以便使工作更有效率。比如我们可以给Shell终端加上时间,以便我们计算脚本执行的时间,如下所示:

[root@localhost src]$echo $PS1
[\u@\h \W]$    #读取默认终端显示信息
[root@localhost src]$export PS1="[\u@\h \W \t]$"    #给Shell终端加上时间显示
[root@localhost src 16:19:18]$    #时间已经显示出来了

Shell终端的显示,使用到以下两个环境变量
PS1:就是用户平时的提示符。
PS2:第一行没输完,等待第二行输入的提示符。

[root@localhost src]$echo $PS1
[\u@\h \W]$    #读取默认终端显示信息

想重启后继续生效,只需要修改配置文件即可。
对于当前用户只需修改~/.bashrc,对于系统所有用户我们修改/etc/bashrc。 继续阅读

Linux加载内核模块

Linux加载内核模块的过程,记录一下,主要命令有modprobe、insmod及depmod等,命令由module-init-tools的软件包提供,请先确认系统安装了此软件包。本文方法已在CentOS 5 x86_64和CentOS6 x86_64系统上验证通过。

一,查看内核已加载的模块

[root@os ~]# lsmod

该命令通过读取/proc/modules文件中的内容列出已加载的模块。
系统中的所有模块位于/lib/modules/$(uname -r)/kernel/下的各种目录中。

二,手动加载模块
手动加载模块的方法有两个,下面分别介绍。

2.1 执行insmod命令加载模块

[root@os ~]# insmod mycdev.ko

2.2 执行modprobe命令加载模块

将模块拷入到相应目录下
[root@os ~]# cp mycdev.ko /lib/modules/$(uname -r)/kernel/drivers/char/

然后把模块的绝对地址写入到modules.dep文件中
手动写入(注意写入的行末尾有一个冒号)
[root@os ~]# echo /lib/modules/$(uname -r)/kernel/drivers/char/mycdev.ko: >> /lib/modules/$(uname -r)/modules.dep
或者执行如下命令自动写入
[root@os ~]# depmod -a

然后,就可以加载模块了
[root@os ~]# modprobe mycdev        #加载模块
[root@os ~]# lsmod | grep mycdev    #检验加载是否成功
mycdev                 35840  0

三,卸载模块

[root@os ~]# rmmod sysdog

四,开机自动加载模块
鸟哥的linux私房菜一书中,介绍的Linux系统开机流程:
(1) 载入BIOS的硬件信息,并取得第一个开机装置的代号
(2) 读取第一个开机装置的MBR的boot Loader (grub)的开机信息
(3) 载入OS Kernel信息,解压Kernel,尝试驱动硬件
(4) Kernel执行init程序并获得run-lebel信息(如3或5)
(5) init执行/etc/rc.d/rc.sysinit
(6) 启动内核外挂模块(/etc/modprobe.conf)
(7) init执行run-level的各种Scripts,启动服务
(8) init执行/etc/rc.d/rc.local
(9) 执行/bin/login,等待用户Login
(10)Login后进入Shell

打开/etc/rc.sysinit(是一个软链接,指向/etc/rc.d/rc.sysinit),会发现有如下内容

……
# Load other user-defined modules
for file in /etc/sysconfig/modules/*.modules ; do
  [ -x $file ] && $file
done

# Load modules (for backward compatibility with VARs)
if [ -f /etc/rc.modules ]; then
        /etc/rc.modules
fi
……

由此可见,如果想让一个模块开机自动加载,只要把模块加到这两个文件之中即可。

[root@os ~]# echo 'modprobe mycdev' > /etc/sysconfig/modules/mycdev.modules
[root@os ~]# chmod +x /etc/sysconfig/modules/mycdev.modules #不能少,否则会加载失败

然后重启,执行lsmod命令,会发现模块已加载。

Linux更新内核

1,准备工作
安装基础包:yum install -y gcc make bison ncurses-devel rpm-build
要编译内核就必须有新的内核,可以从Kernel官方网站www.kernel.org上下载最新的内核源码,解压,进入目录;

2,清除垃圾
一般是在就内核重新编译时使用,在编译新的内核是不需要的;
make clean及make mrproper;

3,内核裁减
内核裁减配置的原则: 从实际出发。 如:根据支持的硬件设备来决定需要选择的驱动模块,根据需要选择所支持的文件系统格式等; 具体配置命令为:
make config:通过命令接口,依次要求你设定每个选项,如果.config文件存在,会根据该文件来设置默认值;
make menuconfig:最常用,显示以curses为基础的、终端式的配置菜单。
make xconfig:图形界面,显示以Tk为基础X Window配置菜单。
说明:这一步中选择为M模式的,编译到/lib/modules/下相关目录文件中;选择为*模式的,编译到内核中即/boot/vmlinuz中,启动时加载到内核中。 具体内核裁减配置参阅其它资料。

可能出现的问题:
make menuconfig时提示make: *** No rule to make target `config’. Stop.
解决方法:没有在正确的目录里进行make menuconfig,一定要进入正确的目录,比如/root/linux-2.6.32.27,然后再执行make menuconfig。

4,生成依赖关系
make dep
内核源码树中大多数文件都会与一些头文件有依存关系,要想编译内核顺利,在正式编译前必须让内核源码树中的各个Makefile文件知道这些依存关系。 make dep读取配置过程生成的配置文件,来创建对应于配置的依赖关系树,从而决定哪些需要编译而那些不需要。依存关系建立期间会在内核源码树中每个子目录里产生一个隐藏的.depend文件,此文件内含子目录里各个文件所依存的头文件清单。 继续阅读

安装好Oracle Client以后没有tnsnames.ora文件

要在Windows系统中远程管理oracle数据库,必须先在本地安装Oracle Client,然后再配合PLSQL来操作。

首先给出Oracle 11g的下载地址,下载页面里面包含了server、client、gateway,选择自己需要的下载:
Oracle Database 11g Release 2 for Microsoft Windows (32-bit)
Oracle Database 11g Release 2 for Microsoft Windows (x64)

安装完Oracle Client以后,发现相应目录中没有tnsnames.ora文件,其实只要手动建立一个就可以了。
在 oracle安装位置\product\11.2.0\client_1\network\admin 目录下,建立一个tnsnames.ora,内容如下

TEST =
  (DESCRIPTION = 
    (ADDRESS = (PROTOCOL = TCP)(HOST = 服务端IP地址)(PORT = 1521))
    (CONNECT_DATA = 
	  (SERVER = DEDICATED)
	  (SID=orcl)
	)
  )

python调用shell脚本

os.system(command) 返回command命令的退出状态。这实际上是使用C标准库函数system()实现的。这个函数在执行command命令时需要重新打开一个终端,并且无法保存command命令的执行结果。

os.popen(command,mode) 返回command命令的执行结果。返回值是一个文件对象,可以读或者写(由mode决定,mode默认是’r’)。如果mode为’r’,可以使用此函数的返回值调用read()来获取command命令的执行结果。如a=os.popen(cmd).read()。还可以使用 a.rstrip() 进行去除换行符“\n”。

commands.getstatusoutput(command) 返回command命令的执行状态和执行结果,返回的是一个元组。该方法其实也是对popen的封装。

演示1:

import os
line=os.popen('date -d -5day +"%Y%m%d"','r')
print line.read().rstrip()  #调用read()方法获取结果,调用rstrip()方法去除换行符

执行结果如下

[root@bear ~]# python 9.py
20130306  #如果不调用rstrip()方法,后面会多出一行空行

继续阅读

配置RedHat yum源

由于RedHat与CentOS同根同源的特性,因此,它俩的yum源可以共用。只是在使用的时候,要注意版本号,比如RedHat5必须使用CentOS5的源,RedHat6必须使用CentOS6的源。

一,导入key文件(可省略)
Key文件用于检验yum下载回来的软件有无问题,类似于Windows系统里的md5验证。这一步不是必须的步骤。

Redhat5执行 
$ rpm --import http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5

Redhat6执行
$ rpm --import http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6

$ rpm -qa | grep gpg-pubkey*    #检查本机安装的key
$ rpm -e gpg-pubkey-e8562897-459f07a4    #卸载key

二,配置RedHat(CentOS)的yum源
在/etc/yum.repos.d/目录下新建一个.repo的文件,把yum源的地址写进去即可。

RedHat 5的yum源:

$ vi /etc/yum.repos.d/163.repo    #如果没有这个文件,新建一个
[base]
name=CentOS-$releasever - Base - 163.com
baseurl=http://mirrors.163.com/centos/$releasever/os/$basearch/
enabled=1
gpgcheck=0

[updates]
name=CentOS-$releasever - Updates - 163.com
baseurl=http://mirrors.163.com/centos/$releasever/updates/$basearch/
enabled=1
gpgcheck=0

[addons]
name=CentOS-$releasever - Addons - 163.com
baseurl=http://mirrors.163.com/centos/$releasever/addons/$basearch/
enabled=1
gpgcheck=0

[extras]
name=CentOS-$releasever - Extras - 163.com
baseurl=http://mirrors.163.com/centos/$releasever/extras/$basearch/
enabled=1
gpgcheck=0

RedHat 6的yum源:

$ vi /etc/yum.repos.d/163.repo    #如果没有这个文件,新建一个
[base]
name=CentOS-$releasever - Base - 163.com
baseurl=http://mirrors.163.com/centos/$releasever/os/$basearch/
enabled=1
gpgcheck=0

[updates]
name=CentOS-$releasever - Updates - 163.com
baseurl=http://mirrors.163.com/centos/$releasever/updates/$basearch/
enabled=1
gpgcheck=0

[extras]
name=CentOS-$releasever - Extras - 163.com
baseurl=http://mirrors.163.com/centos/$releasever/extras/$basearch/
enabled=1
gpgcheck=0
$ yum clean all
$ yum makecache    #生成缓存

如果机器无法联网,在redehat的安装光盘里预置了很多软件和依赖包,也可以直接把将本地光盘设置为yum源

Linux修改日期时间

1.修改时区为东八区
执行代码:cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

2.修改日期,如修改为2013年4月13日
执行代码:date -s 04/13/2013

3.修改时间。如修改为17:30
执行代码:date -s 17:30:00

然后将当前时间和日期写入BIOS,避免重启后失效
执行代码:hwclock -w

==========================================

2013.04.04补充:
今天发现自己的一个VPS,安装的是Centos系统,其时间无法用上面的命令修改,后经过百度解决了问题,现整理一下思路:

检查本机是否安装了 nptd 服务(可以不开机启动),如果没有,则 yum install -y ntp

检查 /etc/ntp.conf 里面的时间同步服务器是否有问题(一般是没有问题的)。

执行 ntpd -gq && hwclock -w 同步时间并写入BIOS
(g选项允许调整15分钟以上,q选项是在同步成功后退出)
发现仍然无效,时间仍然相差了近20分钟

编辑 /etc/sysctl.conf 文件,添加一行 xen.independent_wallclock = 1,然后执行 sysctl -p 命令重新加载内核配置

再一次执行 ntpd -gq && hwclock -w 重新同步时间,然后再使用 date 命令,发现时间正常了。

原因分析:这是 Xen 虚拟化技术导致的,Xen 虚拟机默认不允许不同的虚拟机使用不同的系统时间,因此所有虚拟机的系统时间都会同宿主机的系统时间严格同步,用 date 命令修改虚拟机系统时间时虽然提示成功但其实系统时间还是没变,因此只好修改内核配置文件了。

==========================================

2017.12.12补充:Ubuntu 16.04 VPS更新系统时间的方法,跟上面的命令大同小异

$ sudo apt-get install ntp

$ sudo dpkg-reconfigure tzdata  #选择Asia–Hong Kong即可

$ sudo ntpd -gq    #同步NTP时间

$ date         #查看系统时间
Fri Dec  8 18:49:11 HKT 2017

$ hwclock -r   #查看hardware时间
Fri 08 Dec 2017 08:51:05 PM HKT  .429333 seconds

$ sudo hwclock -w --systohc   #set the hardware clock from the current system time

$ hwclock -r   #再次查看hardware时间
Fri 08 Dec 2017 06:49:22 PM HKT  .953891 seconds 这应该是12小时制,所以显示06:49是正常的

$ date
Fri Dec  8 18:49:32 HKT 2017
Page 20 of 29« First...10...181920212223...Last »