Linux启动流程及mini-linux制作(未完成)

Linux启动流程:

1、通常启动流程:
	@POST:power on self test,主板加电自检;
	@ boot squence:根据bios设置的启动顺序依次查找设备mbr;
	@加载boot load程序:查找mbr的bootloader程序并加载执行
		mbr占用磁盘的第一个扇区共512byte:
			前446byte:存放bootloader程序(linux上比如lilo,grub)
			后64byte:存放磁盘的主分区信息
		uefi:
			uefi会直接搜寻fat分区下的可以读取引导文件,并根据
			bios中的启动顺序设置进行加载
	@加载引导器主程序(grub或ntdlr,后面以grub为例说明):
		mbr:
		mbr中的bootloader程序会根据嵌入的代码设定去查找并加载
		指定的分区文件系统中/boot分区下的grub引导器主程序和配
		置文件;根据配置文件引导系统启动
		如果不能直接识别该分区的文件系统,bootloader会先加载
		位于mbr后面31K字节大小的扇区内的stage1.5,寻找文件
		系统驱动以识别指定分区的文件系统
		uefi:
		搜寻efi分区中的bootx64.efi,启动grub引导器,依据grub.cfg
		配置文件(一般位于efi分区对应操作系统目录中)引导系统
		启动
	@加载操作系统内核及initrd文件进入内存,内核初始化:
		<探测可识别到的所有硬件设备;
		<加载硬件驱动程序(该过程可能会用到initrd文件);
		<以只读方式挂载根文件系统;
		<运行用户空间的第一个应用程序:/sbin/init 
	@用户空间首个应用程序/sbin/init执行系统初始化程序:
		在centos5-7中/sbin/init程序有所不同:
		centos5:init程序本身不包含复杂的功能,只是串行地执行
			需要启动的脚本,脚本实现的功能由脚本自己完成;
			配置文件:/etc/inittab
		centos6:init程序实际为upstart,为了兼容性依旧命名为init
			该程序实现了脚本的并行执行;
			配置文件:/etc/inittab ,/etc/inittab.d
		centos7:init程序变为systemd,init只是一个到systemd程序
			的软链作为兼容性考虑,systemd程序自身包含各种丰富
			的功能,而不需要启动各种外部脚本,启动速度大大提高;
			配置文件:/usr/lib/systemd/system,/etc/systemd/system
		init程序执行动作:
			<设定当前的运行级别
			<执行系统初始化脚本/etc/rc.d/rc.sysinit
				systemd程序由自己实现脚本中的功能
			<执行对应运行级别的服务脚本
			<启动终端,并运行login程序;图形显示级别时,会启动
				图形终端
		rc.sysinit脚本执行动作:
			<设置主机名;
			<设置欢迎信息;
			<激活udev设备和selinux
			<检测根文件,并以读写方式重新挂载根文件系统
			<挂载定义在/etc/fstab中的文件系统
			<设置系统时钟
			<激活swap设备
			<根据/etc/sysctl.conf设置内核参数
			<激活lvm或software raid等设备
			<加载额外驱动程序
			<执行清理动作

grub启动引导程序:

1、版本:
	grub legacy :版本号小于或等于0.97
	grub2:版本号大于或等于0.98
2、功能:
	@启动时提供类似bash的命令行界面,可由用户自由配置启动参数;
	@支持多系统启动,支持链式启动,支持windows启动引导,支持
		LBA
	@支持图形模式
	@可从网络下载操作系统镜像,并在启动前解压,支持无盘系统;
3、grub legacy文件构成:
	grub legacy包含3个部分:stage1、stage1.5、stage2
		stage1:存放在mbr的前446字节中,其作用是装载stage1.5或2
		stage1.5:存放在紧随mbr扇区后30kbyte中,是各类文件系统
			的驱动文件,当stage1无法识别stage2所在磁盘的文件系统
			类型时,会装载stage1.5驱动该文件系统,进而读取stage2;
			当stage2所在的磁盘文件系统类型在stage1所支持范围内时,
			会略过stage1.5,直接装载stage2;
		stage2:grub的主引导程序,存放在/boot目录中,一般该目录
			会挂载在一个独立的分区,且为常用的grub支持的文件系统
			类型;
		启动项配置文件为:menu.list或grub.conf,格式为:
			default=0	;默认启动项为条目1
			timeout=5 ;选择启动项的超时时间为5s
			splashimage=(hd0,0)/grub/splash.xpm.gz ;选择菜单的背景图片
			hiddenmenu ;隐藏菜单
			title CentOS (2.6.18-308.el5) ;首个启动项标题
		        root (hd0,0)	;启动文件所在磁盘分区
		        kernel /vmlinuz-2.6.18-308.el5 ro root=/dev/VolGroup00/LogVol00
		        ;内核文件位置及启动参数
		        initrd /initrd-2.6.18-308.el5.img;initrd文件
		Tip:initrd文件一般只有当启动内核无法识别要挂载的文件系统时,
			才会用到;initrd文件中包含当前主机文件系统类型驱动;为安装
			后生成;
	grub2包含boot.img和core.img
		boot.img:此文件编译后的内容将存放在mbr前446字节中,其作用是
			读取core.img的内容;
		core.img:包含diskboot.img、kernel.img、以及一些模块及加载模块
			的代码结合成core.img;core.img编译后代码存放位置:
			mbr分区:
				一是存放于紧随mbr后的31k字节大小的扇区中(官方推荐)
				二是存放于磁盘分区文件系统中,分区的第一个块存放启动core
					.img的代码(不推荐)
			bios-gpt分区(bios启动的gpt分区系统):
				使用独立的bios boot分区来存放grub2文件,分区最小为31kb,
				一般预留为1M大小,使用parted分区时,必须标记分区为
				boot_grub:
				parted -s /dev/sdb mklabel gpt
				parted -s /dev/sdb mkpart primary 0 1
				parted -s /dev/sdb toggle 1 bios_grub
				parted -s /dev/sdb set 1 bios_grub on
		模块文件存放位置:
			/usr/lib/grub/i386-pc目录
			/boot/grub2/i386-pc目录
		启动配置为/boot/grub2/grub.conf,语法格式较为复杂,更接近于脚本
			文件,例如支持变量、条件判断、循环等
			一般使用grub2-mkconfig命令来生成
4、grub的安装:
	grub-legacy:
		#grub-install device-name 
		命令会安装stage1、stage1.5、stage2,但没有grub.conf文件,需要
		手动配置
	grub2:
		#grub2-install device-name
		命令会安装boot.img和core.img文件,但没有grub.cfg(文件名不同)
		该文件语法复杂,使用grub2-mkconfig命令生成:
		#grub2-mkconfig -o /boot/grub2/grub.cfg
	Tip:在引导文件丢失时,可通过grub命令行手动进入系统或者插入cd进入
		救援系统,执行上述命令安装grub引导;
5、grub的多系统引导和链式引导:
	grub对支持的内核可以在配置文件添加启动项直接引导
	对不支持的内核(例如windows)可以在配置文件中添加链式引导,
	即grub引导启动对方操作系统的引导器,该引导器引导启动其系统
	例1:bios+mbr,centos7+ubuntu,不同磁盘;添加启动项
		安装过程中,两块磁盘都会安装grub引导程序,随便在哪个系统的
		启动引导配置文件中添加另一个系统的启动项,并bios设置该配置
		文件所在磁盘为第一启动顺序即可;设centos7安装在hd0上,
		ubuntu安装在hd2上;bios第一启动项为hd0,进入centos系统
		在/boot/grub2/grub.cfg文件中添加启动项即可:
		menuentry 'Ubuntu18.04' {
	        insmod part_msdos	 ;插入msdos分区模块
	        insmod xfs ;插入xfs文件系统驱动模块
	        set root='hd2,msdos1' ;设置启动文件根目录为磁盘3、分区1
	        search --no-floppy --fs-uuid --set=root  \
	        100d5605-8964-459d-9fca-3f626d7fb53c
	        ;设置/boot分区uuid
	        linux   /vmlinuz-5.3.0-51-generic root=UUID=\
	        f761b3ef-e60b-4727-b968-161fb47125d7 ro quiet
	        ;设置根分区uuid,设置内核文件
	        initrd  /initrd.img-5.3.0-51-generic ;设置initrd文件
        }
	例2:bios+mbr,centos7+ubuntu,不同分区;添加启动项
		先划分分区安装centos7,再划分分区安装ubuntu,此时ubuntu
		安装在磁盘mbr bootloader中的数据会覆盖掉centos安装时写入
		的数据(即bootloader中嵌入的grub引导程序的位置会是ubuntu
		系统的boot分区),因此此时要编辑ubuntu系统中/boot/grub/
		grub.cfg文件添加centos的启动项,才能实现双系统引导;如果
		在centos系统中/boot/grub2/grub.cfg文件添加ubuntu启动项,并
		使该文件生效,则要在centos系统上运行grub-install命令,重新
		写入bootloader,启动项添加如上例;
	例3:支持grub引导的双系统,不论是不同分区还是不同磁盘,uefi
		或者bios都可以使用在grub配置文件中添加启动项的方法来实现
		双系统引导;
	例3:bios+mbr,ubuntu+win10,不同分区,先装windows;
		win10引导ubuntu系统:
			网上推荐使用easybcd修改windows启动条目,但试了几次均
			未成功,不知是不是软件版本的问题;
			windows系统自带的启动分区boot目录下的bcdedit命令行工具
			或许可行,但使用较为复杂,有待摸索;
		ubuntu引导win10系统:
			依旧使用grub的链式引导功能,在/boot/grub/grub.cfg中添加
			menuentry ‘windows 10’ {
				set root=‘hd0,msdos1’	;windows boot分区
				chainloader +1	;链式引导
				boot	;启动
			}
	例4:bios启动不支持安装windows系统在gpt分区,但非系统盘可
		使用gpt分区;ubuntu支持bios+gtp的安装方式;
	例5:uefi+gpt,ubuntu+win10,不同磁盘,win10引导ubuntu,待解决
		bios框架可以使用easybcd来修改和添加win10的启动项,但easy
		bcd不支持uefi,暂时未能解决;
		bcdedit或许可行;
	例6:uefi+gpt,ubuntu+win10,不同磁盘,ubuntu引导win10:;
		进入ubuntu系统后,修改/boot/grub/grub.cfg文件,添加下面内容:		
			if [ "${grub_platform}" == "efi" ]; then
			menuentry "Microsoft Windows 10" {
				insmod part_gpt
				insmod fat
				insmod chain
				search --no-floppy --fs-uuid --set=root $hints_string $fs_uuid
				chainloader /EFI/Microsoft/Boot/bootmgfw.efi
			}
			fi
		内容中的$hints_string替换成windows EFI分区的uuid;
		使用命令blkid查看,或者命令:
		grub-probe --target=fs_uuid /mnt/EFI/Microsoft/Boot/bootmgfw.efi
		内容中的$hints_string替换成分区位置,使用以下命令查看:
		grub-probe --target=hints_string /mnt/EFI/Microsoft/Boot/bootmgfw.efi
		其中/mnt为windows EFI分区所挂载的目录
	例7:uefi+gpt,win10+centos7,不同分区,grub引导;
		由于grub不能直接引导windows内核,又找不到方法修改windows的
		引导条目来引导centos,所以使用同上的方法,grub链式引导windows
		启动,bios中启动顺序要选择centos为第一启动
	Tip:未知是vmware虚拟机原因还是windows原因,所有windows双系统
		不管是同一磁盘不同分区还是不同磁盘,都要先装windows,不然会
		出现以下问题:
			找不到可用分区,找不到可用磁盘,系统无法安装,
			系统无法引导等等;因此,先装windows,再装linux
7、扩展知识:uefi
	uefi:unified extensible firmware interface,统一可扩展接口,是代替
		传统bios的设计方案,现在的主板大多支持UEFI
	uefi是一种预启动环境,支持图形化,直接识别fat分区,能执行efi
		程序文件,因此系统的启动引导更加方便快捷,只需在磁盘上建立
		fat分区并存放efi格式的启动引导程序,就可以实现启动引导,而无需
		mbr的主引导扇区及其后的内容;
		由c语言编写(bios是汇编语言)更适合厂商的定制化和二次开发;
		可以看做一个轻量化的系统,uefi引导启动的过程,就是由这个轻量
		化的系统转到一个功能丰富健全的操作系统;

mini-linux制作:

	1、下载内核linux-3.2.48.tar.xz
	2、解压内核
		# tar xf linux-3.2.4.tar.xz
	3、编译内核:
		# ln -sv linux-3.2.4 linux
		# cd linux
		# make mrproper
		# make allnoconfig
		# make menuconfig
			使用lscpu和lspci等命令查看硬件信息,选用对应的内核参数
			选择cpu支持x86
			选择scsi device支持
			选择Fusion-MPT支持
			选择ext4文件系统支持
			选择inter pro100/1000驱动支持
			保存退出
		# make -j 4 bzImage
			编译后内核位于arch/x86/boot/bzImage,大小2M左右
	4、准备磁盘/dev/sdb
		# parted /dev/sdb mklable msdos
		# parted /dev/sdb mkpart primary ext4 0 10G
		# mkfs -t ext4 /dev/sdba
		# mount /dev/sdb1 /mnt
		# mkdir -pv /mnt/{root,boot,dev,var,mnt,etc,usr,tmp,home,lib,lib64
			,proc,sys}
		# cd /mnt && mkdir usr/{bin,sbin} && ln -sv usr/bin bin && ln -sv 
			usr/sbin sbin && cd -
		# grub-install --boot-directory=/mnt/boot /dev/sdb
		# cat << EOF >> /mnt/boot/grub2/grub.cfg
			<set timeout=5
			<set default=0
			<menuentry 'Mini linux for test' {
			<        set root='(hd0,msdos1)';
			<        linux /boot/bzImage ro root=/dev/sda1
			<}
			EOF
		# 创建简单的init脚本
		 cat << EOF >> /mnt/sbin/init
			<#!/bin/bash
			<#
			<FGRED=`echo "\033[31m"`
			<FGCYAN=`echo "\033[36m"`
			<BGRED=`echo "\033[41m"`
			<FGBLUE=`echo "\033[35m"`
			<BGGREEN=`echo "\033[42m"`
			<NORMAL=`echo "\033[m"`
			<export PATH=/bin:/sbin
			<#读写挂载根系统
			<mount /dev/sda1 / -o remount,rw -t ext4
			<#设置机器主机名
			<hostname MRedHat
			<#显示欢迎信息
			<echo -e "${FGRED}Welcome to Mini Linux !! ${NORMAL}"
			<#挂载/etc/fstab中的文件系统
			<mount -a --fstab /etc/fstab
			<bash
			EOF
		# chmod +x /mnt/sbin/init
		# 创建/etc/fstab挂载文件
		# 编写脚本执行复制命令及其所需库文件到/mnt目录下
			cat << EOF >> /root/cp-cmd.sh
				<#!/bin/bash
				<#
				<dest_dir=/mnt
				<usage() {
				<       echo "Enter a command, we will copy it to the new root directory";
				<       }
				<judge() {
				<       if [[ -z $command ]];then
				<               read -p "Please enter a command to continue or 'quit' to exit" command;
				<               continue;
				<       elif [[ $command == quit ]];then
				<               exit 0;
				<       elif ! which $command &> /dev/null ;then
				<               read -p "The command is not correct, please try again" command;
				<               continue
				<       fi
				<       }
				<cp_cmd() {
				<       cmd_full_path=`which --skip-alias $command`;
				<       cmd_base_dir=`dirname $cmd_full_path`;
				<       if [[ -f ${dest_dir}${cmd_full_path} ]];then
				<               echo "$command script already exists";
				<       else
				<               if [[ -d ${dest_dir}${cmd_base_dir} ]];then
				<                       cp $cmd_full_path ${dest_dir}${cmd_base_dir};
				<                       echo "cp $command script succesfully";
				<               else
				<                       mkdir -pv ${dest_dir}${cmd_base_dir};
				<                       cp $cmd_full_path ${dest_dir}${cmd_base_dir};
				<                       echo "cp $command script succesfully";
				<               fi
				<       fi
				<       }
				<cp_cmd_lib() {
				<       cmd_full_path=`which --skip-alias $command`;
				<       orig_lib_path=`ldd $cmd_full_path | grep -o '/[^[:space:]]*'`;
				<       for i in ${orig_lib_path};do
				<               lib_base_dir=`dirname $i`;
				<               if [[ -f ${dest_dir}${i} ]];then
				<                       echo "$i already exists";
				<               else
				<                       if [[ -d ${dest_dir}${lib_base_dir} ]];then
				<                               cp $i ${dest_dir}${lib_base_dir};
				<                               echo "cp $i to ${dest_dir}${lib_base_dir}";
				<                       else
				<                               mkdir -pv ${dest_dir}${lib_base_dir};
				<                               cp $i ${dest_dir}${lib_base_dir};
				<                               echo "cp $i to ${dest_dir}${lib_base_dir}";
				<                       fi
				<               fi
				<       done
				<               }
				<
				<read -p "Enter a command, we will copy it to the new root directory: " command;
				<while true;do
				<       judge;
				<       cp_cmd;
				<       cp_cmd_lib;
				<       read -p "Enter a command, we will copy it to the new root directory: " command;
				<done
			EOF
		# 执行脚本,复制所需命令
			# bash /root/cp-cmd.sh
			bash、cp、ls、rm、mount、hostname等等
		# 卸载磁盘
			umount /dev/sdc1
	5、新建一台虚拟机,选择该磁盘文件,启动虚拟机

LFS:

Tip:

1、库和可执行程序:
	都是二进制文件,库没有单独的执行入口,只能被可执行的二进制程序调用执行;二进制程序可直接运行;
2、备份bootloader或者mbr,在主机引导丢失或分区表丢失时恢复:
	备份:dd if=/dev/sda bs=512 count=1 | ssh root@192.168.181.10
		"dd of=/root/mbr-backup"
	恢复:启动救援模式
		ssh root@192.168.181.10 "dd if=/root/mbr-backup" | dd of=/dev
		/sda
	其实备份恢复的方法有很多,只是dd if的这种跨主机用法比较新奇
3、vmware安装虚拟机时,安装win7卡在了最后一步‘完成安装’;后删除虚拟机
	新建,选择系统类型为win7,安装成功;
	在vmware安装虚拟机时,可能兼容性问题,最好选择对应iso文件的虚拟机
	类型;
4、bios一般基于磁盘(mbr)来选择启动引导,UEFI是基于fat分区中的启动
	引导文件来选择启动引导;所以uefi存在来自同一磁盘的多个引导选项,
	bios则是一个磁盘一个选项;

问题:

1、uefi+gpt安装ubuntu磁盘efi分区200M,根分区10G,BOOT未单独分区,根
	分区文件系统为xfs,grub安装在/dev/sda1(即efi分区),安装完成后,系
	统启动进入grub模式,未引导成功:
解:
	grub>ls (hd0,gpt2)
	#显示为未知文件系统分区;
	grub>set root=(hd0,gpt1)
	grub>cat /EFI/ubuntu/grub.cfg,内容如下:
		search.fs_uuid 8a887b31-7170-4873-94fe-34b9834329cd root hd0,gpt2
		set prefix=($root)'/boot/grub'
		configfile $prefix/grub.cfg
	#此处定义为搜寻根分区boot目录下grub.cfg配置文件(还有boot目录下的
	其他启动文件),而根分区文件系统不能识别,造成系统无法引导
	@第一次尝试了比较笨的方法:
	插入光盘进入试用系统,挂载efi分区,并修改上述文件为:
		search.fs_uuid ac7df7a2-9ffa-48e2-9775-48bf839bbf63 root hd0,gpt3
		set prefix=($root)'/boot/grub'
		configfile $prefix/grub.cfg
	增加500m大小的boot分区,挂载分区并复制boot目录下文件到分区:
		#parted /dev/sda mkpart p3 ext4 10400m 10900m
		#mkfs /dev/sda3 pt ext4 
		#mount /dev/sda3 /mnt
		#mount /dev/sda1 /opt
		#cp -af /opt/boot/ /mnt/
	重启系统,系统引导成功
	@第二次:复制模块到efi目录中并装载模块:
	进入试用系统后,挂载磁盘:
		#mount /dev/sda1 /opt
		#mount /dev/sda2 /mnt
		#cp /mnt/root/boot/grub/x86_64-efi/xfs.mod /opt/efi/EFI/ubuntu/
	编辑/opt/efi/EFI/boot/grub.cfg文件:
		insmod (hd0,gpt1)/EFI/ubuntu/xfs.mod
		search.fs_uuid 8a887b31-7170-4873-94fe-34b9834329cd root hd0,gpt2
		set prefix=($root)'/boot/grub'
		configfile $prefix/grub.cfg
	重启系统,系统正常引导进入
2、同一磁盘安装ubuntu和centos,uefi+gpt,先安装ubuntu,后安装centos,
	安装完成后通过centos引导选项选择启动ubuntu提示
	can't find commmand 'linux'
	cant't find command 'initrd'
解:未知问题在哪,估计还是ubuntu boot目录在根分区下,且分区为xfs文件
	系统的原因,centos在引导时未能识别文件系统;
	补:ubunut安装的grub引导程序支持linux和initrd命令,而centos的grub程
		序不支持这两个命令
	@仅uefi设置第一启动顺便为ubuntu引导(前面为centos引导),进入系统
		后,修改/etc/default/grub文件:
			#GRUB_HIDDEN-TIMEOUT=0 ;注释此项,取消隐藏菜单
			GRUB_TIMEOUT=10;设置选择等待时间;
		执行update-grub2命令,更新/boot/grub/grub.cfg文件:
			#update-grub2 
		修改/boot/grub/grub.cfg文件,添加centos启动项:
			menuentry 'CentOS Linux (3.10.0-514.el7.x86_64) 7 (Core)' {
	        set gfxpayload=keep
	        insmod gzio
	        insmod part_gpt
	        insmod xfs
	        set root='hd0,gpt4'
	        linuxefi /vmlinuz-3.10.0-514.el7.x86_64 root=/dev/mapper/cl\
	        -root ro crashkernel=auto rd.lvm.lv=cl/root rhgb quiet LANG=\
	        en_US.UTF-8
	        initrdefi /initramfs-3.10.0-514.el7.x86_64.img
			}
		重启系统,出现选择菜单,正常进入双系统;
	@出现该错误,是因为grub2-uefi不支持initrd和linux命令,却不明白
		后面安装centos7时为什么自动添加ubuntu条目时,却使用的是该
		命令,找到centos系统efi分区中grub.cfg启动配置文件,修改ubuntu
		启动项命令linux、initrd为linuxefi和initrdefi
	!:ubuntu安装的grub引导,存在grub的大量模块;
		而centos安装时却找不到这些文件,但模块却装载正常,不太理解
3、mbr-grub安装时选择安装在分区而不是磁盘,此时,grub是不会往
	mbr中写入数据的,只是在指定分区中写入grub引导程序;
	在ubuntu和windows10的双系统bios+mbr单磁盘安装时,先装win10,
	然后安装ubuntu,在安装时选择了安装grub在/boot分区,而不是磁盘
	启动时磁盘的默认引导为win10,没有ubuntu启动项;
	解决办法:
		方法1、进入win10系统,使用easybcd添加linux启动项;
			尝试失败,启动项可以添加但引导失败,又对于windows引导器
			不太熟悉,无法分析问题所在
		方法2、插入ubuntu安装光盘,选择系统试用,进入系统后挂载
			ubuntu系统的boot分区到/mnt目录,执行命令:
			#grub-install --boot-directory=/mnt /dev/sda
			很遗憾,第一次似乎正常进入ubuntu系统,但当我启动windows
			并用easybcd尝试方法一不通时,再次按方法二操作,此时命令
			写入mbr的指令却一直指向windows引导器(使用了dd if命令清空
			了mbr后执行该命令,重启后进入了windows引导器选项界面)
			尝试方法3
		方法3、插入或添加安装有grub2引导的硬盘或u盘,进入grub命令
			交互界面,引导ubuntu系统启动,进入系统后执行grub-install命
			令,本示例中是另一个系统磁盘a,可能grub-install误操作为磁盘
			a,结果启动提示‘no such device:uuid’;进入grub-rescue界面
			由于rescue下磁盘所有文件文件系统均未未知,rescue无法挽救
			只能插入安装光盘进入救援模式执行命令grub-install,重启后
			成功进入系统,继续上一步的尝试,插入ubuntu系统盘,grub
			命令行手动引导进入ubuntu系统,执行命令grub-install;
			重启选择ubuntu所在盘为启动盘,继续进入windows引导器。。
			无效
		方法4:使用dd if命令尝试从正常启动的centos7系统复制mbr中的
			bootloader程序写入ubuntu所在磁盘mbr中;
			重启后,依然进入windows引导管理器(中间有擦除数据后重启
			实验bmr中bootloader是否清楚)
			Tip:貌似这段嵌入在mbr中的代码是统一不变的
		总解:
			上面的操作其实应该都对,但由于ubuntu的grub配置文件默认为
			隐藏启动菜单选项,且grub默认启动选项不知为什么变成链式启
			动win10(即加载windows启动管理器),导致一直进入windows
			启动管理器,误以为grub-install的写入失效;
			通过grub2命令引导启动ubuntu系统,修改/etc/default/grub文件
			注释掉GRUB_TIMEOUT_STYLE=hidden;修改GRUB_TIME
			OUT=10,执行命令update-grub更新/boot/grub/grub.cfg文件,
			重启后,正常进入双系统;
4、windows 10无法启动,蓝屏生成以下错误︰		
	\Windows\system32\winload.exe 文件不存在或配置错误
解:https://support.microsoft.com/en-us/help/4010129/winload-exe-
	error-code-0xc000000e-on-an-azure-vm

优质文章:

1、https://www.cnblogs.com/f-ck-need-u/p/7094693.html
	grub2的介绍以及与grub legacy的区别;
	这位博主的一系列博文都非常好
2、https://wiki.archlinux.org/index.php/GRUB_Legacy_(%E7%AE%80%E
	4%BD%93%E4%B8%AD%E6%96%87)#%E5%AE%89%E8%A3%85
	grub的维基百科
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值