zoukankan      html  css  js  c++  java
  • Linux硬件与服务

    Linux硬件与服务

    Linux


     

     

    1 Linux磁盘管理与磁盘结构

    运算器 存储器(内部存储器 RAM 易失性存储器) I/O输入输出

    外部存储器:U盘 光盘 软盘 硬盘 磁带等 
    I/O 磁盘:机械式硬盘 
    接口:IDE SATA iSCSI接口

     

    磁盘的组成结构

    盘片 Platers(存储数据的设备),轴 Spindle,利用轴组成同心圆;马达(数据记录时候提供高速旋转的动力),磁头(读写头,伸缩臂)

     

    盘片的逻辑结构

    默认硬盘有四个盘片,最靠近中心的为0盘片,一个盘片有两面,双读取,上为0,下为1,依次排布,一般一个磁盘有四个盘片;多盘片并行存取存储到不同盘片的相同编号的磁道上引用

    磁道:盘片以轴为中心组成的同心圆; 
    扇区:磁道被分为多个扇区; 
    柱面:不同盘片上相同编号的磁道组成一个柱面

    磁盘延时(寻址时间):磁头从一个位置到一个位置需要时间;盘片高速旋转定位也需要时间;硬盘以转速速度越快,寻址时间越短,运行速度越快;磁头是悬浮在盘片之上,距离只有几微米。笔记本5400转/min,台式机7200/min

     

    分区格式化

    MBR:主引导记录,位于0磁道0柱面1扇区,512字节,三部分组成,分别是 446字节的boot loader(启动加载器,存放引导代码),64字节磁盘分区表,2字节magic number(检查MBR是否有效)

    ROM:开机自检,自检ROM中的BIOS;检查硬盘,将boot loader 复制加载到内存中,同时把磁盘分区表,读取分区表和分区上的操作系统。 
    磁盘分区表指向不同的地方,称为扩展分区,只能由一个;原来的四个分区叫主分区;

    主分区+扩展分区 <= 4 
    扩展分区extended:只能有一个,16字节,扩展分区是一个指针,指向磁盘另外的位置,不能直接存储数据 
    逻辑分区logical :逻辑分区组成extended

     

    实例说明:

    默认使用 MBR 分区方式的情况下,在第二颗 SATA 磁盘中,分区“六个有用”的分区 (具有 filesystem 的) ,此外,已知有两个 primary 的分区类型!请问六个分区的文件名?/dev/sdb1(primary) /dev/sdb2(primary) /dev/sdb3(extended) /dev/sdb5(logical 下面皆为 logical) /dev/sdb6 /dev/sdb7 /dev/sdb8 请注意,5-8 这四个 logical 容量相加的总和为 /dev/sdb3! 
    -- P(primary)+E(extended)最多叧能有四个 
    -- E 最多叧能有一个 
    -- 1~4 号是保留给主要/延伸分割槽的, 所有在上面的实例当中 没有sdb4

     

    2 磁盘管理之Block、iNode、 super、super block

     

    block

    磁盘上存放的数据块

     

    block bitmap

    段落引用

    在元数据区域,标记数据块是否被使用

    文件系统:软件(XFS NTFS FAT EXT3 
    EXT4等),存储数据或文件的一种格式,文件系统不存在分区上,位于磁盘的某一个位置;文件系统把分区分割为两部分,一部分存放元数据(metadata),另一部分存放数据

     

    metadata:

    元数据(和数据本身内容没有关系,包括的是数据属性,比如数据归属,数据权限,数据的时间戳)

     

    inode:index node(索引节点)

    存放数据的属性,不包括文件名,数据对应的数据块(block),同一个inode可以指向多个文件

     

    super block:

    超级块,管理元数据区域内其他的区域的

     
     
    1. ln [-s -v]:语法: ln [ -s -v ] src_file des_file
    2. -s:创建软链接
    3. -v:显示详细过程

    硬链接:只能对文件进行硬链接,并且在同一个文件系统,指向一个inode节点 ,文件内容与inode有关 多个文件名对应到同一个inode号码 关联记录,硬链接的修改会影响实际文件内容 但其删除并不影响inode和数据块,硬链接的增加也不会增加inode数目

    软链接:使用绝对路径,指向一个路径,文件大小是字符串的个数,跨文件系统建立,可以为文件或目录建立 
    文件让数据指向其链接的文件名。若源文件删除,链接也无法打开。它是建立独立的文件 会占用inode与区块 
    - 符号链接

     
    1. [root@localhost ~]# ll /etc/ -i
    2. ...
    3. 8388720 lrwxrwxrwx. 1 root root 14 Jul 28 08:36 system-release -> centos-release
     

    3 磁盘管理之fdisk,gdisk分区

    设备文件: /dev/ 
    b:块设备 
    c:字符设备

    主设备号(MAJOR):标识某一类设备 
    次设备号(MINOR):标识一类设备下不同设备

    mknod:创建设备:mknod [OPTION]... NAME TYPE [MAJOR MINOR] 
    -m:设置权限

    磁盘类型按接口划分:如 
    IDE ATA:hd 主板:2种 IDE接口 
    SATA:sd ;SCSI:sd ;USB:sd

     

    Linux磁盘表示方式

    Linux以字母标识磁盘的个数 a:第一块 b:第二块 
    Linux用数字标识分区:1-4标识主分区或扩展分区 逻辑分区从5开始 
    例如:sda、sda1、sda2

    低级格式化:划分磁道 
    高级格式化:为分区装载文件系统 
    文件系统:内核功能(FAT32 NTFS EXT2 EXT3 EXT4 XFS等) 
    EXT2 EXT3 EXT4:低容量 
    XFS:高容量 TB级

     

    查看系统磁盘分区情况

     
    1. [root@localhost ~]# cat /proc/partitions
    2. [root@localhost ~]# ls /dev/sda*
     

    du:data usage

    显示特定目录下的使用情况

     
    1. du -h 查看特定目录的空间使用情况
     

    df:disk free

    df命令用于显示磁盘分区上的可使用的磁盘空间

     
    1. df -h
     

    lsblk 列出分区状态

     

    blkid

     

    磁盘分区 gdisk fdisk parted

    fdisk:针对MBR分区类型的工具 
    gdisk:针对GPT分区类型的工具

     

    fdisk:交互式工具

     
    1. fdisk:交互式工具
    2. d:删除一个分区
    3. l:显示linux支持的分区类型
    4. m:显示帮助信息
    5. n:创建一个新分区
    6. p:创建主分区
    7. e:创建扩展分区
    8. p:显示当前分区列表
    9. q:不保存退出
    10. w:保存更改并退出
    11. t:更改分区的系统ID
     

    gdisk

    该命令要是在GPT分区下使用的,需要在安装centOS的时候强制进行GPT分区,并安装gdisk 命令,其选项用法与fdisk基本相同

     

    parted

    使用 parted 命令可以查看系统采用什么类型的分区表 gpt/mbr/msdos/ext/ext/ext2/ext3/ext4

     
    1. parted -l
     

    磁盘格式化 mkfs: Make File System

    创建/格式化文件系统,借助中间层vfs,虚拟文件系统 
    -t:指定文件系统 
    mkfs -t ext3 dev_name

     
    1. mkfs -t xfs /dev/sdb1
    2. mkfs.xfs /dev/sdb1
     

    磁盘ID

    5:扩展分区 
    82:交换分区 
    83:linux系统分区 
    8e:LVM(逻辑卷管理)

     

    多磁盘应用 Mount 挂载

    mount src(挂载源) des(要挂载点) 
    如挂载sdb1

     
    1. /sdb1 mount /dev/sdb1 /sdb1
    2. mkfs /sdb1 #先在根下创建该sdb1,再进行挂载
    3. blkid #查看设备的id号
    4. /etc/fstab #在该文件内添加以下内容: /实现开机自动挂载:
    5. UUID=8567c02b-fac2-46d3-984e-b9fd8c9a2072 /sdb1 xfs defaults 0 0 #UUID=id号 挂载点 文件系统 默认选项 是否开机检查 是否备份
    6. mkswap #创建交换分区

    umount 卸载磁盘 
    df -h 可以查看是否挂载/卸载 
    fstab :filesystem table

     
    1. /etc/fstab 写入错误 只读状态 系统无法自动挂载正常启动 可使用mount的手动重新挂载根目录
    2. mount -n -o remount, rw /

    实际文件系统的挂载是记录到 /etc/mtab 和/pro/mounts

     

    镜像设备的挂载 loop挂载

     

    4 Linux安装磁盘必须安装的两个分区

     

    / 根分区

    根分区下还有一个/boot 引导分区 :用于存放引导文件和Linux内核 
    大小应 <100M 
    / 根分区 :文件系统的根目录 硬盘无论有多少个分区 所有文件都会在根目录下

     

    swap交换分区

    作为虚拟内存使用 swap分区=物理内存的1.5-2倍

     

    5 Linux文件系统

     
    1. ls -l /lib/modules/$(uname -r)/kernel/fs
    2. 查看系统可以支持的系统格式
    3. cat /proc/filesystems
    4. 查看系统正在使用的文件系统格式
     

    ext2 索引式文件系统 与之相对的无索引的 FAT

    文件系统将文件权限、属性与文件内容分开存储

     

    超级区块

    记录整个文件系统的整体信息:inode与数据区块的总量 使用量 剩余量等 
    文件系统挂载时间 最近一次写入数据的时间、最近一次磁盘检验的时间 
    有效位数值(0/1):磁盘是否挂载

     

    inode

    记录文件属性 、权限;一个文件 仅有一个inode 
    atime、mtime SetUID、pointer

     

    数据区块

    实际数据存储于此,但文件太大的时候回占用多个区块

     

    ext2文件系统的限制

    • 原则上 区块大小与数量在格式化之后不能够再修改
    • 每一个区块最多只能放置一个文件的数据 如果文件太大 则占多个区块
    • 如果文件小于区块则该区块其余空间不能够再使用(浪费磁盘空间)
     

    inode的特点

    • inode固定大小 128B,新的ext4/xfs可设置成256B
    • 每个文件仅使用一个inode
    • 文件系统能建立的文件数量与inode的数量有关
     

    dumpe2fs

     
    1. dumpe2fs 查询ext系列超级区块信息的命令
     

    blkid: 查看各个磁盘的uuid、label name、文件系统格式

     

    日志式文件系统

    防止元数据的内容与实际生产数据不一致的问题,快速修复文件系统

     

    6 Linux关机的正确方式

    shutdown -h 时间(默认单位为min)

     
    1. shutdown -h now
    2. shutdown -h +10
    3. shutdown -h 7:30
    4. shutdown -c (强制取消关机命令)

    常用 
    poweroff 关闭系统同时关闭电源 
    halt 关闭系统 不关电源 
    reboot

     

    软件包

     

    任务计划

     

    一次性周期任务

    =======

     

    at

    at:设置系统在某一个时间点执行的任务,执行结果以邮件的方式发送给任务发起者 
    # systemctl start atd 启用at任务计划服务 
    # systemctl enable atd 设置at服务开机自启动 
    # systemctl status atd 查看at服务状态 
    Linux中设置at任务后,会在/var/spool/at/目录生成at任务计划的文件,按照文件名的排序顺序执行 
    应用示例:

     
    1. [root@localhost ~]# at 11:15
    2. at> ls
    3. at> <EOT> # ctrl+d 退出结束
    4. job 5 at Sun Aug 12 11:15:00 2018
    5. [root@localhost ~]# cd /var/spool/at/
    6. [root@localhost at]# ls
    7. a00005018620a3 spool
    8. [root@localhost at]# cat a00005018620a3
     
    1. [root@localhost at]# mail
    2. Heirloom Mail version 12.5 7/5/10. Type ? for help.
    3. "/var/spool/mail/root": 2 messages 2 new
    4. >N 1 llp002@localhost.loc Wed Mar 7 14:40 16/700 "*** SECURITY information for"
    5. N 2 root Sun Aug 12 11:15 23/601 "Output from your job "
    6. & 2
    7. Message 2:
    8. From root@localhost.localdomain Sun Aug 12 11:15:02 2018
    9. Return-Path: <root@localhost.localdomain>
    10. X-Original-To: root
    11. Delivered-To: root@localhost.localdomain
    12. Subject: Output from your job 5
    13. To: root@localhost.localdomain
    14. Date: Sun, 12 Aug 2018 11:15:02 +0800 (CST)
    15. From: root@localhost.localdomain (root)
    16. Status: R
    17. anaconda-ks.cfg
    18. Desktop
    19. Documents
    20. Downloads
    21. initial-setup-ks.cfg
    22. Music
    23. Pictures
    24. Public
    25. Templates
    26. Videos

    /etc/at.allow和/etc/at.deny: 
    /etc/at.allow:at任务计划的白名单-用户名,仅允许此文件中的用户执行at 
    /etc/at.deny:at任务计划的黑名单-用户名,仅拒绝次文件中的用户执行at 
    设置完成后,重启at 服务 systemctl restart at

    语法: 
    # at data_time 
    at>at_command1 
    at>at_command2 
    at>ctrl+d 保存退出 
    data_time:时间日期写法 
    绝对时间: 
    HH:MM:具体时间点 
    DD.MM.YY:天.月.年 
    YY-MM-DD:年-月-日 
    MM/DD/YY:月/日/年 
    HH:MM YY-MM-DD: 
    相对时间:at now+3minutes:从任务计划创建开始计时,3分钟以后执行

    at命令:设置at任务计划 
    -l:查看系统中at任务列表,相当于atq 
    -r:删除系统中的at任务列表,相当于atrm 
    -d:删除系统中的at任务列表,相当于atrm 
    -c:列出后续at任务的具体指令内容

     

    batch

    用法和at相同,不过batch任务计划是在CPU空闲时执行,当CPU的平均负载小于0.8时执行batch设定任务 
    uptime:查看CPU的平均负载

     

    周期性任务计划

    =======

     
    1. 周期性任务计划:
    2. 系统周期性任务:
    3. 日志轮换:logrotate
    4. 登录文件分析:logwatch任务
    5. 创建locate数据库:updatedb
    6. 创建man帮助信息数据库:CentOS6:makewathis CentOS7:mandb
    7. RPM软件登录文件的创建
    8. 与网络相关的分析行为:
    9. 用户周期性任务:
    10. cron:设置周期任务计划
    11. anacron:当cron周期性任务由于某种原因没有执行,anacron重新执行cron任务
     

    cron

    控制crond服务: 
    # systemctl start crond 
    # systemctl enable crond 
    # systemctl status crond

    /etc/cron.allow和/etc/cron.deny 
    /etc/cron.allow:白名单 
    /etc/cron.deny:黑名单,默认情况下系统只保留/etc/cron.deny

    cron相关的配置文件: 
    /etc/crontab:cron配置文件 
    /etc/cron.d/:cron辅助配置文件 
    /var/spool/cron:用户cron任务计划的配置文件,Linux用户设置完cron任务后,会在/var/spool/cron目录下生成以用户名名称的cron文件

    crontab:设置/查看/删除等cron任务计划,执行结果以邮件方式发送给任务发起者 
    -e:编辑cron任务内容 
    -u:为指定用户设置cron任务计划(只有root用户能够使用) 
    -l:查看cron任务列表 
    -r:删除所有的cron列表

    设置cron任务语法: 
    系统设置: 
    分 时 日 月 周 用户 命令 
    用户设置: 
    分 时 日 月 周 命令

    时间取值范围: 
    分钟:0-59 
    小时:0-23 
    日期:1-31 
    月份:1-12或jan,feb,mar,apr ... 
    周:0-7或sun,mon,tue,wed,thu,fri,sat,其中0和7都代表周日 
    时间的特殊写法: 
    通配:*代表任意时间 10 17 * * * cat /etc/fstab 
    离散时间段:,(逗号) 5,15,30,45,56 17 * * * cat /etc/fstab 
    连续时间段:-(中横线) 00 23 * * 1-5 cat /etc/fstab 
    间隔时间段:*/n */5 * * * * cat /etc/fstab 00 10 */5 * * cat /etc/fstab

    /etc/crontab文件解析: 
    SHELL=/bin/bash:cron任务计划执行使用的shell程序 
    PATH=/sbin:/bin:/usr/sbin:/usr/bin:cron任务计划命令搜索地址 
    MAILTO=root:cron任务计划执行结果发送给哪个用户 
    /etc/cron.d:辅助配置文件目录

    cron.hourly:cron工具去执行 
    cron.daily,cron.weekly cron.monthly是有anacron工具去执行

    cron设置任务计划时注意事项: 
    CPU和内存资源集中使用时的问题: 
    # vim /etc/crontab 
    1,6,11,16,21,26,31,36,41,46,51,56 * * * * root COMMAND1 
    取消一些不必要的输出:设置命令时可以重定向输出 
    时间的检验:设置时间时,周与日月不可并存 
    安全的检验:借有/var/log/cron的内容查看cron任务计划中是否有非法任务 
    环境变量:系统命令查找和cron任务命令位置由$PATH变量决定,设置cron任务时,使用命令的绝对路径

     

    anacron

    当cron周期性任务由于某种原因没有执行,anacron重新执行cron任务

    anacron语法: 
    anacron [options] [job] 
    -s:依据时间记录文件去判断是否执行 
    -f:强制执行 
    -n:立刻运行未执行的任务,不需要延时

    anacron执行流程: 
    1:由/etc/anacrontab分析到cron.daily天数为1天 
    2:由/var/spool/anacron/cron.daily取出最近一次执行anacron时间戳 
    3:由2步骤分析出的时间戳和cron任务进行比较,查看哪些cron任务超过1天时间没有执行 
    4:准备执行指令,根据/etc/anacrontab的设置,将延时执行 
    5:延时时间过后,执行指令

     

    文件查找命令find

    which:查找命令字所在的位置 
    locate:模糊匹配(只要包含关键字的文件都查找出来) 
    不是实时的,基于数据库查找, updatedb升级locate数据库 
    查找速度特别快

    find:查看文件或目录的工具 
    实时查找 
    精确查找 
    遍历整个指定目录中的文件,速度很慢 
    支持多种查找条件(属主,属组,权限,文件名等) 
    语法: find [find_path] [条件] [处理动作] 
    find_path:如果不写,默认在当前工作目录查找 
    条件:如果不写,会查找出该路径下所有的文件 
    处理动作:默认打印到屏幕上 print

    条件:(匹配标准)
       -name file_name:根据文件名进行查找,区分大小写
       -iname file_name:根据文件名进行查找,不区分大小写
       -regex PATTERN:根据正则表达式的模式进行查找
       -user:通过属主进行查找
       -group:通过属组进程查找
       -uid UID:通过UID号进行查找
       -gid GID:通过GID号进行查找
       -nouser:查找没有属主的文件
       -nogroup:查找没有属组的文件
       -type:根据文件类型进行查找
         -b:块设备
         -c:字符设备
         -d:目录
         -f:文件
         -p:命名管道
         -s:套接字文件
         -l:链接文件
       -size [+ | -] k m g
         -size 5k:精确匹配
         +:大于
         -:小于
       根据时间戳进行查找: # stat file_name  //查看文件的时间戳
         -atime:时间单位为天,access时间
         -mtime:时间单位为天,modify时间
         -ctime:时间单位为天,change时间
         -mmin:时间单位为分钟,modify时间
         -amin:时间单位为分钟,access时间
         -cmin:时间单位为分钟,change时间
       根据权限查找:
         -perm MODE:
               MODE:644,精确匹配
               /MODE:任意一位匹配
               -MODE:文件权限能够完全包含此MODE时才能匹配
    
       条件组合: 
         -a:同时满足多个条件,比如查找属主是tom并且权限为644的文件
         -o:满足一个条件即可,比如查找属主是tom或者权限为包含644的文件
         -not:不满足条件的被查找出来
    
       出来动作:
         -print:默认动作,默认查找结果打印到屏幕
         -ls:默认以类似于ls -l的形式显示结果的信息
         -ok COMMAND {} ;执行动作时提示用户是否执行,必须以;结尾,{}代表文件名占位符
         -exec COMMAND {} ;执行动作时不提示用户直接执行,必须以;结尾,{}代表文件名占位符
    
    
    查找条件通配符:
       *:通配任意个数的任意字符   # find /etc/ -name "pass*"  # find /etc/ -name "*pass"
       ?:通配单个的任意字符       # find /etc/ -name "passw*"
    
     

    CentOS6系统启动详解

     

    简介

     
    1. 进程管理:kernel+process
    2. CPU分环:ring0:内核空间 ring1-2:库文件等 ring3:用户空间
    3. CPU读取的数据都来自内存
    4. 内存:内核空间和用户空间,RAM:易失性存储器
    5. ROM:只读存储器,存储硬件信息等
    6. 系统启动流程:CentOS6CentOS7
    7. PC:Linux
    8. 启动过程:
    9. POST(加电自检:PowerOnSelfTest)--BIOS(基本输入输出系统:Basic Input Output System:硬件信息;Boot sequence:启动顺序)--MBR(主引导记录;446字节bootloader)--启动菜单(Linux启动菜单:GRUB)--kernel--initramfs(虚拟根文件系统)--/sbin/init
    10. kernel作用:驱动和测检系统外围硬件或程序
    11. 文件系统
    12. 安全管理
    13. 网络管理
    14. 进程管理
    15. 驱动程序
    16. 内核设计:
    17. 单内核:把所有的功能都集成到内核中去
    18. Linux使用单内核,模块化设计 /lib /lib64
    19. /lib/modules/'内核版本号为名称的目录'/kernel
    20. arch:平台架构相关
    21. crypto:安全加密
    22. drivers:驱动程序
    23. fs:文件系统
    24. kernel:内核
    25. lib:内核库 .ko(kernel object)
    26. mm:memory mangement内存管理
    27. net:系统中的TCP/IP协议栈
    28. sound:声卡
    29. modules.dep:解决系统中依赖关系
    30. 微内核:把每个功能都做成小模块 Windows solaris

    Linux运行级别:0-6 
    0:halt关机 
    1:单用户模式(root, 无须登录), single, 维护模式; 
    2: 多用户模式,会启动网络功能,但不会启动NFS;维护模式; 
    3:多用户模式,正常模式;文本界面; CLI:command line interface 
    4:预留级别; 
    5:多用户模式,正常模式;图形界面; GUI:graphical user interface 
    6:重启

    initramfs:CentOS6,虚拟根文件系统,把/proc /sys /dev目录复制到根文件系统 
    initrd:CentOS5

    虚拟根系统,可以切换根目录只要有bin/bash 和对应的lib模块 和所应用的相关模块则可相互切换 
    chroot 文件地址:改变根目录 
    ldd:查看二进制文件所依赖的库文件,查看所需要的lib模块

     

    GRUB

    启动流程详解: 
    BootLoader:MBR(位于磁盘中0磁道0柱面1扇区,512字节),后安装的系统的BootLoader覆盖先安装的BootLoader,安装双系统时,先安装Linux,在安装Windows 
    windows:不允许其他系统引导,也不引导其他系统 
    linux: 
    LILO:有众多的限制 
    GRUB:默认的BootLoader 
    GRUB引导系统时几个阶段:(配置文件/boot/grub/grub.conf) 
    grub.conf的文件内容解析

     
    1. default=0 //默认引导系统
    2. timeout=5 //GRUB引导系统超时时间
    3. splashimage=(hd0,0)/grub/splash.xpm.gz //引导系统时图片
    4. hiddenmenu //隐藏菜单
    5. title CentOS 6 (2.6.32-642.el6.x86_64) //系统title及在GRUB中显示的名称
    6. root (hd0,0) //根所在的位置
    7. kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=ef361140-6306-423c-90f0-63a93c664f96 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
    8. initrd /initramfs-2.6.32-642.el6.x86_64.img

    grub配置文件/boot/grub/grub/conf详细解释: 
    GRUB要求设备名被括在一个括号中。fd表示软盘,hd 表示硬盘(不区分IDE还是SCSI)。其次设备是从0开始编号。分区也是如此,分区和设备之间用一个逗号分开。 
    default 启动系统时在人为不干预的情况下,默认读取哪一个title,如果安装了多个不同版本内核或者安装了不用的操作系统,会产生多个title,0表示第一个,1第二个,以此类推。 
    timeout 开机等待用户的超时时间,单位为秒。在超时时间结束时,如果用户没有人为选择,则以default指定的title读取。 
    hiddenmenu:用于启动时隐藏菜单,除非在timeout之前按下任意键才能看到菜单。 
    title:定义引导项名称。 
    root:指定boot分区所在磁盘及分区,如:root (hd0,6)。 
    kernel:指定kernel文件所在绝对目录地址,如:kernel /vmlinuz-2.6.32-220.el6.x86_64 ,这里的/表示root(hd0,0)分区 
    initrd:指定ramdisk盘所在绝对目录地址,如:initrd /initramfs-2.6.32-220.el6.x86_64.img

    GRUB分阶段启动: 
    stage1:第一个阶段,位于BootLoader,为了引导第二阶段 
    stage1_5:识别文件系统 
    stage2:加载启动设置等等,读取配置文件/boot/grub/grub.conf

    GRUB修复:光盘启动,进入救援模式: 
    # chroot /mnt/sysimage 
    # grub-install --root-directory=/ /dev/sda 
    # grub 
    grub> root (hd0,0) 
    grub> setup (hd0) 
    grub> quit 
    # 准备GRUB配置文件 
    # exit 
    # reboot

    为GRUB启动菜单添加密码: 
    # grub-crypt --sha-512 //生成加密密码 
    # vim /boot/grub/grub.conf,在hiddenmenu添加一行 
    password --encryped 生成的密文 
    为系统添加启动密码: 
    # grub-crypt --sha-512 //生成加密密码 
    # vim /boot/grub/grub.conf,在title中添加一行 
    password --encryped 生成的密文

     

    Kernel、upstart init

    Kernel 
    Linux内核与内核模块: 
    内核:/boot/vmlinuz-version 
    initramfs:/boot/initramfs-kernel_version 
    内核模块:/lib/modules/kernel_version/kernel 
    内核源码:/usr/src/kernels/kernel_version 
    内核版本:/proc/version 
    系统内核功能:/proc/sys/kernel

    Linux关于内核的命令: 
    # lsmod:查看系统中加载的内核模块 
    结果解释: 
    module:模块的名称 
    size:模块的大小 
    userd by:此模块是否被其他模式使用(依赖关系)

     

    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 
    systemV中的 init、upstart init,二者差异不大,centOS中的init称为systemd

    init upstart 系统中的第一个进程 
    系统中第一个进程,PID是1,配置文件/etc/inittab 
    Sys V:init CentOS5:把所有的功能都集成到一个文件中/etc/inittab,启动速度非常慢 
    Upstart:CentOS6:采用事件驱动(event driven),把功能并行执行

    Upstart 概念和术语 
    Upstart 的基本概念和设计清晰明确。UpStart 主要的概念是 job 和 event。Job 就是一个工作单元,用来完成一件工作,比如启动一个后台服务,或者运行一个配置命令。每个 Job 都等待一个或多个事件,一旦事件发生,upstart 就触发该 job 完成相应的工作。 
    Job: 
    Job 就是一个工作的单元,一个任务或者一个服务。可以理解为 sysvinit 中的一个服务脚本。有三种类型的工作: 
    task job:代表在一定时间内会执行完毕的任务,比如删除一个文件 
    service job:代表后台服务进程,比如 apache httpd。这里进程一般不会退出,一旦开始运行就成为一个后台精灵进程,由 init 进程管理,如果这类进程退出,由 init 进程重新启动,它们只能由 init 进程发送信号停止。它们的停止一般也是由于所依赖的停止事件而触发的,不过 upstart 也提供命令行工具,让管理人员手动停止某个服务; 
    Abstract job:仅由 upstart 内部使用,仅对理解 upstart 内部机理有所帮助。我们不用关心它。 
    除了以上的分类之外,还有另一种工作(Job)分类方法。Upstart 不仅可以用来为整个系统的初始化服务,也可以为每个用户会话(session)的初始化服务。系统的初始化任务就叫做 system job,比如挂载文件系统的任务就是一个 system job;用户会话的初始化服务就叫做 session job。

    Job 生命周期:Upstart 为每个工作都维护一个生命周期。一般来说,工作有开始,运行和结束这几种状态。为了更精细地描述工作的变化,Upstart 还引入了一些其它的状态。比如开始就有开始之前(pre-start),即将开始(starting)和已经开始了(started)种不同的状态,这样可以更加精确地描述工作的当前状态。 
    工作从某种初始状态开始,逐渐变化,或许要经历其它几种不同的状态,最终进入另外一种状态,形成一个状态机。在这个过程中,当工作的状态即将发生变化的时候,init 进程会发出相应的事件(event)。

    Upstart 中 Job 的可能状态 
    Waiting:初始状态 
    Starting:Job 即将开始 
    pre-start:执行 pre-start 段,即任务开始前应该完成的工作 
    Spawned:准备执行 script 或者 exec 段 
    post-start:执行 post-start 动作 
    Running:interim state set after post-start section processed denoting job is running (But it may have no associated PID!) 
    pre-stop:执行 pre-stop 段 
    Stopping:interim state set after pre-stop section processed 
    Killed:任务即将被停止 
    post-stop:执行 post-stop 段

    事件 Event 
    顾名思义,Event 就是一个事件。事件在 upstart 中以通知消息的形式具体存在。一旦某个事件发生了,Upstart 就向整个系统发送一个消息。没有任何手段阻止事件消息被 upstart 的其它部分知晓,也就是说,事件一旦发生,整个 upstart 系统中所有工作和其它的事件都会得到通知。

    Event 可以分为三类: signal,methods 或者 hooks。 
    Signal 事件是非阻塞的,异步的。发送一个信号之后控制权立即返回。 
    Methods 事件是阻塞的,同步的。 
    Hooks 事件是阻塞的,同步的。它介于 Signals 和 Methods 之间,调用发出 Hooks 事件的进程必须等待事件完成才可以得到控制权,但不检查事件是否成功。 
    事件是个非常抽象的概念,下面我罗列出一些常见的事件,希望可以帮助您进一步了解事件的含义: 
    系统上电启动,init 进程会发送"start"事件 
    根文件系统可写时,相应 job 会发送文件系统就绪的事件 
    一个块设备被发现并初始化完成,发送相应的事件 
    某个文件系统被挂载,发送相应的事件 
    类似 atd 和 cron,可以在某个时间点,或者周期的时间点发送事件 
    另外一个 job 开始或结束时,发送相应的事件 
    一个磁盘文件被修改时,可以发出相应的事件 
    一个网络设备被发现时,可以发出相应的事件 
    缺省路由被添加或删除时,可以发出相应的事件

    CentOS6上面Upstart大致的一个启动过程: 
    1.内核启动init,读取配置文件/etc/inittab,在CentOS6只定义了运行级别 
    2.系统初始化:(/etc/init/rcS.conf exec /etc/rc.d/rc.sysinit) 
    3.init找到/etc/inittab文件,确定默认的运行级别(X) (/etc/init/rcS.conf exec telinit )触发相应的事件RUNLEVEL) 
    5.开始运行/etc/rc.d/rc,传入参数X 
    6./etc/rc.d/rc脚本进行一系列设置,最后运行相应的/etc/rcX.d/中的脚本 
    7./etc/rcX.d/中的脚本按事先设定的优先级依次启动 
    8.最后执行/etc/rc.d/rc.local 
    9.加载终端或X-Window接口

    /etc/rc.d/rc.sysinit 这个文件做了哪些工作: 
    1、获得网络环境 
    2、挂载设备 
    3、开机启动画面Plymouth(取替了过往的 RHGB) 
    4、判断是否启用SELinux 
    5、显示于开机过程中的欢迎画面 
    6、初始化硬件 
    7、用户自定义模块的加载 
    8、配置内核的参数 
    9、设置主机名 
    10、同步存储器 
    11、设备映射器及相关的初始化 
    12、初始化软件磁盘阵列(RAID) 
    13、初始化 LVM 的文件系统功能 
    14、检验磁盘文件系统(fsck) 
    15、磁盘配额(quota) 
    16、重新以可读写模式挂载系统磁盘 
    17、更新quota(非必要) 
    18、启动系统虚拟随机数生成器 
    19、配置机器(非必要) 
    20、清除开机过程当中的临时文件 
    21、创建ICE目录 
    22、启动交换分区(swap) 
    23、将开机信息写入/var/log/dmesg文件中

    /etc/init/rc.conf:sysv运行级别 
    /etc/rc.d/存放每个运行级别所需要的服务,比如/etc/rc.d/rc3.d/目录定义的运行级别3所需要的服务 
    命名: K+数字+服务名 
    S+数字+服务器 
    K:kill结束服务 
    S:start开启服务 
    数字:代表启动结束的优先级,数字越小优先级越高 
    /etc/rc.d/rc.local:系统启动加载的最后一个脚本(用户的脚本)

    sysv init:chkconfig:定义系统服务在每个级别的运行状态 
    chkconfig --list:查看系统中所有服务的状态 
    chkconfig --level 2345 httpd on 
    chkconfig --level 2345 httpd off

    服务分类: 
    独立服务:应用程序自己控制 
    超级服务:依赖于xinetd进程来管理

    控制服务: 
    service service_name start|stop|restart|reload|status 
    常见命令解释: 
    start:启动服务 
    stop:停止服务 
    restart:重新启动 
    reload:重新加载服务 
    status:查看服务状态

    upstart 常见命令 
    initctl start|stop|restart|reload|status service_name

     

    systemd

    systemd特性 
    1.平行处理所有服务,加速开机流程:旧的init启动脚本是一项一项任务依序启动的模式,因此不相依的服务也是得要一个一个的等待.systemd可以让所有的服务同时启动,因此系统启动的速度变快了 
    2.一经要求就回应的on-demand启动方式:systemd全部就是仅有一只systemd服务搭配systemctl指令来处理,无须其他额外的指令来支援.不像systemV还要init,chkconfig,service...等等指令.此外,systemd由于常驻存储器,因此任何要求(on-demand)都可以立即处理后续的daemon启动的任务. 
    3.服务依赖性的自我检查:由于systemd可以自订服务相依性的检查,因此如果B服务是架构在A服务上面启动的,那当你在没有启动A服务的情况下仅手动启动B服务时,systemd会自动帮你启动A服务! 
    4.按照daemon功能分类:systemd管理的服务非常多,首先systemd先定义所有的服务为一个服务单位(unit),并将该unit归类到不同的服务类型(type)去.systemd将服务单位(unit)区分为service,socket,target,path,snapshot,timer等多种不同的类型(type),方便管理员的分类与记忆. 
    5.将多个daemons集合成为一个群组:如同systemV的init里头有个runlevel的特色,systemd亦将许多的功能集合成为一个所谓的target项目,这个项目主要在设计操作环境的建置,所以是集合了许多的daemons,也就是执行某个target就是执行好多个daemon的意思! 
    6.向下兼容旧有的init服务脚本:基本上,systemd是可以兼容于init的启动脚本的,因此,旧的init启动脚本也能够通过systemd来管理,只是更进阶的systemd功能就没有办法支援就是了. 
    7.systemd有些地方无法完全取代init!包括:在runlevel的对应上,大概仅有runlevel1,3,5有对应到systemd的某些target类型而已,没有全部对应; 
    8.全部的systemd都用systemctl这个管理程序管理,而systemctl支援的语法有限制,不像/etc/init.d/daemon就是纯脚本可以自订参数,systemctl不可自订参数.;

    CentOS7启动流程: 
    lsinitrd /boot/initramfs-3.10.0-514.el7.x86_64.img //查看虚根文件系统 
    在内核载入完毕、进行完硬件侦测与驱动程序载入后,内核会启动第一个进程systemd, systemd 最主要的功能就是准备软件执行的环境,包括系统的主机名称、网络设定、语言设置、文件系统及其他服务的启动。 而所有的动作都会通过 systemd 的预设启动服务集合/etc/systemd/system/default.target设定。 另外, systemd 已经舍弃沿用多年的 system V 的 runlevel! 
    常见的操作环境 target 与兼容于 runlevel 的等级可以作为预设的操作环境 (default.target) 的主要项目有: multi-user.target 以及 graphical.target 这两个。当然还有rescue.target, emergency.target, shutdown.target 等等,以及 initrd.target!但是过去的 systemV 使用的是一个称为 runlevel (执行等级) 的概念来启动系统的,systemd 为了兼容于旧式的 systemV 操作行为, 所以也将 runlevel 与操作环境做个结合!你可以使用底下的方式来查询两者间的对应关系

     
    1. # ll -d /usr/lib/systemd/system/runlevel*.target
    2. # yum -y install bash-completion //补齐参数或选项
    3. # systemctl list-dependencies graphical.target //查看启动依赖关系
    4. # systemctl list-dependencies mutli-user.target //查看字符界面启动依赖关系

    sysinit.target完成的功能: 
    1.特殊文件系统装置的挂载:包括 dev-hugepages.mount dev-mqueue.mount 等挂载服务,主要在挂载跟巨量存储器分页使用与讯息队列的功能。 挂载成功后,会在 /dev 底下建立 /dev/hugepages/, /dev/mqueue/ 等目录; 
    2.特殊文件系统的启用:包括磁碟阵列、网络磁碟 (iscsi)、LVM 档案系统、档案系统对照服务 (multipath) 等等,也会在这里被侦测与使用到! 
    3.开机过程的讯息传递与动画执行:使用 plymouthd 服务搭配 plymouth 指令来传递动画与讯息 
    4.日志式登录档的使用:就是 systemd-journald 这个服务的启用啊! 
    5.载入额外的核心模块:透过 /etc/modules-load.d/.conf 档案的设定,让核心额外载入管理员所需要的核心模块! 
    6.载入额外的核心参数设定:包括 /etc/sysctl.conf 以及 /etc/sysctl.d/
    .conf 内部设定! 
    7.启动系统的随机数产生器:随机数产生器可以帮助系统进行一些密码加密演算的功能 
    8.设定终端机 (console) 字形 
    9.启动动态装置管理员:就是udev

    basic.target完整的功能: 
    1.载入 alsa 音效驱动程序; 
    2.载入 firewalld 防火墙:CentOS 7.x 以后使用 firewalld 取代 iptables 的防火墙设定,虽然最终都是使用 iptables 的架构, 不过在设定上面差很多。 
    3.载入 CPU 的微指令功能; 
    4.启动与设定 SELinux 的安全上下文 
    5.将目前的开机过程所产生的开机信息写入到 /var/log/dmesg 当中 
    6.由 /etc/sysconfig/modules/*.modules 及 /etc/rc.modules 载入管理员指定的模块! 
    7.载入 systemd 的 timer 功能;

    systemd 启动 multi-user.target 下的服务:

     
    1. 启动服务设定的脚本目录:
    2. /usr/lib/systemd/system (系统预设的服务启动脚本设定)
    3. /etc/systemd/system (管理员自己开发与设定的脚本设定)
    4. 而使用者针对主机的本机服务与服务器网络服务的各项 unit 若要 enable 的话,就是将它放到 /etc/systemd/system/multi-user.target.wants/ 这个目录底下做个链接,这样就可以在开机的时候去启动他。

    与sys V兼容的rc.local操作:

     
      1. chmod +x /etc/rc.d/rc.local
      2. systemctl start rc-local
      3. systemctl enable rc-local
  • 相关阅读:
    2017-2018-1 20155232 《信息安全系系统设计基础》实验四
    2017-2018-1 20155232 《信息安全技术》课上测试未提交补充博客
    2017-2018-1 20155232 《信息安全系统设计基础》第十周课堂测试(ch06)补交
    《linux内核分析》第六周:分析fork函数对应的系统调用处理过程
    《Linux内核分析》第五周:分析system_call中断处理过程
    《Linux内核分析与设计》读书笔记二
    《Linux内核分析与设计实现》读书笔记一
    《Linux内核分析》第四周:扒开系统调用的三层皮
    《Linux内核分析》第三周:Linux系统启动过程
    《Linux内核分析》第二周:操作系统是如何工作的
  • 原文地址:https://www.cnblogs.com/xuanbjut/p/12011247.html
Copyright © 2011-2022 走看看