RedHat常见命令学习总结

1./dev/hda为一个盘,其中/dev/hda1等等为一个分区,值得注意的是这里的数字代表了分区的顺序,也就是说,hda1应该是最靠近硬盘开始的那几个扇区,然后才是hda2啥的。对于第二块硬盘,以hdb开始。在/dev目录下,既可以看到/dev/hda,也能看到/dev/hda1、/dev/hda2等等,没有数字的就是代表整个硬盘,有数字的就是代表一个分区。比如我要看MBR,那么MBR不属于任何一个分区,所以应该在/dev/hda上写或读取MBR。
另外,HDA与SDA的区别是由硬盘造成的.HDA是IDE硬盘的名称.SDA是SATA的名称.在最新的2.6.19内核里,所有的硬盘都叫SDA了。

主分区、逻辑分区、扩展分区:一个硬盘的分区表A最多只能记录四个分区,如果要创建四个或四个以上的分区,那么分区表A中的第四个分区会的建立一个新的指针,指向第三个分区后面的一块B,这个B会的再建立一个分区表,并且从这个分区表上建立的分区都叫做逻辑分区(扩展),而前三个分区都叫做主分区。也就是说,/dev/sda4是一个包含扩展分区表的分区,所以会有下面的情况出现:
系统中有一块硬盘sda,已经做了3个分区,分别是sda1,sda2,sda3,这个时候建立第四个分区,会的突然出现2个分区,变成sda1,sda2,sda3,sda4,sda5,其中sda4包含了扩展分区表,真正想创建的那个第四个分区其实是在sda5里边。

2.Bootloader用于引导系统,一般在装系统的时候分三个区,一个是/boot,一个是swap,还有一个是/。/boot在装系统的时候一般建议放在第一个分区里,也就是/dev/sda1,因为有些bootload可能由于数据结构字节的限制,找不到太后面的分区。/boot中主要是grub和其配置文件。swap一般是内存的2倍。

3.安装RHCE的时候按下ctrl+F1~6啥(可能要加上alt)的可以看到一些输出,包括一个安装在内存中的linux,在那里可以安装驱动之类的

4.软RAID:软件层面上的RAID,比如两个分区做一个RAID1,这两个分区对外的话只能看到一个挂载点。做了软raid后设备名就是mdX,X是个数字。

5.man看到的那个数字是用于区别不同类型的,比如open可以是一个命令,这个时候用man 1 open可以看到。如果要看系统调用的open命令,那么就用man 2 open。具体的可以看man的man。如果有时候没有man帮助,可以试试有没有info命令,这个也是类似于man。但可能会有man没有的一些命令。

6.ctrl+
c:中断程序
s:可以连续输入命令,然后ctrl+q退出
l:清屏
r:可以立刻找到最近的命令
z:暂停程序并放到后台

7.基本命令
tcpdump port 22:查看22端口的流量。
stat XXX:显示文件的基本属性
ls -F:如果是目录,加上斜杠。如果是可执行文件,加上*。如果是连接,加上@
ls –color=tty:显示有颜色的ls
ls -li:查看inode号
rm -i:删除前提示
alias ll=’ls -l’
unalias ll
date +%y%m%d date +%Y-%m-%d\ %k:%M:%S
做了计算后的date(比如获取前一天的日期):date –date “1 days ago” +”%Y%m%d”
cal:日历
file XXX:查看某个文件是什么文件
mount -t xxx /dev/sda1 /mnt
mount windows共享!:mount -t cifs -o username=administrator //192.168.0.1/tools /mnt
NFS共享:mount 192.168.0.12:/var/ftp/pub /mnt
du -sh DIRXXX:看文件夹大小,如果不加-s,则递归输出所有子目录、文件的大小
df -h:查看分区大小
pstree:查看进程调用关系

ln a b:建立a的硬连接b,有相同的inode号,只删除其中的一个并不会删除文件
ln -s a b:建立a的软连接b,删除a的话b就指向了无效的东西
如注意inode号,inode号是文件的唯一标识:
[db2inst1@localhost poiu]$ touch a
[db2inst1@localhost poiu]$ ln a b
[db2inst1@localhost poiu]$ ls -i
883011 a 883011 b
[db2inst1@localhost poiu]$ ln -s a c
[db2inst1@localhost poiu]$ ls -i
883011 a 883011 b 883012 c
[db2inst1@localhost poiu]$

uptime:
查看系统启动时间。后面的load average是1分钟、5分钟、15分钟内等待执行的进程压力。一般等于cpu个数是正好的,如果大于cpu个数说明压力大了。

usermod -G root,mysql XXX 设置XXX属于root和mysql组
groupadd ggg -g 1000 添加组ggg,组id为1000
useradd uuu -g 1000 -G root -p uuu 添加用户uuu,属于两个组,分别为组id为1000的ggg和组名为root的组
如:
[uuu@localhost ~]$ id
uid=503(uuu) gid=1000(ggg) groups=0(root),1000(ggg)
一些相关的信息,比如建立用户的时候是否建立目录什么的,默认值保存在/etc/login.defs中
/etc/passwd 用户帐户信息文件
/etc/shadow 密码文件
/etc/group 用户组信息文件
/etc/gshadow 用户组密码文件
上面四个文件默认都有备份,名字为/etc/XXX-,如/etc/passwd-,目的是防止源文件被误删后能用来还原

who:查看哪些用户登录了,用了什么控制台(tty是真实的控制台,pts是虚拟的)
w:功能比who强大,能看到用户从哪个ip登录,还能看到当前使用什么命令。如果想杀掉某个用户,可以用skill:
[uuu@localhost ~]$ w
09:58:28 up 8 days, 6:26, 5 users, load average: 0.05, 0.03, 0.03
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root :0 – 26May13 ?xdm? 45:54 0.32s /usr/bin/gnome-
root pts/1 :0.0 26May13 17days 0.24s 0.24s bash
root pts/2 192.168.71.1 Wed21 3:59m 1.92s 0.02s -bash
root pts/3 192.168.71.1 Wed21 4:14m 0.59s 0.26s -bash
root pts/4 192.168.71.1 09:46 0.00s 0.15s 0.01s w
[uuu@localhost ~]$ skill -9 pts/1

wall XXX:广播XXX这个信息给所有终端。有个mesg的开关,貌似要开了这个开关才行。
last/lastlog:可以看到之前谁登录了系统

一般已经登录的用户需要重新登陆下才能获取新的权限。
chmod [ugoa][+-=][xrw] XXX a是all的意思,u是user,g是group,o是other
linux中权限不叠加,比如:
—r—rw-:用户的权限什么都没有,哪怕他属于有读权限的组,哪怕其它人有读写的权限。

修改时间:
先修改时区,一般是CST时区(Chinese standard time):
# vi /etc/sysconfig/clock
ZONE=”Asia/Shanghai”(查/usr/share/zoneinfo下面的文件)
UTC=false
ARC=false
# rm /etc/localtime
# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
然后修改时间:
date –set “07/14/2013 10:08:00”
然后记得用hwclock -w 同步下硬件时间。我们现在date改的是系统时间,这个时间是系统启动的时候从硬件时间读取过来的。一般系统每11分钟同步一次,如果再11分钟内系统重启了,那么我们之前的修改就没用了,所以最好自己手工同步下。

which:查找可执行命令的路径
whereis:比which多了一个查找帮助文件在哪里的功能
locate/slocate:查找所有目录,去查找你要的东西(其实它自己维护了一个数据库,通过这个数据库去查的。这个数据库可以用updatedb跟新,update在系统cron里默认会运行的)

dmesg:显示内核消息

mtr www.baidu.com:网络连通性判断工具。

kill -l 列出信号。
kill -N PIDXXX 向PID为XXX的进程发送一个N信号。N值用kill -l可以查看。
暂停一个进程kill -19 XXX,恢复一个进程kill -18 XXX(用kill -l先确定下)

8.用户权限
文件夹的权限:
ls -ld dirXXX:可以查看文件夹的权限
r:表示能否ls目录
w:表示能否创建、删除文件(很大的权限,能改目录下只读文件。一般只给r和x权限就行了,如果要写自己的文件,可以给t权限)
x:表示文件目录是否可以cd进去
t:可以cd,touch,rm(自己的文件),vi(自己的文件),使用的时候会的占用x权限的那一位(如果本来没有x权限,那么会的是T,如果有,则是t),用于减少w的权限,如:
[root@localhost ~]# chmod o+t /root
[root@localhost ~]# ls -ld /root
drwxr-xrwt 25 root root 4096 Jul 13 09:52 /root
也可以看下/tmp的权限。t的话用数字表示要用上粘滞位,如chmod 1777 XXX。
s:已文件的所有者运行文件。比如passwd的权限为:
[root@localhost ~]# ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 27936 Aug 3 2010 /usr/bin/passwd
当其它用户执行这个文件的时候,由于user的执行位为s,所以其它用户就会以文件的所有者来执行这个命令(这里是root)。

对于目录下一些没有write权限的文件(r–),只要有目录的write权限,就能强制改写该文件。

umask:查看默认创建文件、目录的权限的被减数(其实是掩码,不过计算的时候可以减)。可以通过umaxk XXX设置默认值,如umask 666。
默认建立的文件权限是666-umask
默认建立的目录权限是777-umask

9.vi
u:undo
ctrl+r:redo
dw:删除一个单词
dd:删除一行
yy:复制一行
p:粘贴
gj/gk:自动换行的上下行移动

10.压缩和打包
compress/uncompress:已经没有compress命令了,这个命令压出来的文件后缀为.Z
gzip:gzip XXX
gunzip:gunzip XXX.gz(或gzip -d XXX.gz)
bzip2:bzip2 XXX 压缩,压缩比例比gzip好很多
bunzip2 XXX.bz2/bzip2 -d XXX.bz2 解压

tar:
tar cvf /tmp/root.tar /root 生成文件
tar rvc /tmp/root.tar /etc/passwd XXX XXXX 追加文件到/tmp/root.tar中
tar xvf /tmp/root.tar -C /tmp 解压到/tmp下,-C指定的参数需要存在
tar tvf /tmp/root.tar 查看有什么内容在包里
tar cvzf /tmp/root.tar.gz /root 生成gzip的压缩tar
tar xvzf /tmp/root.tar.gz -C /tmp
tar cvjf /tmp/root.tar.bz2 /root 生成bzip2的压缩tar
tar xvjf /tmp/root.tar.bz2 -C /tmp

tar解压出来的内容路径由tar的时候的路径指定。比如tar cvf XXX,那么解压的时候就直接解压出XXX。如果是tar cvf /root/XXX,那么解压的时候会的先生成/root目录,然后才是XXX。所以有时候解压发现没有解压到一个目录的原因就是这个。

11.查看、修改内核参数
cat /proc/sys/XXX能看到内核参数。
如果要临时的修改,可以:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
或者,可以(左边的变量名和上边路径名的关系是有关联的):
sysctl -w net.ipv4.icmp_echo_ignore_all=1

如果要永久生效,可以:
vi /etc/sysctl.conf 其中变量名和上面的一样。
改了后不会立即生效,如果要立即生效,那么可以重启,或者:
sysctl -p

sysctl -a可以显示所有目前的内核参数。这个命令可以用来比较两台主机的内核参数设置是否不同,在某些情况是很有用的。

sysctl -f XXX.sysctl.conf -p:从后面的文件中导入内核参数。

12./var/log
里边保存了各种日志,如messages。
其中,secure中包含了一些安全相关日志。
dmesg是内核消息日志。
wtmp是安全的加密日志,用last查看。
maillog是邮件日志。
cron是计划任务的日志。
boot.log是引导日志。
xferlog是ftp会话日志。
syslog记录警告信息。

13。后台进程
jobs可以看到后台进程,如:
[root@localhost sys]# jobs
[1] Stopped vi
[2]- Stopped vi
[3]+ Stopped vim
然后用fg %N可以切换到那个进程,把它弄到前台,N是jobs看到的第一列的数字。
bg %N把某个任务弄到后台。一般任务扔到后台(CTRL+Z)后处于stop状态,这个使用用bg让它在后台运行。
kill %N用于杀掉后台任务。

CTRL+Z用于暂停某个程序,并丢入后台。可以用fg把它弄出来。

当用户启动一个进程的时候,这个进程是运行在前台,使用与相应控制终端相联系的标准输入、输出进行输入和输出。即使将进程的输入输出重定向,并将进程放在后台执行,进程仍然和当前终端设备有关系。正因为如此,在当前的登录会话结束时,控制终端设备将和登录进程相脱离,那么系统就向所有与这个终端相联系的进程发送SIGHUP的信号,通知进程线路已经挂起了,如果程序没有接管这个信号的处理,那么缺省的反应是进程结束。因此普通的程序并不能真正脱离登录会话而运行进程,为了使得在系统登录后还可以正常执行,只有使用命令nohup来启动相应程序:
nohup XXX &
使用nohup命令后,原程序的的标准输出被自动改向到当前目录下的nohup.out文件,起到了log的作用。
用了这个命令后用ps aux可以看到其终端变成了?,而不是pts/2之类的了。

顺便说下父进程子进程的东东:
问:LINUX里,父进程退出了,子进程一定会退出吗?
答:
不。
若父进程退出,子进程尚未结束,则子进程会被init进程领养,也就是说init进程将成为该子进程的父进程。
若希望父进程退出,子进程也退出的话,可以使用线程,因为若进程结束,则还没结束的线程一定会立刻结束。或者如楼上所说,用信号,用atexit注册一个退出时执行的函数,这个函数中发送信号给子进程即可。

14.BASH
提示符,用man bash可以看下语法:
[root@localhost lib64]# echo $PS1
分隔符:
默认是:,shell编程的时候可以改的,参考shell的文档。

~/.bash_history 保存bash命令历史
~/.bash_logout 退出bash的时候会调用
~/.bash_profile 登录bash的时候调用
~/.bashrc 被.bash_profile调用,用于定义一些alias和function

set显示环境变量和普通变量(本地变量)
env显示环境变量
环境变量和以传递到子shell,普通变量不行。
export把普通变量变成环境变量。unset可以删除。
这两个东西参考:
[root@localhost ~]# AAA=aaa
[root@localhost ~]# env | grep AAA
[root@localhost ~]# set | grep AAA
AAA=aaa
[root@localhost ~]# export AAA=aaa
[root@localhost ~]# env | grep AAA
AAA=aaa
[root@localhost ~]#

定制bash。/ect/profile下面的东西所有人都会执行到。如果要某个人能看到某些变量,那么定义在~/.bash_profile里边。profile在login的时候会执行,bashrc是每次启动bash都会执行。比方说,在bash里执行bash,这个时候bashrc就会执行,但是profile不会执行,但如果是su XXX,那么会不一样,具体的看下这个例子(我在每个文件里都加了个echo):
[root@localhost ~]# bash
/root/.bashrc
/etc/bashrc
[root@localhost ~]# su root
/root/.bashrc
/etc/bashrc
[root@localhost ~]# su – root
/etc/profile
/root/.bash_profile
/root/.bashrc
/etc/bashrc
[root@localhost ~]# exit
logout
/root/.bash_logout
、、、、、、、、、、、、、、、、、、、、、、、、
主要就是这四个文件,要改的话根据需求改。
/etc/profile
~/.bash_profile
~/.bashrc
/etc/bashrc

另外,/ect/profile会的去执行/ect/profile.d/*.sh,这里可以定义一些环境变量,如vim的

15.rpm
XXX:一般rpm包名是httpd-devel-2.0.12.2.ent.i386.rpm啥的,数字之前的就是XXX,如httpd-devel。可以用rpm -qa | grep 啥的看下XXX应该是什么。
f参数按可执行文件看。p参数按.rpm来看。
rpm -ivh XXX.rpm 安装。
rpm -ivh –nodeps XXX.rpm 安装。不管依赖关系。
(RHEL5过后的收费功能)rpm -ivh –aid XXX.rpm 安装。并且自动解决依赖关系。
rpm -ivh –force XXX.rpm 在XXX已经安装的情况下,强制安装XXX,比如某些情况下XXX坏了,想重装,可以用这个。
rpm -e XXX 删除XXX,XXX不是.rpm的那种格式,而是程序名。
rpm -e –nodeps XXX 强制删除XXX,不管它是不是被别的包依赖,XXX不是.rpm的那种格式,而是程序名。
rpm -qa | grep XXX:查看装了哪些包
rpm -q XXX:查看单个包,如rpm -q httpd-manual。通过这个可以看看某个rpm有没有装。
rpm -ql XXX:查看包里包含的东西。可以看到具体装到了哪些目录中去。一般可以用rpm -qa得到包名,然后用-q啥的去看详细的东东。
rpm -qi XXX:查看包的信息
rpm -q –scripts XXX:查看安装的时候执行的一些脚本,如设置环境变量啥的。个人感觉像是个安装脚本。
rpm -qpl XXX.rpm:加上-p参数,就能够按照.rpm的格式查看了,并且此时查看的那个XXX.rpm不是系统装的那个,而是一个可安装的rpm文件。这个类似于tar的t选项,看些rpm里边的信息啥的。
rpm -qf /bin/ls:查看ls属于哪个包
rpm -qfi /bin/ls:查看ls属于哪个包,顺便看看这个包能干嘛
rpm -Uvh XXX.rpm:升级。如果原来没装,那么会帮你装上。
rpm -Fvh XXX.rpm:升级。如果原来没有装,那么不装。
rpm -Vf /bin/ls:验证ls所属于的那个包在目前的系统上有没有什么损坏。比如/bin/basename也是在这个包中的,但是它现在坏了,那么用这个命令就能看到。

使用yum的话可以试试这个:
yum localinstall XXX.rpm

yum如果太慢,那么去看下是在下载哪个包比较慢,然后通过wget直接下载后放到/var/cache/yum/x86_64中对应的地方。

16.启动图形界面
X开头的程序也好,进程也好基本上都和这个有关。
startx
X协议。X11r6指的是X的十一代协议的第六版。X协议其实是个C/S协议:startx先启动一个x windows,是个server端,开始监听。然后它启动x client,并让client的输出输出到server上去。如果指向启动x window,也就是server,那么就输入一个X就行。这个时候会的看到黑屏,因为server虽然在监听,但是没有client传递数据过来。通过xinit来启动x客户端,这个时候就能看到东西了,这个命令启动了一个xterm。
Server端:显示器、键盘鼠标。通过X命令可以启动。
Client端:服务器。通过xinit启动。

Client在server不存在的时候,或者找不到server的时候或server不允许它输出数据过来的时候,是启动不了的。通过xhost +命令,使得server允许任何client把数据输出过来。
也就是说,xhost是在server上执行的。
Client通过设置DISPLAY变量,来指定连接的server。DISPLAY的内容是IP:X window的number。X window也就是server端,实际上是第几个这里就写几-1。所以我们一般会的写0,因为远程连接的话这个server往往是第一个server。除非你再开一个server程序在上面啥的。

Xmanager里的的就是个server,运行在windows里边的server。client把图形发送到windows上来。

17.控制台
/dev/ttyN:虚拟控制台。个数在init的配置文件里可以找到,类似于:1:2345:respawn:/sbin/mingetty tty1。这个控制台通过alt+FN可以切换。这种控制台貌似都是在本机的时候用的。比如显示器啥的通过VGA接到机箱。
/dev/ttySN:串行控制台。要配下波特率。显示器通过串口线连接到串口上,就能操作了。
/dev/pts/N:伪终端。通过图形界面或ssh都能创建一个。用w可以查询终端。用mount可以看到其实是挂载了一个文件系统到pts目录:devpts on /dev/pts type devpts (rw,gid=5,mode=620)

18.sudo
有些命令没有权限执行,虽然已经有可执行权限了。一个可能的原因是sudo列表里禁止了。可以用rootyonghu执行visudo查看。
换句话说,有了sudo后,非root用户可以执行一些root用户才能执行的命令。

19.screen
与用户有关,同一个用户只能看到自己的screen。
类似于nohup,防止终端结束后命令被干掉。

常用命令:
screen:打开一个screen,然后可以在里边输入命令啥的
在screen里ctrl+a,d:跳出screen,但是screen还是存在的。可以通过screen -ls看到,并通过screen -r跳过去。
screen -ls:查看有哪些session,通过screen -r sessid跳过去。
screen -r:回到screen。比如我从另一台机子ssh到那台机子,然后执行这个,就能看到之前的screen。但同一时间只能有一个人登录到一个screen,不允许两个人一起登陆。
在screen中输入exit可以退出。
如果在一个screen里再输入screen,不会开启多个screen,但是screen -ls查看的话会发现没有变化。这个时候screen -r会回到前一个screen,而不是回到最原始的shell。所以要回去的话得多来几次。
通过pstree | grep -A2 -B2 screen查看。

要杀死screen可以用killall screen。这个时候如果在screen里那么那个界面也会被kill。其实就是一个占用屏幕的程序被kill掉了。

对于没有tab功能的远程登录软件来说挺有用的命令:
screen中有window的概念。在screen中,通过ctrl+c+命令的方式执行各种命令,如:
C-a c -> Create,开启新的 window
C-a n -> Next,切换到下个 window
C-a p -> Previous,前一个 window
C-a C-a -> Other,在两个 window 间切换
C-a w -> Windows,列出已开启的 windows 有那些
C-a 0 -> 切换到第 0 个 window
C-a 1..9 -> 切换到第 1..9 个window
C-a a -> 发出 C-a,在 emacs, ve, bash, tcsh 下可移到行首
C-a t -> Time,显示当前时间,和系统的 load
C-a K(大写) -> kill window,强行关闭当前的 window
C-a [ -> 进入 copy mode,在 copy mode 下可以回滚、搜索

20.日志子系统
/var/log
比如,如果服务启动有问题,看下/var/log/messages。cron的看下/var/log/cron

日志组件:
syslog 包含两个程序(通过service syslog start启动) –>
klogd:kernel 日志系统。用于kernel记录日志,由kernel内核代码调用。其的输出可以用dmesg查看。也可以用/var/log/dmesg。前者是看内容中的缓存,后者是缓存flush后写入的文件。
syslogd:/etc/syslog.conf是其配置文件。syslogd用于应用程序的日志记录。这个文件里指定了什么类型的日志记录到哪个文件中去。其中语法为“组件.级别 文件”,表示什么组件的什么级别及该级别记录以上的日志记录到什么文件中去。通过man 3 syslog可以看到组件、级别。如果用;隔开,那么;后面的内容被排除,不写入指定的文件中。

klogd和syslogd共同的配置文件是/etc/sysconfig/syslog。对于syslogd,如果使用-r参数,那么允许其它机子把日志记录到这台机子中去,只要其它机子的/etc/syslog.conf中配置的文件地址为@192.168.100.XXX:/home/XXX_log之类的IP就行。

可以用Logger在shell里写日志。如:
logger “`date` XXX”
然后在/var/log/messages中就能看到了。这里默认不会记录debug级别的信息,可以在/etc/syslog.conf里改一下然后service syslog restart

21.cron
日志记录在/var/log/cron中
crond:周期性的执行计划任务。
anacrond:当本来要执行某个任务,但是却没执行的时候,会去帮你补回来。

crond:
启动都是用service crond start
对于一般用户,通过crontab -e编辑他自己的计划任务。用户crond执行的时候是以该用户执行的,换句话说环境变量什么的都搞定了。
对于系统,通过/etc/crontab进行配置。其会调用如/etc/cron.daily目录下的脚本去定期的执行。

crontab -e(比较难设置的地方用[ `date +%e` -gt 10 ] && pwd来做):
默认打开vi,然后可以在这里进行编辑。格式为:
第几分钟 第几小时 第几天 第几月 星期几 命令
其中可以用*表示每一天、每一小时等。命令的脚本需要写全,从根目录开始写。如果命令多的话,一般放在脚本里,然后命令这里放那个脚本名。如果要输出,可以重定向到/dev/ttyN。
每行写一个。
默认保存在/var/spool/cron中,按照用户名命名。
具体格式如下:
第1列分钟1~59
第2列小时1~23(0表示子夜)
第3列日1~31
第4列月1~12
第5列星期0~6(0表示星期天)
第6列要运行的命令

下面是crontab的格式:
分 时 日 月 星期 要运行的命令

这里有crontab文件条目的一些例子:

30 21 * * * /usr/local/apache/bin/apachectl restart
上面的例子表示每晚的21:30重启apache。

45 4 1,10,22 * * /usr/local/apache/bin/apachectl restart
上面的例子表示每月1、10、22日的4 : 45重启apache。

10 1 * * 6,0 /usr/local/apache/bin/apachectl restart
上面的例子表示每周六、周日的1 : 10重启apache。

0,30 18-23 * * * /usr/local/apache/bin/apachectl restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。

0 23 * * 6 /usr/local/apache/bin/apachectl restart
上面的例子表示每星期六的11 : 00 pm重启apache。

* */1 * * * /usr/local/apache/bin/apachectl restart
每一小时重启apache(貌似每秒就不能用这个斜杠,只能用逗号)

* 23-7/1 * * * /usr/local/apache/bin/apachectl restart
晚上11点到早上7点之间,每隔一小时重启apache

0 11 4 * mon-wed /usr/local/apache/bin/apachectl restart
每月的4号与每周一到周三的11点重启apache

0 4 1 jan * /usr/local/apache/bin/apachectl restart
一月一号的4点重启apache

注意,/etc/cron.deny 中的用户不允许使用crond
系统crond:
通过/etc/crontab进行配置。其会调用如/etc/cron.daily目录下的脚本去定期的执行。/etc/crontab内容如下:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

其先设置环境变量,如拿回按小时、天等执行对应目录下的脚本。如果你有什么脚本要执行,那么就扔到对应的目录就好了。或者直接在这个文件里加上要执行的东西。这里多了两个选项,一个是root,一个是run-parts。root指的是按照root来执行。run-parts值执行某个目录下的所有可执行文件。这个目录下的权限最好是755,
对于其它的任务,放到/etc/cron.d下去。内容参照这个,注意权限最好是600,或者说只有root有读写权限,其它用户没有写、执行权限:
# run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/lib64/sa/sa1 1 1
# generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib64/sa/sa2 -A

22.selinux
如果某个文件打不开、服务起不来,可能就是他搞的鬼。
Enforcing:打开
Permissive:只是记录哪些程序做了什么,但不会阻止
Disabled:关闭

通过编辑:/etc/sysconfig/selinux来修改。

23.grub
硬盘中有信息表明一个分区是什么类型的分区(比如是ext3还是ext4啥的)

硬盘的最小单位为扇区sector,一般为512字节。
硬盘的第一个扇区的前446字节为MBR,然后跟着64字节的DPT分区表,然后是2字节的标识,内容为55AA。

BIOS起来后先去看MBR,然后把控制权交给MBR来跑。MBR里会有bootloader,比如grub会的写一些东西在这里。

kernel起来后,根据grub的配置文件,加载根分区(下面的那个root)。配置文件在/etc/grub/grub.conf中:
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Server (2.6.18-308.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-308.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
initrd /initrd-2.6.18-308.el5.img

initrd中装了很多驱动,在系统启动过程中会根据需要加载对应的驱动。

一般这个文件有错误,或initrd里边的驱动不够,或根分区错误啥的系统就会提示panic。可以试试下面的方法去修复。

在grub提示符中引导系统:
grub> root (hd0,) 按tab,查看有多少分区
grub> root (hd0,0) 这里把第一个分区(实际情况是/boot),加载为启动时候的root分区,也就是根分区。
grub> kernel / 然后按下tab查看kernel介质名。这里的/就是上一步设置的引导时候的根分区,也就是/boot分区。
grub> kernel /vmlinuz-2.XXXXXX root=/dev/sda2 这里的root指明kernel加载后的根分区是什么分区。
grub> initrd / 按tab看下initd是哪个文件。
grub> initrd /initrd-2.6.XXXXXXXXXX
grub> boot 启动系统。

引导好后去修复grub.conf文件。

grub>下输入help可以看下帮助,如:
grub> help kernel

如果initrd中没有硬盘设备的驱动,往往会造成panic系统错误。这个时候得把驱动打入Initrd介质中,如:
mkinitrd –with uhci-hcd –with usb-storages –with sd_mod –with scsi_mod /boot/a.img 2.6.18-308.el5
with后面的动动会的组合上2.6.18-308.el5然后去对应系统中找驱动,如:
[root@localhost boot]# cd /lib/modules/2.6.18-308.el5/kernel/drivers/usb/
[root@localhost usb]# ls
atm class host image input misc net serial storage
[root@localhost usb]# cd host/
[root@localhost host]# ls
ehci-hcd.ko ohci-hcd.ko sl811-hcd.ko
isp116x-hcd.ko sl811_cs.ko uhci-hcd.ko
这个时候a.img中就包含了这么多驱动。mkinitrd找的时候回去查一个列表,列表中有驱动名。这个列表通过depmod生成。比方说你自己编译了一个驱动,然后把这个驱动放到了对于的目录下,就需要运行下depmod,然后mkinitrd才能找到。

24.init
kernel会的在启动后调用/sbin/init去进行初始化。配置文件在/etc/inittab。这个配置文件有固定格式,其会的先访问/ect/rc.d/rc.sysinit进行系统初始化。然后会的去访问/etc/rc.d/tc X,这里的X是运行级别。根据级别,去执行/ect/rc.d/rcX.d/SXXX start。在这之后会的去访问/etc/rc.d/rc.local,如果想每次系统启动都启动一个文件的话,把那个文件放到rc.local中去。之后,会的去运行minigetty /dev/ttyN,打开控制台等待登录。登录后打开bash,bash调用profile啥的。

/etc/inittab语法:
可以在这个文件的最后加上要开机启动的程序。不过放在这里里边的文件最好遵循System V的启动规范,就是那种写个脚本实现start、stop之类的。如果不想这么麻烦,那么就放到/etc/rc.d/rc.local中去,在这里里边可以直接写命令。推荐后者。

第一行表示运行级别,如果下面的配置中的运行级别和该行的运行级别(这里是5)相同,那么执行:
id:5:initdefault:

然后运行系统初始化任务:
si::sysinit:/etc/rc.d/rc.sysinit
这个文件中会的运行加载文件系统之类的任务。还比如fsck之类的检测程序啥的。这里也会把根分区按照rw模式加载,这个分区在grub引导的时候是按照只读方式加载的。并且在这里会的加载各种各样的驱动。又比如启动redhat的时候那个红色的RedHat提示。。。在这里可以改掉它,改的帅气点~

接着是各个运行级别的运行,这里只会运行运行级别为5的那行。第一段是行号,可以随便写。然后是运行级别,表明只有运行级别为啥的时候才会去执行。第三段是进程调用子进程的时候的选项,这里是wait,表示父进程会的等待rc这个进程执行完后才会去执行下面的东西。如果这里是respawn,表示父进程运行了子进程后不去等它,而是继续往下弄,但是父进程会的去监视这个进程在不在运行,如果子进程挂了,就会把它启动起来。第四段就是命令。:
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

看下rc这个脚本,发现rc 5会的去运行/etc/rc.d/rc3.d下面的所有脚本。这些脚本有的以K开头,有的以S开头。对于K开头的脚本。这些脚本的参数都是固定的,分别为start/stop/restart/status之类的。这些脚本会的去调用具体的程序,执行启动、停止等。如果以K开头,那么就执行:脚本 stop,如果是S开头,那么就执行:脚本 stop。
由于不同运行级别下的很多脚本其实内容一样,所以它们都是一个软连接,连接到../init.d/XXX,如../init.d/sshd这类脚本上。
这些脚本还有一个数字,如K55XXX啥,代表运行顺序。数字越小越先运行。K比S先运行。

25./proc
[root@localhost ~]# mount -t proc none ./a
一般只有/proc/sys下的文件可以写入去动态修改。其它一般只能read。

26.module
rpm -qf /sbin/lsmod可以看到相关包的信息。

lsmod可以看到已经加载的各种模块。其中各个列的含义是:
模块名,大小,被使用的次数,被谁说基于(A被B基于也就是说没有A的话B也无法加载)

modprobe可以加载模块。其根据modinfo找到模块的路径,然后根据depmod给出的依赖加载模块。
modprobe -r vfat可以卸载模块(同时把依赖也卸载了)。
如(这里加载vfat自动加载了fat,fat是vfat的依赖模块):
[root@localhost ~]# lsmod | grep fat
[root@localhost ~]# modprobe vfat
[root@localhost ~]# lsmod | grep fat
vfat 46529 0
fat 85745 1 vfat
[root@localhost ~]# modprobe -r vfat
[root@localhost ~]# lsmod | grep fa
其有一个配置文件在:/etc/modprobe.conf。这个文件每一行都是一个配置,比如告知某个模块的别名啥的。也可以在这个模块里用install手工加载模块,还可以用options参数在这个文件里写上某个模块加载的时候需要的参数。别名的例子如:
alias eth0 e1000
这里把e1000这个网卡驱动称为eth0。每
如果要开机加载驱动,可以在这个文件里加上对应的东西。如果是和启动有关的驱动,加到Initrd中。再或者就得重新编译内核,然后重新编译加载相关驱动。还有一个方式就是放到rc.local中去,不过rc.local执行的比较晚了,干脆放rc.sysinit里好了。
modprobe的其它配置文件在/ect/modprobe.d下。具体的可以man一下modprobe.conf。

insmod也可以加载模块,但是要输入完整的模块路径。这个和modprobe不同,modprobe更具一个配置文件去默认的地方找。
[root@localhost ~]# insmod /lib/modules/2.6.18-308.el5/kernel/fs/vfat/vfat.ko
insmod: error inserting ‘/lib/modules/2.6.18-308.el5/kernel/fs/vfat/vfat.ko’: -1 Unknown symbol in module
可以发现,insmod还需要自己去先把依赖的模块装上。
rmmod vfat用于卸载模块。

modprobe查找模块的注册文件由depmod生成。如:
depmod -a:这个时候会去查找所有的目录,然后找依存关系。
depmod 2.6.1XXX:只会去查找特定内核的依赖。
生成的文件在:/lib/modules/2.6.18-308.el5/modules.dep 中。

依赖关系其实就是符号的依赖,B模块用到了A模块的符号,那么装B的时候就需要装上A。insmod需要自己去现装A,然后装B,而modprobe则根据depmod生成的文件在自动查找依赖关系。下面的命令可以看到所有模块依赖:
[root@localhost ~]# depmod -v

可以用modinfo fat看下模块信息。

linux自动加载模块的几个方法:
大部分驱动程序都是内核模块。这些模块很多被编译到了内核里,启动的时候会自动加载。
有些驱动装载initrd.img中。
/etc/rc.d/rc.sysinit里也会加载驱动。
/etc/modprobe.conf中会放一些和启动无关的驱动。
如:
[root@localhost ~]# grep ‘modprobe’ /etc/rc.d/rc.sysinit
modprobe usbcore >/dev/null 2>&1 && mount -n -t usbfs /proc/bus/usb /proc/bus/usb
if [ -f /proc/sys/kernel/modprobe ]; then
sysctl -w kernel.modprobe=”/sbin/modprobe” >/dev/null 2>&1
sysctl -w kernel.modprobe=”/bin/true” >/dev/null 2>&1
modprobe $module >/dev/null 2>&1
modprobe dm-mod >/dev/null 2>&1
modprobe dm-multipath > /dev/null 2>&1
modprobe dm-mirror >/dev/null 2>&1
modprobe ide-cd >/dev/null 2>&1
modprobe ide-scsi >/dev/null 2>&1

一个例子:双网卡绑定
需求:把两个100M的网卡弄成一个200M的网卡。
步骤:
1.在/etc/modprobe.conf中加上:
alias eth0 pcnet32
alias eth1 pcnet 32
alias bond0 bonding
options bond0 miimon=100 mode=1
然后运行一下modprobe bonding。这个时候会的加载bonding这个模块。然后在运行:
ifenslave bond0 eth0 eth1来使之生效。

27.设备文件
[root@localhost ~]# ll /dev/sda*
brw-r—– 1 root disk 8, 0 May 26 21:49 /dev/sda
brw-r—– 1 root disk 8, 1 May 26 21:49 /dev/sda1
brw-r—– 1 root disk 8, 2 May 26 21:49 /dev/sda2
这里的8代表主设备号,用于告知系统调用哪个驱动程序。这里的0是子设备号,用于告知系统具体是哪个设备。

打开设备文件的时候,会先去查找/proc/devices,看看如何打开主设备号为N的文件。如:
[root@localhost ~]# cat /proc/devices | grep 8
128 ptm
180 usb
189 usb_device
8 sd
68 sd
128 sd
然后就回去调用sd这个驱动,它对应的驱动是sd_mode.ko。驱动在注册的时候会的注册主设备号,所以在这个文件里才能看到。通过depmod -v可以验证一下有没有这个驱动,然后可以发现这个:
/lib/modules/2.6.18-308.el5/kernel/drivers/scsi/sd_mod.ko
然后sd这个驱动会的去操作子设备号的那个设备。

我们可以通过mknod来注册一个设备,如:
mknod /opt/myhd b 8 0。然后对这个文件的读写就和对/dev/sda一模一样了,因为对于驱动来说,驱动只会看到的设备类型(b),主设备号(8),子设备号(0),然后它就认为这个文件就是一个物理上的文件,然后对它操作都会操作到对应的实体上去。

28.ip
ip命令比ifconfig高级,他能看到的ifconfig不一定能看到。ip是linux下功能最强大的网络命令一直,设置路由什么的都杠杠的~
可以通过ip help或ip addr help看到第一层帮助或addr选项的帮助。

29.mii-tool
可以看看哪个网卡上插了网线。。。有link ok的就是连接上了。
mii-tool -v可以查看网卡的细节。

不过不是所有网卡都支持这个命令。

30.DNS、网关
DNS在/etc/resolv.conf中设定。
网关在/etc/sysconfig/network或ifcfg-ethN中设定。
vi /etc/resolv.conf
search example.com(域名)
nameserver 192.168.0.254(DNS主机IP,如果说是动态IP不需配置DNS)
配置好dns后不需重启network

31.autofs
service autofs start

用于用户在访问某个目录的时候自动加载某个文件系统。
比如,如果没有这个机制,那么我在插入cd的时候我得自己手工执行:mount /dev/cdrom /misc/cd命令,然后才能去访问/misc/cd。但是如果我有这么个机制,那么我直接访问/misc/cd目录就可以了。原因在于系统会的自动监视这个目录有没有被访问,如果有被访问,那么根据 /etc/auto.master中的:/misc /etc/auto.misc可以知道如果访问了/misc那么去/etc/auto.misc中查找配置,然后在/etc/auto.misc中有这么一句话:
cd -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom
这里的cd就是/misc/cd目录,整句话的意思就是如果访问cd目录那么以iso9660,ro,nosuid,nodev形式挂载/dev/cdrom到这个目录。

这玩意还能用一些通配符。

32.chkconfig
用于设置某项服务开机自动运行。这项服务必须符合System V的语法,也就是得有一个对应的有start/stop的脚本。一般用法是:
chkconfig autofs on

33.分区与文件系统
用于硬盘分区、查看。
有时候要用 partprobe – inform the OS of partition table changes 命令来告知os系统分区变了,不然可能分区了后还是无法使用。

分区和格式化文件系统是两件事情哦~

fdisk -l 查看所有可分区设备。
fdisk -l /dev/sda 查看sda上的分区。

mount -a会的访问/etc/fstab加载文件系统。

划分区:
[root@localhost ~]# fdisk /dev/sdb
这里按m可以看到帮助。
按p可以看到目前的分区信息。
按n可以创建分区,这个时候会询问你创建扩展分区还是主分区,然后让你输入其实柱面和最后的柱面,这个其实就是询问分区的大小。每个柱面多大可以通过p命令看到。或者在这里可以按照提示,输入+500M来建立一个500M的分区,而不是通过柱面个数来进行。
一般主分区比较简单,如果是扩展分区,请直接把剩余的都分给它,然后再在上面建立逻辑分区。也就是一开始先输入e,然后再是输入l。这里的提示会的根据实际情况变的。

注意,最后一定要按w才能写入硬盘!!!否则无效。

如果不运行partprobe,除非重启,否则如果这个时候格式化分区系统会的提示找不到分区。因为系统启动的时候会的从分区表中读取信息,然后存到内存中,但我们通过fdisk修改的信息还不会这样子,所以要通过这个命令同步下下。

格式化文件系统:
mkfs.ext3 /dev/sdb5啥的。
这里可以按下mkfs然后tab看下。

有时候文件系统需要用fsck.XXX检测,这个时候切记先umount。还有就是一般不要做检测,就算检测的时候它告诉你有问题,问你要不要修复,你也别去在这里修复。不然很可能丢数据。

然后通过mount命令就可以挂载文件系统了。如mount /dev/sdb5 ~/bbb
通过umount可以卸载已经挂载的文件系统。不过有时候会提示文件系统正在使用,这个时候可以通过:fuser -v / 来查看正在使用这个文件系统的进程。如:
[root@localhost bbb]# fuser -v ~/bbb

USER PID ACCESS COMMAND
/root/bbb: root 4943 ..c.. bash
通过[root@localhost bbb]# fuser -km ~/bbb可以把所有使用该文件系统的用户干掉。然后就可以umount了。

有时候写优盘的数据还没被写到优盘上,而是写在了缓存里,这个使用用sync来同步,然后再umount。

可以通过e2label命令给ext文件系统格式分区打上label,这个时候挂载的时候就不用/dev/XXX了,而是直接用label就可以了。

使用mount -a可以自动加载默认的文件系统,配置文件是:/etc/fstab:
/dev/VolGroup00/LogVol00 / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/VolGroup00/LogVol01 swap swap defaults 0 0
这里第一列是设备,第二列是加载点,第三列是文件系统类型,第四列是加载时候的参数,第五列是没多少天用dump命令备份(已经废弃了),第六列是正常情况下第几个检测该文件系统,允许的数字是0, 1, 和2,一般自定义的都应该是2。
mount -a在rc.sysinit的时候会被调用,也就是在这个时候会的加载文件系统。(这里如果fstab一次有问题以后会很麻烦。解决的办法是手工创建对应目录并执行一次mount命令,然后再用mount -a应该就可以了)

swap分区:
swapon -s可以看到swap是哪个分区。

可以用这个方法手动指定是swap分区(下面的方法是用文件来做swap,一般是用分区来做swap):
先弄块区域出来:
dd < /dev/zero > /opt/swapfile bs=1M count=100
给这个打个标记:
[root@localhost ~]# mkswap /opt/swapfile
然后把这个空间用于swap:
[root@localhost ~]# swapon /opt/swapfile
这个时候再查看下:
[root@localhost ~]# swapon -s
如果要设为系统启动的时候加载,那么在/etc/fstab下进行设置,用swap文件系统进行设置。如:
/dev/VolGroup00/LogVol01 swap swap defaults 0 0
swap的卷标用mkswap -L来进行。

34.acl
setfacl -m g:aaa:rwx codes/ 设置aaa组有codes目录的rwx权限。
setfacl -m g:bbb:rwx codes/ 设置bbb组有codes目录的rwx权限。
setfacl -m u:ccc:rwx codes/ 设置ccc用户有codes目录的rwx权限。

setfacl -m m:rw codes/ 设置mask。mask会的代替上面的权限。也就是mask是最大权限。

setfacl -x g:aaa codes/ 删除aaa组的权限。
setfacl -x m codes/ 删除mask。

然后用户权限(ll查看的第一列)就会有个+。

getfacl获取信息。

35.chattr 修改文件系统底层的权限
要root权限。
lsattr 查看当前目录下文件的attr属性
chattr +i a.sh 禁止修改a.sh
chattr +a a.sh 只能追加

用man chattr查看属性的作用。

36.lvm
结构:
文件系统建立在lv上, vg建立在pv上。可以把vg看成一块大硬盘,lv看成一个分区。

——————-
文件系统
——————-
lv
————————————–
vg
————————————–
普通硬盘 | 存储 | 普通硬盘 —这里就是一个个pv
————————————–

命令都比较有特点,pv的话以pv开头,lv的话以lv开头,vg的话以vg开头。

查看版本:
[root@localhost db2inst1]# rpm -qa | grep lvm

具体实例:
1.fdisk -l:先看一下有哪些物理硬盘和分区
Device Boot Start End Blocks Id System
/dev/sdg1 1 31 31728 83 Linux
/dev/sdg2 32 64 33792 83 Linux
/dev/sdg3 65 102 38912 83 Linux

2.创建pv,实际上就是给分区打上一段pv的标记:
[root@localhost ~]# pvcreate /dev/sdg1 /dev/sdg2
Writing physical volume data to disk “/dev/sdg1”
Physical volume “/dev/sdg1” successfully created
Writing physical volume data to disk “/dev/sdg2”
Physical volume “/dev/sdg2” successfully created

可以用pvdisplay查看。

3.创建vg:
[root@localhost ~]# vgcreate vg0 /dev/sdg1 /dev/sdg2
Volume group “vg0” successfully created

查看有没有创建成功:
[root@localhost ~]# vgdisplay
— Volume group —
VG Name vg0
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 2
Act PV 2
VG Size 60.00 MB
PE Size 4.00 MB
Total PE 15
Alloc PE / Size 0 / 0
Free PE / Size 15 / 60.00 MB
VG UUID Ff7OoX-xzuV-5vtD-2r00-dQrw-jEpJ-Zdc3uS

VG size就是VG的总大小。
PE:PE是划分和分配的最小单位。比如:
ext3文件系统建立在一个800M的lv上,lv所建立的vg中的pv中的一个硬盘是500M,PE大小是400M,那么lv中的400M就会放在那个500M的硬盘中,该硬盘剩余的100M就不会被使用。
换句话说,LV由一个个PE组成,LV的最小大小是一个PE的大小。

4.创建lv:
[root@localhost ~]# lvcreate -L 3M -n lv0 vg0 #可以指定对应的pv:lvcreate -L 280G -n LV_RPT_DBF_01 VG_RPT /dev/sdf(man下有例子)
Rounding up size to full physical extent 4.00 MB
Logical volume “lv0” created
这里-L指定创建一个3M的lv,但由于PE为4M,所以自动调整成了4M。-n指定名字。最后一个参数表明创建在哪个vg上。

可以用lvdisplay查看。同时会发现这么一个目录结构:
[root@localhost ~]# cd /dev/vg0
[root@localhost vg0]# ls
lv0

5.在lv上创建文件系统:
[root@localhost vg0]# mkfs.ext3 /dev/vg0/lv0

6.挂载并测试:
[root@localhost vg0]# mount /dev/vg0/lv0 /mnt/

[root@localhost vg0]# echo aaa > /mnt/aaa
[root@localhost vg0]# echo bbb > /mnt/bbb
[root@localhost vg0]# mkdir -p /mnt/dir
[root@localhost vg0]# echo ccc > /mnt/dir/ccc

7.扩展lv:
7.1 给扩展的分区打上pv标签
[root@localhost mnt]# pvcreate /dev/sdg3
Writing physical volume data to disk “/dev/sdg3”
Physical volume “/dev/sdg3” successfully created

7.2扩展vg:
[root@localhost mnt]# vgextend vg0 /dev/sdg3
Volume group “vg0” successfully extended

7.3扩展lv:
[root@localhost mnt]# lvextend -L +4M /dev/vg0/lv0
Extending logical volume lv0 to 8.00 MB
Logical volume lv0 successfully resized
但这个时候文件系统还没变大,但是lvdisplay可以看到变大了。

7.4扩文件系统:
[root@localhost mnt]# resize2fs /dev/vg0/lv0
Performing an on-line resize of /dev/vg0/lv0 to 8192 (1k) blocks.
The filesystem on /dev/vg0/lv0 is now 8192 blocks long.

这个过程是online的,resize2fs: ext2/ext3 file system resizer
然后用df命令看一下就能看到了。

8.缩小lv(务必先减小文件系统!!!):
8.1先减小文件系统:
一般都需要先要umount:
[root@localhost /]# umount /mnt/
然后检测一下(必须):
[root@localhost /]# e2fsck -f /dev/vg0/lv0
e2fsck 1.39 (29-May-2006)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/vg0/lv0: 15/1024 files (6.7% non-contiguous), 1196/8192 blocks
然后缩小文件系统,这里的4M指的是调整过后的新大小:
[root@localhost /]# resize2fs /dev/vg0/lv0 4M
resize2fs 1.39 (29-May-2006)
Resizing the filesystem on /dev/vg0/lv0 to 4096 (1k) blocks.
The filesystem on /dev/vg0/lv0 is now 4096 blocks long.

8.2较小lv:
[root@localhost /]# lvreduce -L 4M /dev/vg0/lv0
WARNING: Reducing active and open logical volume to 4.00 MB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lv0? [y/n]: y
Reducing logical volume lv0 to 4.00 MB
Logical volume lv0 successfully resized

9.卸载pv
先umount。
先转移一个打算卸载的pv上的数据:
只要移除后空间啥的都还够,就可以转移。如果空间不够,可以考虑加个新PV然后转移:
比如目前/dev/sdg1这个pv用了一个PE了:
[root@localhost /]# pvdisplay
— Physical volume —
PV Name /dev/sdg1
VG Name vg0
PV Size 30.98 MB / not usable 2.98 MB
Allocatable yes
PE Size (KByte) 4096
Total PE 7
Free PE 6
Allocated PE 1
PV UUID 8cmRkV-P9D5-WPgi-KaDW-eQz7-QGZA-2P2P05
但其实这个vg空间足够,所以我还是可以转移走。下面的命令把该pv上的PE移动到该VG的其它pv上:
[root@localhost /]# pvmove /dev/sdg1
/dev/sdg1: Moved: 100.0%
现在再看一下:
[root@localhost /]# pvdisplay
— Physical volume —
PV Name /dev/sdg1
VG Name vg0
PV Size 30.98 MB / not usable 2.98 MB
Allocatable yes
PE Size (KByte) 4096
Total PE 7
Free PE 7
Allocated PE 0
PV UUID 8cmRkV-P9D5-WPgi-KaDW-eQz7-QGZA-2P2P05

然后缩小VG
[root@localhost /]# vgreduce vg0 /dev/sdg1
Removed “/dev/sdg1” from volume group “vg0”

pvmove的其它用法:
pvmove /dev/sdg1:1-20 /dev/sdb1 :把前面的1~20个PE移动到后面去

这个时候查看vgdisplay就可以看到ok了。

36.xinetd
通过chkconfig xinetd on设置开机启动。chkconfig对于xinetd指定的服务所进行的操作和一般的Sys V是不同的。这些操作在/etc/xinted.d目录下。
如:
[root@localhost rc3.d]# pwd
/etc/rc.d/rc3.d
[root@localhost rc3.d]# ls | grep telnet
[root@localhost rc3.d]#
会发现没有telnet,但是却可以执行:
[root@localhost rc3.d]# chkconfig krb5-telnet on
因为在下面的目录里有这么个东西:
[root@localhost xinetd.d]# ls | grep telnet
ekrb5-telnet
krb5-telnet
[root@localhost xinetd.d]#
看一下对于的内容:
[root@localhost xinetd.d]# cat krb5-telnet | grep -i disable
disable = no
[root@localhost xinetd.d]# chkconfig krb5-telnet off
[root@localhost xinetd.d]# cat krb5-telnet | grep -i disable
disable = yes
[root@localhost xinetd.d]#

配置文件:[db2inst1@localhost etc]$ ls /etc/xinetd.conf
脚本都在/etc/xinetd.d/*里边。这些脚本包含了各个服务,如telnet。这个文件会的去查看/etc/services,按照配置打开对应端口。
脚本内容定义通过:man xinted.conf查看。
要启动那些脚本,运行service xinetd restart。这个会统一重启所有的脚本。

37.ntp
配置文件:[root@localhost xinetd.d]# vi /etc/ntp.conf

同步时间:
记得先调整时区。

常用命令:
ntpq –p #查看本机和上层服务器的时间同步结果
ntptrace #可以用來追踪某台时间服务器的时间对应关系
ntpdate IP #客户端要和NTP server进行时钟同步。
/var/log/ntp/ntp.log #查看ntp日志 不过一般在/var/log/messages中
ntpq -p用于查看服务的信息。一般遇到“no server suitable for synchronization found”错误的时候,看一下reach这个值,在启动ntp server服务后,这个值就从0开始不断增加,当增加到17的时候,从0到17是5次的变更,每一次是poll的值的秒数,是64秒*5=320秒的时间。

如果之后从ntp客户端同步ntp server还失败的话,用ntpdate –d来查询详细错误信息,再做判断。

设置自动同步:
service ntpd start
chkconfig ntpd on

搭建NTP服务器:
首先修改/etc/ntp.conf文件。这个文件中:
server开头的指的是连接的上级同步server
restrict指的是允许连接到本server进行时间同步的server
如:
restrict default nomodify 这个允许所有机子连上来。
参数说明:
ignore
拒绝所有类型的 NTP 连线;
nomodiy
用户端不能更改 NTP 伺服器的时间参数,这即表示用户端不能使用 ntpc 与 ntpq 这两支程式来修改伺服器罗。 但用户端仍可透过这部主机来进行网路校时的;
noquery
用户端不能够使用 ntpq, ntpc 等指令来查询时间伺服器,等於不提供 NTP 的网路校时罗;
notrap
不提供 trap 这个远端事件登录 (remote event logging) 的功能。
notrust
拒绝没有认证的用户端。

启动服务:
[root@localhost xinetd.d]# service ntpd start

一般启动后要过几分钟才会提供服务。

客户端的设置(需要停止ntpd服务,ntpd服务是给服务器端使用的,如果开着会的报端口占用的错误):
1.使用crond来进行:
echo “00 */1 * * * root /usr/sbin/ntpdate 192.168.0.240;/sbin/hwclock -w”>>/etc/crontab
2.使用配置文件中的server指定server

如果不用crond,那么可以打开ntpd服务,指定server参数到ntpd服务器,这里的server指的是我本机成为了一个ntpd服务器了,但偶尔要向更加高级的主机请求时间调整,所以server指的是更加高级、精确的ntpd服务器,用于同步本地的ntpd服务器。一般用crond同步就好了。

38.NFS
查看有没有装nfs:
[root@localhost xinetd.d]# rpm -qa | grep nfs
nfs-utils-lib-1.0.8-7.9.el5
nfs-utils-1.0.9-60.el5

NFS基于PORTMAP。

设置服务自动启动(需要先启动portmap):
[root@localhost xinetd.d]# chkconfig portmap on
[root@localhost xinetd.d]# chkconfig nfs on

如果启动nfs的时候报错,就看下portmap有没有起来了:
[root@localhost xinetd.d]# service portmap start
[root@localhost xinetd.d]# service nfs start

配置文件:
/etc/sysconfig/nfs
比如可以在这个文件里设置使用静态端口。默认的话会的通过portmap使用动态端口进行服务,但是这往往和iptables冲突。

/etc/exports
用于设置用于导出的文件系统。可以man exports看下语法格式。
如:
/var/ftp 192.168.71.0/24(rw,sync) *.uplooking.com(rw,sync) rw说明可写可读,async表示异步。都必须写上。
修改好后重启nfs即可。

另一台允许访问的server可以通过下面的方法挂载:
[root@localhost ftp]# mount 192.168.71.181:/var/ftp/ /mnt

如果能挂载,但是没法读写,提示权限不够,那么需要:
[root@localhost /]# chmod -R 777 /var/ftp/
因为nfs的话会的用nfsnobody来运行。这个时候你在/var/ftp ll看新建立的用户的时候发现其拥有者是nfsnobody。
当然还有一个方法:
/var/ftp 192.168.71.0/24(rw,sync,no_root_squash)
这样的话client节点的root就有权限来弄了。并且建立的文件的所有者是root。不过对其它用户还是没权限的。
如果要都能写,用all_squash。这个时候建立的文件的拥有者都是nfsnobody。

39.iptables

顺序问题!!!!!!!!!!!!!!!!!!!!!!!:
iptables -L,排在越前面的越生效

-A 添加
-I 插入
-D 删除
-F 清除
-L 显示

INPUT:进入的数据包
FORWARD:转发数据包(如果开启了转发功能就有用)。转发的数据包不会受到INPUT的规则影响。
OUTPUT:发出的数据包

实例:
[root@hadr02 ~]# iptables -A INPUT -s 192.168.0.2 -j DROP
-s:源IP。可以是192.168.9.1/24这种。
-d:目的IP
–sport:源端口。可以指定范围:。也可以指定非XXX端口!。
–dport:目的端口
-p:指定协议,如tcp/udp/icmp
-j:动作:DROP ACCEPT REJECT
-i:源网络接口,如-i eth0
-o:目的网络接口,如-o eth0
-m:扩展模块

-A的话会的按照顺序添加。如果要有顺序,用-I,如:
目前的规则,数据包会被DROP:
[root@hadr02 ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all — 192.168.0.2 anywhere
ACCEPT all — 192.168.0.2 anywhere
在第一个位置添加一条:
[root@hadr02 ~]# iptables -I INPUT 1 -s 192.168.0.2 -j ACCEPT
[root@hadr02 ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all — 192.168.0.2 anywhere
DROP all — 192.168.0.2 anywhere
ACCEPT all — 192.168.0.2 anywhere
删除规则:
[root@hadr02 ~]# iptables -D INPUT 1
[root@hadr02 ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all — 192.168.0.2 anywhere
ACCEPT all — 192.168.0.2 anywhere
清空:
[root@hadr02 ~]# iptables -F
[root@hadr02 ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination

设置默认的级别(不能被-F清除):
[root@hadr02 ~]# iptables -P INPUT DROP
[root@hadr02 ~]# iptables -P INPUT ACCEPT

iptables -L -n:不方向解析

扩展模块:
-m参数,后面加模块名。

如指定只能A主动访问B,不能B主动访问A,这里的–state值得是TCP包的状态,-m后面的state是模块名:
iptables -m state –state NEW -s 192.1.1.1 -j ACCEPT
又如limit模块可以用于限速:
iptables -m limit –limit XXX

保存当前规则:
service iptables save
然后保存在:
[root@hadr02 ~]# less /etc/sysconfig/iptables

设置开机启动:chkconfig iptables on
重启:service iptables restart

深入:
iptables是建立在内核功能上的。
当一个数据包进入后,一次顺序检查各个规则,如果有匹配的则立刻执行对应的action。如果都没有匹配,则会通过预设动作进行处理(也就是chain后面的那个policy)。

iptables 的表格 (table) 与链 (chain):
表格就是type,比如filter表、nat表。链就是每个type里的规则集合。

预设的情况下,咱们 Linux 的 iptables 至少就有三个表格,包括管理本机进出的 filter 、管理后端主机 (防火墙内部的其他计算机) 的 nat 、管理特殊旗标使用的 mangle (较少使用) 。更有甚者,我们还可以自定义额外的链。

每个表格与其中链的用途分别是这样的:
filter (过滤器):主要跟进入 Linux 本机的封包有关,这个是预设的 table 喔!
INPUT:主要与想要进入我们 Linux 本机的封包有关;
OUTPUT:主要与我们 Linux 本机所要送出的封包有关;
FORWARD:这个咚咚与 Linux 本机比较没有关系, 他可以‘转递封包’到后端的计算机中,与下列 nat table 相关性较高。
nat (地址转换):是 Network Address Translation 的缩写, 这个表格主要在进行来源与目的之 IP 或 port 的转换,与 Linux 本机较无关,主要与 Linux 主机后的局域网络内计算机较有相关。
PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT)
POSTROUTING:在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)
OUTPUT:与发送出去的封包有关
mangle (破坏者):这个表格主要是与特殊的封包的路由旗标有关, 早期仅有 PREROUTING 及 OUTPUT 链,不过从 kernel 2.4.18 之后加入了 INPUT 及 FORWARD 链。 由于这个表格与特殊旗标相关性较高,所以像咱们这种单纯的环境当中,较少使用 mangle 这个表格。

[root@www ~]# iptables [-t tables] [-L] [-nv]
选项与参数:
-t :后面接 table ,例如 nat 或 filter ,若省略此项目,则使用默认的 filter
-L :列出目前的 table 的规则
-n :不进行 IP 与 HOSTNAME 的反查,显示讯息的速度会快很多!
-v :列出更多的信息,包括通过该规则的封包总位数、相关的网络接口等

target:代表进行的动作, ACCEPT 是放行,而 REJECT 则是拒绝,此外,尚有 DROP (丢弃) 的项目!
prot:代表使用的封包协议,主要有 tcp, udp 及 icmp 三种封包格式;
opt:额外的选项说明
source :代表此规则是针对哪个‘来源 IP’进行限制
destination :代表此规则是针对哪个‘目标 IP’进行限制

不过现在推荐用iptables-save来查看iptables,而不是iptables -L -n。

清楚规则等数据:
[root@www ~]# iptables [-t tables] [-FXZ]
选项与参数:
-F :清除所有的已订定的规则;
-X :杀掉所有使用者 “自定义” 的 chain (应该说的是 tables )啰;
-Z :将所有的 chain 的计数与流量统计都归零

范例:清除本机防火墙 (filter) 的所有规则:
[root@www ~]# iptables -F
[root@www ~]# iptables -X
[root@www ~]# iptables -Z

设置policy:
[root@www ~]# iptables [-t nat] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]
选项与参数:
-P :定义政策( Policy )。注意,这个 P 为大写啊!
ACCEPT :该封包可接受
DROP :该封包直接丢弃,不会让 client 端知道为何被丢弃。
范例:将本机的 INPUT 设定为 DROP ,其他设定为 ACCEPT
[root@www ~]# iptables -P INPUT DROP
[root@www ~]# iptables -P OUTPUT ACCEPT
[root@www ~]# iptables -P FORWARD ACCEPT
[root@www ~]# iptables-save
# Generated by iptables-save v1.4.7 on Fri Jul 22 15:56:34 2011
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
# Completed on Fri Jul 22 15:56:34 2011
# 由于 INPUT 设定为 DROP 而又尚未有任何规则,所以上面的输出结果显示:
# 所有的封包都无法进入你的主机!是不通的防火墙设定!(网络联机是双向的)

添加规则的示范:
[root@www ~]# iptables [-AI 链名] [-io 网络接口] [-p 协议] \
> [-s 来源IP/网域] [-d 目标IP/网域] -j [ACCEPT|DROP|REJECT|LOG]
选项与参数:
-AI 链名:针对某的链进行规则的 “插入” 或 “累加”
-A :新增加一条规则,该规则增加在原本规则的最后面。例如原本已经有四条规则,
使用 -A 就可以加上第五条规则!
-I :插入一条规则。如果没有指定此规则的顺序,默认是插入变成第一条规则。
例如原本有四条规则,使用 -I 则该规则变成第一条,而原本四条变成 2~5 号
链 :有 INPUT, OUTPUT, FORWARD 等,此链名称又与 -io 有关,请看底下。
-io 网络接口:设定封包进出的接口规范
-i :封包所进入的那个网络接口,例如 eth0, lo 等接口。需与 INPUT 链配合;
-o :封包所传出的那个网络接口,需与 OUTPUT 链配合;
-p 协定:设定此规则适用于哪种封包格式
主要的封包格式有: tcp, udp, icmp 及 all 。
-s 来源 IP/网域:设定此规则之封包的来源项目,可指定单纯的 IP 或包括网域,例如:
IP :192.168.0.100
网域:192.168.0.0/24, 192.168.0.0/255.255.255.0 均可。
若规范为‘不是’时,则加上 ! 即可,例如:
-s ! 192.168.100.0/24 表示不是 192.168.100.0/24 的封包来源;
-d 目标 IP/网域:同 -s ,只不过这里指的是目标的 IP 或网域。
-j :后面接动作,主要的动作有接受(ACCEPT)、丢弃(DROP)、拒绝(REJECT)及记录(LOG)

几个例子:
iptables -A INPUT -s ! 127.0.0.1 -p icmp -j DROP
从 –s 开始即是一条规则,-j 前面是规则的条件,-j 开始是规则的行为(目的)。整条命令解释为,在filter 表中的 INPUT 规则链中插入一条规则,所有源地址不为 127.0.0.1 的 icmp 包都被抛弃。

自定义chain:
例子:
iptables -N brus
iptables -A brus -s 0/0 -d 0/0 -p icmp -j DROP
iptables -A INPUT -s 0/0 -d 0/0 -j brus
此例子的意思是:
第一句建立了一个叫做brus的用户自定义链;
第二句用-A参数添加了一条用户自定义的封堵规则;
第三句向默认的INPUT链添加一条新规则,使所有的包都由brus自定义链处理。

对于自定义的chain,会的将符合匹配规则的packet发到自定义chain中一次查找。如果查找到则执行自定义chain中的action。如果查找不到则会回到原来的chain中继续匹配余下的规则。

40.strace
strace -o outputfile cat /dev/null
输出:
每一行都是一条系统调用,等号左边是系统调用的函数名及其参数,右边是该调用的返回值。
strace 显示这些调用的参数并返回符号形式的值。strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。

实例:
-c 统计每一系统调用的所执行的时间,次数和出错的次数等.
[db2inst1@hadr02 ~]$ strace -c cat /dev/null
% time seconds usecs/call calls errors syscall
—— ———– ———– ——— ——— —————-
73.58 0.000156 20 8 6 stat
26.42 0.000056 5 12 8 open
0.00 0.000000 0 2 read
0.00 0.000000 0 5 close
0.00 0.000000 0 5 fstat
0.00 0.000000 0 8 mmap
0.00 0.000000 0 3 mprotect
0.00 0.000000 0 1 munmap
0.00 0.000000 0 3 brk
0.00 0.000000 0 1 1 access
0.00 0.000000 0 1 execve
0.00 0.000000 0 1 arch_prctl
—— ———– ———– ——— ——— —————-
100.00 0.000212 50 15 total

-r 打印出相对时间关于,,每一个系统调用.
[db2inst1@hadr02 ~]$ strace -r cat /dev/null
0.000000 execve(“/bin/cat”, [“cat”, “/dev/null”], [/* 23 vars */]) = 0
0.001584 brk(0) = 0xd243000
0.000765 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ab7ac20c000
0.001039 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ab7ac20d000

-t 在输出中的每一行前加上时间信息.
[db2inst1@hadr02 ~]$ strace -t cat /dev/null
23:45:03 execve(“/bin/cat”, [“cat”, “/dev/null”], [/* 23 vars */]) = 0
23:45:03 brk(0) = 0x19a54000
23:45:03 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b05f0c96000
23:45:03 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b05f0c97000

-T 显示每一调用所耗的时间.
[db2inst1@hadr02 ~]$ strace -T cat /dev/null
execve(“/bin/cat”, [“cat”, “/dev/null”], [/* 23 vars */]) = 0 <0.000499>
brk(0) = 0xa74d000 <0.000016>
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ba36343a000 <0.000021>
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ba36343b000 <0.000022>

其它:
-F 尝试跟踪vfork调用.在-f时,vfork不被跟踪.
-ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号.
-d 输出strace关于标准错误的调试信息.
-f 跟踪由fork调用所产生的子进程.
-v 输出所有的系统调用.一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出.
-p pid 跟踪指定的进程pid.

40.netstat
-a:显示处于listen和非listen的东东
-t:显示tcp
-u:显示udp
-x:显示UNIX端口,UNIX端口就是只能用于本机通信的那个,速度比tcp之类的快的多
-l:只显示listen的
-p:显示进程
-n:拒绝显示别名,能显示数字的全部转化成数字。

-s:显示一些统计信息

比较全的(不看UNIX端口):
[root@hadr02 ~]# netstat -atup

41.ipcs
IPC
1.管道
2.信号
3.message 队列
4.共享内存
5.信号量
6.套接口

可以用ipcs命令查看:
ipcs -m:共享内存
ipcs -q:消息队列
ipcs -s:信号量
ipcs -a:所有
其它可用的参数如:
ipcs -t:按时间格式查看
ipcs -p:按进程查看
ipcs -c:按创建者查看
ipcs -l:按最大限制查看
ipcs -u:按summary查看

共享内存:
SHMMAX
含义:单个共享内存段最大字节数
设置:比SGA略大
查看:cat /proc/sys/kernel/shmmax
$ cat /proc/sys/kernel/shmmax
1073741824
修改:
sysctl -w kernel.shmmax=1073741824
echo “kernel.shmmax=1073741824″ >> /etc/sysctl.conf

SHMMNI
含义:共享内存段最大个数
设置:至少4096
查看:cat /proc/sys/kernel/shmmni
# cat /proc/sys/kernel/shmmni
4096
修改:
# sysctl -w kernel.shmmni=4096
# echo “kernel.shmmni=4096″ >> /etc/sysctl.conf

SHMALL
含义:系统中共享内存页总数
设置:至少ceil(shmmax/PAGE_SIZE);ORACLE DOC 默认值:2097152*4096=8GB
查看:cat /proc/sys/kernel/shmall
$ getconf PAGE_SIZE
4096
# cat /proc/sys/kernel/shmall
2097152
修改:
# sysctl -w kernel.shmall=2097152
# echo “kernel.shmall=2097152″ >> /etc/sysctl.conf

信号量:
SEMMSL
含义:每个信号量set中信号量最大个数
设置:最小250;对于processes参数设置较大的系统建议设置为processes+10

SEMMNI
含义:linux系统信号量set最大个数
设置:最少128

SEMMNS
含义:linux系统中信号量最大个数
设置:至少32000;SEMMSL * SEMMNI

SEMOPM
含义:semop系统调用允许的信号量最大个数
设置:至少100;或者等于SEMMSL

查看信号量设置:cat /proc/sys/kernel/sem
order:SEMMSL, SEMMNS, SEMOPM, SEMMNI
oracle@lab-rd-01:~$ cat /proc/sys/kernel/sem
250 32000 100 128

修改:
sysctl -w kernel.sem=”250 32000 100 128″
echo “kernel.sem=250 32000 100 128″ >> /etc/sysctl.conf

42.ulimit
这个是shell自带的命令,一般先用ulimit -a查看一下(软限制,同ulimit -S -a,如果要看硬限制,那么ulimit -H -a),然后用ulimit -S -c 0 或ulimit -H -c 0的方法设置软限制或硬限制。-c参数指定的是选项,这个可以在-a的时候看到。设置的值可以是0,也可以是unlimited。

如果ulimit不限定使用-H或-S,此时它会同时把两类限制都改掉的.
软限制可以限制用户/组对资源的使用,硬限制的作用是控制软限制.
超级用户和普通用户都可以扩大硬限制(普通用户试了下貌似不行。。。。),但超级用户可以缩小硬限制,普通用户则不能缩小硬限制.
硬限制设定后,设定软限制时只能是小于或等于硬限制.

-H 设置硬资源限制,一旦设置不能增加。 ulimit – Hs 64;限制硬资源,线程栈大小为 64K。
-S 设置软资源限制,设置后可以增加,但是不能超过硬资源设置。 ulimit – Sn 32;限制软资源,32 个文件描述符。
-a 显示当前所有的 limit 信息。 ulimit – a;显示当前所有的 limit 信息。
-c 最大的 core 文件的大小, 以 blocks 为单位。 ulimit – c unlimited; 对生成的 core 文件的大小不进行限制。
-d 进程最大的数据段的大小,以 Kbytes 为单位。 ulimit -d unlimited;对进程的数据段大小不进行限制。
-f 进程可以创建文件的最大值,以 blocks 为单位。 ulimit – f 2048;限制进程可以创建的最大文件大小为 2048 blocks。
-l 最大可加锁内存大小,以 Kbytes 为单位。 ulimit – l 32;限制最大可加锁内存大小为 32 Kbytes。
-m 最大内存大小,以 Kbytes 为单位。 ulimit – m unlimited;对最大内存不进行限制。
-n 可以打开最大文件描述符的数量。 ulimit – n 128;限制最大可以使用 128 个文件描述符。
-p 管道缓冲区的大小,以 Kbytes 为单位。 ulimit – p 512;限制管道缓冲区的大小为 512 Kbytes。
-s 线程栈大小,以 Kbytes 为单位。 ulimit – s 512;限制线程栈的大小为 512 Kbytes。
-t 最大的 CPU 占用时间,以秒为单位。 ulimit – t unlimited;对最大的 CPU 占用时间不进行限制。
-u 用户最大可用的进程数。 ulimit – u 64;限制用户最多可以使用 64 个进程。
-v 进程最大可用的虚拟内存,以 Kbytes 为单位。 ulimit – v 200000;限制最大可用的虚拟内存为 200000 Kbytes。

43.dd
dd bs=1M count=128 if=/dev/zero of=test conv=fdatasync 最后一个参数表明dd最后需要自己做一次sync,把写缓存中的数据写入磁盘,然后得到真正的写入速度。

44.PAM
可装载式身份验证模块。
查看rpm包和包含的库:
[root@HADR01 ~]# rpm -qa | grep pam
pam-0.99.6.2-6.el5_5.2
pam_krb5-2.2.14-22.el5
pam_krb5-2.2.14-22.el5
pam_smb-1.1.7-7.2.1
pam_smb-1.1.7-7.2.1
pam_pkcs11-0.5.3-26.el5
pam-0.99.6.2-6.el5_5.2
pam_ccreds-3-5
pam_pkcs11-0.5.3-26.el5
pam_passwdqc-1.0.2-1.2.2
pam_ccreds-3-5
pam_passwdqc-1.0.2-1.2.2
[root@HADR01 ~]# ldconfig -v | grep pam
libpam_misc.so.0 -> libpam_misc.so.0.81.2
libpamc.so.0 -> libpamc.so.0.81.0
libpam.so.0 -> libpam.so.0.81.5
libpam_misc.so.0 -> libpam_misc.so.0.81.2
libpamc.so.0 -> libpamc.so.0.81.0
libpam.so.0 -> libpam.so.0.81.5

应用都会去调用libpamXXX.so,然后进行安全方面的工作。
比如我们的login程序,看一下其调用了哪些库:
[root@HADR01 ~]# ldd /bin/login
linux-vdso.so.1 => (0x00007fff83fa2000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x0000003a85e00000)
libpam.so.0 => /lib64/libpam.so.0 (0x0000003a7fe00000)
libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x0000003a76000000)
libaudit.so.0 => /lib64/libaudit.so.0 (0x0000003a7ee00000)
libc.so.6 => /lib64/libc.so.6 (0x0000003a72000000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003a72400000)
/lib64/ld-linux-x86-64.so.2 (0x0000003a71c00000)
我们会发现其调用了pam的库。

pam有很多认证的方式,认证方式的库在/lib/security下:
比如ladp认证:
[root@HADR01 ~]# ls /lib/security/ | grep ldap
pam_ldap.so

由于pam有这么多的认证方式,每个应用程序都能用pam来进行认证,那么需要有一个地方为每个应用程序提供pam的配置,这个配置在/etc/pam.d下。如login程序的pam配置文件:
[root@HADR01 pam.d]# head /etc/pam.d/login
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth include system-auth
account required pam_nologin.so
account include system-auth
password include system-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session optional pam_keyinit.so force revoke
session required pam_loginuid.so

每个so文件也能有相应的配置文件,如/etc/passwd就是一个配置文件。

也就是说:应用程序调用libpam.so来进行认证,libpam.so根据应用的配置文件(/etc/pam.d/XXX),调用实际的模块,如pam_unix.so来完成具体的认证。pam_unix.so这个模块可以拥有自己的配置文件,如/etc/passwd文件。配置文件会的说明通过认证需要调用哪几个模块,只有每个模块都通过了,才算验证通过。

比如login程序:
[root@HADR01 security]# cat /etc/pam.d/login
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth include system-auth
account required pam_nologin.so
account include system-auth
password include system-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session optional pam_keyinit.so force revoke
session required pam_loginuid.so
session include system-auth
session optional pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open
当使用pam的auth功能的时候,会得去调用pam_securetty.so模块,同时需要system-auth配置文件(/etc/pam.d/system-auth),但使用account功能的时候,会的去调用pam_nologin.so模块,password和session功能也是类似的。
那auth来分析:
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth include system-auth
只有每一行都通过,才能通过验证。对于include来说,需要通过include的那个配置文件里的对应方法的每一行才行。
第一行,从pam_securetty.so可以推断出其配置文件为/etc/securetty,这个文件指明了一些允许被登录的控制台。也就是说,使用login的控制台必须写在这个文件中才行。
第二行,表明还需要通过system-auth文件里的auth的每一行,内容为:
[root@HADR01 ~]# cat /etc/pam.d/system-auth | grep auth
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet
auth required pam_deny.so
第一行,required表示必须要用到pam_env.so这个模块验证一下。
第二行,sufficient表示如果通过了,那么就通过了。如果不行,那么看下面几行的表现,如果通过了,那么ok~
第三行,requisite表示必须通过,和required的区别在于required如果没通过,会的往下执行,如果为requisite,如果没通过就直接返回验证失败。
第四行,pam_deny.so只要一执行,必然是失败。

可以看到,其最重要的一条是pam_unix.so模块的认证(当然啦,如果你的tty不符合securetty的配置,那么这一步也是进行不到的啦)。这个模块会的用到/etc/passwd这些配置文件。

总结一下:
应用程序把验证交给pam库提供的函数来进行。这些函数会的更具配置文件,一次调用各种验证模块来进行验证。验证通过就ok,验证失败就不ok。

45.常用查看系统性能命令:
内存使用率前N:
[ORA_12c:oracle:o12c ~]$ps -e -o pmem,pid,user,tty,args | head -1; ps -e -o pmem,pid,user,tty,args | sort -n -k 1 -r | grep -v -E “%MEM” | head -20
CPU使用率前N:
[ORA_12c:oracle:o12c ~]$ps -e -o pcpu,pid,user,tty,args | head -1; ps -e -o pcpu,pid,user,tty,args | sort -n -k 1 -r | grep -v -E “%CPU” | head -20

45.至查看可见字符
strings /u01/dbfile/o12c/control01.ctl

45.watch
对于那些输出变化的东东,可以用watch,比如 watch vmstat 1

46.ethtool
这个功能是用于网卡管理的,功能比ifconfig要强大的多。使用ethtool配置后的参数都会保存在ifcfg-ethXXX中。
[root@RHEL65 ~]# ethtool eth0
Settings for eth0:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised pause frame use: No
Advertised auto-negotiation: Yes
Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 0
Transceiver: internal
Auto-negotiation: on
MDI-X: Unknown
Supports Wake-on: d
Wake-on: d
Current message level: 0x00000007 (7)
drv probe link
Link detected: yes

47.route
route -n:不解析IP

route从上往下,只要一符合就会转发,于是后面的就会忽略。

route表产生的方式:
1.本机的某个eth口被分配了IP,那么对应的路由就会的走那边。
2.可以手工使用route命令设置路由。比如:
route add -net 192.168.5.0 netmask 255.255.255.0 dev eth0
注意,一般用dev做转发比较好,当然也可以用ip做默认网关,如:
route add -net 192.168.5.0 netmask 255.255.255.0 gw 192.168.5.254
为什么用dev比较好呢?因为如果你的转发方式是通过gw,那么必须保证你的主机上有至少一个eth口和gw处于同一个网段。
3.动态路由学习。这个需要软件支持。

通过route动态增加的路由在重启后就会没有,因此需要用如下方法设置:
[root@routera ~]# vim /etc/sysconfig/network-scripts/route-eth0
192.168.100.0/24 via 192.168.1.100 dev eth0
目标网域 透过的gateway 装置

48.ip forward
通过下面命令查看是否打开:
[root@CONTROLLER01 ~]# cat /proc/sys/net/ipv4/ip_forward
1

设置:
[root@www ~]# vim /etc/sysctl.conf
# 将底下这个设定值修改正确即可! (本来值为 0 ,将它改为 1 即可)
net.ipv4.ip_forward = 1
然后:sysctl -p

49.使用iptables构建NAT
NAT的过程(可以看下OPnotes中的IPTABLES_路径_简化.jpg):
1.先经过 NAT table 的 PREROUTING 链;
2.经由路由判断确定这个封包是要进入本机与否,若不进入本机,则下一步;
3.再经过 Filter table 的 FORWARD 链;
4.通过 NAT table 的 POSTROUTING 链,最后传送出去。

NAT 服务器的重点就在于上面流程的第 1,4 步骤,也就是 NAT table 的两条重要的链:PREROUTING 与 POSTROUTING。 那这两条链有什么重要的功能呢?重点在于修改 IP 嘛!但是这两条链修改的 IP 是不一样的! POSTROUTING 在修改来源 IP ,PREROUTING 则在修改目标 IP 。 由于修改的 IP 不一样,所以就称为来源 NAT (Source NAT, SNAT) 及目标 NAT (Destination NAT, DNAT)。

SNAT的一个实际例子(用于内网IP想访问外网的情况。IP的映射会的存放在内存中):
客户端 192.168.1.100 这部主机要联机到 http://tw.yahoo.com 去时,他的封包表头会如何变化?
1.客户端所发出的封包表头中,来源会是 192.168.1.100 ,然后传送到 NAT 这部主机;
2.NAT 这部主机的内部接口 (192.168.1.2) 接收到这个封包后,会主动分析表头数据, 因为表头数据显示目的并非 Linux 本机,所以开始经过路由, 将此封包转到可以连接到 Internet 的 Public IP 处;
3.由于 private IP 与 public IP 不能互通,所以 Linux 主机透过 iptables 的 NAT table 内的 Postrouting 链将封包表头的来源伪装成为 Linux 的 Public IP ,并且将两个不同来源 (192.168.1.100 及 public IP) 的封包对应写入暂存内存当中, 然后将此封包传送出去了;

4.在 Internet 上面的主机接到这个封包时,会将响应数据传送给那个 Public IP 的主机;
5.当 Linux NAT 服务器收到来自 Internet 的回应封包后,会分析该封包的序号,并比对刚刚记录到内存当中的数据, 由于发现该封包为后端主机之前传送出去的,因此在 NAT Prerouting 链中,会将目标 6.IP 修改成为后端主机,亦即那部 192.168.1.100,然后发现目标已经不是本机 (public IP), 所以开始透过路由分析封包流向;
封包会传送到 192.168.1.2 这个内部接口,然后再传送到最终目标 192.168.1.100 机器上去!

DNAT的一个实际例子(用于外网主机想访问内网的情况):
1.外部主机想要连接到目的端的 WWW 服务,则必须要连接到我们的 NAT 服务器上头;
2.我们的 NAT 服务器已经设定好要分析出 port 80 的封包,所以当 NAT 服务器接到这个封包后, 会将目标 IP 由 public IP 改成 192.168.1.210 ,且将该封包相关信息记录下来,等待内部服务器的响应;
3.上述的封包在经过路由后,来到 private 接口处,然后透过内部的 LAN 传送到 192.168.1.210 上头!
4.192.186.1.210 会响应数据给 61.xx.xx.xx ,这个回应当然会传送到 192.168.1.2 上头去;
5.经过路由判断后,来到 NAT Postrouting 的链,然后透过刚刚第二步骤的记录,将来源 IP 由 192.168.1.210 改为 public IP 后,就可以传送出去了!

对于iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE这么一条规则,MASQUERADE这个设定值就是‘ IP 伪装成为封包出去 (-o) 的那块装置上的 IP ’。所以封包来源只要来自 $innet (也就是内部 LAN 的其他主机) ,只要该封包可透过 eth0 传送出去, 那就会自动的修改 IP 的来源表头成为 eth0 的 public IP 啦。

一般使用NAT的话,LAN中的主机设定一般是:
NETWORK 为 192.168.100.0
NETMASK 为 255.255.255.0
BROADCAST 为 192.168.100.255
IP 可以设定 192.168.100.1 ~ 192.168.100.254 间,不可重复!
通讯闸 (Gateway) 需要设定为 192.168.100.254 (NAT 服务器的 Private IP)
DNS (/etc/resolv.conf) 需设定为 168.95.1.1 (Hinet) 或 139.175.10.20 (Seed Net),这个请依你的 ISP 而定;
而NAT服务器的设定一般只要是iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE这么一条规则就行了。

如果对外的IP我想自己指定,那么咋办?可以使用–to-source这个参数,这个参数甚至可以指定多个IP轮流用,比如:
iptables -t nat -A POSTROUTING -o eth0 -j SNAT \
–to-source 192.168.1.210-192.168.1.220

例子:
PC A发出去的包要把源地址变成10.0.0.1,于是:
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 172.16.93.0/24 -j SNAT –to-source 10.0.0.1
PC B想把接收到的目的地址变成172.16.93.1,于是:
iptables -t nat -A PREROUTING -d 10.0.0.1 -j DNAT –-to-destination 172.16.93.1

来看个PNAT的,目的地址是10.0.0.1:80的就转成172.16.93.1:8080:
iptables -t nat -A PREROUTING -d 10.0.0.1 -p tcp –-dport 80 -j DNAT –-to-destination 172.16.93.1:8080

50.nc
通过nc命令,可以打开tcp连接、发送udp包或监听任意的tcp端口、进行端口扫描。

常见选项:
-4:强制只使用IPv4
-6:强制只使用IPv6
-D:开启debug
-d:不从stdin中读取信息
-i interval:指定text文件的发送和接收的时间间隔。同时也指定多个port之间的连接时间间隔
-k:要求nc在一个连接完成后等待另一个连接而不是直接关闭
-l:用于指定nc需要监听某个端口
-n:用于指定不进行DNS解析
-p source_port:用于指定nc监听的源端口
-r:用于指定源或目的端口是随机取的
-S:允许使用RFC 2385 TCP MD5签名
-s source_ip_address:用于指定发送数据包的IP地址
-T Tos:用于指定连接的ToS
-C:发送CRLF左右行的结尾
-U:自定Unix Domain Sockets
-u:使用UDP而不是默认的TCP
-v:输出更加详细的信息
-w timeout:指定连接超时时间。比如一个连接连上来后timeout指定的时间里没有操作就可以超时断开。对对-l的监听没有用。
-X proxy_version:指定proxy的版本。可以使socks v4/socks v5和https代理。
-x proxy_address[:port]:指定代理服务器的地址
-z:指定nc只是扫描监听的后台进程,而不发送任何的数据给这些监听中的进程

例子:
1.最简单的客户机服务器模式
在主机A上发起监听:

[root@COMPUTE01 ~]#  nc -l 1234

在主机B上进行连接:

[root@COMPUTE02 ~]#  nc 192.168.19.96 1234

然后在两个窗口中任意一个窗口的输出都能在另一个窗口中接收到。如果要结束的话输入ctrl+D
2.数据传输
其实就是使用了上面的例子,不过这里的输入是从文件输入,而输出是从文件输出:
在主机A上发起监听,并重定向输出:

[root@COMPUTE01 ~]#  nc -l 1234 > filename.out

在主机B上进行连接,并重定向输入:

[root@COMPUTE02 ~]#  nc 192.168.19.96 1234 < filename.in

3.发送HTTP请求
比如通过下面这个管道的例子:

[root@COMPUTE02 ~]#  echo -n "GET / HTTP/1.0\r\n\r\n" | nc host.example.com 80

4.端口检测
nc可以进行端口检测,比如下面的例子检测一台主机的20~100的端口中有几个是开着的(记得用-w加个超时时间):

[root@COMPUTE02 ~]# nc -z 192.168.19.96 20-100 -w 5
Connection to 192.168.19.96 22 port [tcp/ssh] succeeded!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*