linux学习笔记014

    xiaoxiao2021-03-25  81

    日志系统

     

    Linux系统启动流程

     

    PC: OS(Linux)

     

    POST-->BIOS(BootSequence)-->MBR(bootloader,446)-->Kernel-->initrd-->(ROOTFS)/sbin/init(/etc/inittab)

     

    Init管理(/etc/inittab)

    启动的服务不同:

             运行级别:0-6

                       0:halt

                       1:single user mode, 直接以管理员身份切入, s,S,single

                       2:multi usermode, no NFS

                       3:multi user mode, text mode 文本模式

                       4:reserved

                       5:multi user mode, graphic mode 图像界面

                       6:reboot

     

    详解启动过程

             bootloader(MBR)

                       LILO:LInux LOader

                       GRUB:GRand Unified Bootloader

                                Stage1:MBR

                                Stage1_5:/boot/grub/

                                Stage2:/boot/grub/

     

    grub.conf                  

     

    default=0 # 设定默认启动的title的编号,从0开始

    timeout=5 # 等待用户选择的超时时长,单位是秒

    splashimage=(hd0,0)/grub/splash.xpm.gz  # grub的背景图片

    hiddenmenu # 隐藏菜单

    password redhat

    password --md5 $1$HKXJ51$B9Z8A.X//XA.AtzU1.KuG.

    title Red Hat Enterprise Linux Server(2.6.18-308.el5)  # 内核标题,或操作系统名称,字符串,可自由修改

             root(hd0,0)  # 内核文件所在的设备;对grub而言,所有类型硬盘一律hd,格式为(hd#,N);hd#, #表示第几个磁盘;最后的N表示对应磁盘的分区;

             kernel/vmlinuz-2.6.18-308.el5 ro root=/dev/vol0/root rhgb quiet   # 内核文件路径,及传递给内核的参数/proc/cmdline

             initrd/initrd-2.6.18-308.el5.img # ramdisk文件路径

             password--md5 $1$HKXJ51$B9Z8A.X//XA.AtzU1.KuG.

    title Install Red Hat Enterprise Linux 5

             root(hd0,0)

             kernel/vmlinuz-5 ks=http://172.16.0.1/workstation.cfg ksdevice=eth0 noipv6

             initrd/initrd-5

             password--md5 $1$FSUEU/$uhUUc8USBK5QAXc.BfW4m.

     

     

    grub-md5-crypt

     

    查看运行级别:

    runlevel: n 3 代表从n切换到3

    who -r

     

    查看内核release号:

             uname-r

     

     

     

    安装grub stage1:

    # grub

    grub> root (hd0,0) boot所在的分区在0

    grub> set (hd0)指定安装在哪块硬盘

     

    安装grub第二种方式:

    # grub-install--root-directory=/path/to/boot's_parent_dir /PATH/TO/DEVICE

    grub-install --root-directory(grub放在什么分区上的跟)=/(boot的父目录)

     

    配置文件坏了

    grub> find

    grub> root (hd#,N)

    grub> kernel /PATH/TO/KERNEL_FILE

    grub> initrd /PATH/TO/INITRD_FILE

    grub> boot

     

     

     

    Kernel初始化的过程:

    1、设备探测

    2、驱动初始化(可能会从initrd(initramfs)文件中装载驱动模块)

    3、以只读挂载根文件系统;

    4、装载第一个进程init(PID:1)

     

    Init的过程

    /sbin/init:(/etc/inittab)

             upstart:ubuntu, d-bus, 事件驱动event-driven (ipc机制)把inittab切割成多个/etc/init/

             systemd:并行

     

    id:runlevels:action:process

    id: 标识符

    runlevels: 在哪个级别运行此行;

    action: 在什么情况下执行此行;

    process: 要运行程序;

     

    id:3:initdefault:设定默认级别

     

    si::sysinit:/etc/rc.d/rc.sysinit 

     

     

    ACTION:

    initdefault: 设定默认运行级别

    sysinit: 系统初始化

    wait: 等待级别切换至此级别时执行

    respawn: 一旦程序终止,会重新启动

     

     

    init执行的脚本

    /etc/rc.d/rc.sysinit完成的任务:

    1、激活udev和selinux;

    2、根据/etc/sysctl.conf文件,来设定内核参数;

    3、设定时钟时钟;

    4、装载键盘映射;

    5、启用交换分区;

    6、设置主机名;

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

    8、激活RAID和LVM设备;

    9、启用磁盘配额;

    10、根据/etc/fstab,检查并挂载其它文件系统;

    11、清理过期的锁和PID文件;

    /etc/rc.d/rc 关闭k开头,开始s开头的,根据优先级次序指向/etc/rc0.d

    /etc/rc0.d指向/etc/rc.d/rc.0.d,继续链接到/etc/rc.d/init.d/下的脚本

     

     

     

    for I in /etc/rc3.d/K*; do

      $Istop

    done

     

     

    for I in /etc/rc3.d/S*; do

      $Istart

    done

     

    ##: 关闭或启动的优先次序,数据越小越优先被选定

    先关闭以K开头的服务,后启动以S开头的服务;

     

     

    内核设计风格:

     

    RedHat, SUSE

    核心:动态加载内核模块

    内核:/lib/modules/“内核版本号命令的目录”/

    vmlinuz-2.6.32

    /lib/modules/2.6.32/

     

    RedHat5: ramdisk-->initrd

    RedHat6: ramfs-->initramfs

     

     

             单内核:Linux(LWP)

                       核心:ko(kernelobject)

                      

                      

                      

                       so()

                      

             微内核:Windows,Solaris (线程)

     

    chroot: chroot /PATH/TO/TEMPROOT[COMMAND...]

             chroot/test/virrrot  /bin/bash

            

    ldd /PATH/TO/BINARY_FILE:显示二进制文件所依赖的共享库

     

     

     

     

    MBR(bootloader)-->Kernel --> initrd(initramfs) --> (ROOTFS) --> /sbin/init(/etc/inittab)

             /etc/inittab,/etc/init/*.conf

             upstart

            

    init /etc/inittab

    id:runlevels:action:process

     

    id:5:initdefault:

     

    si::sysinit:/etc/rc.d/rc.sysinit

    OS初始化

     

    l0:0:wait:/etc/rc.d/rc 0

             rc0.d/

                       K*

                                stop

                       S*

                                start

                               

    /etc/rc.d/init.d, /etc/init.d

     

    服务类脚本:

             start

            

             SysV:/etc/rc.d/init.d

                       start|stop|restart|status

                       (1号信号)reload|configtest

     

    chkconfig 命令可以自动创建链接

                      

    # chkconfig: runlevels SS KK                          当chkconfig命令来为此脚本在rc#.d目录创建链接时,runlevels表示默认创建为S*开头的链接,-表示没有级别默认为S*开头的链接;除此之外的级别默认创建为K*开头的链接;

             S后面的启动优先级为SS所表示的数字;K后面关闭优先次序为KK所表示的数字;

    # description: 用于说明此脚本的简单功能;\, 续行符

     

    把写好的命令复制到 /etc/rc.d/init.d/目录下,chkconfig --add SERVICE_NAME

    创建服务链接

     

    chkconfig --list: 查看所有独立守护服务的启动设定;独立守护进程!

             chkconfig--list SERVICE_NAME

            

    chkconfig --add SERVICE_NAME

     

    chkconfig --del SERVICE_NAME

     

    chkconfig [--level RUNLEVELS] SERVICE_NAME{on|off}

             如果省略级别指定,默认为2345级别;

    Chkconfig –level myservice off;

     

     

    样例脚本:

    #!/bin/bash

    #

    # chkconfig: 2345 77 22

    # description: Test Service

    #

    LOCKFILE=/var/lock/subsys/myservice

     

    status() {

      if[ -e $LOCKFILE ]; then

       echo "Running..."

     else

       echo "Stopped."

      fi

    }

     

    usage() {

     echo "`basename $0` {start|stop|restart|status}"

    }

     

    case $1 in

    start)

     echo "Starting..."

     touch $LOCKFILE ;;

    stop)

     echo "Stopping..."

      rm-f $LOCKFILE &> /dev/null

      ;;

    restart)

     echo "Restarting..." ;;

    status)

     status ;;

    *)

     usage ;;

    esac

     

     

    /etc/rc.d/rc.local:系统最后启动的一个服务,准确说,应该执行的一个脚本;

     

     

    /etc/inittab的任务:

    1、设定默认运行级别;

    2、运行系统初始化脚本;

    3、运行指定运行级别对应的目录下的脚本;

    4、设定Ctrl+Alt+Del组合键的操作;

    5、定义UPS电源在电源故障/恢复时执行的操作;

    6、启动虚拟终端(2345级别);

    7、启动图形终端(5级别);

     

     

    yum install xinetd -y

    chkconfig --list xinetd

    service xinetd start

    chkconfig --list

    chkconfig rsync on

    chkconfig --list

    守护进程的类型:

             独立守护进程

             xinetd:超级守护进程,代理人

                       瞬时守护进程:不需要关联至运行级别

                      

            

     

    核心:/boot/vmlinuz-version

    内核模块(ko): /lib/modules/version/

     

    内核设计:

             单内核

                       模块化设计

             微内核

     

    装载模块:

             insmod

             modprobe

     

    www.kernel.org:

     

     

            

    用户空间访问、监控内核的方式:

    /proc, /sys

     

    伪文件系统

     

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

    /sys/: 某些文件可写

     

     

    设定内核参数值的方法:                                                   free-m

    echo VALUE > /proc/sys/TO/SOMEFILE  echo 1 > /proc/sys/vm/drop_caches

    sysctl -w kernel.hostname=                                                   free–m

    echo “peng” > /proc/sys/kernel/hostname

            

    能立即生效,但无法永久有效;

     

    永久有效:/etc/sysctl.conf

     

    修改文件完成之后,执行如下命令可立即生效:

    sysctl -p   重读配置文件

    sysctl -a: 显示所有内核参数及其值

     

     

     

    内核模块管理:

    lsmod: 查看模块

     

    modprobe MOD_NAME:装载某模块

    lsmod | grep floppy

    modprobe -r floppy

    lsmod | grep floppy

    modprobe floppy

    modprobe -r MOD_NAME: 卸载某模块

     

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

     

    insmod /PATH/TO/MODULE_FILE: 装载模块        

    rmmod MOD_NAME

     

    depmod /PATH/TO/MODILES_DIR 生成模块依赖表,保持在这个目录

     

     

     

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

    1、不使用此功能;

    2、编译成内核模块;

    3、编译进内核;

    yum grouplist查看组装好没有,会影响后面的编译(DevelopmentTools Development Libraries)

    yum groupinstall "DevelopmentLibraries"装组

     

     

     

    如何手动编译内核:

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

    make kconfig: KDE桌面环境使用,需要安装图形开发库 KDE Software Development

     

    make menuconfig: 打开图形窗口

     

    make

    make modules_install

    make install

     

     

     

    yum install screen

    screen命令:

    screen -ls: 显示已经建立的屏幕

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

             Ctrl+a,d: 拆除屏幕

    screen -r ID: 还原回某屏幕

    exit: 退出

     

     

     

     

     

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

    make clean

    make mrproper

     

     

     

     

    grub-->kernel-->initrd-->ROOTFS(/sbin/init,/bin/bash)

     

     

    mkinitrd initrd文件路径  内核版本号

     

    mkinitrd /boot/initrd-`uname -r`.img `uname -r`

     

     

     

    FILE=/usr/local/src 从左往右找到第一个/去掉之前的内容

    ${FILE#*/}: usr/local/src从左往右找到第一个/去掉之前的内容

    ${FILE##*/}: src从左往右找到最后一个/去掉之前的内容

     

    ${FILE%/*}: /usr/local从右往左找到第一个/去掉之后的内容

    ${FILE%%/*}:从右往左找到最后/去掉之后的内容

     

     

    ${parameter%word*}

    ${parameter%%word*}

                  The word is expanded to produce apattern just as in pathname expansion. If the pattern matches a  trailing  portion of  the

                  expanded  value of  parameter, then the result ofthe expansion is the expanded value of parameter with the shortest matching

                  pattern (the ?.€.?.€.case) or the longestmatching pattern (the ?.€.%?.€.case) deleted.  Ifparameter  is  @ or  *,  the pattern

                  removal  operation is applied to each positional parameter in turn, and the expansion isthe resultant list.  If parameter is

                  an array variable subscriptedwith @ or *, the pattern removal operation is applied to each member of thearray in  turn,  and

                  the expansion is the resultantlist.

     

     

    复制二进制程序及其依赖的库文件的脚本:

    #!/bin/bash

    #

    DEST=/mnt/sysroot

    libcp() {

     LIBPATH=${1%/*}

      [ !-d $DEST$LIBPATH ] && mkdir -p $DEST$LIBPATH

      [ !-e $DEST${1} ] && cp $1 $DEST$LIBPATH && echo "copy lib $1finished."

    }

     

    bincp() {

     CMDPATH=${1%/*}

      [ !-d $DEST$CMDPATH ] && mkdir -p $DEST$CMDPATH

      [ !-e $DEST${1} ] && cp $1 $DEST$CMDPATH

     

      forLIB in  `ldd $1 | grep -o"/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`; do

       libcp $LIB

     done

    }

     

    read -p "Your command: " CMD

    until [ $CMD == 'q' ]; do

       ! which $CMD &> /dev/null &&echo "Wrong command" && read -p "Input again:" CMD&& continue

     COMMAND=` which $CMD | grep -v "^alias" | grep -o"[^[:space:]]\{1,\}"`

     bincp $COMMAND

     echo "copy $COMMAND finished."

     read -p "Continue: " CMD

    done

     

     

    /etc/rc.d/rc.sysdone脚本,可用于实现为微型的Linux系统关机

    #!/bin/bash

    #

    sync

    sleep 2

    sync

     

    mount | awk '{print $3}' | grep -v -E"\/(dev|proc|sys)?$" | sort -r | while read LINE; do

     umount -n -f $LINE

      [$? -eq 0 ] && echo "Unmount $LINE finished." || echo"Can not unmount $LINE."

    done

     

    mount | awk '{print $3}' | while read LINE;do

     mount -n -o remount,ro $LINE

      [$? -eq 0 ] && echo "Remount $LINE finished." || echo"Can not remount $LINE."

    done

     

    exec /sbin/halt -p

     

     

     

     

    T_RED="\\033[1;31m"    # bold+red

    T_GREEN="\\033[1;32m"  # bold+green

    T_YELLOW="\\033[1;33m" #bold+yellow

    T_BLUE="\\033[1;34m"   # bold+blue

    T_CYAN="\\033[1;36m"   # cyan

    T_BOLD="\\033[1;37m"   # bold+white

    T_NORM="\\033[0;39m"   # normal

    转载请注明原文地址: https://ju.6miu.com/read-41025.html

    最新回复(0)