1、简述linux操作系统启动流程


1.BIOS自检: 所有的操作系统的启动流程基本都是在通电的时候,会检查所有的硬件是否存在问题,如果没有问题计算机会先加载BIOS信息。bios中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。开机时将ROM中的指令映射到RAM的低地址空间,CPU读取到这些指令,硬件的健康状况进行检查,按照BIOS中设置的启动设备来启动。
其他:开机到BIOS提醒界面,不同的主板厂商存在不同的快捷键进入BIOS设置BOOT MENU,继而设置启动项:硬盘HD启动,光盘CD/DVD启动,还是U盘USB启动。


2.读取MBR:在bios环节启动过程中按照信息启动硬盘顺序,会依顺序读取硬盘。硬盘上第0磁道的第一个扇区成为MBR。也就是Master Boot Record,即主引导记录,它的大小是512字节,可里面却存放了预启动信息、分区表信息。系统找到BIOS所指定的硬盘的MBR后,就会将其复制到0×7c00地址所在的物理内存中。被复制到物理内存的内容就是Boot Loader,那就是lilo或者grub了(引导扇区是引导加载器真正的第一阶段。大多数 Linux 发行版本使用的引导加载器有三种:GRUB、GRUB2 和 LILO。GRUB2 是最新的,也是相对于其他老的同类程序使用最广泛的。


3.bootloader: Boot Loader 就是在操作系统内核运行之前运行的一段小程序。bootloader供一个菜单,允许用户选择要启动的系统或不同的内核版本; 把用户选定的内核装载到RAM中的特定空间中,解压、展开,而后把系统控制权移交给内核。


4.加载内核: 内核Kernel是Linux系统最主要的程序,Kernel的文件很小,只保留了最基本的模块,并以压缩的文件形式存储在硬盘中,当GRUB将Kernel读进内存,内存开始解压缩内核文件。首先读入 /boot 目录下的内核文件。
在Linux系统中,有些磁盘的驱动程序并没有编译在内核中,而是被打包成了模块存放在了/lib/modules目录下面,而当内核启动了之后就需要加载磁盘的驱动程序。可是/lib/modules还没有被挂载,这时就产生矛盾了!为了解决这个矛盾,就产生了虚拟文件系统的这个概念。
initrd这个文件是在安装系统时产生的,是一个临时的根文件系统(rootfs)。因为Kernel为了精简,只保留了最基本的模块,因此,Kernel上并没有各种硬件的驱动程序,也就无法识rootfs所在的设备,故产生了initrd这个文件,该文件装载了必要的驱动模块,当Kernel启动时,可以从initrd文件中装载驱动模块,直到挂载真正的rootfs,然后将initrd从内存中移除。载到内存中(为了担心影响到磁盘上的文件系统,此时根目录的挂载是以只读的方式来挂载的),虚拟出一个根文件系统出来,然后读取虚拟根文件系统中的磁盘驱动程序,然后再从新挂载真正的根目录。

Kernel会以只读方式挂载根文件系统,当根文件系统被挂载后,开始装载第一个进程(用户空间的进程),执行/sbin/init,之后就将控制权交接给了init程序。(/sbin/init的作用是初始化系统环境,是用户第一个运行的程序,其他所有程序都从它衍生,都是它的守护进程)


5.init:依据inittab文件设定运行级别:
许多程序需要开机启动。它们在Windows叫做"服务"(service),在Linux就叫做"守护进程"(daemon)。
init进程的一大任务,就是去运行这些开机启动的程序。但是,不同的场合需要启动不同的程序,比如用作服务器时,需要启动Apache,用作桌面就不需要。Linux允许为不同的场合,分配不同的开机启动程序,这就叫做"运行级别"(runlevel)。也就是说,启动时根据"运行级别",确定要运行哪些程序。
/sbin/init进程运行会读取/etc/inittab文件,并依据此文件来进行初始化工作。这就表明Linux需要运行在等级5上。Linux的运行等级设定如下:

Linux预置七种init运行级别(0-6):
0:关机模式    (相当于poweroff)
1:单用户模式
2:无网络支持的多用户模式
3:有网络支持的多用户模式(也就是文本模式,工作中最常用的模式)
4:保留,未使用
5:有网络支持的X-windows支持多用户模式(也就是桌面图形模式)
6: 重新引导系统,即重启    (相当于reboot)

其中配置文件/etc/inittab,它是运行级别的设置文件配置格式为

id:runlevels:action:process

id:一个任务的标识符,用于唯一标识每个登记项,不能重复
        runlevels:系统的运行级别,表示process的action要在哪个级别下运行,该段中可以定义多个运行级别,各级别之间直接写不用分隔符;如果为空,表示在所有的运行级别运行
        action:表示对应登记项的process在一定条件下所要执行的动作。
        process:任务;
 
    action:
        wait:等待切换至此任务所在的级别时执行一次;
        respawn:一旦此任务终止,就自动重新启动之;
        initdefault:设定默认运行级别;此时,process省略;
        sysinit:设定系统初始化方式,只有系统开机或重新启动的时候,这个process才会被执行一次,此处一般为指定/etc/rc.d/rc.sysinit脚本;‘’
       
       例子:
id:3:initdefault:
    表示我们默认的运行级别是3,也就是说我们默认开机启动会进入命令行模式。
 
initdefault的值是3,表明系统启动时的运行级别为3。如果需要指定其他级别,可以手动修改这个值。
	Linux系统在/etc目录下面,都有一个的子目录对应着相应的运行级别,指定要加载的程序
	 /etc/rc0.d
  /etc/rc1.d
  /etc/rc2.d
  /etc/rc3.d
  /etc/rc4.d
  /etc/rc5.d
  /etc/rc6.d
查看
[root@localhost 3.10.0-514.el7.x86_64]# ll /etc/rc3.d/
总用量 0
lrwxrwxrwx. 1 root root 20 1月   1 2002 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 17 1月   1 2002 S10network -> ../init.d/network

其中
 K*:要停止的服务;K##*,优先级,数字越小,越是优先关闭;依赖的服务先关闭,而后关闭被依赖的;
 S*:要启动的服务;S##*,优先级,数字越小,越是优先启动;被依赖的服务先启动,而依赖的服务后启动 
这个目录里的所有文件(除了README),就是启动时要加载的程序。如果想增加或删除某些程序,不建议手动修改 /etc/rcN.d 目录,最好是用一些专门命令进行管理

上面的七个 /etc/rcN.d  目录里列出的程序,指向另外一个目录/etc/init.d,真正的启动脚本都统一放在这个目录中。init进程逐一加载开机启动程序,其实就是运行这个目录里的启动脚本。如果你要手动关闭或重启某个进程,直接到目录 /etc/init.d 中寻找启动脚本即可。
比如,我要重启iptables服务器,就运行下面的命令:
[root@bastion-IDC ~]# /etc/init.d/iptables restart

/etc/init.d 这个目录名最后一个字母d,是directory的意思,表示这是一个目录,用来与程序 /etc/init 区分。

6.系统初始化脚本rc.sysinit以及运行/etc/inittab中脚本执行不同级别的脚本程序: 在init的配置文件中有这么一行:si::sysinit:/etc/rc.d/rc.sysinit,它调用执行了/etc/rc.d/rc.sysinit,而rc.sysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。
主要完成的工作有

1.设置主机名;
2.设置欢迎信息;
3.激活udev和selinux;
4.挂载/etc/fstab文件中定义的所有文件系统;
5.检测根文件系统,并以读写方式重新挂载根文件系统;
6.设置系统时钟;
7.根据/etc/sysctl.conf文件来设置内核参数;
8.激活lvm及软raid设备;
9.激活swap设备;
10.加载额外设备的驱动程序;
11.清理操作;

初始话后执行/etc/inittab中脚本


7.启动mingetty,进入系统登陆界面
当系统的初始化内容完成之后,系统就会调用mingetty函数,来设置终端机,并等待用户登陆!
一般来说,用户的登录方式有三种:命令行登录、ssh登录、图形界面登录。这三种情况,都有自己的方式对用户进行认证。

1)命令行登录:init进程调用getty程序(意为get teletype),让用户输入用户名和密码。输入完成后,再调用login程序,核对密码(Debian还会再多运行一个身份核对程序/etc/pam.d/login)。如果密码正确,就从文件 /etc/passwd 读取该用户指定的shell,然后启动这个shell。
2)ssh登录:这时系统调用sshd程序(Debian还会再运行/etc/pam.d/ssh ),取代getty和login,然后启动shell。
3)图形界面登录:init进程调用显示管理器,Gnome图形界面对应的显示管理器为gdm(GNOME Display Manager),然后用户输入用户名和密码。如果密码正确,就读取/etc/gdm3/Xsession,启动用户的会话。

根据用户设置登陆启动不同的shell,系统会启用不同的脚本。用户登录时打开的shell,就叫做login shell。
login shell

Linuix默认的shell是Bash,它会读入一系列的配置文件。上一步的三种情况,在这一步的处理,也存在差异。
1)命令行登录:首先读入 /etc/profile,这是对所有用户都有效的配置;然后依次寻找下面三个文件,这是针对当前用户的配置。
  ~/.bash_profile
  ~/.bash_login
  ~/.profile
需要注意的是,这三个文件只要有一个存在,就不再读入后面的文件了。比如,要是 ~/.bash_profile 存在,就不会再读入后面两个文件了。
2)ssh登录:与第一种情况完全相同。
3)图形界面登录:只加载 /etc/profile 和 ~/.profile。也就是说,~/.bash_profile 不管有没有,都不会运行。

用户进入操作系统以后,常常会在login shell中再开启一个shell。这个shell就叫做 non-login shell,意思是它不同于登录时出现的那个shell,不读取/etc/profile和.profile等配置文件。
no-login shell:

no-login shell会读入用户自己的bash配置文件 ~/.bashrc。大多数时候,我们对于bash的定制,都是写在这个文件里面的。
打开文件 ~/.profile
  if [ -n "$BASH_VERSION" ]; then
    if [ -f "$HOME/.bashrc" ]; then
      . "$HOME/.bashrc"
    fi
  fi
  
上面代码先判断变量 $BASH_VERSION 是否有值,然后判断主目录下是否存在 .bashrc 文件,如果存在就运行该文件。第三行开头的那个点,是source命令的简写形式,表示运行某个文件,写成"source ~/.bashrc"也是可以的。
因此,只要运行~/.profile文件,~/.bashrc文件就会连带运行。但是上一节的第一种情况提到过,如果存在~/.bash_profile文件,那么有可能不会运行~/.profile文件。解决这个问题很简单,把下面代码写入.bash_profile就行了。
  if [ -f ~/.profile ]; then
    . ~/.profile
  fi
 
这样一来,不管是哪种情况,.bashrc都会执行,用户的设置可以放心地都写入这个文件了。系统的通用设置放在 /etc/profile,用户个人的、需要被所有子进程继承的设置放在.profile,不需要被继承的设置放在.bashrc。

2、简述grub启动引导程序配置及命令行接口详解

grub 启动是在开机启动读取MBR后的一种bootloader,还有另一种时LiLo但是LiLo的缺陷–只能识别0-1023范围的柱面构成的分区中的内核文件,因此逐渐被grub代替,但目前的安卓手机都是使用LiLo程序引导的。
grub的版本分为

  1. grub 0.X (grub legacy)
  2. grub 1.X (grub 2)
    目前来讲目前centos 5和centos 6使用的就是 grub legacy 版本 。centos 7使用的是 grub2 版本的启动引导程序。

Grub详解
grub的三个阶段:

  1. stage1:MBR(0柱面 0磁道 1扇区)中
  2. stage1_5:MBR随后的扇区
  3. stage2:读取grub.conf配置文件,并实现引导功能的扩展

其中由于历史的原因,MBR只有512bytes的空间,给Bootloader的空间很小只有446bytes,因此Grub程序分为三段来进行:
“stage 1” bootloader,用于启动Boot loader 来加载stage2的内容至内存中,被装入磁盘的MBR中;
特殊的"stage 1_5"被装入MBR随后的扇区,它能够识别内核和"stage 2"所在分区的文件系统格式并帮助引导"stage 2";
stage 2"位于文件系统上;stage 2程序和配置文件grub.conf可以与内核文件处于不同的分区上(但必须位于同一磁盘),只要"stage 1.5"能够驱动它们各自所在的分区。


Grub的配置文件:
Centos7中的grub和contos6有点不一样。Centos7采用的是grub2,而不是grub。在Centos7中,把grub的主要配置文件放在以下三个地方。/boot/grub2/grub.cfg (/etc/grub2.cfg 是/boot/grub2/grub.cfg 文件的符号链接),/etc/grub.d/,/etc/default/grub。
这三个配置文件之间是通过/boot/grub2/grub.cfg执行脚本###BEGIN###这种格式按照顺序调用 /etc/grub.d 里面的脚本实现不同的功能。在 grub.d 目录里有很多数字开头的脚本,按从小到大的顺序执行。

/boot/grub2/grub.cfg代码片段:

### BEGIN /etc/grub.d/10_linux ###
menuentry 'CentOS Linux (3.10.0-514.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-514.el7.x86_64-advanced-5d8d47c9-f2b1-42c3-8b67-92343d532e0b' {
        load_video
        set gfxpayload=keep
        insmod gzio
        insmod part_msdos
        insmod xfs
        set root='hd0,msdos1'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1 --hint='hd0,msdos1'  485098b1-5a5b-4ed8-9cf9-310cc97cff36
        else
          search --no-floppy --fs-uuid --set=root 485098b1-5a5b-4ed8-9cf9-310cc97cff36
        fi
        linux16 /vmlinuz-3.10.0-514.el7.x86_64 root=/dev/mapper/cl-root ro crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet LANG=zh_CN.UTF-8
        initrd16 /initramfs-3.10.0-514.el7.x86_64.img
}
menuentry 'CentOS Linux (0-rescue-afa55111353c4c09817eef67ebb43bbc) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-afa55111353c4c09817eef67ebb43bbc-advanced-5d8d47c9-f2b1-42c3-8b67-92343d532e0b' {
        load_video
        insmod gzio
        insmod part_msdos
        insmod xfs
        set root='hd0,msdos1'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1 --hint='hd0,msdos1'  485098b1-5a5b-4ed8-9cf9-310cc97cff36
        else
          search --no-floppy --fs-uuid --set=root 485098b1-5a5b-4ed8-9cf9-310cc97cff36
        fi
        linux16 /vmlinuz-0-rescue-afa55111353c4c09817eef67ebb43bbc root=/dev/mapper/cl-root ro crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet
        initrd16 /initramfs-0-rescue-afa55111353c4c09817eef67ebb43bbc.img
}
### END /etc/grub.d/10_linux ###

如上面代码段可以看到在 /etc/grub2.cfg 文件里调用 /etc/grub.d/10_linux 配置不同内核,在这里有2个menuentry(菜单入口),所以我们开机的时候会看见两个默认选项,一个是普通模式,一个是救援模式。

/etc/default/grub文件

安卓镜像制作 uboot 安卓制作iso镜像工具_安卓镜像制作 uboot


/etc/default/grub参数:

  • LGRUB_DEFAULT=0 ->设置默认启动项,按menuentry顺序。比如要默认从第四个菜单项启动,数字改为3,若改为 saved,则默认为上次启动项
  • GRUB_TIMEOUT=“3” ->设置进入默认启动项的等候时间,默认值10秒,按自己需要修改.如果改为-1,那么每次启动需要手动确认才可以
  • GRUB_DISTRIBUTOR="$(sed ‘s, release .*$,g’ /etc/system-release)" ->获得发行版名称(比如Ubuntu, Debian)
  • GRUB_DISABLE_LINUX_RECOVERY=“true”->取消注释以阻止GRUB将传递参数 “root=UUID=xxx” 传递给 Linux #GRUB_DISABLE_LINUX_UUID=true# 取消启动菜单中的“Recovery Mode”选项
  • GRUB_TERMINAL=console ->设置是否使用图形介面。去除前面#,仅使用控制台终端,不使用图形介面
  • GRUB_CMDLINE_LINUX=""-> 将会导入到每个启动项(包括recovery mode启动项)的’linux’命令行

假如我们要自定义开机应该去修改对应的脚本或者 /etc/default/grub 文件,然后通过 grub2-mkconfig 重新生成 grub.cfg 文件,而不是修改 /etc/grub2.cfg 文件。这个是因为如果后期升级内核,所有的配置都会失效。

安卓镜像制作 uboot 安卓制作iso镜像工具_运行级别_02


安卓镜像制作 uboot 安卓制作iso镜像工具_安卓镜像制作 uboot_03


grub保护机制
grub程序提供系统保护机制,防止恶意用户随意通过当用户模式修改root密码或启动其他内核。可以执行命令grub2-setpasswork设置密码,当上述的方法不管用时这里提供另外一种是通过修改文件配置规定当修改启动参数.
设置密码相关文件:

  • /etc/grub.d/01_users
    kickstart安装过程如果指定使用该模板会建立此文件,如系统中没有可手动建立。此文件用来设置用户及密码
  • /etc/grub.d/40_custom 用户系统菜单选项配置文件,用来限定启动系统使用的镜像、内核及用户的组织关系

注意:update-grub命令执行时会读取此目录下的文件,并将配置合并至grub.cfg中,grub.cfg中的菜单顺序是由此目录中的文件顺序决定的,文件开头数字较小的会先执行,全英文名字的文件将会在最后执行,自定义选项在40_custom中定义,或者建立一个新文件,此目录下的文件必须有执行权限才会被update-grub读取,并把配置合并到grub.cfg中

设置用户及密码加密

设置脚本
[root@localhost ~]# cat /etc/grub.d/01_users 
cat <<EOF
set superusers="milkoto"     #设置milkoto为超级用户,拥有所有系统菜单进入、修改、启动权限,必须设置。注意,这里的用户不是系统中的用户
password wiil 123456      #明文密码
password_pbkdf2 ok        #用户ok的加密密码,使用命令# grub2-mkpasswd-pbkdf2  按照提示输入想要加密的密码后返回以和哈希串
grub.pbkdf2.sha512.10000.5429F8134584EB531B9C5BFF59ADBFD4FB3751CA19FEB9DA1003A3BBC5638FBE9288D1D6B3F303306D0891EC7710CC526CBAEDBF35AD05F4245C3147100CC34A.72504215A4B0A19F2246CCDDD4D40E12B5BA0287D053B89607E7174B79ADD787745C036F7CDCBA1A2A184CCCA2720FD1A6682ED55CB05ED654CE92209A4673DD
EOF
设置完脚本后到自定义脚本/etc/grub.d/40_custom  添加代码。
# cat /etc/grub.d/40_custom
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
set superusers = "milkoto"
password_pbkdf2 milkoto grub.pbkdf2.sha512.10000.497F246861691979B9B7A6E3758A865929ED27D121E913DB7CE825BA8051A6F12C8AFA6A1A497BA87AC2AEEF2FDDC293523114CAC53603B78B6BD790EEE802A7.3E1A2876C499CD9F12A8A634C7D4A18B84F8F0AF69BDB4D9C1E859A1861BB01EA5E34BBF65388CED8F4435C50051C61FBB460E489F1D1E4DA41A5B5984E43F1C

然后执行命令"grub2-mkconfig -o /boot/grub2/grub.cfg"重新生成配置文件。

# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-862.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-862.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-5cd1608ab306482b8813c487489ccd84
Found initrd image: /boot/initramfs-0-rescue-5cd1608ab306482b8813c487489ccd84.img
done

当然,你也可以自定义开机时,根据输入不同的命令来确定是否需要输入密码,这里我试了一下还没搞懂也没成功,直接复制cat /boot/grub2/grub.cfg中的menuentry 代码段到/etc/grub.d/40_custom 增加代码

**cat /boot/grub2/grub.cfg的代码段:**
menuentry 'CentOS Linux (0-rescue-afa55111353c4c09817eef67ebb43bbc) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-afa55111353c4c09817eef67ebb43bbc-advanced-5d8d47c9-f2b1-42c3-8b67-92343d532e0b' {
        load_video
        insmod gzio
        insmod part_msdos
        insmod xfs
        set root='hd0,msdos1'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1 --hint='hd0,msdos1'  485098b1-5a5b-4ed8-9cf9-310cc97cff36
        else
          search --no-floppy --fs-uuid --set=root 485098b1-5a5b-4ed8-9cf9-310cc97cff36
        fi
        linux16 /vmlinuz-0-rescue-afa55111353c4c09817eef67ebb43bbc root=/dev/mapper/cl-root ro crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet
        initrd16 /initramfs-0-rescue-afa55111353c4c09817eef67ebb43bbc.img
}

/etc/grub.d/40_custom增加代码

menuentry 'CentOS Linux (0-rescue-afa55111353c4c09817eef67ebb43bbc) 7 (Core)'  --user  ##这里可以添加参数来自定义设置grub的菜单参数{
        load_video
        insmod gzio
        insmod part_msdos
        insmod xfs
        set root='hd0,msdos1'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1 --hint='hd0,msdos1'  485098b1-5a5b-4ed8-9cf9-310cc97cff36
        else
          search --no-floppy --fs-uuid --set=root 485098b1-5a5b-4ed8-9cf9-310cc97cff36
        fi
        linux16 /vmlinuz-0-rescue-afa55111353c4c09817eef67ebb43bbc root=/dev/mapper/cl-root ro crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet
        initrd16 /initramfs-0-rescue-afa55111353c4c09817eef67ebb43bbc.img
}

最后update-grub2,更新grub2配置。

自定义grub2启动加密


grub的命令行接口:
在出现选择菜单时,按C进入终端命令行模式,按E进入当前菜单项编辑模式(和grub一样),编辑中按Ctrl + C退出,按Ctrl + X 以编辑内容启动。
grub常用的指令有:

1.help:获取帮助列表
2.help KEYWORD:详细帮助信息
3.find /FILENAME:查找文件所在的磁盘分区
4.root (hd#,#):指定boot所在分区
5.kernel /KERNEL_FILE:设定本次启动时用到的内核文件;额外还可以添加许多内核支持使用的cmdline参数,如:selinux=0,init=/path/to/init
6.initrd /INITRAMFS_FILE:设定为选定的内核提供额外文件的ramfs
7.boot:引导启动选定的内核、

grub的编辑模式:

1.b键:表示boot,启动;
2.e键:表示edit,编辑选中的项:
            o键:在选中行的下一行添加一行
            O键:在选中行的上一行添加一行
            d键:删除选中的行
            Esc键:退出编辑界面

例子:grub修复

Linux的引导丢失后,需要进入Linux的救援模式,然后重新安装grub2

安卓镜像制作 uboot 安卓制作iso镜像工具_运行级别_04

首先使用U盘引导进入CentOS。在最开始的界面选择“trouble shooting”。
然后选择进入救援模式。在接下来的过程中可能会让你选择什么的。选择continue选项,然后继续。
成功进入救援模式后。执行以下命令

chroot /mnt/sysimage
#说明,这条命令是切换根目录的意思。目的是要把当前的根目录切换到自己硬盘中原来的根目录。这样就可以使用自己原来的Linux了。
#有人也在说没有/mnt/sysimage目录,或者命令执行失败。这样的话可以检查以下自己是不是真的进到了救援模式。起初我就是这样的情况。
grub2-install /dev/sda
#说明,这是在硬盘sda上安装grub2.安装完后会重新覆盖原来的引导。
grub2-mkconfig
#说明,让grub2自己去识别不同的系统,然后按照脚本自己创建引导。
#补充一下,如果你的Linux无法识别Windows的NTFS分区,grub2就不能建立对Windows的引导。那怎么办呢?安装一个可以识别NTFS文件系统的软件呗。。。
sudo yum install ntfs-3g
#有时候使用上面的命令已经识别了Windows系统,但是就是没有更新grub2的配置文件/boot/grub2/grub.cfg。那就多加一个参数-o
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
#如果想修改一下grub2的配置,比如等待时间、默认启动的条目等等,就要修改下面的配置文件/etc/default/grub
#在文件中
GRUB_TIMEOUT    #等待时间
GRUB_DEFAULT    #表示默认启动项。saved默认上次启动项,或者0,1,2,3……

grub功能详解


实现kickstart文件制作与光盘镜像制作

kickstart是RedHat/CentOS/Fedora等系统实现无人值守自动化安装的一种安装方式,系统管理员可将安装过程中需要配置的所有参数集成于一个kickstart文件中,而后在系统安装时,安装程序通过读取事先给定的这个kickstart文件自动化地完成配置并安装完成。

anaconda的配置方式有以下两种:

  • 交互式配置
  • 通过读取事先给定的配置文件事先自动完成配置,这个配置文件就是kickstart文件,它遵循特定的语法格式。

anaconda的安装引导选项可在boot界面(即bootloader引导时的菜单界面)由用户给定,由bootloader传递把参数传递给内核,再由内核把参数传递给anaconda应用程序;也可以直接在bootloader的配置文件中写入参数直接传递给内核,以光盘引导为例,可以在isolinux/isolinux.cfg配置文件中通过"append"的方式把参数追加给label中定义的内核。
anaconda的安装引导选项有:

text

文本安装方式

method

手动指定使用的安装方法

ip=IPADDR

安装时的ip地址

netmask=MASK

子网掩码

gateway=GW

默认网关

dns=DNS_SERVER_IP

安装过程需要解析主机名时会用到

ifname=NAME:MAC_ADDR

默认网关

vnc

可以让远程用户帮助配置各个安装选项

vncpassword

设置vnc密码

ks=

指明kickstart文件的位置

需要注意的是,kickstart文件可以来自光盘(镜像)、硬盘或网络,因此其指定方式各有不同。

  • 光盘:ks=cdrom:/PATH/TO/KICKSTART_FILE
  • 硬盘:ks=hd:/DEVICE/PATH/TO/KICKSTART_FILE
  • 网络:HTTP服务器:ks=http://HOST[:PORT]/PATH/TO/KICKSTART_FILE
    HTTPS服务器:ks=https://HOST[:PORT]/PATH/TO/KICKSTART_FILE
    FTP服务器:ks=ftp://HOST[:PORT]/PATH/TO/KICKSTART_FILE

kickstart文件的格式

  1. 命令段
    作用:指定各种安装前的配置选项,如键盘类型等。
    选项类型:必备命令+可选命令
    必备命令:
1.authconfig:认证方式配置   如  authconfig --enableshadow --passalgo=sha512
2.bootloader:定义bootloader的安装位置及相关配置  如:bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"
3.keyboard:设置键盘类型 如 keyboard us
4.lang:设置语言类型  如 lang en_US.UTF-8
5.part:分区布局 如 part /boot --fstype=ext4 --size=500
6.clearpart:清除分区  如clearpart --none --drives=sda
7.volgroup:创建卷组 如 volgroup VolGroup --pesize=4096 pv.008002
8.logvol:创建逻辑卷 如 logvol / --fstype=ext4 --name=lv_root --vgname=VolGroup --grow --size=1024 --maxsize=5120
0
9.rootpw:设置管理员密码 如 rootpw  --iscrypted $6$2V70fZkSFMrqldev$Qf950j2Ip5vxhEoOmlZgKHnySkBBMA6T5tBQz5jPiAurItpei
663xVkRfrdWZPESgQu33q3E.CShfkY4MCtjK.
10. timezone:时区 如 timezone Asia/Shanghai

生成加密密码的方式:
~]# openssl  passwd  -1  -salt  `openssl  rand  -hex  4`

可选命令:

1.install或upgrade:安装或升级
2.text:安装界面类型,text为TUI,默认为GUI
3.network:配置网络接口
4.firewall:防火墙  如firewall --disabled
5.selinux:SELinux 如 selinux --disabled
6.halt、poweroff或reboot:定义安装完成之后的行为,如关机、重启
7.user:安装完成后为系统创建新用户
8. 	repo:指明安装时使用的repository(安装源) 例如repo --name="CentOS" --baseurl=cdrom:sr0 --cost=100  这里可以指定其他epal源
9. url:指明安装时使用的repository(安装源),但为url格式  例如 :url --url=http://172.16.0.1/cobbler/ks_mirror/CentOS-6.7-x86_64/

注意:要配置好相关网络属性,例如局域网通信需要ip和netmask,如果要访问互联网还需要gateway
和dns。
  1. 程序包段
    作用:指定要安装的程序包、包组以及不安装的程序包。
    表示方式:
%packages	程序包段的开始
				@group_name	要安装的包组
				package	要安装的程序包
				-package	不安装的程序包
				%end	程序包段的结束

需要注意的是,如果一个程序包被其他指定要安装的程序包所依赖,那么就算指明该程序不安装,系统也会自动安装这个程序包。

  1. 脚本段
    包括安装前要执行的脚本和安装后要执行的脚本。
    安装前要执行的脚本:%pre
    脚本格式:
%pre
    ...
    %end

安装后要执行的脚本:%post

脚本格式:

%post
...
%end
运行环境:安装完成后的系统。

运行环境:运行于安装介质上的微型Linux系统环境。

制作kickstart文件的方式:

  • 直接手动编辑,可以依据某个模板来进行修改;
  • 使用kickstart文件创建工具:system-config-kickstart进行配置,同样可以导入某个模板并修改之。

使用 kickstart文件创建工具:system-config-kickstart 来定制kickstart:必须确保system-config-kickstart已经安装,如果没有安装可以使用yum安装。
安装完成后在命令行上运行system-config-kickstart命令即可启动窗口界面:

打开窗口如图

安卓镜像制作 uboot 安卓制作iso镜像工具_配置文件_05

这里直接进行配置(不使用模板),首先完成基本配置(如图),这里可设置语言类型、键盘类型、时区、管理员密码(加密)以及安装的平台类型等选项:

安卓镜像制作 uboot 安卓制作iso镜像工具_配置文件_06

选择安装方式,这里通过网易镜像网站(mirrors.163.com)安装程序包:

安卓镜像制作 uboot 安卓制作iso镜像工具_配置文件_07

选择安装类型、MBR的安装位置以及向内核传递的参数等:

安卓镜像制作 uboot 安卓制作iso镜像工具_配置文件_08

设置分区信息:

安卓镜像制作 uboot 安卓制作iso镜像工具_运行级别_09

网卡配置,可以静态指定也可以使用dhcp动态获取网络属性配置:

安卓镜像制作 uboot 安卓制作iso镜像工具_bash_10

认证方式配置:

安卓镜像制作 uboot 安卓制作iso镜像工具_bash_11

设定是否开启防火墙和selinux功能:

安卓镜像制作 uboot 安卓制作iso镜像工具_运行级别_12

设定是否安装图形界面:

安卓镜像制作 uboot 安卓制作iso镜像工具_配置文件_13

选定要安装的程序包:

安卓镜像制作 uboot 安卓制作iso镜像工具_运行级别_14

安装前要执行的脚本,注意运行环境是安装介质之上的微型Linux系统环境:

安卓镜像制作 uboot 安卓制作iso镜像工具_运行级别_15

安装后要执行的脚本:

安卓镜像制作 uboot 安卓制作iso镜像工具_bash_16

完成配置之后进行保存:

安卓镜像制作 uboot 安卓制作iso镜像工具_配置文件_17

指定保存目录:

安卓镜像制作 uboot 安卓制作iso镜像工具_配置文件_18


光盘引导镜像制作过程
(1) 准备工作目录,例如这里使用/tmp/cdrom;
#mkdir /tmp/cdrom
(2) 挂载系统发行光盘,复制光盘所有内容至/tmp/cdrom;注意复制光盘的文件只有只读权限,需要修改权限
#mount -r -t iso9660 /dev/cdrom /media/cdrom
#cp -r /media/cdrom/. /tmp/cdrom
#chmod u+w isolinux/* 修改文件权限
(3) 复制制作好的kickstart文件ks.cfg至/tmp/cdrom中;
#cp /root/ks.cfg /tmp/cdrom
(4) 如果需要,可以编辑/tmp/cdrom/isolinux/isolinux.cfg
在label linux后的append指令后附加ks=cdrom:/ks.cfg,从而实现自动调用光盘上提供的ks文件;

(5) 创建iso镜像:

#mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V “CentOS 6.6 X86_64 boot disk” -b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/boot.iso cdrom/
参数解释

"CentOS 6 x86_64 boot"        //光盘卷标;
isolinux/boot.cat            //MBR中的bootloader;
isolinux/isolinux.bin        //bootloader的第二阶段;
/root/boot.iso            //指定存放在哪里,并命名之;
./myboot/            //指定某个目录为“根”创建光盘镜像;

(6)安装

创建完成之后使用ls查看:

[root@localhost ~]# ls -1
anaconda-ks.cfg
boot.iso    //这就是刚刚创建的光盘镜像文件!
Desktop
Documents
Downloads
ks.cfg
Music
myboot
myboot1
Pictures
Public
Templates
Videos

接着创建新的虚拟机,将其引导设备指明为boot.iso镜像,然后点击启动即可实现自动安装: