linux组成部分

    核心/boot/vmlinuz-version

    内核模块:/lib/modules/version

内核设计:

    单内核

        模块化设计

    微内核

装载模块命令

    insmod

    modprobe


伪文件系统:

/proc

    /proc/sys:此目录的文件很多是可读写的

/sys

    某些文件可写


设定内核参数值的方法:

   1、 echo VALUE > /proc/sys/to/somefile(重启会失效)

   2、sysctl -w kernel.hostname="HOSTNAME"(重启会失效)

   3、/etc/sysctl.conf(永久有效),但需使用sysctl -p 命令,使其立即生效

      sysctl -a:显示所有系统参数值

内核模块管理

lsmod:查看系统模块

modprobe MOD_NAME:装载模块

modprobe -r MOD_NAME:卸载某模块

modinfo MOD_NAME:查看模块的具体信息

insmod /path/to/modules_FILE:装载模块

rmmod MOD_NAME:移除模块

depmod /PATH/TO/MODILES_DIR:生成模块的依赖关系


内核中的功能,除了核心功能以外,在编译时,大多功能都有三种选择:

1、不使用此功能

2、编译成内核模块

3、编译进内核


如何手动编译内核:

make gconfig :Gnome桌面环境使用(需安装图形开发库环境组:GNOME Software Development)

make Kconfig: KDE桌面环境使用(需安装图形开发库环境)

make menuconfig

make modules_install

make install 

二次编译时清理,如果有需要,请备份配置文件.config:

    make clean:清理此前编译好的二进制模块

    make mrproper:清理编译所残留的工作的,包括.config


screen 命令:

    screen -ls :显示建立的屏幕

    screen :直接打开一个新的屏幕

    screen -r ID:还原某屏幕

    ctrl+a,d:拆除一个屏幕

生成initrd或者initramfs

RHEL5\6:mkinitrd,mkinitrd /boot/initrd-`uname -r` `uname -r` 

        mkinitrd initrd文件路径 内核版本号

RHEL6:dracut


系统启动流程:

POST-->BIOS(Boot sequence)-->bootloader(MBR)-->kernel-->initrd(initramfs)-->init(inittab)

/etc/inittab:

    默认运行级别

    系统初始化(/etc/rc.d/rc.sysinit)

    运行指定级别的服务脚本

        /etc/rc.d/init.d/

          /etc/rc.d/rc#.d/

             K*

             S*

               00-99:运行次序

        /etc/rc.d/rc.local

     启动虚拟终端

    启动图形化终端 

/etc/rc.d/rc.sysinit:

    检测并以读写方式重新挂载根文件系统

    设定主机名

    检测并挂载/etc/fstab中的其他文件系统

    启用sawp交换分区

    初始化外围硬件设备的驱动

    根据/etc/sysctl.conf设定内核参数

    激活Udev和SElinux

    激活LVM和RAID设备

    清理过期锁和PID文件

    装载键映射



定制小的Linux系统:(任务)

    1、关机和重启

    2、运行对应的服务脚本

    3、主机名

    4、启动终端

    5、运行用户验证登陆

    6、定义单用户级别

    7、装载网上驱动,启用网络功能

    8、提供一个web服务器

busybox:模拟工具的命令

复制程序及程序所依赖的so文件:

#!/bin/bash
NEWPATH=/mnt/sysroot

socp() {
  OLDPATH2=${1%/*}
  [ ! -d $NEWPATH$OLDPATH2 ] && mkdir -p $NEWPATH$OLDPATH2 && echo -e "\033[31m$NEWPATH$OLDPATH2 mkdir finished.\033[0m"
  [ ! -e $NEWPATH$1 ] && cp $1 $NEWPATH$1 && echo -e "\033[31m$NEWPATH$1 cp finished.\033[0m"
}
bincp() {
  OLDPATH=${1%/*}
  [ ! -d $NEWPATH$OLDPATH ] && mkdir -p $NEWPATH$OLDPATH && echo -e "\033[31m$NEWPATH$OLDPATH mkdir finished.\033\[0m"
  [ ! -e $NEWPATH$1 ] && cp $1 $NEWPATH$1 && echo -e "\033[31m$NEWPATH$1 copy finished.\033[0m"
  for sofile in `ldd $1 | grep -o "/[^[:space:]]*"`;do
        socp $sofile
  done
}

read -p "Please enter your Command: " CMD
   until [ $CMD == 'quit' -o $CMD == 'QUIT' ]; do
    ! which $CMD &> /dev/null && echo -e "\033[31mError Command.\033[0m" && read -p "Please enter again: " CMD && continue
     BINFILE=`which $CMD | grep -o "/[^[:space:]]*"`
        bincp $BINFILE
      read -p "Please enter your Command again: " CMD
   done


halt:

    -p :直接切断电源

exec:直接替换父进程,并启动新的进程


脚本编程知识点:

变量中字符的长度:${#VARNAME}

stty -F /dev/console

[root@Centos6 ~]# stty -F /dev/console size  #查看字符设备console的输出长数及列数
25 80
[root@Centos6 ~]# stty -F /dev/console speed #查看字符设备console的显示速率
38400

readhat启动中服务启动的OK或者failure提示

#!/bin/bash
#
SCREEN=`stty -F /dev/console size`
SUMSCREEN=${SCREEN#* }
SUMSCREEN2=$[$SUMSCREEN-14]
RED='\033[1;31m'
GREEN='\033[1;32m'
YELLOW='\033[1;33m'
BLUE='\033[1;34m'
NORMAL='\033[0m'

success() {
    CHARSSUM=${#1}
    SUMSCREEN3=$[$SUMSCREEN2-$CHARSSUM]
    echo -n "$1"
    for I in `seq 1 $SUMSCREEN3`;do
        echo -n " " 
    done
    echo -e "[   ${GREEN}OK$NORMAL   ]"
}
failure() {
    CHARSSUM=${#1}
    SUMSCREEN3=$[$SUMSCREEN2-$CHARSSUM]
    echo -n "$1"
    for I in `seq 1 $SUMSCREEN3`;do
        echo -n " " 
    done
    echo -e "[ ${RED}FAILED$NORMAL ]"
}
success "Starting tserver"
success "Starting tserver is OK"
success "Starting tserver is OK your See!"
failure "failure tserver"
failure "failure tserver is failure"
failure "failure tserver is failure see"

/etc/issue:系统登陆界面提示信息设置

\r ==uname -r

\m ==uname -m 

rc.sysinit:挂载/etc/fstab中定义的其他文件系统

会挂载的信息也可以在/pro/mounts文件中查看:

[root@localhost ~]# cat /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
/dev/sdb1		/mnt/boot		ext3 	  defaults    0   0 
/dev/sdb2		/mnt/sysroot		ext3	 defaults     0    0
[root@localhost ~]# awk '{print $1}' /proc/mounts | grep '/dev/sdb2'
/dev/sdb2
在/etc/fstab文件中注明的挂载点,可以在/proc/mounts文件中查看,是否挂载成功

设定内核参数:

/etc/sysctl.conf

sysctl -p (重启也会生效)


用户功能:

PAM:Pluggable Authentication Module

/etc/pam.d/*

不基于PAM机制认证用户信息:

nsswitch:Network service switch (用于login程序与passwd\shadow文件的中间层)

库:PASSWD中验证,libnss_file.so NIS中认证:libnss_nis.so,ldap中认证:libnss_ldap.so

配置文件:/etc/nsswitch.conf

nsswitch即可以称为:网络服务转换,名称解析开关

制作用户登陆功能:

1、复制nsswitch所依赖的库文件,并使用cp -d命令保留库文件的连接到新系统中

    库文件位于:/lib64/libns* /usr/lib64/libns*

2、创建/etc/nsswitch.conf文件,指定nsswitch读取文件的路径

3、创建新系统中的/etc/group、passwd、shadow文件,并导入用户

cat /etc/group | grep -E "^(root|leozhenping)\>" >> /mnt/sysroot/etc/group

4、复制login程序及所依赖的库文件到新系统目录中

5、指定/etc/issue中欢迎界面提示内容

6、修改/etc/inittab中使用mingetty程序打开tty1

1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

7、对用户提示登陆符进行设置
   建立/root目录,创建.bash_profile文件(或者直接复制/etc/skel/目录中的所有文件到新系统中目    录。

[root@localhost ~]# ls /etc/skel/ -la
total 48
drwxr-xr-x  2 root root 4096 May 15 13:08 .
drwxr-xr-x 76 root root 4096 May 20 09:26 ..
-rw-r--r--  1 root root   33 Jul 22  2011 .bash_logout
-rw-r--r--  1 root root  176 Jul 22  2011 .bash_profile
-rw-r--r--  1 root root  124 Jul 22  2011 .bashrc
-rw-r--r--  1 root root  515 Apr 28  2011 .emacs
或者直接在用户目录下建立.bash_profile文件,输入:
export PS1='[\u@\h \W]$'
u表示用户名
h表示主机名
W表示目录基名
w完整路径名
$普通用户为$,管理员为#

单用户模式:

1、对/etc/inittab添加1级别条目

2、对/etc/rc.d/init.d目录下添加single脚本:

if [ "$1" != "start" ];then
    exit 9
done

exec /sbin/init -t1 S

3、创建/etc/rc.d/rc1.d/的相应连接,并对其他不要的服务添加K天头连接,对single添加S开头连接

4、启动的时候在kernel项添加 S或者1字符


查看本机硬件设备信息:

1、cat /proc/cpuinfo

2、lsusb

3、lspci

4、hal-device(hardware Abstract Layer,硬件抽象层)


如何实现部分编译:

1、只编译某子目录下的相关代码

make dir/

make drivers/net/

2、只编译部分模块

make M=drivers/net

3、只编译某一模块

make drivers/net/pcnet32.ko

4、将编译完成的结果放置于别的目录中

make O=/tmp/kernel

交叉编译

make ARCH=


如何编译busybox

make menuconfig :配置所需要的模块及配置

make install


busybox制作注意点

  kernel+initrd(busybox制作,提供相应的文件系统模块)+rootfs(busybox制作)

单独编译内核文件

  make arch/X86/

  make SUBDIR=arch/

   编译好的文件会存放到arch/X86(32位)/boot/bzImage

   initrd:提供所必需访问存储设备的驱动

   系统初始化rc.sysinit:初始其他硬件的驱动程序

 busybox init:不支持运行级别,可以移值readhat中的init程序

 busybox inittab:格式也不尽相同,如果使用readhat的init程序,需改写相应的格式

 busybox shell:只有ash hush,如需使用bash,需移值相应版本的程序

变量赋值

${parameter:-word}:如果parameter为空或未定义,则变量展开为“word”;否则,展开为parameter的值;

[root@Centos6 ~]# A=3
[root@Centos6 ~]# echo $A
3
[root@Centos6 ~]# unset A
[root@Centos6 ~]# echo $A

[root@Centos6 ~]# echo ${A:-30}
30
[root@Centos6 ~]# A=${A:-30}  #如果A有值就将A本身的值赋给A,如果值为空就将30赋给A
[root@Centos6 ~]# echo $A
30

${parameter:+word}:如果parameter为空或未定义,不做任何操作;否则,则展开为“word”值;

[root@Centos6 ~]# A=20
[root@Centos6 ~]# echo ${A:+30}
30
[root@Centos6 ~]# unset A
[root@Centos6 ~]# echo ${A:+30}

[root@Centos6 ~]#            #A的值空侧为空,不空则为30

${parameter:=word}:如果parameter为空或未定义,则变量展开为“word”,并将展开后的值赋值给parameter;

[root@Centos6 ~]# unset A
[root@Centos6 ~]# echo $A

[root@Centos6 ~]# echo ${A:=30}   #将$A的值展开为30,并且$A也等于30
30
[root@Centos6 ~]# echo $A
30

${parameter:offset}

[root@Centos6 ~]# A='hello world'
[root@Centos6 ~]# echo ${A:2}
llo world

${parameter:offset:length}:取子串,从offset处的后一个字符开始,取lenth长的子串;

[root@Centos6 ~]# A='hello world'   #取片,从开关跳过1个字符,切后面的三个字符
[root@Centos6 ~]# echo ${A:1:3}
ell


/etc/rc.d/init.d/中的脚本都支持配置文件,一般配置文件存放于/etc/sysconfig/目录下


局部变量概念

#!/bin/bash
#
A=1
TEST() {
  local  A=$[3+4]  #如果想要函数的变量只在函数中有效,需加上local关键字
}

TEST

for I in `seq $A 10`;do
    echo $I
done



mktemp命令

   创建临时文件或目录

        -d:创建临时目录

[root@Centos6 Test]# mktemp file.XXXXX   创建文件
file.L0pjr
[root@Centos6 Test]# mktemp -d file.XXXXX  创建目录
file.ANvKu
[root@Centos6 Test]# FILE=`mktemp -d file.XXXXX`
[root@Centos6 Test]# echo $FILE
file.Sczuy


脚本中的实现信息捕捉,(9,15信号无法捕捉):

trap命令:(用于捕捉信号)

     trap 'COMMAND' 信号列表

#!/bin/bash
#
trap 'echo "No"' INT  #命令前后加''号,信息加“”,不能中止结束
while :;do
  date
  sleep 2
done
#!/bin/bash
#
A=10.189.9.
trap 'echo "quit";exit 1' INT    #多个命令使用分号分隔开,可以使用ctrl+c中止
for I in {200..254};do
 if ping -c 1 -w1 $A$I &>/dev/null;then
   echo -e "\033[34m$A$I is up.\033[0m"
 else
   echo -e "\033[31m$A$I is down.\033[0m"
 fi
done
#!/bin/bash
#
A=10.189.8.
FILE=`mktemp /tmp/ping.XXXX`
cleanup(){
   echo "quit"
   rm -rf $FILE
   exit 9
}  #定义函数清理现场
trap 'cleanup' INT   #在trap命令中引用函数,可以引入更多命令
for I in {200..254};do
 if ping -c 1 -w1 $A$I &>/dev/null;then
   echo -e "\033[34m$A$I is up.\033[0m" >> $FILE
 else
   echo -e "\033[31m$A$I is down.\033[0m"
 fi
done



任务计划

   1、在未来的某个时间点执行一次某任务

    at命令

          at 时间

          at > COMMAND

          at > ctrl+d

     指定时间方式:

       绝对时间:HH:MM/DD.MM.YY/MM.DD.YY 

       相对时间:now+#

          #单位:minutes,hours,days,weeks

       模糊时间:noon,midnight,teatime

     命令的执行结果,将以邮件的形式发送给安排任务的用户

    at -l显示作业列表

    at -d JOD_ID 删除作业,他等于atrm

配置文件

 /etc/at.deny,黑名单

 /etc/at.allow 白名单(默认是不存在的)

  如果两个文件同时存在,就白名单生效,如果两个文件都不存在, 只有root可以使用at,如果deny文件存在,但是空的,那就所有用户都可以运行,如果只有allow存在,但也是空的,那也只有管理员可以使用at。


    batch命令:使用与at一样,但不能指定运行时间,他会选择在系统空闲时自动执行任务

   2、周期性的执行某任务

    cron:自身是一个不间断运行的服务

    anacron:cron的补充,能够实现让cron因为各种原因在过去的时间点该执行而未执行的任务,在

            恢复正常执行一次

     cron分类:

             系统cron任务:

                /etc/crontab

[root@localhost ~]# cat /etc/crontab 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

                分钟 小时 天 月 周 用户 任务

             用户cron任务:

                /etc/spool/cron/USERNAME    

                分钟 小时 天 月 周 任务


      时间有效取值:

        分钟:0-59

        小时:0-23

        天:1-31

        月:1-12

        周:0-7,0和7都表示周日

      时间通配表示:

        *:对应的所有有效取值

            3 * * * * 

            3 * * * 7

            12 12 6 7 *

        ,:离散时间点

            10,40 * * * * 每半小时

            10,40 * * * 2,5 每周2,周5的半小时

            10,40 02 * * 2,5每周2和周5的2点半小时任务

        -:连续时间点:

            10 02 * * 1-5 每周的星期一到周五的2点10分

        /#:对应取值范围内每多久一次

            */3 * * * * 每3分钟

      01 */2 * * * 每两小时

      10 04 */2 * * 每两天

cron结果将以邮件形式发送给管理员

    */3 * * * * cat /etc/fstab > /dev/null :将正确的信息清空,不发邮件通知

    */3 * * * * cat /etc/fstab &> /dev/null :将错误正确的信息都清空

cron的环境变量:执行所有命令都去path环境变量指定路径下去查找

     默认cron PATH路径:/bin:/sbin:/usr/bin:/usr/sbin

用户任务的管理

    crontab

        -l:列出当前用户的所有任务

        -e:定义任务

        -r:移除所有任务

        -u USERNAME:管理其他用户的cron任务

anacron命令:

    配置文件:/etc/anacrontab

[root@localhost ~]# cat /etc/anacrontab 
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22

#period in days   delay in minutes   job-identifier   command
1	5	cron.daily		nice run-parts /etc/cron.daily
7	25	cron.weekly		nice run-parts /etc/cron.weekly
@monthly 45	cron.monthly		nice run-parts /etc/cron.monthly

#nice  run-parts:是readhat的专有机制,让/etc/cron.daily中的所有脚本以脚本名称排序顺序依次执行

cron的服务状态查看:

[root@Centos6 tmp]# service crond status
crond (pid  1991) 正在运行..

服务运行级别检查:

[root@Centos6 tmp]# chkconfig --list crond
crond          	0:off	1:off	2:on	3:on	4:on	5:on	6:off