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 ,重新启动,发现可以正常启动
GRUB 引导流程的更多相关文章
- linux引导流程
本章重点: 1.linux引导流程 2.linux运行级别 3.linux启动服务管理 4.GRUB配置与应用 5.启动故障分析解决 linux启动流程 1.固件(fireware):固话在硬件上的程 ...
- (五)Linux引导流程解析
目录 Linux引导流程 Linux运行级别 Linux启动服务管理 GRUB配置与应用 启动故障分析与解决 Linux引导流程 Linux系统引导流程如下图: 固件(Firmware)就是写入ERO ...
- 9.Linux系统引导流程
一.Linux系统引导流程 当我们按下主机电源键的那时候开始,主板上的CMOS/BIOS模块将进行固件自检,以此检查各个硬件是否正确连接. 在Linux引导流程中,一般可以分为以下几个主要过程: 1. ...
- Linux 开机引导流程
Linux 开机启动流程 BIOS(Basic Input Output System)是 PC 机启动时加载的第一个软件.其实,它是一组固化到计算机主板上一个芯片上的程序,它保存着计算机最重要的输入 ...
- 5linux引导流程解析
课程大纲 Linux引导流程 Linux运行级别 Linux启动服务管理 GRUB配置与应用 启动故障分析与解决 常用固件设置 安全设置 可引导介质列表 可引导介质搜索顺序 ...
- linux 启动引导流程
课程大纲: Linux引导流程 Linux运行级别 Linux启动服务管理 GRUB配置与应用 启动故障分析与解决 系统引导流程 1.固件firmware(CMOS(固化在硬件上的程序与硬件统称)/B ...
- 学习鸟哥的Linux私房菜笔记(17)——Linux引导流程
一.系统引导流程 第一步:固件fireware(CMOS/BIOS)--POST加点自检(与操作系统无关) 这一步主要是检查硬盘等硬件是否能正常工作 CMOS:是固化在主板上,详细:http://sc ...
- Ubuntu grub引导修复
通过USB启动盘安装系统时将引导程序指定到/dev/sdb1,正常应该是指定到/dev/sdb才是,导致安装之后启动不起来. 重新通过USB启动盘进入试用界面,然后打开终端通过如下操作进行grub引导 ...
- ubuntu10.04+win7双系统,重装win7后,恢复grub引导菜单以及命令行引导linux
我在我的小Y上安装了ubuntu10.04和win7旗舰版的双系统,采用的是grub引导.今天win7不知道哪儿出了问题,windows update更新一直报错,(当然360也是打不上滴)网上查了很 ...
随机推荐
- Django 中Admin站点的配置
Admin站点是django提供的一个后台管理页面,可以用来对用户与数据库表数据进行管理. Admin站点配置流程 1.在settings.py文件中INSTALL_APPS列表中添加django.c ...
- HTML常用标签简介及快速入门
此HTML常用标签简介编写的目的,是给一个经常使用网页编辑器的一个朋友提供一个快速熟悉和入门HTML的途径. 现在分享出来,给其他有类似需求的朋友,此处只列出了编辑文章时最常用和遇到的标签,完整标签页 ...
- 00065字符串缓冲区_StringBuilder类
1.StringBuilder类,它也是字符串缓冲区,StringBuilder与它和StringBuffer的有什么不同呢? 它一个可变的字符序列.此类提供一个与 StringBuffer 兼容的 ...
- OA项目知识总结2
BaseAction的抽取 项目中的每个实体类都对应一个action 每个action都都要继承ActionSupport类 已以及实现ModelDriver接口 并且需要注入service 虽然 ...
- 排序算法Python(冒泡、选择、快速、插入、希尔、归并排序)
排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们通常所说的排序算法往往指的是内部排序算法,即数据 ...
- HDU 4196
很容易由算术基本定理知道,完全平方数就是所有质因子指数为偶数的数.而求得N以下的质因子,可由前两篇的公式知,由N!与p的关系求得.对于指数为p的,用N!除去就可以,因为p必定属于N以内,且无重复. 至 ...
- Android中的WiFi P2P
Android中的WiFi P2P可以同意一定范围内的设备通过Wifi直接互连而不必通过热点或互联网. 使用WiFi P2P须要Android API Level >= 14才干够,并且不要忘记 ...
- c++中字符输入函数getline、cin.getline区分
1.cin>>s; s能够是:string s.char s[]; 这个是ostream中的函数.遇到' '(空格) , '\n'(换行),就会自己主动结束,因此假设用cin读取字符串, ...
- Server Tomcat v8.0 Server at localhost was unable to start within 45 seconds. If the server requires
Server Tomcat v8.0 Server at localhost was unable to start within 45 seconds. If the server requires ...
- kaggle 中使用ipython
# pandas import pandas as pd from pandas import Series,DataFrame # numpy, matplotlib, seaborn import ...