• Linux第八讲随笔 -tar / 系统启动流程


    linux 第八讲
    1.tar 参考
    作用:压缩和解压文件。tar本身不具有压缩功能。他是调用压缩功能实现的。
    语法:tar[必要参数][选择参数][文件]
    参数:必要参数有如下:
      -A 新增压缩文件到已存在的压缩 add
      -B 设置区块大小        block
      -c 建立新的压缩文件      create
      -d 记录文件的差别       difference
      -r 添加文件到已经压缩的文件
      -u 添加改变了和现有的文件到已经存在的压缩文件
      -x 从压缩的文件中提取文件 Extraction
      -t 显示压缩文件的内容 detail
      -z 支持gzip解压文件 gz (不支持zip)
      -j 支持bzip2解压文件 bz2
      -Z 支持compress解压文件
      -v 显示操作过程 view
      -l 文件系统边界设置
      -k 保留原有文件不覆盖
      -m 保留文件不被覆盖
      -W 确认压缩文件的正确性
    可选参数如下:
      -b 设置区块数目
      -C 切换到指定目录
      -f 指定压缩文件 file
      --help 显示帮助信息
      --version 显示版本信息
    辨析:首先要弄清两个概念:打包和压缩。打包是指将一大堆文件或目录变成一个总的文件;压缩则是将一个大的文件通过一些压缩算法变成一个小文件。 为什么要区分这两个概念   呢?这源于Linux中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包(tar命令),然后再用压缩程序进行压缩(gzip bzip2命令)。
    例子:
    .tar
    解包:tar xvf FileName.tar
    打包:tar cvf FileName.tar DirName
    (注:tar是打包,不是压缩!)

    .gz
    解压1:gunzip FileName.gz
    解压2:gzip -d FileName.gz
    压缩:gzip FileName

    .tar.gz 和 .tgz
    解压:tar zxvf FileName.tar.gz
    压缩:tar zcvf FileName.tar.gz DirName

    .bz2
    解压1:bzip2 -d FileName.bz2
    解压2:bunzip2 FileName.bz2
    压缩: bzip2 -z FileName

    .tar.bz2
    解压:tar jxvf FileName.tar.bz2
    压缩:tar jcvf FileName.tar.bz2 DirName

    .bz
    解压1:bzip2 -d FileName.bz
    解压2:bunzip2 FileName.bz
    压缩:未知

    .tar.bz
    解压:tar jxvf FileName.tar.bz
    压缩:未知

    .Z
    解压:uncompress FileName.Z
    压缩:compress FileName

    .tar.Z
    解压:tar Zxvf FileName.tar.Z
    压缩:tar Zcvf FileName.tar.Z DirName

    .zip -r 压缩目录
    解压:unzip FileName.zip
    压缩:zip FileName.zip DirName

    .rar
    解压:rar x FileName.rar
    压缩:rar a FileName.rar DirName

    使用实例
    tar -cvf log.tar log2012.log 仅打包,不压缩!
    tar -zcvf log.tar.gz log2012.log 打包后,以 gzip 压缩
    tar -zcvf log.tar.bz2 log2012.log 打包后,以 bzip2 压缩
    在参数 f 之后的文件档名是自己取的,我们习惯上都用 .tar 来作为辨识。 如果加 z 参数,则以 .tar.gz 或 .tgz 来代表 gzip 压缩过的 tar包; 如果加 j 参数,则以 .tar.bz2 来作为tar包名。


    2.系统启动流程
    开机->引导->载入内核并执行->运行init进程->执行/etc/rc.d下面对应的Init级别的启动脚本->启动/etc/rc.local脚本->载入控制台->登录

    1.BIOS 加电自检 (Basic Input Output System)(ROM BIOS)
      1.检测硬件连接(显卡,内存,磁盘等)是否正常
      2.寻找启动磁盘:启动级别(硬盘、光盘、软驱)
      3.第一个启动扇区-MBR主引导记录(Main Boot Record): (1)引导程序446 (2)分区表16*4 (3)校验码 2,以55.aa结尾
      查看MBR: dd if=/dev/sda of=/mbr bs=1 count=512 从硬盘中读取512字节数据
      hexdump -C /mbr: 查看mbr数据,cat 查看会乱码
    2.启动内核(kernel)
      1.boot loader:大于512字节,无法放入引导程序中,boot loader写入引导程序中来加载 。
      2.lilo/grub:grub进一步取代lilo。因为lilo存在着一个1024柱面的限制,并且更改了磁盘上的启动信息文件后需要重新启动系统才能同步446字节的内容,因为lilo的缺陷,已经被    grub所取代.现在的绝大多数类linux系统都采用grub做boot loader;
        cd /boot/grub/:查看grub 文件,stage1 ,stage2, stage1_5
        stage1:在系统启动时装载stage2
        stage1_5:连接stage1和stage2,格式区分引导
        stage2:GRUB的核心,所有的功能都是由它实现
    3.grub.conf:
      default:默认启动title系统
      timeout:默认显示系统提示时间
      splashimage:登陆时默认图片
      hiddenmenu:隐藏菜单
      title CentOS:启动菜单名字
      root (hd0,0): boot分区位置 hd0代表第一块硬盘,0代表第一个分区
      kernel /vmlinuz-2.6.32-220.el6.x86_64:内核文件名以及相对位置
      initrd /initramfs-2.6.32-220.el6.x86_64.img :系统静态驱动


    一.BIOS 加电自检 (Basic Input Output System)
    当你按电源开关开机时,电脑会首先去启动BIOS(基本输入输出系统),BIOS一般是集成在主板上的.
    BIOS 的工作
    1.检测连接硬件,比如显卡,内存,磁盘等等,检测的目的是以后把这些设备信息提供给操作系统
    2.寻找启动磁盘,每一种BIOS都会有开机启动菜单,可以在菜单里设置以哪个设备启动系统
    比如:光驱,硬盘,网络等等,这个菜单可以设置多个选项,依照设置次序在设备上寻找启动信息
    3.找到了启动硬盘,接着BIOS就会在磁盘上寻找第一个启动扇区,也就是主引导记录MBR(Master Boot Record)
    但是MBR中,存储操作系统的空间只有446字节;MBR总共是512字节(=stage1)(其中引导程序占446字节+分区表占64字节(每16个字节记录一个分区),标识符校验码占2个字节,以55.aa结尾)
    如果没有在MBR中找到操作系统的内核,那么BIOS就无法继续启动工作.
    而我们的内核往往会大于446个字节,存放在磁盘的其他位置上,既然446装不下内核,又为了能顺利的找到放在其他位置上的内核,人们想出了一个办法就在446字节里写了一个小程序,当BIOS试着启动操作系统时就会执行这个小程序,然后再由小程序来载入位于其他位置的内核.这个小程序就是启动载入器(boot loader)
    (dd if=)
    二.BOOT Loader 参考
    linux的boot loader(上文提到的小程序) 常见的有两种:lilo grub
    因为lilo存在着一个1024柱面的限制,并且更改了磁盘上的启动信息文件后需要重新启动系统才能同步446字节的内容,因为lilo的缺陷,已经被grub所取代.现在的绝大多数类linux系统都采用grub做boot loader;
    grub则没有了lilo各种限制,而且方便到能修改系统文件的启动内容就可以立刻与446内容同步.
    那么我们就看看grub的内容 它存在于 /boot/grub中
    GRUB有几个重要的文件,STAGE1、STAGE1.5、STAGE2
    STAGE1:它只有512字节,通常放在MBR中,它的作用很简单,就是在系统启动时用于装载STAGE2并将控制权交给它。
    STAGE2:GRUB的核心,所有的功能都是由它实现。
    STAGE1.5:介于STAGE1和STAGE2之间,是它们的桥梁,因为STAGE2较大,通常都是放在一个文件系统当中的,但是STAGE1并不能识别文件系统格式,所以才需要STAGE1.5来引导位于某个文件系统当中的STAGE2。根据文件系统格式的不同,STAGE1.5也需要相应的文件,如:e2fs_stage1_5,fat_stage1_5,分别用于识别ext和fat的文件系统格式。它存放于1-63的柱面之间.
    引导顺序如下:STAGE1->;STAGE1.5->;STAGE2,
    主要的配置文件时 grub.conf
    里面选项含义:
    title:一个操作系统引动的标头,可以使多个
    root :指明所需文件存在于哪个磁盘哪个分区上 (hd0,0)表示第一个硬盘,第一个分区
    kernel:内核文件的名字,并且会有一些加载内核时的参数
    initrd:包含一些附加的驱动程序
    _____________________
    #cat /boot/grub/grub.conf grub配置文件
    default=0 默认启动项,选择启动条目第一个为0号
    timeout=5 默认超时时间
    splashimage=(hd0,0)/grub/splash.xpm.gz 登陆时默认图片
    hiddenmenu 隐藏菜单

    title CentOS (2.6.32-220.el6.x86_64) 启动菜单名字
    root (hd0,0) hd0代表第一块硬盘,0代表第一个分区
    kernel /vmlinuz-2.6.32-220.el6.x86_64 内核文件名
    initrd /initramfs-2.6.32-220.el6.x86_64.img

    三.内核启动
    内核启动后会向bios查询电脑的所有硬件信息,然后自己接手下来管理这些设备,以便提供给linux使用
    内核会试着驱动这些设备,这些设备的驱动一部分包含在内核中,叫做静态驱动,一部分以模块的方式(动态)存放文件系统中,由于此时还未挂载任何文件系统,因此还不能使用文件系统中的模块,这里只能驱动在内核中存在的硬件驱动程序的对应设备.想驱动内核中未包含的硬件驱动就需要加载文件系统.

    四.启动INIT服务 参考
    顺利的挂载了根文件系统后,就会启动init服务,init内核启动的第一个用户级进程
    内核会按 /sbin/init /etc/init /bin/init 顺序寻找init程序,
    如果找不到则内核报错
    启动init的目的就是为了初始化系统环境,启动了init就证明了内核已经顺利启动,接下来就由init服务来建立linux使用环境
    init做了什么?它会读取 /etc/inittab 文件,根据这个文件的信息来进行初始化工作.
    会执行三个脚本 /etc/rc.d/rc.sysinit /etc/rc.d/rc[0-6]/* /etc/rc.d/rc.local(万能配置文件,系统启动完毕后,最后运行此文件内的命令)
    rc.sysinit 主要的功能用来建立系统的基本环境,比如:
    启动udev selinux子系统
    udev负责产生 /dev中的文件,selinux负责增强系统的安全性
    设定核心参数 sysctl -p 加载 /etc/sysctl.conf
    设定系统时间 将硬件时间设定为系统时间
    加载键盘和交换分区 swapon -a -e
    设置主机名,挂载文件系统,并将根重新挂载为可读写的.
    加载动态驱动模块
    USB设备与RAID & LVM

    rc 脚本设置启动级别 linux中有许多不同的启动级别,不同的启动级别会制定不同的服务
    根据指定rc的参数会对应执行 /etc/rc.d/rc[0-6].d/ 中的连接脚本文件 以S开头的则启动,K开头的不随机自启动
    rc.local 前两个脚本都是系统至关重要的脚本,如果我们想在启动过程中放置一些其他程序
    应该使用rc.local脚本中
    三个RC脚本执行完毕后,就会建立虚拟主控制台 执行 /bin/login 就提供了用户登陆界面了
    如果是图形 L5级别的话,会启动X window登录界面
    所有的启动就都已经完毕

    初始化/sbin/init
    #vime/etc/inittab 初始化配置文件

    # Default runlevel. The runlevels used by RHS are:
    # 0 - halt (Do NOT set initdefault to this) 关机
    # 1 - Single user mode 单用户模式
    # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) 多用户模式,无网络模式,也就是不能远程登录
    # 3 - Full multiuser mode 全部都用户模式
    # 4 - unused 保留参数
    # 5 - X11 图形界面模式
    # 6 - reboot (Do NOT set initdefault to this) 重起模式
    #
    id:3:initdefault: 定义默认启动级别
    #ls /etc/rc.d
    init.d rc0.d rc2.d rc4.d rc6.d rc.sysinit(启动初始化)
    rc rc1.d rc3.d rc5.d rc.local (rc0~6为运行级别脚本,启动或关闭的控制文件,S启动,K关闭,启动或关闭顺序S后面的数字越小、优先级越高)

    五.登陆,加载用户环境变量
    输入用户名和密码系统验证,然后会执行
    /etc/profile
    /etc/bashrc
    $HOME/.bash_profile
    $HOME/.bashrc
    查看当前启动级别
    # runlevel
    N 5
    N是上次的级别,5是当前级别 也就是说机器开机就是5级别
    切换级别
    init 3

  • 相关阅读:
    启动dr-elephant失败问题
    hive2.3 任务因一个map导致进程oom挂掉的排查
    hive客户端远程debug
    jdk命令行工具
    hadoop联邦集群 Hive 服务不重启udf函数生效
    livy server高并发下报错java.lang.RuntimeException: java.io.IOException: Unable to connect to provided ports 10000~10010
    使用apache livy导致的结果集不一致问题记录
    spark与hive引擎差异致结果集不一致
    mysql终止当前正在执行的sql语句
    Linux 修改文件目录权限
  • 原文地址:https://www.cnblogs.com/LinuxSuDa/p/4301709.html
Copyright © 2020-2023  润新知