zoukankan      html  css  js  c++  java
  • GRUB 引导流程

    GRUB(bootloader)引导流程:
      GRUB,GRand Unified Bootlader ,是一个来自GUN项目的多操作系统启动程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。
      grub版本:
      grub 0.x:grub(legacy) Centos 5,6
      grub 1.x:grub2     Centos 7

      grub legacy版本:
      工作流程:当系统启动时,如果要加载grub所在的磁盘时,会读取这个磁盘的MBR,同时会加载stage1,stage1会尝试读取后扇区的stage1_5阶段,stage1_5阶段会帮助stage1中的bootloader识别stage2所在的分区上的文件系统,然后加载stage2所在的磁盘分区,这个分区不但有stage2阶段,还有内核和ramdisk等。

      stage1:运行Boot Loader主程序,这个程序必须要安装在启动区,即MBR中。因为MBR空间有限,因此在MBR当中仅安装Boot Loader的最小程序,并没有安装Boot Loader的相关配置文件
      stage1_5:MBR之后的扇区,让stage1中的BootLoader能识别stage2所在的分区上的文件系统(相当于文件系统的驱动)
      stage2:boot目录所在的磁盘分区(/boot/grub)
      配置文件:/etc/grub.conf软链接到/boot/grub/grub.conf
           /boot/grub/menu.lst软链接到/boot/grub/grub.conf

     stage2及内核等通常放置于一个基本磁盘分区(boot分区)
      boot单独分区是用来存放与Linux系统启动有关的程序,比如内核文件、启动引导装载程序,启动菜单配置文件等;
      boot作为一个单独的分区,也就意味着这个单独分区下有一个grub,因为grub刚启动的时候,操作系统还没有启动(真正的根文件系统还没有被加载),所以,不能通过访问/boot/grub来实现,但是我们又需要访问这个文件来执行stage2 阶段。所以,grub中就有一个root命令,指明的就是把stage2 阶段直设为根,而grub自带有文件系统驱动(stage 1.5),所以就可以直接访问分区及根下的所有文件即kernel,initrd等来选择内核启动;
      boot目录,有没有单独分区(或者说引导分区是不是一个独立的分区),决定了在grub中的访问路径是否一样。而grub中的root命令,指明的就是这个根分区是谁,如果boot被单独分区了,那么就直接指向这个新分区,访问路径就直接把boot给去掉了;如果boot没有被单独分区,就是挂在根分区上,那就意味着/boot目录是绕不过去的,访问的时候只能先访问根,在访问根下的boot。
      grub要想访问某一分区,这个分区必须是基本磁盘分区,不可能是提供了非常复杂的驱动程序(RAID或LVM)。如果想把根做的复杂些(比如LVM)但又不对boot做单独分区,那把逻辑卷往分区上一放,就找不到grub中的stage2阶段了,所以,要想把根做的复杂,就只能把boot作为一个单独的基本磁盘分区;
      如果不使用逻辑卷,boot是可以不用单独分区的。

      stage2的主要功能:
      1、提供菜单、并提供交互式接口
        e:编辑模式,用于编辑菜单
        c:命令模式,交互式接口

      2、 加载用户选择的内核或操作系统
        允许传递参数给内核
        可隐藏此菜单
      3、为菜单提供了保护机制
        为编辑菜单进行认证
        为启用内核或操作系统进行认证

      GRUB识别硬盘设备:(hd#,#)表示第几块磁盘的第几块分区
        hd# 磁盘编号用数字表示,从0开始编号
        #  分区编号用数字表示,从0开始编号
       例如(hd0,0)表示第一块硬盘的第一个分区

    grub命令行接口:
      help:获取帮助列表
      help KEYWORD:查看指定命令的详细帮助信息
      find (hd#,#)/PATH/TO/SOMEFILE:查找某个磁盘上的某个文件
      root (hd#,#):设置grub的根设备(boot目录所在的磁盘设备)
      initrd /PATH/TO/INITRAMFS_FILE:设定选定内核配套的ramdisk文件
      boot:引导启动选定的内核
      kernel /PATH/TO/KERNEL_FILE:设定本次启动时用到的内核;额外还可以添加许多内核支持的cmdline参数:
      例如:init=/path/to/init, selinux=0
      内核支持的启动参数:
        磁盘相关启动参数:
        root 指定启动系统的真实根文件系统所在分区 如:root=/dev/sda1
        ro  指定根设备在启动过程中为readly-only(只读),默认情况下为ro(这里根设备指的是grub的根设备)
        rw  指定根设备在启动过程中为read-write(读写)
        rootfstype 指定根文件系统类型,如:rootfstype=ext4

        console和kernel log相关的启动参数:
        console console的设备和选项,如:console=tty0,console=ttyS0
        debug  enable kerneldebugging 系统启动中的所有debug信息
        quiet  静默模式将kernel loglevel设置为KERN_WARNING,在启动中指非常严重的信息
        loglevel 设置默认的console日志级别,如:loglevel=7(0~7数字分别为KERN_EMERG,…,KERN_DEBUG)
        time   设置在每条kernel log信息前加一个时间戳

        内存相关的启动参数:
        mem 指定kernel使用的内存量,mem=n[KMG]
        hugepages 设置大页表页(4MB大小)的最多个数,hugepages=n

        CPU启动的相关参数:
        mce     #Enable the machine check exception feature.
        nosmp   #Run as a single-processor machine. 只使用一个处理器,不使用SMP(多处理器)
        max_cpus #max_cpus=n, SMP系统最多能使用的CPU个数

        Ramdisk相关的启动参数:
        initrd  指定初始化ramdisk的位置,initrd=filename
        noinitrd 不使用initrd的配置,即使配置了initrd参数

        初始化相关启动参数:
        init 在启动时去执行的程序,init=filename,默认值为/sbin/init

        PCI相关的启动参数:
        pci #pci相关的选项,我常使用pci=assign_buses,也使用过pci=nomsi

        SELinux相关启动参数:
        enforcing #SELinux enforcing状态的开关,enforcing=0表示仅仅是记录危险 而不是阻止访问,enforcing=1完全enable,默认值是0
        selinux 在启动时关闭或开启SELinux,selinux=0表示关闭,selinux=1表示开启selinux

      手动在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 与内核匹配的initramfs文件
      password [--md5] STRING 启动选定内核或操作系统时需要认证

      每行详细解释:
      default=#: 设定默认启动的菜单项;假如同时装有多个操作系统,0表示定义的第一个title系统,1表示定义的第二个title系统,以此类推
      timeout=#:表示可供选择的等待时间,如果超出5秒,则使用默认的启动条目default定义的
      splashimage=(hd#,#)/PATH/TO/XPM_FILE:菜单背景图片文件路径
      hiddenmenu:隐藏菜单,默认是不显示菜单信息,如果要想显示菜单,可以将该配置信息注释即可
      password [--md5] STRING: 启动菜单编辑认证
      title TITLE:定义菜单项“标题”(操作系统名称), 可出现多次,用来引导不同的操作系统或内核
        root (hd#,#):grub查找stage2及kernel文件所在设备分区;为grub"根"。也就是说,表示的是内核文件的存放位置,这里指的是分区位置,而非根目录
        kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:内核的名称,以及一些启动时的核心参数。由于启动过程中需要挂载根目录,因此就需要指定根目录所在的分区。rhgb表示色彩显示,quiet表示静默模式加载内核
        initrd/PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件,虚拟文件系统
        password [--md5] STRING: 启动选定的内核或操作系统时进行认证

    grub-md5-crypt命令生成密钥:
      [root@localhost ~]# grub-md5-crypt
      Password:
      Retype password:
      $1$TcvuB$S9n4SJLUnvoM3NXYT6Fk2.
      编辑grub.conf文件将秘钥添加到相应位置vim /etc/boot/grub.conf
      passwd --md5 $1$TcvuB$S9n4SJLUnvoM3NXYT6Fk2.


    实验1:为编辑启动菜单进行认证;为启用内核或操作系统进行认证
      1、复制一份内核文件,改名为Tao Linux,并分别在第一个title之前和第二个title之后添加生成的加盐密码,保存并退出,并重启系统;

      2、重启系统之后发现要为进行编辑启动菜单的认证,效果如下:

      3、按“p”键输入密码之后,可以发现原来的提示信息又回来了,这是我们就可以编辑了

     

      4、选择第二个内核作为启动程序,按回车键发现要想启动内核,要输入密码认证,说明我们为内核设置的密码,起作用了。

     


    进入单用户模式:
    1、编辑grub菜单(选定要编辑的title,按"e"命令进行编辑)
    2、在选定的kernel后添加1, s, S或single参数都可以
    3、在kernel所在行,按"b"命令启动kernel

    实验2:单用户模式下修改密码
    1、在进入开机界面的时候,按任意键进入菜单界面

    2、因为我们在编辑启动菜单前设置了认证,所以需要输入密码,按"p"输入密码后进入编辑菜单,然后选定要启动的内核,按"e"键进入编辑模式

    3、选定好要启动的kernel后,按"e"键进入,然后在选定的内核后添加1, s, S或single,然后按回车键,紧接着在kernel所在行输入"b"进入单用户模式


    grub安装:出现grub损坏或给其它硬盘安装grub
      1、通过grub-install命令进行grub安装(这种方式二进制类的文件可以恢复,但是背景图片和grub.conf的文件不能恢复。会安装grub stage1和stage1_5到/dev/DISK磁盘上,并复制GRUB相关文件到 DIR/boot目录下(这里的DIR指的是boot目录的上一级目录)
      grub-install -root-directory=DIR /dev/sda
      2、在grub命令行进行grub安装,需要依赖/boot/grub/目录中除grub.conf之外的其它文件,这些文件都是完好存在情况下才能安装
      grub> root (hd#,#)
      grub> setup (hd#)

    示例1:重新安装grub, 用grub-install安装
      1、 dd if=/dev/zero of=/dev/sda bs=200 count=1  模拟破坏掉grub的stage 1(bootloader)
      2、grub-install --root-directory=/ /dev/sda  重新安装grub


    示例2:在grub命令提示符下修复grub(需要依赖/boot/grub/中的除grub.conf之外的文件都是完好情况下)
      1、dd if=/dev/zero of=/dev/sda bs=200 count=1  模拟破坏掉grub的stage 1(bootloader)
      2、grub  进入grub命令提示符下
      3、root (hd0,0)  指定grub的根所在的硬盘分区(也就是boot目录所在的硬盘分区)
      4、setup (hd0)  开始安装grup,需要指定grub所在硬盘
      5、quit命令退出grup命令行模式


    示例3:在紧急救援模式下修复grub(在grub损坏情况下设备重启了,这时候肯定起不来了)
      1、dd if=/dev/zero of=/dev/sda bs=200 count=1  模拟破坏掉grub的stage 1(bootloader)
      2、reboot  重启设备加载安装光盘,进入救援模式

    选择将根文件系统挂载到救援模式系统的/mnt/sysimage目录

    提示挂载成功,并可以通过chroot命令切换根

    启动shell

    3、进入shell界面,切换根开始修复grub

    总结:GRUB启动故障排除案例
      1、MBR中grub损坏,1_5阶段的数据损坏,2阶段的grub损坏
      2、initramfs*.img文件损坏,内核文件损坏
      3、/boot/grub/grub.conf文件丢失
      4、/etc/fstab丢失,无法挂载根等文件系统
      5、/boot 目录全部的文件丢失

    解决方法(都是在救援模式下)
      1、MBR中grub损坏,1_5阶段的数据损坏,2阶段的grub损坏;救援模式:
        chroot /mnt/sysimage 切根,改变磁盘根目录
        grub-install /dev/sda 安装grub引导程序到磁盘/dev/sda的MBR扇区

      2、initramfs*.img文件损坏,内核文件损坏
        initramfs*.img文件损坏,解决方法:
        # chroot=/mnt/sysimage
        # mkinitrd /boot/initramfs-$(uname -r).img $(uname -r) #创建
      内核文件损坏
        # mkdir /mnt/cdrom
        # mount /dev/cdrom /mnt/cdrom 挂载光盘
        进入/mnt/cdrom/Packages/ 目录下覆盖安装kernel包,
       rpm -ivh–replacepkgs kernel-VERSION.rpm –root=/mnt/sysimage –force
        安装完成后会在/boot目录下自动生成相应版本的vmlinuz文件.(前提是内核版本未更新, 和光盘中的内核版本一致)

      3、/boot/grub/grub.conf文件丢失
        这个新建一个写上引导等信息就行

      4、/etc/fstab丢失,无法挂载根等文件系统
        同样新建一个/etc/fatab、填写上挂载信息
        LVM的话需要激活LVM逻辑卷

      5、/boot目录全部的文件丢失
        结合上面,先MBR修复,然后内核文件修复和initramfs*.img文件修复


    示例4:虚拟机下手动制作grub
      1、准备好一个新硬盘,分3个分区(根分区、swap、boot)分别格式化,这里的boot单独分一个区
        /boot:mkfs.ext4 /dev/sdb1
        /:mkfs.ext4 /dev/sdb2
        swap:mkswap /dev/sdb3
      2、模拟启动时的boot目录,将其挂载到当前系统/mnt/boot/目录(创建的目录名一定要为boot)
        mkdir /mnt/boot
        mount /dev/sdb1 /mnt/boot
      3、将制作grub到新硬盘的boot分区(指定根目录就是boot目录所在的上一级目录)
        grub-install --root-directory=/mnt /dev/sdb
      4、复制当前系统的内核文件和initramfs文件到/mnt/boot/目录中,并手动创建grub.conf配置文件
        cp /boot/vmlinuz-2.6.32-573.el6.x86_64 /mnt/boot/vmlinuz
        cp /boot/initramfs-2.6.32-573.el6.x86_64.img /mnt/boot/initramfs.img
        vim /mnt/boot/grub/grub.conf
          default=0
          timeout=5
          title centos 6 (Express)
          root (hd0,0)
          kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/bin/bash
          initrd /initramfs.img
      5、为根分区创建常用的一级子目录
        mkdir /mnt/sysroot
        mount /dev/sdb2 /mnt/sysroot/
        cd /mnt/sysroot/
        mkdir -pv etc bin sbin lib lib64 dev proc sys tmp var usr home root mnt media
      6、拷贝bash程序和依赖的库文件到根文件系统上的对应目录
        cp /bin/bash /mnt/sysroot/bin/
        ldd /bin/bash  查看bash程序依赖的库文件
        cp /lib64/libtinfo.so.5 /mnt/sysroot/lib64/
        cp /lib64/libdl.so.2 /mnt/sysroot/lib64/
        cp /lib64/libc.so.6 /mnt/sysroot/lib64/
        cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64/
        sync  将内存数据同步到硬盘
      7、用新的硬盘去创建一个虚拟机,检验是否能正常启动

    实验:自制Linux操作系统
    1、为CentOS 6系统添加一块新的硬盘,然后启动,演示如下:

    2、查看新添加的硬盘,并为添加好的磁盘分区,创建文件系统;
    [root@CentOS6 ~]# fdisk -l /dev/sd[a-z]

    Disk /dev/sda: 85.9 GB, 85899345920 bytes
    255 heads, 63 sectors/track, 10443 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x0007eba7

    Device Boot Start End Blocks Id System
    /dev/sda1 * 1 26 204800 83 Linux
    Partition 1 does not end on cylinder boundary.
    /dev/sda2 26 7859 62914560 8e Linux LVM
    /dev/sda3 7860 9165 10490445 83 Linux
    /dev/sda4 9166 10443 10265535 5 Extended
    /dev/sda5 9166 9819 5253223+ 83 Linux
    #可以看到新添加的硬盘sdb
    Disk /dev/sdb: 21.5 GB, 21474836480 bytes
    255 heads, 63 sectors/track, 2610 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x00000000
    #分三个主分区,分别作为为根分区,swap分区和boot分区,并创建对应的文件系统,操作如下:
    [root@CentOS6 ~]# fdisk /dev/sdb #创建分区,
    #创建文件系统如下命令:
    [root@CentOS6 ~]# mkfs.ext4 /dev/sdb1
    [root@CentOS6 ~]# mkswap /dev/sdb2
    [root@CentOS6 ~]# mkfs.ext4 /dev/sdb3
    #查看创建好的分区
    [root@CentOS6 ~]# blkid
    /dev/sdb1: UUID="f4921d76-f089-4cb6-8f47-aff34711cb7a" TYPE="ext4"
    /dev/sdb2: UUID="3eaa649e-a5c0-4f9c-8887-453368419238" TYPE="swap"
    /dev/sdb3: UUID="286c857d-8f52-465f-9ed6-8eeaa3363743" TYPE="ext4"

    3、创建一个boot目录,并把boot分区(sdb1)挂载上;
    [root@CentOS6 ~]# mkdir /mnt/boot
    [root@CentOS6 ~]# mount /dev/sdb1 /mnt/boot
    [root@CentOS6 ~]# df
    Filesystem 1K-blocks Used Available Use% Mounted on
    /dev/mapper/vg0-root 20511356 1112808 18349972 6% /
    tmpfs 502068 0 502068 0% /dev/shm
    /dev/sda1 194241 34199 149802 19% /boot
    /dev/mapper/vg0-usr 10190136 2473060 7192788 26% /usr
    /dev/mapper/vg0-var 20511356 489148 18973632 3% /var
    /dev/sda5 5039592 10352 4766580 1% /home
    /dev/sdb1 104769 1550 97598 2% /mnt/boot # 挂载的设备sdb1

    4、创建grub,并查看
    [root@CentOS6 ~]# ls /mnt/boot/
    lost+found
    [root@CentOS6 ~]# grub-install --root-directory=/mnt /dev/sdb #创建grub
    Probing devices to guess BIOS drives. This may take a long time.
    Installation finished. No error reported.
    This is the contents of the device map /mnt/boot/grub/device.map.
    Check if this is correct or not. If any of the lines is incorrect,
    fix it and re-run the script `grub-install'.

    (fd0) /dev/fd0
    (hd0) /dev/sda
    (hd1) /dev/sdb
    [root@CentOS6 ~]# ls /mnt/boot/
    grub lost+found
    [root@CentOS6 ~]# ls /mnt/boot/grub/
    device.map fat_stage1_5 iso9660_stage1_5 minix_stage1_5 stage1 ufs2_stage1_5 xfs_stage1_5
    e2fs_stage1_5 ffs_stage1_5 jfs_stage1_5 reiserfs_stage1_5 stage2 vstafs_stage1_5

    5、要想成为一个真正的系统,还需要内核文件,initrd以及grub/grub.conf这些文件;
    [root@CentOS6 ~]# cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/vmlinuz
    [root@CentOS6 ~]# cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot/initramfs.img
    [root@CentOS6 ~]# vim /mnt/boot/grub/grub.conf #手动编写配置文件
    default=0
    timeout=5
    title CentOS (Express)
    root (hd0,0) # 在当前下为第二块磁盘应为(hd1,0),但是如果在其它设备上使用为(hd0,0)
    kernel /vmlinuz ro root=/dev/sda3 #加载的根目录所在的分区,因为在其他设备上为第一块磁盘所以为 /dev/sda3
    initrd /initramfs.img #内核匹配的ramfs文件

    6、要把/dev/sda3当做根文件系统,就需要挂载,并创建根文件系统下想对应的子目录:
    [root@CentOS6 ~]# mkdir /mnt/sysroot
    [root@CentOS6 ~]# mount /dev/sdb3 /mnt/sysroot/
    [root@CentOS6 ~]# cd /mnt/sysroot/
    [root@CentOS6 sysroot]# ls
    lost+found
    [root@CentOS6 sysroot]# mkdir -pv etc bin sbin lib lib64 dev proc sys mnt var usr home root tmp media
    mkdir: created directory `etc'
    mkdir: created directory `bin'
    mkdir: created directory `sbin'
    mkdir: created directory `lib'
    mkdir: created directory `lib64'
    mkdir: created directory `dev'
    mkdir: created directory `proc'
    mkdir: created directory `sys'
    mkdir: created directory `mnt'
    mkdir: created directory `var'
    mkdir: created directory `usr'
    mkdir: created directory `home'
    mkdir: created directory `root'
    mkdir: created directory `tmp'
    mkdir: created directory `media'
    [root@CentOS6 sysroot]# ls
    bin dev etc home lib lib64 lost+found media mnt proc root sbin sys tmp usr var

    7、根文件系统的目录有了,但是要想运行还需要程序,还需要bash,以及基于动态编译的共享库文件
    [root@CentOS6 sysroot]# cp /bin/bash /mnt/sysroot/bin #复制bash
    [root@CentOS6 sysroot]# ldd /bin/bash # 查看库文件
    linux-vdso.so.1 => (0x00007ffd127d9000)
    libtinfo.so.5 => /lib64/libtinfo.so.5 (0x0000003278e00000)
    libdl.so.2 => /lib64/libdl.so.2 (0x000000326f200000)
    libc.so.6 => /lib64/libc.so.6 (0x000000326f600000)
    /lib64/ld-linux-x86-64.so.2 (0x000000326ee00000)
    # 复制共享库中的文件到创建的根目录中的lib64下
    [root@CentOS6 sysroot]# cp /lib64/libtinfo.so.5 /mnt/sysroot/lib64
    [root@CentOS6 sysroot]# cp /lib64/libdl.so.2 /mnt/sysroot/lib64
    [root@CentOS6 sysroot]# cp /lib64/libc.so.6 /mnt/sysroot/lib64
    [root@CentOS6 sysroot]# cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64

    8、基本的操作已经完成,使用chroot切换根,进行测试,如下:
    [root@CentOS6 sysroot]# chroot /mnt/sysroot/ # 切换根
    bash-4.1#
    bash-4.1#
    bash-4.1# ls # 因为没有复制命令,所以只能使用内建命令,如果需要使用外部命令,就把命令以及以依赖的库复制过去就可以了。
    bash: ls: command not found
    bash-4.1# pwd
    /
    bash-4.1# exit
    exit

    9、最后,我们再编辑一下配置文件/mnt/boot/grub/grub.conf
    [root@CentOS6 ~]# vim /mnt/boot/grub/grub.conf
    default=0
    timeout=5
    title CentOS (Express)
    root (hd0,0)
    kernel /vmlinuz ro root=/dev/sda3 init=/bin/bash # 表示要求限定运行的的是/bin/bash 而不是 /sbin/init 这样就直接把bash当做用户空间的第一个进程来使用了
    initrd /initramfs.img

    10、同步内存信息到硬盘
    [root@CentOS6 ~]# sync

    11、我们新建一个虚拟机,把硬盘改为新创建好的磁盘,测试系统能否启动?

    启动此虚拟机,如下图:按e键可以看到我们创建的系统文件,选定内核,按b键启动

    选定内核,按b键启动,发现系统报错,什么原因呢?可能是没有添加selinux策略

    选定内核,按e键,进入编辑模式,添加selinux=0 ,重新启动,发现可以正常启动

     

  • 相关阅读:
    Windows XP上可以安装的SQL Server 2008版本
  • 原文地址:https://www.cnblogs.com/Link-Luck/p/9858869.html
Copyright © 2011-2022 走看看