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