zoukankan      html  css  js  c++  java
  • 马哥Linux SysAdmin学习笔记(三)

    CentOS 5和6的启动流程:
    Linux:kernel+rootfs
    kernel:进程管理,内存管理,网络管理,驱动程序,文件系统,安全功能
    rootfs:
    glibc
    库:函数集合,function,调用接口
    过程调用:procedure
    函数调用:function
    程序
    内核设计流派:
    单内核设计:Linux
    把所有功能集成于同一个程序
    微内核设计:Windows,Solaris
    每种功能使用一个单独子系统实现
    Linux内核特点:
    支持模块化:.ko
    支持模块的动态装载和卸载:
    组成部分:
    核心文件:/boot/vmlinuz-VERSION-release
    ramdisk:
    CentOS 5 :/boot/initrd-VERSION-release.img
    CentOS 6 :/boot/initramfs-VERSION-release.img
    模块文件:/lib/modules/VERSION-release
    CentOS 系统启动流程:
    POST:加电自检
    ROM:CMOS
    BIOS:Basic Input and Output System
    ROM+RAM
    BOOT Sequence:
    按次序查找各引导设备,第一个有引导程序的设备即为本次启动用到设备
    BootLoader:引导加载器,程序
    Windows:ntloader
    Linux:
    LILO:LInux LOader
    GRUB:GRand Uniform Bootloader
    GRUB 0.x:GRUB Legacy
    GRUB 1.x:GRUB2
    功能:提供一个菜单,允许用户选择要启动的系统或不同的内核版本;把用户选定的内核装载到内存的特定空间中,解压展开,并把系统控制权移交给内核
    MBR:
    446:bootloader
    64:fat
    2:55AA
    GRUB:
    bootloader:1st stage
    disk:2nd stage
    kernel:
    自身初始化
    探测可识别到的所有硬件设备
    加载硬件驱动程序(有可能会借助于ramdisk加载驱动)
    以只读方式挂载根文件系统
    运行用户空间的第一个应用程序/sbin/init
    init程序的类型:
    SysV:init,CentOS 5
    配置文件:/etc/inittab
    Upstart:init,CentOS 6
    配置文件:/etc/inittab,/etc/init/*.conf
    Systemd:systemd,CentOS 7
    配置文件:/usr/lib/systemd/system,/etc/systemd/system
    ramdisk:
    内核的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问
    ramdisk --> ramfs
    CentOS 5:initrd,工具程序:mkinitrd
    CentOS 6:initramfs,工具程序:mkinitrd,dracut
    系统初始化:
    POST --> BootSequence(BIOS) --> Bootloader(MBR) --> kernel(ramdisk) -->rootfs(只读) --> init
    /sbin/init
    CentOS 5:
    运行级别:为了系统的运行或维护等应用目的而设定
    0-6:7个级别
    0:关机
    1.单用户模式(root,无需登录),single,维护模式
    2.多用户模式,会启动网络功能,但不会启动NFS:维护模式
    3.多用户模式,正常模式:文本界面
    4.预留级别:可同3级别
    5.多用户模式,正常模式:图形界面
    6.重启系统
    默认级别:
    3,5
    切换级别:
    init #
    查看级别:
    runlevel
    who -r
    配置文件:/etc/inittab
    每一行定义一种action以及与之对应的process
    id:runlevel:action:process
    action:
    wait:切换至此级别运行一次
    respawn:此process终止,就重新启动之
    initdefault:设定默认运行级别:process省略
    sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit
    id:3:initdefault:
    si::sysinit:/etc/rc.d/rc.sysinit
    l0:0:wait:/etc/rc.d/rc 0
    l1:1:wait:/etc/rc.d/rc 1
    ...
    l6:6:wait:/etc/rc.d/rc 6
    说明:rc 0 --> 意味着读取/etc/rc.d/rc0.d/
    K*:K##*:##运行次序,数字越小,越先运行;数字越小的服务,通常为依赖到别的服务
    S*:S##*:##运行次序,数字越小,越先运行;数字越小的服务,通常为被依赖到的服务
    for srv in /etc/rc.d/rc0.d/K*;do
    $srv stop
    done
    for srv in /etc/rc.d/rc0.d/S*;do
    $srv start
    done
    chkconfig命令:
    查看服务在所有级别的启动或关闭设定情形:
    chkconfig [--list] [name]
    添加:
    SysV的服务脚本放置于/etc/rc.d/init.d (/etc/init.d)
    chkconfig --add name
    #!/bin/bash
    #
    #chkconfig: LLLL nn nn
    删除:
    chkconfig --del name
    修改其指定的链接类型:
    chkconfig [--level levels] [--type type] name <on|off|reset>
    --level LLLL:指定要设置的级别;省略时表示2345
    注意:正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向了/etc/rc.d/rc.local脚本,因此,不变或不需写为服务脚本放置于/etc/rc.d/init.d目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中
    /etc/rc.d/rc.sysinit:系统初始化脚本
    1.设置主机名
    2.设置欢迎信息
    3.激活udev和selinux
    4.挂在/etc/fstab文件中定义的文件系统
    5.检测根文件系统,并以读写方式重新挂载根文件系统
    6.设置系统时钟
    7.激活swap设备
    8.根据/etc/stsctl.conf文件设置内核参数
    9.激活lvm及software raid设备
    10.加载额外设备的驱动程序
    11.清理操作
    总结:/sbin/init --> (/etc/inittab) --> 设置默认运行级别 --> 运行系统初始脚本,完成系统初始化 --> 关闭对应需要关闭的服务,启动需要启动服务 --> 设置登录终端
    CentOS 6:
    init程序为:upstart,其配置文件
    /etc/inittab,/etc/init/*.conf
    注意:/etc/init/*.conf文件语法,遵循upstart配置文件语法格式
    博客作业:系统启动流程
    启动系统时,设置其运行级别为1
    GRUB(Boot Loader):
    grub:GRand Unified Bootloader
    grub 0.x:grub legacy
    grub 1.x:grub 2
    grub legacy:
    stage1:mbr
    stage1_5:mbr之后的扇区,让stage1中的BootLoader能识别stage2所在的分区上的文件系统
    stage2:磁盘分区(/boot/grub)
    配置文件:/boot/grub/grub.conf <-- /etc/grub.conf
    stage2及内核等通常放置于一个基本磁盘分区:
    功用:
    1.提供菜单,并提供交互式接口
    e:编辑模式,用于编辑菜单
    c:命令模式,交互式接口
    2.加载用户选择的内核或操作系统
    允许传递参数给内核
    可隐藏此菜单
    3.为菜单提供保护机制
    为编辑菜单进程认证
    为启用内核或操作系统进行认证
    如何识别设备:
    (hd#,#)
    hd#:磁盘编号,用数字表示,从0开始编号
    #:分区编号,用数字表示,从0开始编号
    (hd0,0)
    grub的命令行接口:
    help:获取帮助列表
    help KEYWORD:详细帮助信息
    find (hd#,#)/PATH/TO/SOMEWHERE
    root (hd#,#):设置根分区
    kernel /PATH/TO/KERNEL_FILE:设定本次启动时用到的内核文件,额外还可以添加许多内核支持使用的cmdline参数
    例如:init=/path/to/init,selinux=0
    initrd /PATH/TO/INITRAMFS_FILE:设定为选定的内核提供额外文件的ramdisk
    boot:引导启动选定的内核
    手动在grub命令行接口启动系统:
    grub> root (hd#,#)
    grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
    grub> initrd /initramfs-VERSION-RELEASE.img
    grub> boot
    配置文件:/boot/grub/grub.conf
    配置项:
    default=#:设定默认启动的菜单项,菜单项(title)编号从0开始
    timeout=#:指定菜单项等待选项选择的时长
    splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜单背景图片文件路径
    hiddenmenu:隐藏菜单
    password [--md5] STRING:菜单编辑认证
    title TITLE:定义菜单项标题,可出现多次
    root (hd#,#):grub查找stage2及kernel文件所在设备分区,为grub的根
    kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核
    initrd /PATH/TO/INITRAMFS_FILE:内核匹配的ramfs文件
    password [--md5] STRING:启动选定的内核或操作系统时进行认证
    grub-md5-crypt:生成加密的密码
    进入单用户模式:
    1.编辑grub菜单(选定要编辑的title,而后使用e命令)
    2.在选定的kernel后附加
    1,s,S或single都可以
    3.在kernel所在行,键入b命令
    安装grub:
    1.grub-install
    grub-install --root-directory=ROOT /dev/DISK
    2.grub
    grub> root(hd#,#)
    grub> setup(hd#)
    练习:
    1.新加硬盘,提供直接单独运行bash系统
    2.破坏本机grub stage1,而后在救援模式下修复
    3.为grub设置保护功能
    Linux kernel:
    单内核体系设计,但充分借鉴了微内核设计体系的优点,为内核引入模块化机制
    内核组成部分:
    kernel:内核核心,一般为bzImage,通常在/boot目录下,名称为vmlinuz-VERSION-RELEASE
    kernel object:内核对象,一般放置于/lib/modules/VERSION-RELEASE/
    [ ]:N
    [M]:M
    [*]:Y
    辅助文件:ramdisk
    initrd
    initramfs
    运行中的内核:
    uname命令:
    uname - print system information
    uname [OPTION]...
    -n:显示节点名称
    -r:显示VERSION-RELEASE
    模块:
    lsmod命令:
    显示由核心已经装载的内核模块
    显示的内容来自:/proc/modules
    modinfo命令:
    显示模块的详细描述信息
    modinfo [ -k kernel ]  [ modulename|filename... ]
    -n:只显示模块文件路径
    -p:显示模块参数
    -a:author
    -d:description
    -l:license
    modprobe命令:
    装载或卸载内核模块
    modprobe [ -C config-file ] [ modulename ] [ module parameters... ]
    配置文件:/etc/modprobe.conf ,/etc/modprobe/*.conf
    modprobe [ -r ] modulename...
    depmod命令:
    内核模块依赖关系文件及系统信息映射文件的生成工具
    装载或卸载内核模块:
    insmod
    insmod [ filename ]  [ module options... ]
    rmmod
    rmmod [ modulename ]
    /proc目录:
    内核把内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出
    参数:
    只读:输出信息
    可写:可接受用户指定"新值"来实现对内核某功能或特性的配置
    /proc/sys
    1.sysctl命令用于查看或设定此目录中诸多参数
    sysctl -w path.to.parameter=VALUE
    2.echo命令通过重定向的方式也可以修改大多数参数的值
    echo "VALUE" > /path/to/parameter
    sysctl命令:
    配置文件:/etc/sysctl.conf
    1.设置某参数
    sysctl -w parameter=VALUE
    2.通过读取配置文件设置参数
    sysctl -p [/path/to/conf_file]
    内核中的路由转发:
    /proc/sys/net/ipv4/ip_forward
    常用的几个参数:
    net.ipv4.ip_forward
    vm.drop_caches
    kernel.hostname
    /sys目录:
    sysfs:输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息;有些参数是可以调优的,用于调整硬件工作特性
    udev通过此路径下输出的信息动态为各设备创建所需要设备文件;udev是运行用户空间程序;专用工具:udevadmin,hotplug
    udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d及/usr/lib/udev/rules.d目录下
    ramdisk文件的制作:
    1.mkinitrd命令
    为当前正在使用的内核重新制作ramdisk文件
    mkinitrd initramfs-$(uname -r).img $(uname -r)
    2.dracut命令
    为当前正在使用的内核重新制作ramdisk文件
    dracut /boot/initramfs-$(uname -r).img $(uname -r)
    编译内核:
    前提:
    1.准备好开发环境
    2.获取目标主机上硬件设备的相关信息
    3.获取到目标主机系统功能的相关信息,例如要启动的文件系统
    4.获取内核源代码包
    www.kernel.org
    准备开发环境:
    包组:
    Server Platform Development
    Development tools
    目标主机硬件设备相关信息:
    CPU:
    cat /proc/cpuinfo
    x86info -a
    lscpu
    PCI设备:
    lspci
    -v
    -vv
    lsusb
    -v
    -vv
    lsblk
    了解全部硬件设备信息
    hal-device
    简单依据模板文件的制作过程:
    tar xf linux-3.10.105.tar.xz -C /usr/src
    cd /usr/src
    ln -sv linux-3.10.105 linux
    cd linux
    cp /boot/config-$(uname -r) ./.config
    make menuconfig
    screen
    make -j #
    make modules_install
    make install
    init 6
    练习:编译好并启用 
    回顾:内核组成部分,内核编译
    内核组成部分:
    核心,模块
    核心:/boot/vmlinuz-VERSION-RELEASE
    模块:/lib/modules/VERSION-RELEASE
    模块管理的相关命令:
    lsmod,modinfo,modprobe [-r],insmod,rmmod,depmod
    内核编译:
    [ ]
    [*]
    [M]
    Linux内核编译(2):
    编译内核的步骤:
    1.配置内核选项
    1.make config:基于命令行以遍历的方式去配置内核中可配置的每个选项
    2.make menuconfig:基于curses的文本窗口界面
    3.make gconfig:基于GTK开发环境的窗口界面
    4.make xconfig:基于Qt开发环境的窗口界面
    支持全新配置模式进行配置:
    1.make defconfig:基于内核为目标平台提供的默认配置进行配置
    2.make allnoconfig:所有选项均回答为no
    2.编译
    make [-j #]
    如何只编译内核中的一部分功能:
    1.只编译某子目录中的相关代码
    cd /usr/src/linux
    make dir/
    2.只编译一个特定的模块:
    cd /usr/src/linux
    make dir/file.ko
    例如:只为e1000编译驱动
    make drivers/net/ethernet/intel/e1000/e1000.ko
    如何交叉编译内核:
    编译的目标平台与当前平台不相同:
    make ARCH=arch_name
    要获取特定目标平台的使用帮助:
    make ARCH=arch_name help
    如何在已经执行过编译操作的内核源码树做重新编译:
    事先清理操作:
    make clean:清理大多数编译生成的文件,但会保留config文件等
    make mrproper:清理所有编译生成的文件,config及某些备份文件
    make distclean:mrproper,patches以及编辑器备份文件
    screen命令:
    打开新的screen
    screen
    退出并关闭screen:
    exit
    剥离当前screen:
    ctrl+a,d
    显示所有已经打开的screen:
    screen -ls
    恢复某screen
    screen -r [SESSION]
    CentOS系统安装:
    BootLoader --> kernel(initramfs) --> rootfs --> /sbin/init
    anaconda安装程序:
    tui:基于curses的文本窗口
    gui:图形窗口
    CentOS的安装程序启动过程:
    MBR:boot.cat
    stage2:isolinux/isolinux.bin
    配置文件:isolinux/isolinux.cfg
    每个对应的菜单选项:
    加载内核:isolinux/vmlinuz
    向内核传递参数:append initrd=initrd.img ...
    装载根文件系统,并启动anaconda
    默认启动GUI接口
    若是显式指定使用TUI接口:
    向内核传递"text"参数即可
    boot:linux text
    注意:上述内容一般应位于引导设备,而后续的anaconda及其安装用到的程序包等有几种方式可用:
    本地光盘
    本地硬盘
    ftp server:yum repository
    http server:yum repository
    nfs server
    如果想手动指定安装源:
    boot: linux method
    anaconda应用的工作过程:
    安装前配置阶段:
    安装过程使用的语言
    键盘类型
    安装目标存储设备:
    basic storage
    特种设备:iSCSI
    设定主机名
    配置网络接口
    设定分区方式及MBR的安装位置
    语言
    时区
    管理员密码
    创建普通用户
    选定要安装的程序包
    安装阶段:
    在目标磁盘创建分区,执行格式化操作等
    将选定的程序包安装至目标位置
    安装BootLoader
    首次启动:
    iptables
    selinux
    core dump
    anaconda的配置方式:
    1.交互式配置方式
    2.通过读取事先给定的配置文件自动完成配置
    按特定语法给出的配置选项:
    kickstart文件:
    安装引导选项:
    boot:
    text:文本安装方式
    method:手动指定使用的安装方法
    与网络相关的引导选项:
    ip=IPADDR
    netmask=MASK
    gateway=GW
    dns=DNS_SERVER_IP
    ifname=NAME:MAC_ADDR
    与远程访问功能相关的引导选项:
    vnc
    vncpassword='PASSWORD'
    指明kickstart文件的位置:
    ks=
    DVD drive: ks=cdrom:/PATH/TP/KICKSTART_FILE
    Hard dirve: ks=hd:/device/drectory/KICKSTART_FILE
    HTTP server: ks=http://host:port/path/to/KICKSTART_FILE
    FTP server: ks=ftp://host:port/path/to/KICKSTART_FILE
    HTTPS server: ks=https://host:port/path/to/KICKSTART_FILE
    启动紧急救援模式:
    rescue
    官方文档: Installation Guide
    kickstart文件的格式:
    命令段:指明各种安装前配置,如键盘类型等
    程序包段:指明要安装的程序包组或程序包,不安装的程序包等
    %packages
    @grou_name
    package
    -package
    %end
    脚本段:
    %pre:安装前脚本
    运行环境:运行于安装介质上的微型Linux环境
    %post:安装后脚本
    运行环境:安装完成的系统
    命令段中的命令:
    必给命令:
    auth:认证方式
    BootLoader:BootLoader的安装位置及相关配置
    keyboard:设定键盘类型
    lang:语言类型
    part:创建分区
    rootpw:指明管理员的密码
    timezone:时区
    可选命令:
    install OR upgrade
    text:文本安装界面
    network
    firewall
    selinux
    halt
    poweroff
    reboot
    repo
    user:安装完成后为系统创建新用户
    url:指明安装源
    创建kickstart文件的方式:
    1.直接手动编辑
    依据模板修改
    2.可使用创建工具:system-config-kickstart (CentOS 6)
    检查ks文件的语法错误:ksvalidator
    ksvalidator /PATH/TO/KICKSTART_FILE
    创建引导光盘:
    mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "CentOS 6.5 x86_64 boot" -b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/boot.iso myiso/
    回顾:CentOS系统安装
    kickstart文件:
    命令段
    必备:authconfig,bootloader...
    可选:firewall,selinux...
    程序包段
    %packages
    @group_name
    package
    -package
    %end
    脚本段
    %pre
    ...
    %end
    %post
    ...
    %end
    创建工具:system-config-kickstart
    语法检查:ksvalidator
    安装过程如何获取kickstart文件:
    DVD:cdrom:/PATH/TO/KS_FILE
    HTTP:http://
    SELinux:
    SELinux:secure enhanced linux,工作于Linux内核中
    DAC:自主访问控制
    MAC:强制访问控制
    SELinux有两种工作级别:
    strict:每个进程都受到selinux的控制
    targeted:仅有限个进程受到selinux控制
    只监控容易被入侵的进程
    sandbox:
    subject operation object
    subject:进程
    object:进程,文件
    文件:open,read,write,close,chown,chmod
    subject:domain
    object:type
    SELinux为每个文件提供了安全标签,也为进程提供了安全标签
    user:role:type
    user:SELinux的user
    role:角色
    type:类型
    SELinux规则库:
    规则:哪种域能访问哪种或者哪些种类型内文件
    配置SELinux:
    SELinux是否启用:
    给文件重新打标:
    设定某些布尔特性:
    SELinux的状态:
    enforcing:强制,每个受限的进程都必然受限
    permissive:启用,每个受限的进程违规操作不会被禁止,但会被记录于审计日志
    disabled:关闭
    相关命令:
    getenforce:获取selinux当前状态
    setenforce 0|1
    0:设置为permissive
    1:设置为enforcing
    此设定:重启系统后无效
    配置文件:/etc/sysconfig/selinux,/etc/selinux/config
    SELinux={disable|enforcing|permissive}
    给文件重新打标:
    chcon
    chcon [OPTION]... CONTEXT FILE...
    chcon [OPTION]... [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE...
    chcon [OPTION]... --reference=RFILE FILE...
    -R:递归打标
    还原文件的默认标签:
    restorecon [-R] /path/to/somewhere
    布尔型规则:
    getsebool
    setsebool
    getsebool命令:
    getsebool [-a]  [boolean]
    setsebool命令:
    setsebool [-P] boolean value | bool1=val1 bool2=val2 ...
    bash脚本编程:
    编程语言:
    数据结构
    顺序执行
    选择执行
    条件测试
    运行命令或[[ EXPRESSION ]]
    执行状态返回值
    if
    case
    循环执行
    将某代码段重复运行多次
    重复运行多少次?
    循环次数事先已知
    循环次数事先未知
    必须有进入条件和退出条件 
    for,while,until
    函数:结构化编程及代码重用  
    function
    for循环语法:
    for NAME in LIST;do
    循环体
    done
    列表生成方式:
    1.整数列表
    {start..end}
    $(seq start [[step]end])
    2.glob
    /etc/rc.d/rc3.d/K*
    3.命令
    通过ping命令探测172.16.250.1-254范围内的所有主机的在线状态
    #!/bin/bash
    net='192.168.1'
    uphosts=0
    downhosts=0
    for i in {1..200};do
    ping -c 1 -w 1 ${net}.${i} &> /dev/null
    if [ $? -eq 0 ];then
    echo "${net}.${i} is up."
    let uphosts++
    else
    echo "${net}.${i} is down."
    let downhosts++
    fi
    done
    echo "up hosts:$uphosts"
    echo "down hosts:$downhosts"
    while循环:
    while CONDITION;do
    循环体
    done
    CONDITION:循环控制条件,进入循环之前,先做一次判断,每一次循环之后会再次做判断
    条件为true,则执行一次循环;直到条件测试状态为false终止循环
    因此:CONDITION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正
    示例:求100以内正整数之和
    #!/bin/bash
    declare -i i=0
    declare -i sum=0
    while [ $i -le 100 ];do
    let sum+=$i
    let i++
    done
    echo $sum
  • 相关阅读:
    NVelocity实现违反了LSP法则,使我的一个低级错误排查了一个下午。
    ADO.NET EF 4中 query.Where().Where()和动态组合lambda实现组合查询的不同。
    发现blend4的一个导致崩溃的BUG!!!
    代码回滚:git reset、git checkout和git revert区别和联系
    精确获取函数运行时间,精确到微秒
    在github分支上上传空文件夹
    VS2010 LINK1123:failure during conversion to COFF:file invalid or corrupt
    同步github上fork出来的分支
    未能找到任何适合于指定的区域性或非特定区域性的资源。请确保在编译时已将“XXXXX.resources”正确嵌入或链接到程序集“XX”,或者确保所有需要的附属程序集都可加载并已进行了完全签名。
    决定以后把写博客转的主要平台转到cnblogs了
  • 原文地址:https://www.cnblogs.com/redheat/p/7145652.html
Copyright © 2011-2022 走看看