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