linux內核編譯及系統裁減(sysctl 內核模塊管理 screen 生成initrd cron

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章